Обсуждение статьи "Реализация мультивалютного режима в MetaTrader 5" - страница 4

 
artall:

В индикаторе всё-таки или в эксперте???

Извини, я только-только разбираюсь с МТ5

Из индикатора отправляешь событие (сигнал) с помощью EventChartCustom. А в эксперте принимаешь сигнал и обрабатываешь его с помощью OnChartEvent В справке подробно об этом написано.

 

Приветы! Если тики по нескольким парам пойдут очень быстро,а сами фукции обработки предположим длительнее,то события будут накапливаться и ждать окончания предыдущей обработки?

"Пробка" не получится случаем ,с последующими ошибками? 

Документация по MQL5: Математические функции / MathRand
Документация по MQL5: Математические функции / MathRand
  • www.mql5.com
Математические функции / MathRand - Документация по MQL5
 
Karlson:

Приветы! Если тики по нескольким парам пойдут очень быстро,а сами фукции обработки предположим длительнее,то события будут накапливаться и ждать окончания предыдущей обработки?

"Пробка" не получится случаем ,с последующими ошибками? 

Теоретически такое возможно. Практически у меня работает на 12 инструментах на тиках без проблем. Естественно, что из обработчика событий постарался убрать все, что возможно. Вообще из шпионов можно отправлять не тики или "новый бар", а просто сигналы, что существенно разгрузит обработчик событий в эксперте.
 

Вот у меня тоже идея промелькнула отправлять новый бар.Но потом промелькнула следующая,что если эксперту не критично работать по новым барам,то отталкиваться можно и простым способом,контролируя новый бар на основном тф,на который установлен эксперт.

Спасибо. 

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 

Помню раньше речь шла о том, что в тестере не обрабатывается OnChartEvent(). Сейчас проверил и обнаружил, что если повесить эксперта на таймфрейм выше, чем тот который принимается, как событие, то такое событие пропускается. Но если эксперт висит на таймфрейме ниже либо равном минимальному, то такие события принимаются.

То есть, если работать по сформировавшимся барам, то можно поставить в тестере минимальный ТФ и тест пройдёт правильно даже в режиме "Только цены открытия". Но если есть необходимость обрабатывать тики, то такое событие будет пропускаться в этом режиме тестирования. Событие каждый тик будет обрабатываться в режимах "OHLC на M1" и "Все тики".

 
tol64:

Помню раньше речь шла о том, что в тестере не обрабатывается OnChartEvent(). Сейчас проверил и обнаружил, что если повесить эксперта на таймфрейм выше, чем тот который принимается, как событие, то такое событие пропускается. Но если эксперт висит на таймфрейме ниже либо равном минимальному, то такие события принимаются.

Так было и раньше или разработчиками уже принят шаг в сторону обработки OnChartEvent() в тестере?

P.S. Тест проводил в режиме визуализации. 

да уже приняли шаг, и довольно давно, это обсуждалось с пол года назад (щас уже не найду где).
 
Urain:
да уже приняли шаг, и довольно давно, это обсуждалось с пол года назад (щас уже не найду где).
Спасибо. Отлично. А я думал, что в курсе всех событий и ничего не пропустил.))
 

скажите,

1. если мне нужет только Bid и Ask c других валют, обьективно ли пользоваться "шпионами"

2. это просто идея, нет ли возможности в функции onChartEvent проверять события с других валют а не только с текущей?

3. нельзя ли в событии onTimer поставить значение таймера меньше еденицы, чтобы он скачивал значение котировок намного чаще и соответственно отставал от времени последнего тика на минимальное время

4. или можно ли с помощью "CHARTEVENT_CUSTOM+n" проверять, в моем случае пересечение машек, на других граффиках? 

 
Lazarev:

скажите,

1. если мне нужет только Bid и Ask c других валют, обьективно ли пользоваться "шпионами"

2. это просто идея, нет ли возможности в функции onChartEvent проверять события с других валют а не только с текущей?

3. нельзя ли в событии onTimer поставить значение таймера меньше еденицы, чтобы он скачивал значение котировок намного чаще и соответственно отставал от времени последнего тика на минимальное время

