diff --git a/demos/__init__.py b/demos/__init__.py new file mode 100644 index 0000000..fdffa2a --- /dev/null +++ b/demos/__init__.py @@ -0,0 +1 @@ +# placeholder diff --git a/demos/comprehensive_demo.py b/demos/comprehensive_demo.py index a921760..90fb786 100644 --- a/demos/comprehensive_demo.py +++ b/demos/comprehensive_demo.py @@ -7,12 +7,14 @@ import time from datetime import datetime from loguru import logger - from pocketoptionapi_async.client import AsyncPocketOptionClient from pocketoptionapi_async.models import TimeFrame -from connection_keep_alive import ConnectionKeepAlive -from connection_monitor import ConnectionMonitor -from load_testing_tool import LoadTester, LoadTestConfig +from pocketoptionapi_async.connection_keep_alive import ConnectionKeepAlive +from pocketoptionapi_async.connection_monitor import ConnectionMonitor +from tests.performance.load_testing_tool import ( + LoadTester, + LoadTestConfig, +) async def demo_ssid_format_support(): diff --git a/demos/enhanced_test.py b/demos/enhanced_test.py index d6ee530..7c28738 100644 --- a/demos/enhanced_test.py +++ b/demos/enhanced_test.py @@ -40,9 +40,7 @@ async def test_enhanced_connection(self): logger.info("Testing Enhanced Connection with Monitoring") print("=" * 60) - client = AsyncPocketOptionClient( - session_id=self.session_id, is_demo=self.is_demo - ) + client = AsyncPocketOptionClient(ssid=self.session_id, is_demo=self.is_demo) try: # Test connection with monitoring diff --git a/example payouts.json b/example payouts.json new file mode 100644 index 0000000..93c43fd --- /dev/null +++ b/example payouts.json @@ -0,0 +1,10064 @@ +[ + [ + 5, + "#AAPL", + "Apple", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 170, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 170, + "#AAPL_otc", + "Apple OTC", + "stock", + 3, + 79, + 60, + 30, + 3, + 1, + 0, + 5, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 140, + "#AXP", + "American Express", + "stock", + 3, + 50, + 60, + 30, + 3, + 0, + 291, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 291, + "#AXP_otc", + "American Express OTC", + "stock", + 3, + 79, + 60, + 30, + 3, + 1, + 0, + 140, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 8, + "#BA", + "Boeing Company", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 292, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 292, + "#BA_otc", + "Boeing Company OTC", + "stock", + 2, + 83, + 60, + 30, + 3, + 1, + 0, + 8, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 154, + "#CSCO", + "Cisco", + "stock", + 3, + 45, + 60, + 30, + 3, + 0, + 427, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 427, + "#CSCO_otc", + "Cisco OTC", + "stock", + 3, + 72, + 60, + 30, + 3, + 1, + 0, + 154, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 177, + "#FB", + "FACEBOOK INC", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 187, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 187, + "#FB_otc", + "FACEBOOK INC OTC", + "stock", + 2, + 69, + 60, + 30, + 3, + 1, + 0, + 177, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 180, + "#INTC", + "Intel", + "stock", + 2, + 25, + 60, + 30, + 3, + 0, + 190, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 190, + "#INTC_otc", + "Intel OTC", + "stock", + 3, + 92, + 60, + 30, + 3, + 1, + 0, + 180, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 144, + "#JNJ", + "Johnson & Johnson", + "stock", + 3, + 50, + 60, + 30, + 3, + 0, + 296, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 296, + "#JNJ_otc", + "Johnson & Johnson OTC", + "stock", + 3, + 92, + 60, + 30, + 3, + 1, + 0, + 144, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 20, + "#JPM", + "JPMorgan Chase & Co", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 295, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 23, + "#MCD", + "McDonald's", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 175, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 175, + "#MCD_otc", + "McDonald's OTC", + "stock", + 3, + 92, + 60, + 30, + 3, + 1, + 0, + 23, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 24, + "#MSFT", + "Microsoft", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 176, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 176, + "#MSFT_otc", + "Microsoft OTC", + "stock", + 3, + 74, + 60, + 30, + 3, + 1, + 0, + 24, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 147, + "#PFE", + "Pfizer Inc", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 297, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 297, + "#PFE_otc", + "Pfizer Inc OTC", + "stock", + 2, + 84, + 60, + 30, + 3, + 1, + 0, + 147, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 186, + "#TSLA", + "Tesla", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 196, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 196, + "#TSLA_otc", + "Tesla OTC", + "stock", + 2, + 92, + 60, + 30, + 3, + 1, + 0, + 186, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 153, + "#XOM", + "ExxonMobil", + "stock", + 3, + 45, + 60, + 30, + 3, + 0, + 426, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 426, + "#XOM_otc", + "ExxonMobil OTC", + "stock", + 3, + 61, + 60, + 30, + 3, + 1, + 0, + 153, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 315, + "100GBP", + "100GBP", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 403, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 403, + "100GBP_otc", + "100GBP OTC", + "index", + 1, + 45, + 60, + 30, + 3, + 1, + 0, + 315, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 473, + "ADA-USD_otc", + "Cardano OTC", + "cryptocurrency", + 6, + 56, + 60, + 30, + 3, + 1, + 0, + 474, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 538, + "AEDCNY_otc", + "AED/CNY OTC", + "currency", + 5, + 83, + 60, + 30, + 30, + 1, + 0, + 537, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 449, + "AEX25", + "AEX 25", + "index", + 2, + 45, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 568, + "AMD_otc", + "Advanced Micro Devices OTC", + "stock", + 4, + 64, + 60, + 30, + 30, + 1, + 0, + 567, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 412, + "AMZN_otc", + "Amazon OTC", + "stock", + 2, + 72, + 60, + 30, + 3, + 1, + 0, + 325, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 36, + "AUDCAD", + "AUD/CAD", + "currency", + 5, + 84, + 60, + 30, + 3, + 0, + 67, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 67, + "AUDCAD_otc", + "AUD/CAD OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 36, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 37, + "AUDCHF", + "AUD/CHF", + "currency", + 5, + 40, + 60, + 30, + 3, + 0, + 68, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 68, + "AUDCHF_otc", + "AUD/CHF OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 37, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 38, + "AUDJPY", + "AUD/JPY", + "currency", + 3, + 86, + 60, + 30, + 3, + 0, + 69, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 69, + "AUDJPY_otc", + "AUD/JPY OTC", + "currency", + 3, + 82, + 60, + 30, + 3, + 1, + 0, + 38, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 70, + "AUDNZD_otc", + "AUD/NZD OTC", + "currency", + 5, + 47, + 60, + 30, + 3, + 1, + 0, + 39, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 40, + "AUDUSD", + "AUD/USD", + "currency", + 5, + 70, + 60, + 30, + 3, + 0, + 71, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 71, + "AUDUSD_otc", + "AUD/USD OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 40, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 305, + "AUS200", + "AUS 200", + "index", + 2, + 37, + 60, + 30, + 3, + 0, + 306, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 306, + "AUS200_otc", + "AUS 200 OTC", + "index", + 2, + 67, + 60, + 30, + 3, + 1, + 0, + 305, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 481, + "AVAX_otc", + "Avalanche OTC", + "cryptocurrency", + 5, + 48, + 60, + 30, + 3, + 1, + 0, + 482, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 183, + "BABA", + "Alibaba", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 428, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 428, + "BABA_otc", + "Alibaba OTC", + "stock", + 3, + 88, + 60, + 30, + 3, + 1, + 0, + 183, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 450, + "BCHEUR", + "BCH/EUR", + "cryptocurrency", + 2, + 15, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 451, + "BCHGBP", + "BCH/GBP", + "cryptocurrency", + 2, + 15, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 452, + "BCHJPY", + "BCH/JPY", + "cryptocurrency", + 0, + 15, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 536, + "BHDCNY_otc", + "BHD/CNY OTC", + "currency", + 5, + 71, + 60, + 30, + 30, + 1, + 0, + 535, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 494, + "BITB_otc", + "Bitcoin ETF OTC", + "cryptocurrency", + 5, + 69, + 60, + 30, + 3, + 1, + 0, + 493, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 470, + "BNB-USD_otc", + "BNB OTC", + "cryptocurrency", + 4, + 50, + 60, + 30, + 3, + 1, + 0, + 469, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 453, + "BTCGBP", + "BTC/GBP", + "cryptocurrency", + 2, + 15, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 454, + "BTCJPY", + "BTC/JPY", + "cryptocurrency", + 2, + 15, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 197, + "BTCUSD", + "Bitcoin", + "cryptocurrency", + 2, + 15, + 60, + 30, + 3, + 0, + 484, + 0, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 484, + "BTCUSD_otc", + "Bitcoin OTC", + "cryptocurrency", + 3, + 92, + 60, + 30, + 3, + 1, + 0, + 197, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 455, + "CAC40", + "CAC 40", + "index", + 2, + 45, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 41, + "CADCHF", + "CAD/CHF", + "currency", + 5, + 33, + 60, + 30, + 3, + 0, + 72, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 72, + "CADCHF_otc", + "CAD/CHF OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 41, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 42, + "CADJPY", + "CAD/JPY", + "currency", + 3, + 80, + 60, + 30, + 3, + 0, + 73, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 73, + "CADJPY_otc", + "CAD/JPY OTC", + "currency", + 3, + 45, + 60, + 30, + 3, + 1, + 0, + 42, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 43, + "CHFJPY", + "CHF/JPY", + "currency", + 3, + 88, + 60, + 30, + 3, + 0, + 74, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 74, + "CHFJPY_otc", + "CHF/JPY OTC", + "currency", + 3, + 80, + 60, + 30, + 3, + 1, + 0, + 43, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 457, + "CHFNOK_otc", + "CHF/NOK OTC", + "currency", + 3, + 82, + 60, + 30, + 3, + 1, + 0, + 456, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 326, + "CITI", + "Citigroup Inc", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 413, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 413, + "CITI_otc", + "Citigroup Inc OTC", + "stock", + 3, + 74, + 60, + 30, + 3, + 1, + 0, + 326, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 570, + "COIN_otc", + "Coinbase Global OTC", + "stock", + 4, + 50, + 60, + 30, + 30, + 1, + 0, + 569, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 318, + "D30EUR", + "D30/EUR", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 406, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 406, + "D30EUR_otc", + "D30EUR OTC", + "index", + 1, + 45, + 60, + 30, + 3, + 1, + 0, + 318, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 209, + "DASH_USD", + "Dash", + "cryptocurrency", + 2, + 25, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 322, + "DJI30", + "DJI30", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 409, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 409, + "DJI30_otc", + "DJI30 OTC", + "index", + 1, + 45, + 60, + 30, + 3, + 1, + 0, + 322, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 485, + "DOGE_otc", + "Dogecoin OTC", + "cryptocurrency", + 6, + 92, + 60, + 30, + 3, + 1, + 0, + 492, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 486, + "DOTUSD_otc", + "Polkadot OTC", + "cryptocurrency", + 4, + 58, + 60, + 30, + 3, + 1, + 0, + 458, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 314, + "E35EUR", + "E35EUR", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 402, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 402, + "E35EUR_otc", + "E35EUR OTC", + "index", + 1, + 45, + 60, + 30, + 3, + 1, + 0, + 314, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 319, + "E50EUR", + "E50/EUR", + "index", + 2, + 45, + 60, + 30, + 3, + 0, + 407, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 407, + "E50EUR_otc", + "E50EUR OTC", + "index", + 2, + 45, + 60, + 30, + 3, + 1, + 0, + 319, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 272, + "ETHUSD", + "Ethereum", + "cryptocurrency", + 2, + 40, + 60, + 30, + 3, + 0, + 487, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 487, + "ETHUSD_otc", + "Ethereum OTC", + "cryptocurrency", + 3, + 92, + 60, + 30, + 3, + 1, + 0, + 272, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 44, + "EURAUD", + "EUR/AUD", + "currency", + 5, + 73, + 60, + 30, + 3, + 0, + 75, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 45, + "EURCAD", + "EUR/CAD", + "currency", + 5, + 34, + 60, + 30, + 3, + 0, + 76, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 46, + "EURCHF", + "EUR/CHF", + "currency", + 5, + 44, + 60, + 30, + 3, + 0, + 77, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 77, + "EURCHF_otc", + "EUR/CHF OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 46, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 47, + "EURGBP", + "EUR/GBP", + "currency", + 5, + 88, + 60, + 30, + 3, + 0, + 78, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 78, + "EURGBP_otc", + "EUR/GBP OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 47, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 460, + "EURHUF_otc", + "EUR/HUF OTC", + "currency", + 3, + 57, + 60, + 30, + 3, + 1, + 0, + 459, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 48, + "EURJPY", + "EUR/JPY", + "currency", + 3, + 70, + 60, + 30, + 3, + 0, + 79, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 79, + "EURJPY_otc", + "EUR/JPY OTC", + "currency", + 3, + 68, + 60, + 30, + 3, + 1, + 0, + 48, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 80, + "EURNZD_otc", + "EUR/NZD OTC", + "currency", + 5, + 91, + 60, + 30, + 3, + 1, + 0, + 49, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 200, + "EURRUB_otc", + "EUR/RUB OTC", + "currency", + 5, + 90, + 60, + 30, + 3, + 1, + 0, + 127, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 468, + "EURTRY_otc", + "EUR/TRY OTC", + "currency", + 5, + 39, + 60, + 30, + 3, + 1, + 0, + 121, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 1, + "EURUSD", + "EUR/USD", + "currency", + 5, + 78, + 60, + 30, + 3, + 0, + 66, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 66, + "EURUSD_otc", + "EUR/USD OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 1, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 316, + "F40EUR", + "F40/EUR", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 404, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 404, + "F40EUR_otc", + "F40EUR OTC", + "index", + 1, + 45, + 60, + 30, + 3, + 1, + 0, + 316, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 414, + "FDX_otc", + "FedEx OTC", + "stock", + 2, + 92, + 60, + 30, + 3, + 1, + 0, + 327, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 51, + "GBPAUD", + "GBP/AUD", + "currency", + 5, + 83, + 60, + 30, + 3, + 0, + 81, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 81, + "GBPAUD_otc", + "GBP/AUD OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 51, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 52, + "GBPCAD", + "GBP/CAD", + "currency", + 5, + 83, + 60, + 30, + 3, + 0, + 82, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 53, + "GBPCHF", + "GBP/CHF", + "currency", + 5, + 78, + 60, + 30, + 3, + 0, + 83, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 54, + "GBPJPY", + "GBP/JPY", + "currency", + 3, + 78, + 60, + 30, + 3, + 0, + 84, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 84, + "GBPJPY_otc", + "GBP/JPY OTC", + "currency", + 3, + 91, + 60, + 30, + 3, + 1, + 0, + 54, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 56, + "GBPUSD", + "GBP/USD", + "currency", + 5, + 68, + 60, + 30, + 3, + 0, + 86, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 86, + "GBPUSD_otc", + "GBP/USD OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 56, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 566, + "GME_otc", + "GameStop Corp OTC", + "stock", + 4, + 73, + 60, + 30, + 30, + 1, + 0, + 565, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 463, + "H33HKD", + "HONG KONG 33", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 548, + "IRRUSD_otc", + "IRR/USD OTC", + "currency", + 10, + 61, + 60, + 30, + 30, + 1, + 0, + 547, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 546, + "JODCNY_otc", + "JOD/CNY OTC", + "currency", + 6, + 60, + 60, + 30, + 30, + 1, + 0, + 545, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 317, + "JPN225", + "JPN225", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 405, + 0, + [], + 1750891500, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 405, + "JPN225_otc", + "JPN225 OTC", + "index", + 1, + 45, + 60, + 30, + 3, + 1, + 0, + 317, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 554, + "KESUSD_otc", + "KES/USD OTC", + "currency", + 6, + 92, + 60, + 30, + 30, + 1, + 0, + 553, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 530, + "LBPUSD_otc", + "LBP/USD OTC", + "currency", + 9, + 92, + 60, + 30, + 30, + 1, + 0, + 529, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 478, + "LINK_otc", + "Chainlink OTC", + "cryptocurrency", + 4, + 68, + 60, + 30, + 3, + 1, + 0, + 477, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 464, + "LNKUSD", + "Chainlink", + "cryptocurrency", + 4, + 15, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 60, + -1 + ], + [ + 488, + "LTCUSD_otc", + "Litecoin OTC", + "cryptocurrency", + 4, + 60, + 60, + 30, + 3, + 1, + 0, + 273, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 534, + "MADUSD_otc", + "MAD/USD OTC", + "currency", + 5, + 81, + 60, + 30, + 30, + 1, + 0, + 533, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 572, + "MARA_otc", + "Marathon Digital Holdings OTC", + "stock", + 5, + 80, + 60, + 30, + 30, + 1, + 0, + 571, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 491, + "MATIC_otc", + "Polygon OTC", + "cryptocurrency", + 6, + 65, + 60, + 30, + 3, + 1, + 0, + 490, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 323, + "NASUSD", + "US100", + "index", + 1, + 45, + 60, + 30, + 3, + 0, + 410, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 410, + "NASUSD_otc", + "US100 OTC", + "index", + 1, + 45, + 60, + 30, + 3, + 1, + 0, + 323, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 182, + "NFLX", + "Netflix", + "stock", + 2, + 50, + 60, + 30, + 3, + 0, + 192, + 0, + [], + 1750869300, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + 1750869300 + ], + [ + 429, + "NFLX_otc", + "Netflix OTC", + "stock", + 2, + 88, + 60, + 30, + 3, + 1, + 0, + 182, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 552, + "NGNUSD_otc", + "NGN/USD OTC", + "currency", + 6, + 87, + 60, + 30, + 30, + 1, + 0, + 551, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 89, + "NZDJPY_otc", + "NZD/JPY OTC", + "currency", + 3, + 53, + 60, + 30, + 3, + 1, + 0, + 59, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 90, + "NZDUSD_otc", + "NZD/USD OTC", + "currency", + 5, + 91, + 60, + 30, + 3, + 1, + 0, + 60, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 544, + "OMRCNY_otc", + "OMR/CNY OTC", + "currency", + 5, + 57, + 60, + 30, + 30, + 1, + 0, + 543, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 562, + "PLTR_otc", + "Palantir Technologies OTC", + "stock", + 4, + 22, + 60, + 30, + 30, + 1, + 0, + 561, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 542, + "QARCNY_otc", + "QAR/CNY OTC", + "currency", + 6, + 42, + 60, + 30, + 30, + 1, + 0, + 541, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 540, + "SARCNY_otc", + "SAR/CNY OTC", + "currency", + 6, + 68, + 60, + 30, + 30, + 1, + 0, + 539, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 466, + "SMI20", + "SMI 20", + "index", + 2, + 45, + 60, + 30, + 3, + 0, + 0, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 472, + "SOL-USD_otc", + "Solana OTC", + "cryptocurrency", + 5, + 28, + 60, + 30, + 3, + 1, + 0, + 471, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 321, + "SP500", + "SP500", + "index", + 2, + 45, + 60, + 30, + 3, + 0, + 408, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 408, + "SP500_otc", + "SP500 OTC", + "index", + 2, + 45, + 60, + 30, + 3, + 1, + 0, + 321, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 550, + "SYPUSD_otc", + "SYP/USD OTC", + "currency", + 9, + 92, + 60, + 30, + 30, + 1, + 0, + 549, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 532, + "TNDUSD_otc", + "TND/USD OTC", + "currency", + 5, + 77, + 60, + 30, + 30, + 1, + 0, + 531, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 480, + "TON-USD_otc", + "Toncoin OTC", + "cryptocurrency", + 6, + 29, + 60, + 30, + 3, + 1, + 0, + 479, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 476, + "TRX-USD_otc", + "TRON OTC", + "cryptocurrency", + 6, + 92, + 60, + 30, + 3, + 1, + 0, + 475, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + } + ], + 0, + 5, + -1 + ], + [ + 558, + "UAHUSD_otc", + "UAH/USD OTC", + "currency", + 5, + 63, + 60, + 30, + 30, + 1, + 0, + 557, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 50, + "UKBrent", + "Brent Oil", + "commodity", + 3, + 50, + 60, + 30, + 3, + 0, + 164, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 164, + "UKBrent_otc", + "Brent Oil OTC", + "commodity", + 3, + 80, + 60, + 30, + 3, + 1, + 0, + 50, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 64, + "USCrude", + "WTI Crude Oil", + "commodity", + 3, + 50, + 60, + 30, + 3, + 0, + 165, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 165, + "USCrude_otc", + "WTI Crude Oil OTC", + "commodity", + 3, + 80, + 60, + 30, + 3, + 1, + 0, + 64, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 506, + "USDARS_otc", + "USD/ARS OTC", + "currency", + 2, + 90, + 60, + 30, + 30, + 1, + 0, + 505, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 500, + "USDBDT_otc", + "USD/BDT OTC", + "currency", + 5, + 92, + 60, + 30, + 30, + 1, + 0, + 499, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 502, + "USDBRL_otc", + "USD/BRL OTC", + "currency", + 4, + 92, + 60, + 30, + 30, + 1, + 0, + 501, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 61, + "USDCAD", + "USD/CAD", + "currency", + 5, + 70, + 60, + 30, + 3, + 0, + 91, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 91, + "USDCAD_otc", + "USD/CAD OTC", + "currency", + 5, + 57, + 60, + 30, + 3, + 1, + 0, + 61, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 62, + "USDCHF", + "USD/CHF", + "currency", + 5, + 83, + 60, + 30, + 3, + 0, + 92, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 92, + "USDCHF_otc", + "USD/CHF OTC", + "currency", + 5, + 92, + 60, + 30, + 3, + 1, + 0, + 62, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 525, + "USDCLP_otc", + "USD/CLP OTC", + "currency", + 4, + 79, + 60, + 30, + 30, + 1, + 0, + 524, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 467, + "USDCNH_otc", + "USD/CNH OTC", + "currency", + 5, + 76, + 60, + 30, + 3, + 1, + 0, + 105, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 515, + "USDCOP_otc", + "USD/COP OTC", + "currency", + 2, + 92, + 60, + 30, + 30, + 1, + 0, + 514, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 508, + "USDDZD_otc", + "USD/DZD OTC", + "currency", + 3, + 46, + 60, + 30, + 30, + 1, + 0, + 507, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 513, + "USDEGP_otc", + "USD/EGP OTC", + "currency", + 5, + 92, + 60, + 30, + 30, + 1, + 0, + 512, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 504, + "USDIDR_otc", + "USD/IDR OTC", + "currency", + 1, + 79, + 60, + 30, + 30, + 1, + 0, + 503, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 202, + "USDINR_otc", + "USD/INR OTC", + "currency", + 4, + 92, + 60, + 30, + 3, + 1, + 0, + 126, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 63, + "USDJPY", + "USD/JPY", + "currency", + 3, + 68, + 60, + 30, + 3, + 0, + 93, + 0, + [], + 1750891500, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 1750891500, + 60, + -1 + ], + [ + 93, + "USDJPY_otc", + "USD/JPY OTC", + "currency", + 3, + 90, + 60, + 30, + 3, + 1, + 0, + 63, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 509, + "USDMXN_otc", + "USD/MXN OTC", + "currency", + 4, + 58, + 60, + 30, + 30, + 1, + 0, + 113, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 523, + "USDMYR_otc", + "USD/MYR OTC", + "currency", + 6, + 82, + 60, + 30, + 30, + 1, + 0, + 522, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 511, + "USDPHP_otc", + "USD/PHP OTC", + "currency", + 5, + 92, + 60, + 30, + 30, + 1, + 0, + 510, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 517, + "USDPKR_otc", + "USD/PKR OTC", + "currency", + 3, + 64, + 60, + 30, + 30, + 1, + 0, + 516, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 199, + "USDRUB_otc", + "USD/RUB OTC", + "currency", + 4, + 92, + 60, + 30, + 3, + 1, + 0, + 128, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 526, + "USDSGD_otc", + "USD/SGD OTC", + "currency", + 5, + 85, + 60, + 30, + 30, + 1, + 0, + 104, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 521, + "USDTHB_otc", + "USD/THB OTC", + "currency", + 5, + 92, + 60, + 30, + 30, + 1, + 0, + 520, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 519, + "USDVND_otc", + "USD/VND OTC", + "currency", + 1, + 76, + 60, + 30, + 30, + 1, + 0, + 518, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 416, + "VISA_otc", + "VISA OTC", + "stock", + 2, + 50, + 60, + 30, + 3, + 1, + 0, + 331, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 560, + "VIX_otc", + "VIX OTC", + "stock", + 4, + 84, + 60, + 30, + 30, + 1, + 0, + 559, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 103, + "XAGEUR", + "XAG/EUR", + "commodity", + 3, + 50, + 60, + 30, + 3, + 0, + 166, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 65, + "XAGUSD", + "Silver", + "commodity", + 3, + 50, + 60, + 30, + 3, + 0, + 167, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 167, + "XAGUSD_otc", + "Silver OTC", + "commodity", + 4, + 80, + 60, + 30, + 3, + 1, + 0, + 65, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 102, + "XAUEUR", + "XAU/EUR", + "commodity", + 3, + 50, + 60, + 30, + 3, + 0, + 168, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 2, + "XAUUSD", + "Gold", + "commodity", + 3, + 50, + 60, + 30, + 3, + 0, + 169, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 169, + "XAUUSD_otc", + "Gold OTC", + "commodity", + 3, + 80, + 60, + 30, + 3, + 1, + 0, + 2, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 311, + "XNGUSD", + "Natural Gas", + "commodity", + 3, + 45, + 60, + 30, + 3, + 0, + 399, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 399, + "XNGUSD_otc", + "Natural Gas OTC", + "commodity", + 4, + 45, + 60, + 30, + 3, + 1, + 0, + 311, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 313, + "XPDUSD", + "Palladium spot", + "commodity", + 2, + 45, + 60, + 30, + 3, + 0, + 401, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 401, + "XPDUSD_otc", + "Palladium spot OTC", + "commodity", + 2, + 45, + 60, + 30, + 3, + 1, + 0, + 313, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 312, + "XPTUSD", + "Platinum spot", + "commodity", + 2, + 45, + 60, + 30, + 3, + 0, + 400, + 0, + [], + 1750896000, + false, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + -1, + 60, + -1 + ], + [ + 400, + "XPTUSD_otc", + "Platinum spot OTC", + "commodity", + 2, + 45, + 60, + 30, + 3, + 1, + 0, + 312, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 528, + "YERUSD_otc", + "YER/USD OTC", + "currency", + 7, + 61, + 60, + 30, + 30, + 1, + 0, + 527, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ], + [ + 556, + "ZARUSD_otc", + "ZAR/USD OTC", + "currency", + 5, + 80, + 60, + 30, + 30, + 1, + 0, + 555, + [], + 1750896000, + true, + [ + { + "time": 60 + }, + { + "time": 120 + }, + { + "time": 180 + }, + { + "time": 300 + }, + { + "time": 600 + }, + { + "time": 900 + }, + { + "time": 1800 + }, + { + "time": 2700 + }, + { + "time": 3600 + }, + { + "time": 7200 + }, + { + "time": 10800 + }, + { + "time": 14400 + } + ], + 0, + 5, + -1 + ] +] \ No newline at end of file diff --git a/pocketoptionapi_async/client.py b/pocketoptionapi_async/client.py index ee1cc8d..8c2b335 100644 --- a/pocketoptionapi_async/client.py +++ b/pocketoptionapi_async/client.py @@ -147,7 +147,7 @@ def _setup_event_handlers(self): self._websocket.add_event_handler("disconnected", self._on_disconnected) async def connect( - self, regions: Optional[List[str]] = None, persistent: bool = None + self, regions: Optional[List[str]] = None, persistent: Optional[bool] = None ) -> bool: """ Connect to PocketOption with multiple region support @@ -162,7 +162,7 @@ async def connect( logger.info("Connecting to PocketOption...") # Update persistent setting if provided if persistent is not None: - self.persistent_connection = persistent + self.persistent_connection = bool(persistent) try: if self.persistent_connection: @@ -1181,39 +1181,31 @@ async def _on_candles_received(self, data: Dict[str, Any]) -> None: logger.info(f"🕯️ Candles received with data: {type(data)}") # Check if we have pending candle requests if hasattr(self, "_candle_requests") and self._candle_requests: - # Parse the candles data try: - # Get the first pending request to extract asset and timeframe info for request_id, future in list(self._candle_requests.items()): if not future.done(): - # Extract asset and timeframe from request_id format: "asset_timeframe" parts = request_id.split("_") if len(parts) >= 2: - asset = "_".join( - parts[:-1] - ) # Handle assets with underscores + asset = "_".join(parts[:-1]) timeframe = int(parts[-1]) - - candles = self._parse_candles_data(data, asset, timeframe) + candles = self._parse_candles_data( + data.get("candles", []), asset, timeframe + ) if self.enable_logging: logger.info( f"🕯️ Parsed {len(candles)} candles from response" ) - future.set_result(candles) if self.enable_logging: logger.debug(f"Resolved candle request: {request_id}") break - except Exception as e: if self.enable_logging: logger.error(f"Error processing candles data: {e}") - # Resolve futures with empty result for request_id, future in list(self._candle_requests.items()): if not future.done(): future.set_result([]) break - await self._emit_event("candles_received", data) async def _on_disconnected(self, data: Dict[str, Any]) -> None: @@ -1227,51 +1219,39 @@ async def _handle_candles_stream(self, data: Dict[str, Any]) -> None: try: asset = data.get("asset") period = data.get("period") - if not asset or not period: return - request_id = f"{asset}_{period}" - if self.enable_logging: logger.info(f"🕯️ Processing candle stream for {asset} ({period}s)") - - # Check if we have a pending request for this asset/period if ( hasattr(self, "_candle_requests") and request_id in self._candle_requests ): future = self._candle_requests[request_id] - if not future.done(): - # Parse candles from stream data - candles = self._parse_stream_candles(data) + candles = self._parse_stream_candles(data, asset, period) if candles: future.set_result(candles) if self.enable_logging: logger.info( f"🕯️ Resolved candle request for {asset} with {len(candles)} candles" ) - - # Clean up the request del self._candle_requests[request_id] - except Exception as e: if self.enable_logging: logger.error(f"Error handling candles stream: {e}") - def _parse_stream_candles(self, stream_data: Dict[str, Any]): + def _parse_stream_candles( + self, stream_data: Dict[str, Any], asset: str, timeframe: int + ): """Parse candles from stream update data (changeSymbol response)""" candles = [] - try: - # Stream data might contain candles in different formats candle_data = stream_data.get("data") or stream_data.get("candles") or [] - if isinstance(candle_data, list): for item in candle_data: if isinstance(item, dict): - # Dict format candle = Candle( timestamp=datetime.fromtimestamp(item.get("time", 0)), open=float(item.get("open", 0)), @@ -1279,10 +1259,11 @@ def _parse_stream_candles(self, stream_data: Dict[str, Any]): low=float(item.get("low", 0)), close=float(item.get("close", 0)), volume=float(item.get("volume", 0)), + asset=asset, + timeframe=timeframe, ) candles.append(candle) elif isinstance(item, (list, tuple)) and len(item) >= 6: - # Array format: [timestamp, open, close, high, low, volume] candle = Candle( timestamp=datetime.fromtimestamp(item[0]), open=float(item[1]), @@ -1290,16 +1271,14 @@ def _parse_stream_candles(self, stream_data: Dict[str, Any]): low=float(item[4]), close=float(item[2]), volume=float(item[5]) if len(item) > 5 else 0.0, + asset=asset, + timeframe=timeframe, ) candles.append(candle) - - # Sort by timestamp candles.sort(key=lambda x: x.timestamp) - except Exception as e: if self.enable_logging: logger.error(f"Error parsing stream candles: {e}") - return candles async def _on_keep_alive_connected(self): diff --git a/pocketoptionapi_async/connection_keep_alive.py b/pocketoptionapi_async/connection_keep_alive.py index 5705fd6..23d4b00 100644 --- a/pocketoptionapi_async/connection_keep_alive.py +++ b/pocketoptionapi_async/connection_keep_alive.py @@ -6,8 +6,8 @@ from typing import Optional, List, Callable, Dict, Any from datetime import datetime, timedelta from loguru import logger -import websockets from websockets.exceptions import ConnectionClosed +from websockets.legacy.client import connect, WebSocketClientProtocol from models import ConnectionInfo, ConnectionStatus from constants import REGIONS @@ -23,7 +23,7 @@ def __init__(self, ssid: str, is_demo: bool = True): self.is_demo = is_demo # Connection state - self.websocket: Optional[websockets.WebSocketServerProtocol] = None + self.websocket: Optional[WebSocketClientProtocol] = None self.connection_info: Optional[ConnectionInfo] = None self.is_connected = False self.should_reconnect = True @@ -138,7 +138,7 @@ async def _establish_connection(self) -> bool: # Connect with headers (like old API) self.websocket = await asyncio.wait_for( - websockets.connect( + connect( url, ssl=ssl_context, extra_headers={ @@ -198,6 +198,8 @@ async def _establish_connection(self) -> bool: async def _send_handshake(self): """Send initial handshake sequence (like old API)""" try: + if not self.websocket: + raise RuntimeError("Handshake called with no websocket connection.") # Wait for initial connection message initial_message = await asyncio.wait_for( self.websocket.recv(), timeout=10.0 @@ -408,9 +410,10 @@ async def _process_message(self, message): # Handle ping-pong (like old API) if message == "2": - await self.websocket.send("3") - self.connection_stats["last_pong_time"] = datetime.now() - logger.debug("Ping: Pong sent") + if self.websocket: + await self.websocket.send("3") + self.connection_stats["last_pong_time"] = datetime.now() + logger.debug("Ping: Pong sent") return # Handle authentication success (like old API) @@ -490,6 +493,25 @@ def get_connection_stats(self) -> Dict[str, Any]: "available_regions": len(self.available_urls), } + async def connect_with_keep_alive( + self, regions: Optional[List[str]] = None + ) -> bool: + """Establish a persistent connection with keep-alive, optionally using a list of regions.""" + # Optionally update available_urls if regions are provided + if regions: + # Assume regions are URLs or region names; adapt as needed + self.available_urls = regions + self.current_url_index = 0 + return await self.start_persistent_connection() + + async def disconnect(self) -> None: + """Disconnect and clean up persistent connection.""" + await self.stop_persistent_connection() + + def get_stats(self) -> Dict[str, Any]: + """Return connection statistics (alias for get_connection_stats).""" + return self.get_connection_stats() + async def demo_keep_alive(): """Demo of the keep-alive connection manager""" diff --git a/pocketoptionapi_async/connection_monitor.py b/pocketoptionapi_async/connection_monitor.py index e3e87b6..1aaa64c 100644 --- a/pocketoptionapi_async/connection_monitor.py +++ b/pocketoptionapi_async/connection_monitor.py @@ -602,7 +602,7 @@ def generate_diagnostics_report(self) -> Dict[str, Any]: return report - def export_metrics_csv(self, filename: str = None) -> str: + def export_metrics_csv(self, filename: str = "") -> str: """Export metrics to CSV file""" if not filename: filename = f"metrics_export_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" @@ -723,7 +723,7 @@ async def _display_loop(self): await asyncio.sleep(1) -async def run_monitoring_demo(ssid: str = None): +async def run_monitoring_demo(ssid: Optional[str] = None): """Run monitoring demonstration""" if not ssid: diff --git a/pocketoptionapi_async/constants.py b/pocketoptionapi_async/constants.py index 8080d9a..c9077cb 100644 --- a/pocketoptionapi_async/constants.py +++ b/pocketoptionapi_async/constants.py @@ -178,8 +178,10 @@ def get_all_regions(cls) -> Dict[str, str]: """Get all regions as a dictionary""" return cls._REGIONS.copy() + from typing import Optional + @classmethod - def get_region(cls, region_name: str) -> str: + def get_region(cls, region_name: str) -> Optional[str]: """Get specific region URL""" return cls._REGIONS.get(region_name.upper()) diff --git a/pocketoptionapi_async/exceptions.py b/pocketoptionapi_async/exceptions.py index f8212ac..d4759ff 100644 --- a/pocketoptionapi_async/exceptions.py +++ b/pocketoptionapi_async/exceptions.py @@ -6,7 +6,9 @@ class PocketOptionError(Exception): """Base exception for all PocketOption API errors""" - def __init__(self, message: str, error_code: str = None): + from typing import Optional + + def __init__(self, message: str, error_code: Optional[str] = None): super().__init__(message) self.message = message self.error_code = error_code diff --git a/pocketoptionapi_async/monitoring.py b/pocketoptionapi_async/monitoring.py index accbb86..2168422 100644 --- a/pocketoptionapi_async/monitoring.py +++ b/pocketoptionapi_async/monitoring.py @@ -63,11 +63,13 @@ class PerformanceMetrics: class CircuitBreaker: """Circuit breaker pattern implementation""" + from typing import Type + def __init__( self, failure_threshold: int = 5, recovery_timeout: int = 60, - expected_exception: type = Exception, + expected_exception: Type[BaseException] = Exception, ): self.failure_threshold = failure_threshold self.recovery_timeout = recovery_timeout @@ -79,7 +81,10 @@ def __init__( async def call(self, func: Callable, *args, **kwargs): """Execute function with circuit breaker protection""" if self.state == "OPEN": - if time.time() - self.last_failure_time < self.recovery_timeout: + if ( + self.last_failure_time is not None + and time.time() - self.last_failure_time < self.recovery_timeout + ): raise Exception("Circuit breaker is OPEN") else: self.state = "HALF_OPEN" @@ -155,7 +160,10 @@ async def execute(self, func: Callable, *args, **kwargs): ) await asyncio.sleep(delay) - raise last_exception + if last_exception is not None: + raise last_exception + else: + raise Exception("RetryPolicy failed but no exception was captured.") class ErrorMonitor: @@ -197,8 +205,8 @@ async def record_error( severity: ErrorSeverity, category: ErrorCategory, message: str, - context: Dict[str, Any] = None, - stack_trace: str = None, + context: Optional[Dict[str, Any]] = None, + stack_trace: Optional[str] = None, ): """Record an error event""" error_event = ErrorEvent( @@ -208,7 +216,7 @@ async def record_error( category=category, message=message, context=context or {}, - stack_trace=stack_trace, + stack_trace=stack_trace or "", ) self.errors.append(error_event) @@ -340,7 +348,7 @@ async def execute_with_monitoring( "args": str(args)[:200], # Truncate for security "kwargs": str({k: str(v)[:100] for k, v in kwargs.items()})[:200], }, - stack_trace=None, # Could add traceback.format_exc() here + stack_trace="", # Could add traceback.format_exc() here ) raise e diff --git a/pocketoptionapi_async/websocket_client.py b/pocketoptionapi_async/websocket_client.py index 7d54d75..13e4a47 100644 --- a/pocketoptionapi_async/websocket_client.py +++ b/pocketoptionapi_async/websocket_client.py @@ -11,6 +11,7 @@ from collections import deque import websockets from websockets.exceptions import ConnectionClosed +from websockets.legacy.client import WebSocketClientProtocol from loguru import logger from .models import ConnectionInfo, ConnectionStatus, ServerTime @@ -61,8 +62,7 @@ class ConnectionPool: """Connection pool for better resource management""" def __init__(self, max_connections: int = 3): - self.max_connections = max_connections - self.active_connections: Dict[str, websockets.WebSocketServerProtocol] = {} + self.active_connections: Dict[str, WebSocketClientProtocol] = {} self.connection_stats: Dict[str, Dict[str, Any]] = {} self._pool_lock = asyncio.Lock() @@ -119,7 +119,7 @@ class AsyncWebSocketClient: """ def __init__(self): - self.websocket: Optional[websockets.WebSocketServerProtocol] = None + self.websocket: Optional[WebSocketClientProtocol] = None self.connection_info: Optional[ConnectionInfo] = None self.server_time: Optional[ServerTime] = None self._ping_task: Optional[asyncio.Task] = None @@ -143,6 +143,7 @@ def __init__(self): "40": self._handle_connection_message, "451-[": self._handle_json_message_wrapper, "42": self._handle_auth_message, + "[[5,": self._handle_payout_message, } async def connect(self, urls: List[str], ssid: str) -> bool: @@ -166,7 +167,7 @@ async def connect(self, urls: List[str], ssid: str) -> bool: ssl_context.verify_mode = ssl.CERT_NONE # Connect with timeout - self.websocket = await asyncio.wait_for( + ws = await asyncio.wait_for( websockets.connect( url, ssl=ssl_context, @@ -177,6 +178,7 @@ async def connect(self, urls: List[str], ssid: str) -> bool: ), timeout=10.0, ) + self.websocket = ws # type: ignore # Update connection info region = self._extract_region_from_url(url) self.connection_info = ConnectionInfo( @@ -209,6 +211,86 @@ async def connect(self, urls: List[str], ssid: str) -> bool: raise ConnectionError("Failed to connect to any WebSocket endpoint") + async def _handle_payout_message(self, message: str) -> None: + """ + Handles messages related to asset payout information. + These messages are typically in the format `[[5, [...]]]`. + The payout percentage is located at index 5 within the inner list. + + Args: + message: The raw WebSocket message string containing payout data. + """ + try: + # The message starts with "[[5," and is a JSON string. + # We need to parse it as JSON. + # Example: [[5, ["5", "#AAPL", "Apple", "stock", 2, 50, ...]]] + # The structure is a list containing a list, where the first element + # of the inner list is '5' (indicating payout data), and the rest is the data. + + # Remove the initial '[[5,' and the final ']]' and parse the remaining as JSON. + # A more robust way is to find the first '[' and last ']' of the actual JSON array. + + # Find the start of the actual JSON array data + json_start_index = message.find("[", message.find("[") + 1) + # Find the end of the actual JSON array data + json_end_index = message.rfind("]") + + if json_start_index == -1 or json_end_index == -1: + logger.warning( + f"Could not find valid JSON array in payout message: {message[:100]}..." + ) + return + + # Extract the inner JSON string that represents the array of arrays + json_str = message[json_start_index : json_end_index + 1] + + # Parse the extracted JSON string + data: List[List[Any]] = json.loads(json_str) + + # Iterate through each asset's payout information + for asset_data in data: + # Ensure the asset_data is a list and has enough elements + if isinstance(asset_data, list) and len(asset_data) > 5: + try: + # Extract relevant information + asset_id = asset_data[0] + asset_symbol = asset_data[1] + asset_name = asset_data[2] + asset_type = asset_data[3] + payout_percentage = asset_data[5] # Payout is at index 5 + + payout_info = { + "id": asset_id, + "symbol": asset_symbol, + "name": asset_name, + "type": asset_type, + "payout": payout_percentage, + } + logger.debug(f"Parsed payout info: {payout_info}") + # Emit an event with the parsed payout data + await self._emit_event("payout_update", payout_info) + except IndexError: + logger.warning( + f"Payout message element missing for asset_data: {asset_data}" + ) + except Exception as e: + logger.error( + f"Error processing individual asset payout data {asset_data}: {e}" + ) + else: + logger.warning( + f"Unexpected format for asset payout data: {asset_data}" + ) + + except json.JSONDecodeError as e: + logger.error( + f"Failed to decode JSON from payout message '{message[:100]}...': {e}" + ) + except Exception as e: + logger.error( + f"Error in _handle_payout_message for message '{message[:100]}...': {e}" + ) + async def disconnect(self): """Gracefully disconnect from WebSocket""" logger.info("Disconnecting from WebSocket") @@ -349,11 +431,19 @@ async def _send_handshake(self, ssid: str) -> None: try: # Wait for initial connection message with "0" and "sid" (like old API) logger.debug("Waiting for initial handshake message...") + if not self.websocket: + raise WebSocketError("WebSocket is not connected during handshake") initial_message = await asyncio.wait_for( self.websocket.recv(), timeout=10.0 ) logger.debug(f"Received initial: {initial_message}") + # Ensure initial_message is a string + if isinstance(initial_message, memoryview): + initial_message = bytes(initial_message).decode("utf-8") + elif isinstance(initial_message, (bytes, bytearray)): + initial_message = initial_message.decode("utf-8") + # Check if it's the expected initial message format if initial_message.startswith("0") and "sid" in initial_message: # Send "40" response (like old API) @@ -366,8 +456,14 @@ async def _send_handshake(self, ssid: str) -> None: ) logger.debug(f"Received connection: {conn_message}") - # Check if it's the expected connection message format - if conn_message.startswith("40") and "sid" in conn_message: + # Ensure conn_message is a string + if isinstance(conn_message, memoryview): + conn_message_str = bytes(conn_message).decode("utf-8") + elif isinstance(conn_message, (bytes, bytearray)): + conn_message_str = conn_message.decode("utf-8") + else: + conn_message_str = conn_message + if conn_message_str.startswith("40") and "sid" in conn_message_str: # Send SSID authentication (like old API) await self.send_message(ssid) logger.debug("Sent SSID authentication") @@ -538,7 +634,7 @@ async def _process_message_optimized(self, message) -> None: if cached_time and time.time() - cached_time < self._cache_ttl: # Use cached processing result - cached_result = self._message_cache.get(message_hash) + cached_result = self._message_cache.get(str(message_hash)) if cached_result: await self._emit_event("cached_message", cached_result) return @@ -553,7 +649,10 @@ async def _process_message_optimized(self, message) -> None: logger.warning(f"Unknown message type: {message[:20]}...") # Cache processing result - self._message_cache[message_hash] = {"processed": True, "type": "unknown"} + self._message_cache[str(message_hash)] = { + "processed": True, + "type": "unknown", + } self._message_cache[f"{message_hash}_time"] = time.time() except Exception as e: @@ -651,7 +750,7 @@ def _extract_region_from_url(self, url: str) -> str: return "DEMO" else: return "UNKNOWN" - except: + except Exception: return "UNKNOWN" @property @@ -660,6 +759,6 @@ def is_connected(self) -> bool: return ( self.websocket is not None and not self.websocket.closed - and self.connection_info + and self.connection_info is not None and self.connection_info.status == ConnectionStatus.CONNECTED ) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..fdffa2a --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +# placeholder diff --git a/tests/advanced_testing_suite.py b/tests/advanced_testing_suite.py index 58e8782..7ce11e6 100644 --- a/tests/advanced_testing_suite.py +++ b/tests/advanced_testing_suite.py @@ -13,7 +13,7 @@ from pocketoptionapi_async.client import AsyncPocketOptionClient from pocketoptionapi_async.models import OrderDirection, TimeFrame -from connection_keep_alive import ConnectionKeepAlive +from pocketoptionapi_async.connection_keep_alive import ConnectionKeepAlive class AdvancedTestSuite: diff --git a/tests/integration_tests.py b/tests/integration_tests.py index 2ca0147..942bf97 100644 --- a/tests/integration_tests.py +++ b/tests/integration_tests.py @@ -12,9 +12,9 @@ from pocketoptionapi_async.client import AsyncPocketOptionClient from pocketoptionapi_async.models import TimeFrame -from connection_keep_alive import ConnectionKeepAlive -from connection_monitor import ConnectionMonitor -from load_testing_tool import LoadTester, LoadTestConfig +from pocketoptionapi_async.connection_keep_alive import ConnectionKeepAlive +from pocketoptionapi_async.connection_monitor import ConnectionMonitor +from performance.load_testing_tool import LoadTester, LoadTestConfig class IntegrationTester: diff --git a/tests/performance/__init__.py b/tests/performance/__init__.py new file mode 100644 index 0000000..fdffa2a --- /dev/null +++ b/tests/performance/__init__.py @@ -0,0 +1 @@ +# placeholder diff --git a/tests/performance/load_testing_tool.py b/tests/performance/load_testing_tool.py index 385213f..cac3fb2 100644 --- a/tests/performance/load_testing_tool.py +++ b/tests/performance/load_testing_tool.py @@ -14,7 +14,7 @@ from pocketoptionapi_async.client import AsyncPocketOptionClient from pocketoptionapi_async.models import OrderDirection, TimeFrame -from connection_keep_alive import ConnectionKeepAlive +from pocketoptionapi_async.connection_keep_alive import ConnectionKeepAlive @dataclass diff --git a/tests/test_order_placement_fix.py b/tests/test_order_placement_fix.py index 6d30569..fee41f1 100644 --- a/tests/test_order_placement_fix.py +++ b/tests/test_order_placement_fix.py @@ -5,6 +5,7 @@ import asyncio import os from loguru import logger +from pocketoptionapi_async import AsyncPocketOptionClient, OrderDirection # Configure logger logger.remove() @@ -14,8 +15,6 @@ level="INFO", ) -from pocketoptionapi_async import AsyncPocketOptionClient, OrderDirection - async def test_order_placement_fix(): """Test the order placement fix""" diff --git a/tools/client_test.py b/tools/client_test.py index 213c94a..39ff86a 100644 --- a/tools/client_test.py +++ b/tools/client_test.py @@ -1,19 +1,21 @@ import websockets import anyio from rich.pretty import pprint as print -from pocketoptionapi.constants import REGION +from pocketoptionapi_async.constants import REGIONS SESSION = r'42["auth",{"session":"a:4:{s:10:\"session_id\";s:32:\"a1dc009a7f1f0c8267d940d0a036156f\";s:10:\"ip_address\";s:12:\"190.162.4.33\";s:10:\"user_agent\";s:120:\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OP\";s:13:\"last_activity\";i:1709914958;}793884e7bccc89ec798c06ef1279fcf2","isDemo":0,"uid":27658142,"platform":1}]' async def websocket_client(url, pro): - for i in REGION.get_regions(REGION): + # Use REGIONS.get_all() to get a list of region URLs + region_urls = REGIONS.get_all() + for i in region_urls: print(f"Trying {i}...") try: async with websockets.connect( i, extra_headers={ - "Origin": "https://pocketoption.com/" # main URL + "Origin": "https://pocketoption.com/" # main URL }, ) as websocket: async for message in websocket: @@ -23,14 +25,13 @@ async def websocket_client(url, pro): except Exception as e: print(e) print("Connection lost... reconnecting") - # await anyio.sleep(5) return True async def pro(message, websocket, url): - # if byte data - if type(message) == type(b""): - # cut 100 first symbols of byte date to prevent spam + # Use isinstance for type checking + if isinstance(message, bytes): + # cut 100 first symbols of byte data to prevent spam print(str(message)[:100]) return else: diff --git a/tools/get_ssid.py b/tools/get_ssid.py index 3403302..cf0efb5 100644 --- a/tools/get_ssid.py +++ b/tools/get_ssid.py @@ -3,6 +3,7 @@ import time import re import logging +from typing import cast, List, Dict, Any from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from driver import get_driver @@ -94,7 +95,12 @@ def get_pocketoption_ssid(): # Retrieve performance logs which include network requests and WebSocket frames. # These logs are crucial for capturing the raw WebSocket messages. - performance_logs = driver.get_log("performance") + get_log = getattr(driver, "get_log", None) + if not callable(get_log): + raise AttributeError( + "Your WebDriver does not support get_log(). Make sure you are using Chrome with performance logging enabled." + ) + performance_logs = cast(List[Dict[str, Any]], get_log("performance")) logger.info(f"Collected {len(performance_logs)} performance log entries.") found_full_ssid_string = None