Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
- Доступ к таймсериям и индикаторам - CopyTime
- Доступ к таймсериям и индикаторам - CopyOpen
- Доступ к таймсериям и индикаторам - CopyClose
Pavlo Minakov:
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
Зависит от частоты поступления тиков. А она в свою очередь зависит от инструмента, дня недели, времени суток ...
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
На мой взгляд лучше рассмотреть вариант исполнения кода при получении тика по конкретному инструменту. Не все инструменты перебирать с какой-то периодичностью, а обрабатывать только тот который получил очередной тик.
Вариант рабочий. Я это делал, но каждый инструмент даёт разные результаты при одинаковых параметрах. То-есть при одних параметрах инструмент_1 даёт прибыль, а инструмент_2 убытки. Поменяли параметры и ситуация совсем противоположная… По этой причине я отказался от этой затеи и сделал этот советник для работы только с тем инструментом на график которого установлен.
Pavlo Minakov:
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне?
Если вы работаете только на Форекс, то меньше 100 мс делать нет смысла. Все равно время исполнения на сервере считается отличным, если 300 мс. А есть брокеры, которые не дают закрывать прибыльные сделки минутами! Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую 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; }
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь