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

 
zdd:

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

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

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

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

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

Попробуйте довести до ума мою рыбу. Логика конечно не закончена и очень тупа, но вроде сильно походит на то что Вам нужно.

По крайней мере позиции с рынка открывает и в тестере и на демке.

Не знаю по чему (разбираться лень), но Ваш пример у меня при любом раскладе выдавал 10013.

PS

Лучше привязаться к стандартным объектам (таким как CAccountInfo и CTrade). Но, если у Вас терпения хватит самостоятельно все прописать буду только рад.

Кстати, реализацию самого шпиона лучше взять из статьи, либо сделать модифицируемую копию (я, к примеру, предлагаю заменить вот этот год "(long)_Period" на дату-время отправки события или иную полезную инфу). Ваш вариант как-то совсем "сыроват".


Файлы:
DemoEA.mq5  20 kb
 
Interesting:

Попробуйте довести до ума мою рыбу. Логика конечно не закончена и очень тупа, но вроде сильно походит на то что Вам нужно.

Спасибо, разобрался. Если объявлять структуры MqlTradeRequest и MqlTradeResult на глобальном уровне, то работает!
 
Большое спасибо за статью!
 

Пытаюсь получить цены по трем парам EURUSD, EURGBP, GBPUSD. Все работает хорошо при выборе "Все тики", либо "Только цены открытия" в тестере стратегий. Но если я выбираю "Каждый тик на основе реальных тиков", то почему то в однму минуту по одному инструменту может прийти несколько событий "Новый бар". 

Чтобы повторить, можно выбрать интервал, например с 2016.07.15 по 2016.07.19. Вот пример лога, смотрим 7-ую минуту, 9-ую минуту:

2016.07.15 00:05:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333

2016.07.15 00:05:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:05:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33399

2016.07.15 00:06:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8334

2016.07.15 00:06:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:06:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33382

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33381

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33384

2016.07.15 00:08:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83329

2016.07.15 00:08:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11167

2016.07.15 00:08:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

2016.07.15 00:09:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33396

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

С чем связано такое поведение при выборе режима "Все тики на основе реальных" ?
 
ooparadise:

Пытаюсь получить цены по трем парам EURUSD, EURGBP, GBPUSD. Все работает хорошо при выборе "Все тики", либо "Только цены открытия" в тестере стратегий. Но если я выбираю "Каждый тик на основе реальных тиков", то почему то в однму минуту по одному инструменту может прийти несколько событий "Новый бар". 

Чтобы повторить, можно выбрать интервал, например с 2016.07.15 по 2016.07.19. Вот пример лога, смотрим 7-ую минуту, 9-ую минуту:

С чем связано такое поведение при выборе режима "Все тики на основе реальных" ?

Как отлавливаете событие "Новый бар"? В 1375 билде точность прихода тиков повышена до миллисекунд:

Tester: Добавлена поддержка времени с точностью до миллисекунд. Ранее в тестере стратегий квантом времени являлась одна секунда.

  • Теперь функции EventSetMillisecondTimer и Sleep работают более точно в тестере стратегий.
  • Повысилась точность подачи тиков при тестировании мультивалютных экспертов. Раньше, если в одну секунду укладывалось несколько тиков (тиковый объем минутного бара больше 60), всем им проставлялось одно и то же время. При тестировании моновалютных экспертов это не имеет большого значения, поскольку тики просто последовательно передаются эксперту. Однако при тестировании на нескольких парах важно знать, тик с какой пары пришел первым. Раньше тики по каждому символу передавались эксперту последовательно: сначала все тики за секунду по одному символу, затем - все тики по другому. Теперь они передаются с учетом миллисекунд.

    При тестировании на реальных тиках миллисекунды берутся из исходных тиковых данных. При генерации тиков проставление миллисекунд происходит в соответствии с тиковым объемом. Например, если в одной секунде умещается 3 тика, то им будет проставлено время 000, 333 и 666 миллисекунды.
 

Новый бар отлавливаю так, как написано в статье. То есть индикатор отправляет событие "Новый бар" таким образом (сравнивается с предыдущим временем минуты ,часы, дни, месяцы):

   double price_current=price[rates_total-1];

   TimeCurrent(time);

   if(prev_calculated==0)

     {

      EventCustom(CHARTEVENT_INIT,price_current);

      prev_time=time; 

      return(rates_total);

     }

//--- new tick

   if((flag_event & CHARTEVENT_TICK)!=0) EventCustom(CHARTEVENT_TICK,price_current);       


//--- check change time

   if(time.min==prev_time.min && 

      time.hour==prev_time.hour && 

      time.day==prev_time.day &&

      time.mon==prev_time.mon) return(rates_total);


//--- new minute

   if((flag_event & CHARTEVENT_NEWBAR_M1)!=0) EventCustom(CHARTEVENT_NEWBAR_M1,price_current); 

UPDATE: Проблема ушла при установке билда 1375

Причина обращения: