Обсуждение статьи "Разработка системы репликации - Моделирование рынка (Часть 10): Только реальные данные для репликации"
Привет, Даниил, добрый вечер!
Даниил, у меня следующая ситуация: я могу запустить и отладить сервис. Но я не могу отладить индикатор, потому что когда я запускаю сервис, он уже загружает исполняемый файл индикатора.
Я не знаю, что я делаю не так, но, насколько я понимаю, нельзя запустить код индикатора, чтобы отладить его. Действительно ли это так? Не могли бы вы мне подсказать?
Привет, Дэниел, добрый вечер!
Даниил, у меня следующая ситуация: я могу запустить и отладить сервис. Но я не могу отладить индикатор, потому что когда я запускаю сервис, он уже загружает исполняемый файл индикатора.
Я не знаю, что я делаю не так, но, насколько я понимаю, нельзя запустить код индикатора, чтобы отладить его. Действительно ли это так? Не могли бы вы мне подсказать?
Вы абсолютно НЕ делаете ничего неправильно.
На самом деле служба инициализирует контрольный индикатор, как только все готово к тому, чтобы пользователь мог играть в службу.
Я не совсем понимаю, почему вы хотите отлаживать индикатор. На нем практически ничего не выполняется. Он служит лишь формой взаимодействия между пользователем и сервисом. Без него было бы очень сложно контролировать, когда мы хотим включить или приостановить сервис. В любом случае, вы не сделаете ничего плохого, если попытаетесь изучить, как работает система. Но в качестве совета я советую вам внимательно читать статьи. В них подробно объясняется, как работает система, что сэкономит вам много сил на попытках понять, как происходят взаимодействия. 😁👍
Привет, Даниил, доброе утро!
Даниил, я немного изучил ваш код и разработку на платформе Metatrader 5, чтобы запустить робота на реплее/симуляторе, предложенном в ваших статьях.
Робот основан на потоке входящих данных, т.е. он считает входящие тики и производит расчеты для того, чтобы определить, нужно ли совершать сделки.
Я уже разбирался с этой же проблемой в других постах, заранее прошу прощения за настойчивость. Дело в том, что я изучил немного больше и сделал те реализации, которые считал нужными, чтобы робот (советник) мог получать тики от сервиса Replay.
Но у меня возникла следующая проблема: первые тики робот получает правильно, один за другим, но после первых 47 полученных тиков (я поставил счетчик), он начинает получать тики очень разрозненно, и я не могу понять почему.
Я хотел бы показать вам реализацию и попросить вашей помощи в решении проблемы, если это возможно.
Вот изменения, которые я сделал:
- В классе C_Replay (строки выделены желтым цветом):
- В методе Event_OnTime:
- Я создал переменную типа MqlTick для получения тика, который будет отправлен на график;
- После отправки обновления бара(CustomRatesUpdate), я поместил код для отправки тика на график и жду, пока он будет обработан через глобальную переменную "def_GlobalVariableTick";
inline int Event_OnTime(void) { bool bNew; int mili, iPos; u_Interprocess Info; MqlTick TickToAdd[1]; static MqlRates Rate[1]; static datetime _dt = 0; if (m_ReplayCount >= m_Ticks.nTicks) return -1; if (bNew = (_dt != m_Ticks.Info[m_ReplayCount].time)) { _dt = m_Ticks.Info[m_ReplayCount].time; Rate[0].real_volume = 0; Rate[0].tick_volume = 0; } mili = (int) m_Ticks.Info[m_ReplayCount].time_msc; do { while (mili == m_Ticks.Info[m_ReplayCount].time_msc) { Rate[0].close = m_Ticks.Info[m_ReplayCount].last; Rate[0].open = (bNew ? Rate[0].close : Rate[0].open); Rate[0].high = (bNew || (Rate[0].close > Rate[0].high) ? Rate[0].close : Rate[0].high); Rate[0].low = (bNew || (Rate[0].close < Rate[0].low) ? Rate[0].close : Rate[0].low); Rate[0].real_volume += (long) m_Ticks.Info[m_ReplayCount].volume_real; bNew = false; m_ReplayCount++; } mili++; }while (mili == m_Ticks.Info[m_ReplayCount].time_msc); Rate[0].time = m_Ticks.Info[m_ReplayCount].time; CustomRatesUpdate(def_SymbolReplay, Rate, 1); iPos = (int)((m_ReplayCount * def_MaxPosSlider) / m_Ticks.nTicks); GlobalVariableGet(def_GlobalVariableReplay, Info.u_Value.df_Value); if (Info.s_Infos.iPosShift != iPos) { Info.s_Infos.iPosShift = (ushort) iPos; GlobalVariableSet(def_GlobalVariableReplay, Info.u_Value.df_Value); } // Apenas plotará o tick no grafico se o robo tiver criado a variavel "def_GlobalVariableTick" if (GlobalVariableCheck(def_GlobalVariableTick)) { TickToAdd[0]=m_Ticks.Info[m_ReplayCount]; Print("Tick enviado: Time: ", TickToAdd[0].time, " Time_msc: ", TickToAdd[0].time_msc, " Bid: ", TickToAdd[0].bid, " Ask: ", TickToAdd[0].ask, " Last: ", TickToAdd[0].last, " Volume: ", TickToAdd[0].volume_real); GlobalVariableSet(def_GlobalVariableTick, 1); // Quando o EA receber o tick (OnTick) irá alterar para ZERO CustomTicksAdd(def_SymbolReplay, TickToAdd); short ctd=0; while (GlobalVariableGet(def_GlobalVariableTick) > 0 && (!_StopFlag) && ctd <= 50) { ctd++; Sleep(50) }; } return (int)(m_Ticks.Info[m_ReplayCount].time_msc < mili ? m_Ticks.Info[m_ReplayCount].time_msc + (1000 - mili) : m_Ticks.Info[m_ReplayCount].time_msc - mili); }
- Код для робота (советника), который получает тик для обработки:
#define def_GlobalVariableTick "ReplayTick" //+------------------------------------------------------------------+ int OnInit() { GlobalVariableTemp(def_GlobalVariableTick); Print("Variavel Criada: ", def_GlobalVariableTick); return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { GlobalVariableDel(def_GlobalVariableTick); } //+------------------------------------------------------------------+ void OnTick() { MqlTick mTick; static int ctd=0; SymbolInfoTick(Symbol(),mTick); ctd++; Print(Symbol(), " Tick Recebido ", ctd, ": Time: ", mTick.time, " Time_msc: ", mTick.time_msc, " Bid: ", mTick.bid, " Ask: ", mTick.ask, " Last: ", mTick.last, " Volume: ", mTick.volume); // . // . // Код обработки тиков // . // . // Измените значение глобальной переменной на ноль, чтобы получить следующий тик GlobalVariableSet(def_GlobalVariableTick, 0); }
продолжение ....
Таким образом, когда вам понадобится остановить робота для отладки, воспроизведение будет ждать, пока вы не пройдете строку, которая устанавливает глобальную переменную "def_GlobalVariableTick" в ноль;
Понятно?
продолжение ....
Таким образом, когда мне нужно будет остановить робота для отладки, воспроизведение будет ждать, пока я не пройду строку, которая устанавливает глобальную переменную "def_GlobalVariableTick" в ZERO;
Понятно?
Дело в том, что этот механизм претерпел изменения. Посмотрите более новые статьи, в них показано, как правильно выпускать тики. Вы даже можете следить за ними в окне наблюдения за рынком, DOM. На данный момент у нас есть статья для части 28, уже опубликованная на португальском языке. Так что код, который вы пытаетесь подправить и которым пытаетесь манипулировать, уже полностью устарел. Вам нужно следить за статьями, чтобы быть в курсе развития системы. Не привязывайтесь к коду в любой из статей до тех пор, пока серия не будет полностью опубликована. Потому что со временем они претерпят ряд изменений, чтобы выполнить обещанное: РАЗРАБОТАЙТЕ РЕПЛЕЙ / СИМУЛЯТОР, и это позволит использовать все, что у вас уже есть или разрабатывается для использования на DEMO или РЕАЛЬНОМ счете. Либо на фондовом рынке, либо на FOREX.
НЕ пытайтесь объединить ваш советник, индикатор или скрипт с REPLAY / SIMULATOR, по крайней мере, пока. Потому что он будет претерпевать значительные изменения в коде ... Просто создавайте свой код, не заботясь о REPLAY / SIMULATOR ... Наступит время, когда я ненадолго прекращу его разработку, чтобы показать вам, как создать несколько вспомогательных модулей. Когда это произойдет, вы сможете начать интегрировать в него свой код. И даже тогда очень медленно, потому что когда модули, которые я покажу вам, как разрабатывать, достигнут определенного уровня функциональности, они будут интегрированы в REPLAY / SIMULATOR ... вот тогда вам действительно нужно понять, как будет работать вся система. Иначе вы не сможете интегрировать свой код в СЕРВИС REPLAY / SIMULATOR.
Так что не напрягайтесь и изучайте статьи, всегда оставаясь в курсе того, что разрабатывается... 😁👍
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Разработка системы репликации - Моделирование рынка (Часть 10): Только реальные данные для репликации:
Здесь мы рассмотрим, как более надежные данные (торгуемые тики) можно использовать в системе репликации, не беспокоясь о том, скорректированы они или нет.
На представленном ниже видео вы можете увидеть результат работы, представленной в этой статье. Хоть некоторые вещи и не видны визуально, просмотр видео даст вам четкое представление о ходе работы системы репликации/моделирования во всех этих статьях. Просто посмотрите видео и сравните изменения с самого начала и до настоящего момента.
В следующей статье мы продолжим развитие этой системы, так как еще остаются некоторые действительно необходимые функции для реализации.
Автор: Daniel Jose