- Доступ к таймсериям и индикаторам - CopyTime
- Доступ к таймсериям и индикаторам - CopyOpen
- Доступ к таймсериям и индикаторам - CopyClose
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
На мой взгляд лучше рассмотреть вариант исполнения кода при получении тика по конкретному инструменту. Не все инструменты перебирать с какой-то периодичностью, а обрабатывать только тот который получил очередной тик.
Вариант рабочий. Я это делал, но каждый инструмент даёт разные результаты при одинаковых параметрах. То-есть при одних параметрах инструмент_1 даёт прибыль, а инструмент_2 убытки. Поменяли параметры и ситуация совсем противоположная… По этой причине я отказался от этой затеи и сделал этот советник для работы только с тем инструментом на график которого установлен.
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
У меня скальперы работают по OnTimer с частотой дискретизации 1 Гц и я считаю это оптимальным с точки зрения нагрузки на CPU и пропуском несущественных данных. HFT в данное время на форе это фантастика, надо быть реалистом. Вот нашел свой старый советник, должен писать даные в файл, не проверял
------------------
//+------------------------------------------------------------------+ //| SaveTicks.mq5 | //| Alexey Volchanskiy | //| http://mql.gnomio.com | //+------------------------------------------------------------------+ #property copyright "Alexey Volchanskiy" #property link "http://mql.gnomio.com" #property version "1.01" #property description "SaveTicks save tick data for multiple symbols in files" enum ESelectSymbols { EAllSymbols, //All symbols EMarketWatchSymbols,//MarketWatch symbols ELoadFromFile //Load list of symbols from file }; enum EFormatRecording { ECsv, //CSV EBin, //Binary EAll //CSV+Binary }; enum EFormatTime { EServerTime, //Server time, 1 sec precision ELocalTime //Local windows time, 1 ms precision }; input int TimerMsInterval = 500; //Recording interval input ESelectSymbols SelectSymbols = EMarketWatchSymbols; //The symbols chosen as... input string SymbolsFileName = "InputSymbolList.txt"; //Name of file with all symbol names input EFormatRecording FormatRecording = ECsv; //Format recording input EFormatTime FormatTime = EServerTime; //Time format string SymbolList[]; int FileSymbolCsv[]; int FileSymbolBin[]; int FileSymbolList; int OnInit() { if(CreateSymbolList() == -1) ExpertRemove(); EventSetMillisecondTimer(TimerMsInterval); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { EventKillTimer(); for(int n = 0; n < ArraySize(SymbolList); n++) { FileClose(FileSymbolCsv[n]); FileClose(FileSymbolBin[n]); } } void OnTimer() { static string dt; static SYSTEMTIME st; static MqlTick mt; if(FormatTime == ELocalTime) dt = TimeToString(TimeLocal(), TIME_DATE|TIME_MINUTES|TIME_SECONDS); else dt = TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES|TIME_SECONDS); for(int n = 0; n < ArraySize(SymbolList); n++) { if(!SymbolInfoTick(SymbolList[n], mt)) return; if(FormatRecording == ECsv || FormatRecording == EAll) { if(FileSymbolCsv[n] == INVALID_HANDLE) return; FileWrite(FileSymbolCsv[n], dt, mt.bid, mt.ask); } if(FormatRecording == EBin || FormatRecording == EAll) { if(FileSymbolBin[n] == INVALID_HANDLE) return; if(FormatTime == ELocalWinAPI) { FileWriteStruct(FileSymbolBin[n], st); FileWriteStruct(FileSymbolBin[n], mt); } else { FileWriteLong(FileSymbolBin[n], TimeCurrent()); FileWriteStruct(FileSymbolBin[n], mt); } } } } int CreateSymbolList() { int stotal = 0; if(SelectSymbols == ELoadFromFile) stotal = LoadSymbolList(SymbolsFileName); else { stotal = SymbolsTotal((bool)SelectSymbols); ArrayResize(SymbolList, stotal); } ArrayResize(FileSymbolCsv, stotal); ArrayResize(FileSymbolBin, stotal); for(int n = 0; n < stotal; n++) { if(SelectSymbols != ELoadFromFile) SymbolList[n] = SymbolName(n, (bool)SelectSymbols); string fname = SymbolList[n] + "_" + MQLInfoString(MQL_PROGRAM_NAME); if(FormatRecording == ECsv || FormatRecording == EAll) { FileSymbolCsv[n] = FileOpen(fname + ".csv", FILE_WRITE | FILE_READ | FILE_SHARE_READ | FILE_CSV | FILE_ANSI, ','); if(FileSymbolCsv[n] == INVALID_HANDLE) { Alert("Can't open file " + fname, "Error of opening file"); return -1; } FileSeek(FileSymbolCsv[n], 0, SEEK_END); } if(FormatRecording == EBin || FormatRecording == EAll) { FileSymbolBin[n] = FileOpen(fname + ".bin", FILE_WRITE | FILE_READ | FILE_SHARE_READ | FILE_BIN); if(FileSymbolBin[n] == INVALID_HANDLE) { Alert("Can't open file " + fname, "Error of opening file"); return -1; } FileSeek(FileSymbolBin[n], 0, SEEK_END); } } return SaveSymbolList(); } int SaveSymbolList() { string fname = "AllSymbols_" + MQLInfoString(MQL_PROGRAM_NAME) + ".txt"; int file = FileOpen(fname, FILE_WRITE | FILE_TXT); if(file == INVALID_HANDLE) { Alert("Can't open file " + fname, "Error of opening file"); return -1; } FileWrite(file, IntegerToString(ArraySize(SymbolList))); for(int n = 0; n < ArraySize(SymbolList); n++) FileWrite(file, SymbolList[n]); FileClose(file); return ArraySize(SymbolList); } int LoadSymbolList(string fname) { int file = -1; file = FileOpen(fname, FILE_READ | FILE_TXT); if(file == INVALID_HANDLE) { Alert("Can't open file " + fname); return -1; } int size = (int)StringToInteger(FileReadString(file)); Print("size=", size); if(size > 0) ArrayResize(SymbolList, size); else { Alert("First string <size> is incorrect in file " + fname); return -1; } for(int n = 0; n < ArraySize(SymbolList); n++) { SymbolList[n] = FileReadString(file); Print(SymbolList[n]); } FileClose(file); return size; }
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
а померь сколько времени занимает твой OnTimer, "обход пар" и сколько прочие и как часто они вызываются, сколько всё занимает в сумме с таймером и без
от этой статистики и прикинь
----
PS/ но это относится не непосредственно к OnTimer, а к тому как часто из него можно дёргать "обход валютных пар" не порушив всё прочее.
Сам по себе OnTimer вполне можно ставить и на 50 или даже 20msc, а в нём простые+быстрые проверки "не пора ли запустить то, или сё"
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
например созрел сигнал, а тики не приходят, нужно чтобы сделка случилась именно в этот момент
у меня для этого таймер, время 30 секунд
кстати, про таймеры :
время в милисек. Не относящееся к теме замазано.
смотрим внимательнее: даже SymbolInfoTick выполнялся почти секунду :-(
что случилось ? а это фоновое обновление терминала, оно вот так сказывается - всё начинает притормаживать. Даже пинг увеличивается, на скриншоте самое верхнее.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
