Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления - страница 30

 

Предложение по улучшению функционала.
Для https://www.mql5.com/ru/docs/series/copyticks

Нужно получить несколько тиков от указанной даты, но не вперед, а назад.
На самом деле нужен 1 предыдущий тик, чтобы узнать цены Ask и Bid на нужный момент времени Rollover-a (заметьте, нужен не текущий из SymbolInfoDouble(s, SYMBOL_ASK), т.к. тик придет при открытии торг. сессии, м.б. через несколько минут после Rollover-a).
Если есть решение без CopyTicks - расскажите.

Сейчас если указать
CopyTicks(_Symbol, ticks, COPY_TICKS_ALL, TimeMsec, 10);
То получим 10 тиков в будущее от TimeMsec .

Хорошо бы сделать count с отрицательным значением, для переключения направления копирования тиков, чтобы получить тики до указанной даты:
CopyTicks(_Symbol, ticks, COPY_TICKS_ALL, TimeMsec, -10);
И получить 10 тиков от TimeMsec в прошлое. Нужно просто переключить направление копирования от найденной даты

Сейчас есть вариант делать через дату = 0, т.е. от текущего момента

CopyTicks(_Symbol, ticks, COPY_TICKS_ALL, 0, 10);

Можно запросить 10 в цикле поискать нужный момент времени , если не найдется, то 100, потом 1000 и т.д., но это долго.

Задача похожа на  CopyTicksRange, но там надо начальную дату ставить, а не количество. Т.е. тоже надо запрашивать с избытком и в цикле искать нужный момент времени.

Доработка достаточно простая, и позволит получать очень быстро Ask,Bid и др. на любой момент времени.

Альтернативно или дополнительно к этому - создать запрос:
SymbolInfoDouble(s, SYMBOL_ASK/BID, TimeMsec ); - который вернет цены на нужный момент времени.
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
CopyTicks - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Forester #:

На самом деле нужен 1 предыдущий тик, чтобы узнать цены Ask и Bid на нужный момент времени Rollover-a (заметьте, нужен не текущий из SymbolInfoDouble(s, SYMBOL_ASK), т.к. тик придет при открытии торг. сессии, м.б. через несколько минут после Rollover-a).
Если есть решение без CopyTicks - расскажите.

Сохранять значение предыдущего тика в глобальную или static перемнную.
Если нужно несколько значений, то создать соостветствующий массив.
На CopyTicks было много нареканий.

 
Alexander Sevastyanov #:

Сохранять значение предыдущего тика в глобальную или static перемнную.
Если нужно несколько значений, то создать соостветствующий массив.
На CopyTicks было много нареканий.

По ~300-500 тыс сохранений (Ask и Бид) в день (86400 секунд - если тиков по 5 в сек)? Думаю это еще медленнее моего решения (даю код, может кому пригодится):
void getPricesBeforeTime(string s, double &LAsk, double &LBid, long Time_Msc ){
   MqlTick ticks[];
   for (int c=1; c < 100000000; c*=10){//берем 3,13,103....
      int cr = CopyTicks(s, ticks, COPY_TICKS_ALL, 0, c+2);//начнем с 1+2 = 3, чаще всего их достаточно
      if(cr > 0 && ticks[0].time_msc < Time_Msc){break;}
   }
   LAsk = ticks[0].ask; LBid = ticks[0].bid;//уст. самые старые данные, на случай, если в цикле не найдется
   for(int i=ArraySize(ticks)-1; i>=0; i--){ if(ticks[i].time_msc < Time_Msc){ LAsk = ticks[i].ask; LBid = ticks[i].bid; break; }}
   //Print(ticks[i].time," ",ticks[i].time_msc%1000,  " ",LAsk," ",LBid);
}

Но хотелось бы быстрый запрос получить, по предложенным выше вариантам.

 
Forester #:
По ~300-500 тыс сохранений в день (86400 секунд - если тиков по 5 в сек)? Думаю это еще медленнее моего решения (даю код, может кому пригодится):

Но хотелось бы быстрый запрос получить, по предложенным выше вариантам.

Ну да, в неделю еще больше будет, а за месяц/год вообще. )))

На самом деле одна операция присваивания за тик - это вообще ничто даже для ЦП 10-летней давности.

 
Alexander Sevastyanov #:

Ну да, в неделю еще больше будет, а за месяц/год вообще. )))

На самом деле одна операция присваивания за тик - это вообще ничто даже для ЦП 1-летней давности.

Мы не про одну операцию говорим... Надеюсь разработчики сделают быстрый доступ.

И это будут не присваивания известных цен, а запросы по др. символу SymbolInfoDouble(s, SYMBOL_ASK), SymbolInfoDouble(s, SYMBOL_BID), по 300 000 в день... - однозначно тормоза
 
Forester #:
Мы не про одну операцию говорим... Надеюсь разработчики сделают быстрый доступ.

И это будут не присваивания известных цен, а запросы по др. символу SymbolInfoDouble(s, SYMBOL_ASK), SymbolInfoDouble(s, SYMBOL_BID), по 300 000 в день... - однозначно тормоза

Надеяться на разработчиков можно и нужно. Но у них немало работы и свои приоритеты.

Практика показывает что 95% вопросов приходится решать своими силами.

 

Правильно ли понимаю, что добавление в сигнатуры штатных функций const-модификатора обозначает, что компилятор добавляет исходники штатных функций в исходник пользователя и объединенный результат компилирует, включая все шаги оптимизации? Грубо говоря, раньше штатные функции брались через #import, а сейчас - #include.

 
Forester #:

нужен 1 предыдущий тик, чтобы узнать цены Ask и Bid на нужный момент времени Rollover-a (заметьте, нужен не текущий из SymbolInfoDouble(s, SYMBOL_ASK), т.к. тик придет при открытии торг. сессии, м.б. через несколько минут после Rollover-a).

CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 2); // На первом тике после ролловера Ticks[1] будет содержать тик до ролловера.
 
fxsaber #:

По текущему символу - да. По другому символу нет (нужно для перевода свопа из цены символа в валюту аккаунта). Например первый тик пришел на 5 секунде по этому инструменту после начала сессии, по другому уже много натикало с 1-й секунды... Из своих распечаток отловил 20 тиков по одной из комбинаций. Очевидно, что может быть и больше. До миллионов, если по текущему инструменту выходные/празднчные, а по другому нет и там дня 3 тикало... Поэтому через циклы с запросами до миллионов тиков. Или разработчики сделают быстрый доступ по времени.

 
Forester #:

По текущему символу - да. По другому символу нет (нужно для перевода свопа из цены символа в валюту аккаунта). Например первый тик пришел на 5 секунде по этому инструменту после начала сессии, по другому уже много натикало с 1-й секундв... Из своих распечаток отловил 20 тиков по одной из комбинаций. Очевидно, что может быть и больше. До миллионов, если по текущему инструменту выходные/празднчные, а по другому нет и там дня 3 тикало... Поэтому через циклы с запросами до миллионов тиков.

Не понимаю авторов мультивалютных советников, не использующих мультивалютный OnTick, который обеспечивает совпадение результатов, вне зависимости от выбранного _Symbol.