4. или можно ли с помощью "CHARTEVENT_CUSTOM+n" проверять, в моем случае пересечение машек, на других граффиках? 

1. Пользуюсь.

2. Есть возможность. Событие с другой валюты должно быть отправлено на график, где установлен эксперт с OnChartEvent().

3. Нет. Единица - это минимум.

4. Можно.  

 

Создал простой "индикатор-шпион" SendEvent.mq5, отправляющий событие при поступлении новой котировки:

#property indicator_chart_window
#property indicator_plots 0
int OnInit()
  {
   return(0);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   EventChartCustom(0,1,0,0,_Symbol);
   return(rates_total);
  }

Создал простой советник, который получает события от этого индикатора и пытается совершить торговую операцию (привожу часть, полный текст в приложенном файле):

void OnChartEvent(const int id, // Обработчик события ChartEvent
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)            // sparam содержит название инструмента
  {
      // запрашиваем Digit,Point,Ask,Bid для инструмента, для которого пришло событие
      if(!SymbolInfoInteger(sparam,SYMBOL_DIGITS,dig)) Print("SymbolInfoInteger(SYMBOL_DIGITS) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_POINT,p)) Print("SymbolInfoDouble(SYMBOL_POINT) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_BID,Bid)) Print("SymbolInfoDouble(SYMBOL_BID) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_ASK,Ask)) Print("SymbolInfoDouble(SYMBOL_ASK) ERROR!");
      d=(int)dig;
      if(1>0) // всегда покупаем
        {
         q.action=TRADE_ACTION_DEAL; // заполняем структуру MqlTradeRequest и пытаемся совершить торговую операцию
         q.symbol=sparam; // sparam содержит имя инструмента
         q.volume=Lot;
         q.price=NormalizeDouble(Ask,d);
         q.sl=NormalizeDouble(Ask-p*StopLoss,d);
         q.tp=NormalizeDouble(Ask+p*TakeProfit,d);
         q.deviation=0;
         q.type=ORDER_TYPE_BUY;
         q.type_filling=ORDER_FILLING_FOK;
         // проверяем текущие свойства инструмента
         Print("Bid=",DoubleToString(Bid,8),", Ask=",DoubleToString(Ask,8),", Digits=",d,", Points=",DoubleToString(p,8));
         // проверяем структуру торгового запроса, который будем отправлять
         Print("q.action=",q.action,", q.symbol=",q.symbol,", q.volume=",q.volume,", q.price=",DoubleToString(q.price,d),", q.sl=",DoubleToString(q.sl,d),", q.tp=",DoubleToString(q.tp,d),", q.deviation=",q.deviation,", q.type=",q.type,", q.type_filling=",q.type_filling);
         Print(OrderCheck(q,ch));                                  // проверка возможности совершить торговую операцию
         Print("ch.retcode=",ch.retcode,", ch.comment=",ch.comment); // результат
         Print("OrderSend:",OrderSend(q,s));                        // попытка совершить торговую операцию
         Print("s.retcode=",s.retcode,", s.comment=",s.comment);     // результат
        }
      if(0>0) // если исправить условие - будем продавать
        {
         // аналогично для продажи
        }
     }
  }

Советник получает события от индикатора, но в тестере (и с визуализацией и без нее) не может выполнить торговую операцию - возвращается ошибка  "Invalid Request", код возврата 10013. В реальном времени работает нормально. Если в советнике торговую операцию совершать из OnTick() вместо OnChartEvent() - тоже работает нормально.

Вставил отправку торгового запроса в шаблон советника, предлагаемый автором статьи в CodeBase - тоже не работают торговые операции (та же ошибка).

Кто-нибудь подскажет в чем причина? Читал в этой ветке, что  в тестере не обрабатывается OnChartEvent(), но, в данном случае события, присылаемые индикатором, в тестере обрабатываются, но невозможно выполнить в тестере торговую операцию из OnChartEvent().

Файлы:
ea.mq5  4 kb
SendEvent.mq5  1 kb
Причина обращения: