Дайте советник для сбора тиковой истории - страница 3

 
fxsaber:

Представляю только, как это можно проверить на MT5.

не гарантированно но с определенной степенью достоверности:

1. вообще наличие нескольких тиков подряд с одинаковыми ценами и временем

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

 
Комбинатор:

не гарантированно но с определенной степенью достоверности:

1. вообще наличие нескольких тиков подряд с одинаковыми ценами и временем

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

Не в курсе, может ли в MT4 быть два идентичных по ценам тика, если не считать начало и конец выходных. В MT5 - может.

 
fxsaber:

Не в курсе, может ли в MT4 быть два идентичных по ценам тика

поэтому и не гарантированно
 
Andrey Khatimlianskii:

Это проверено? И для МТ4 с MarketInfo( MODE_BID/MODE_ASK )? И для МТ4 с Bid/Ask?

Даже не верится, что специально реализованная очередь тиков для гарантированной обработки всех данных не может эти самые данные получить.

Да, проверено. В последнем билде (1090) недавно провел такое исследование. При получении пачки тиков все Bid и Ask в пачке оказываются одинаковыми. Но, помнится, году эдак в 2014-ом (или раньше, когда еще не было OnCalculate) ситуация была другой - на каждый тик был свой Bid и Ask. Хотя, возможно меня уже память подводит (что такое было) и я выдаю желаемое за действительное.

 

Интересно, откуда пошел миф, что MT4-индикаторы не пропускают тиков... Опровержение мифа

// Индикатор показывает, что не на каждом тике вызывается индикатор

#property indicator_chart_window
#property indicator_buffers 0

#define PRINT(A) Print(#A + " = " + (string)(A))

int OnCalculate( const int, const int, const datetime& [], const double& [], const double& [],
                 const double& [], const double& [], const long& tick_volume[], const long& [], const int& [] )
{  
  static int i = 0;
  static long PrevVolume = LONG_MAX;
  
  PRINT(tick_volume[0]);      
  PRINT(i);

  if (tick_volume[0] - PrevVolume > 1)
    Alert("Tick Skip!");
    
  PrevVolume = tick_volume[0];
  i++;

  return(0);
}


Результат

2018.03.06 22:39:48.259 Test EURUSD,M1: tick_volume[0] = 32
2018.03.06 22:39:46.867 Test EURUSD,M1: i = 73
2018.03.06 22:39:46.867 Test EURUSD,M1: tick_volume[0] = 31
2018.03.06 22:39:46.180 Test EURUSD,M1: Alert: Tick Skip!
2018.03.06 22:39:46.180 Test EURUSD,M1: i = 72
2018.03.06 22:39:46.180 Test EURUSD,M1: tick_volume[0] = 30
2018.03.06 22:39:44.057 Test EURUSD,M1: i = 71
2018.03.06 22:39:44.057 Test EURUSD,M1: tick_volume[0] = 28
2018.03.06 22:39:42.793 Test EURUSD,M1: i = 70
2018.03.06 22:39:42.793 Test EURUSD,M1: tick_volume[0] = 27


MT4-индикаторы пропускают тики, либо сам Терминал их пропускает.

 
fxsaber:

Мне понадобился для MT4 CopyTicks. Это еще больше предаст кроссплатформенности коду. Придумал, как реализовать.

Думал создать CopyTicks-индикатор, который будет записывать в индикаторные буферы тики. А советником считывать эти буферы через iCustom, но обломался

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql4, тонкости и приёмы работы

fxsaber, 2018.03.06 22:36

  1. Первый вызов индикатора через советника с помощью iCustom вызывает запуск OnInit и OnCalculate индикатора
  2. До следующего вызова iCustom индикатор не вызывает своего OnCalculate.
  3. Выход из советника вызывает выполнение OnDeinit индикатора.
iCustom-индикаторы не полноценные. А получить с вручную запущенных индикаторов значения индикаторных буферов не получится средствами MQL4.

Возможно ли без файлов и глобальных переменных (по сути - те же файлы) решить задачу?


ЗЫ В MT5 индикаторы гораздо круче...

 
fxsaber:

MT4-индикаторы пропускают тики, либо сам Терминал их пропускает.

Тоже выяснил это, сравнивая тики, пришедшие в терминал и записанные в лог-файл, с тиковой историей Альпари. Думал, что пропускает только быстрые тики, но нет – бывает, нормально пишет 5-8 тиков в пределах одной секунды, а бывает, вроде и движения нет - все равно пропуск тиков. Такое ощущение, что терминал берет тики как бы по таймеру - не более скольких-то тиков за определенный интервал времени.

Если это не баг, то значит сознательная "забота" метаквотов о пользователях  (например, чтобы  процессор не перегружать).

Вообще это объясняет, почему многие стратегии испытанные в тестере (имею ввиду реальные тики с реальным спредом) потом  резко ухудшают свои показатели на реале. По факту получается, что в тестере  мы испытываем одни закономерности, а на реале другие.

+ Еще есть такие нюансы с тестером: в тестере процессы идут синхронно (например, время берется из тиковой истории и соответствует текущему тику), а в реале, насколько я понял, многие процессы в терминале не синхронизированы… И это тоже проблема.

Совокупность этих факторов и приводит к рождению мифов и легенд:

  • Нельзя верить тестеру.
  • Пишите «толстокожие» стратегии.

По-моему, вопрос о соответствии тиков обрабатываемых терминалом и реальной тиковой историей более чем насущный.

 
fxsaber:

Интересно, откуда пошел миф, что MT4-индикаторы не пропускают тиков... Опровержение мифа


Результат


MT4-индикаторы пропускают тики, либо сам Терминал их пропускает.

Еще раз подчеркиваю: тот тиковый объем, который дает брокер или ДЦ, не выдерживает никакой критики, нет ему доверия. Часто возникают ситуации, когда тиковый индикатор набрал больше тиков за бар, чем тиковый объем для этого бара, присланный сервером. Таким образом, что там сервер считает за тиковый объем, не совсем понятно.

 
Ihor Herasko:

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

В таком индикаторе ошибка. Терминал не получает больше тиков, чем тиковый объем.

Через DDE можно получить все тики и проверить. С DDE не дружу.

 
поэтому лучше пользоваться объемом с фьючей ) нормальным а не тиковым