Советник, записывающий тиковую историю. Как сохранить все тики ? - страница 2

 

Если OnCalculate заменить на OnTick, то результат выходит идентичный. А вот если такой советник:

#property strict

void OnTimer( void )
{ 
  static datetime PrevTime = 0;
  static int AmountTicks;
  static double PrevBid = 0;
  static double PrevAsk = 0;

  RefreshRates();
  
  if (PrevTime != Time[0])
  {
    Print(WindowExpertName() + ": Real TickVolume = " + (string)Volume[1] + ", AmountTicks = " + (string)AmountTicks);
    
    AmountTicks = 0;
    
    PrevTime = Time[0];
  }
  
  if ((PrevBid != Bid) || (PrevAsk != Ask))
  {  
    PrevBid = Bid;
    PrevAsk = Ask;

    AmountTicks++;
  }
    
  return;
}

void OnInit( void )
{
  EventSetMillisecondTimer(1);
  
  return;
}

void OnDeinit( const int reason )
{
  EventKillTimer();
  
  return;
}

void OnTick( void )
{ 
  return;
}

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

Кстати, помимо эквиобъемных баров, ввел бы и бары, основанные на тиках, длительностью больше определенного порога. Чтобы индикативную составляющую убрать. Думаю, было бы наглядно видно, как эти бары будут поуже, чем те, что строит MT4. Т.к. вершинки чаще всего бывают индикативными. 

 
Scriptong:

Вы пропустили такой важный момент, который я указал Выше, как запуск индикатора в выходные. На выходных нет тиков, но индикатор при запуске отрабатывает их. Как Вы смогли это проверить сегодня, когда рынок открыт?

Поясните еще раз этот момент. Не понял его совсем.

Ломать - не строить. Вот пусть этот паренек создаст что-нибудь достаточно популярное, тогда и посмотрим на него и его решения.

Насчет же новой архитектуры у меня нет никаких предпосылок, чтобы не верить разработчикам терминала. Как программист я их понимаю. В обществе трейдеров нет массового запроса на тиковую историю. Тому подтверждением мои работы, выложенные в свободном доступе, в том числе и здесь. За год с небольшим интерес к этой теме проявило едва с десяток человек. Поэтому соотношение затрат на изменения архитектуры терминала к возможной финансовой выгоде получается неимоверно большим. Вот и не берутся они за это.  

Паренек делает MT4 тестер полноценным. Ничего он не ломает, а добавляет функционал, который востребован огромным количеством людей (посмотрите просто форумы по скальперам, HFT, новостникам и пробойщикам). Вашим решением никто пользоваться не будет, т.к. оно не делает тестер полноценным. А у того парня решение с этим справляется. Поэтому не просто есть к нему интерес, а люди ежемесячно платят по всему миру ему абонентку, а разработчики поддерживают такое положение вещей.

Уважаю разработчиков. Не уважал бы - не критиковал бы. Что вы их оправдываете? Боитесь обидеть что ли? Вроде, логично мыслю. Если найдутся форумчане, которым есть что сказать по теме - велкам. Не один так думаю. Просто большинство не видят смысл высказываться, т.к. позиция разработчиков почти всегда остается неизменной. Они бы и рады изменить ситуацию, но раз сказали "нет", надо отвечать за свое слово.

А решение паренька так и остается единственным вариантом сделать MT4-тестер полноценным на все 100%. 

 
hrenfx:

Поясните еще раз этот момент. Не понял его совсем.

1. Запускаете индикатор со счетчиком тиков в рабочий день.

2. Выключаете терминал (индикатор не отключали от графика).

3. В выходной день, когда нет тиков, включаете терминал (и автоматически загружается индикатор).

OnCalculate индикатора сработает не один раз, как этого следовало бы ожидать, а несколько раз. Это простая демонстрация того факта, что индикатор получает пропущенные им тики. Хотя для этого случая есть и другое объяснение - терминал хранит некоторое количество последних тиков. Вот его и получает индикатор. Тем не менее, советник не получает даже этих тиков.

Чтобы удостовериться на 100% в том, что индикатор не пропускает тики, следует провести более сложный опыт:

1. Открыть два идентичных терминала.

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

3. Второй индикатор после окончания паузы получит все тики (до некоторого максимального количества), которые пропустил.

  

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

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

 А у того парня решение с этим справляется. Поэтому не просто есть к нему интерес, а люди ежемесячно платят по всему миру ему абонентку, а разработчики поддерживают такое положение вещей.

"Поддерживают активно", т. е. сами как-то участвуют в этом? Или имеется в виду пассивная поддержка - не мешают?

Уважаю разработчиков. Не уважал бы - не критиковал бы. Что вы их оправдываете? Боитесь обидеть что ли?

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

 Вроде, логично мыслю. Если найдутся форумчане, которым есть что сказать по теме - велкам. Не один так думаю. Просто большинство не видят смысл высказываться, т.к. позиция разработчиков почти всегда остается неизменной. Они бы и рады изменить ситуацию, но раз сказали "нет", надо отвечать за свое слово.

А решение паренька так и остается единственным вариантом сделать MT4-тестер полноценным на все 100%. 

Каждый, конечно, делает бизнес, как может. В свое время тоже пытался многое достроить в терминал МТ4. Но потом пришло простое понимание: использование недокументированных возможностей какого-либо приложения с прицелом ведения на этой основе своих долгосрочных проектов - путь в никуда. Разработчик приложения не обязан поддерживать недокументированный функционал. А потому все, что построено на таких вот лазейках, по определению недолговечно.

Примеры тому уже есть. Тот же Вадим Жунко намучился поддерживать свою библиотеку API от выхода одного билда к другому. Есть и другие примеры, которые написаны на чистом MQL, но тоже использовали недокументированные возможности. Сейчас они не работают. 

Такой же финал рано или поздно ждет метод недокументированного повышения функционала тестера.

 
Scriptong:

1. Запускаете индикатор со счетчиком тиков в рабочий день.

2. Выключаете терминал (индикатор не отключали от графика).

3. В выходной день, когда нет тиков, включаете терминал (и автоматически загружается индикатор).

OnCalculate индикатора сработает не один раз, как этого следовало бы ожидать, а несколько раз. Это простая демонстрация того факта, что индикатор получает пропущенные им тики. Хотя для этого случая есть и другое объяснение - терминал хранит некоторое количество последних тиков. Вот его и получает индикатор. Тем не менее, советник не получает даже этих тиков.

Чтобы удостовериться на 100% в том, что индикатор не пропускает тики, следует провести более сложный опыт:

1. Открыть два идентичных терминала.

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

3. Второй индикатор после окончания паузы получит все тики (до некоторого максимального количества), которые пропустил.

Воспроизвел. Советник:

#property strict

void MyPrint( const string Str )
{
  Print(WindowExpertName() + ": " + Str + " - " + (string)TimeCurrent());
  
  return;
}

bool TickCounter( const long BarTickVolume, const datetime BarTime )
{ 
  static datetime PrevTime = 0;
  static int AmountTicks;
  
  const bool Res = (PrevTime != BarTime);

  if (Res)
  {
    MyPrint("Real TickVolume = " + (string)BarTickVolume + ", AmountTicks = " + (string)AmountTicks);
    
    AmountTicks = 0;
    
    PrevTime = BarTime;
  }
  
  AmountTicks++;
    
  return(Res);
}

void OnTick( void )
{ 
  TickCounter(Volume[1], Time[0]);

  return;
}

Индикатор:

#property strict

// Sleep в индикаторах игнорируются
void SynthPause( void )
{
  ulong Counter = GetTickCount();

  double Tmp = 5;
  
  for (int i = 0; i < 100000000; i++)
    Tmp = MathExp(MathLog(Tmp));
  
  Counter = GetTickCount() - Counter;
    
  MyPrint(__FUNCTION__ + " = " + (string)Counter + " ms.");
    
  return;
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{  
  if (TickCounter(tick_volume[1], time[0])) // Делаем всего одну паузу на бар после его формирования
    SynthPause();    

  return(rates_total);
}

Результат:

Indicator: Real TickVolume = 84, AmountTicks = 69 - 2015.09.28 14:22:00
Expert: Real TickVolume = 84, AmountTicks = 77 - 2015.09.28 14:22:00
Indicator: SynthPause = 4930 ms. - 2015.09.28 14:21:05
Indicator: Real TickVolume = 95, AmountTicks = 73 - 2015.09.28 14:21:00
Expert: Real TickVolume = 95, AmountTicks = 86 - 2015.09.28 14:21:00
Indicator: SynthPause = 4945 ms. - 2015.09.28 14:20:05
Теперь однозначно видно, что событие прихода нового тика идентично и для советников и для индикаторов. Т.е. сборщик тиков через индикатор и через советник - одно и то же.
 
Scriptong:

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

Каждый, конечно, делает бизнес, как может. В свое время тоже пытался многое достроить в терминал МТ4. Но потом пришло простое понимание: использование недокументированных возможностей какого-либо приложения с прицелом ведения на этой основе своих долгосрочных проектов - путь в никуда. Разработчик приложения не обязан поддерживать недокументированный функционал. А потому все, что построено на таких вот лазейках, по определению недолговечно.

Примеры тому уже есть. Тот же Вадим Жунко намучился поддерживать свою библиотеку API от выхода одного билда к другому. Есть и другие примеры, которые написаны на чистом MQL, но тоже использовали недокументированные возможности. Сейчас они не работают. 

Такой же финал рано или поздно ждет метод недокументированного повышения функционала тестера.

Изложил только факты:

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

Господа, просветите, пожалуйста в таком вопросе...

Пишу свой тестер под свою же стратегию. Не на MQL4. Допустим, есть открытый ордер Buy с выставленным TP и SL. Предположим, цена Bid (тестирую на тиках) коснулась уровня TP (или поднялась чуть выше). Какое поведение тестера должно быть наиболее правильным в этом случае ? Сразу закрыть ордер с профитом или закрыть его, но по цене Bid, которая будет через секунду или две после касания ? По идее, в идеале, ордер должен быть закрыт сразу же, это, вроде, ясно. Какое поведение у тестера MT4 в такой же ситуации при использовании тиковой истории котировок ? И какое должно быть в идеале для максимального приближения к реальной торговле ?

Аналогичный вопрос по открытию ордера ? Сколько времени отвести тестеру на открытие ордера от момента поступления сигнала на открытие ?

P.S. Исполнение ордеров Market Execution.

 

Тестер меты исполнит по TP. На ECN должен исполниться по TP (если не на открытии сессии). На ECN/STP (или просто STP) - либо проскальзывание в обе стороны, либо реджект или исполнение с не отрицательным проскальзыванием.

Выбирайте сами режим. Самое простое, сделать идеальное исполнение, будто индикатива нет. Затем смотреть на результат, в зависимости от маркапа на цену. Если очень вкратце. 

 
hrenfx:

Изложил только факты:

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

Видео хакнутого тестера, где переменный спред (воспроизводятся бид и аск): https://vid.me/TYhW

Как видно, все отлично может работать, если захотеть. 

 
hrenfx:

Теперь однозначно видно, что событие прихода нового тика идентично и для советников и для индикаторов. Т.е. сборщик тиков через индикатор и через советник - одно и то же.

Вы запустили советник и индикатор на одном терминале. В тот момент, когда индикатор находится в паузе, весь терминал также находится в паузе. Советнику не на что реагировать.

Я говорил о двух способах проверки:

1. В выходные.

2. В онлайн на двух терминалах.

 
Scriptong:

Вы запустили советник и индикатор на одном терминале. В тот момент, когда индикатор находится в паузе, весь терминал также находится в паузе. Советнику не на что реагировать.

2. В онлайн на двух терминалах.

Нет, я воспроизвел Ваш способ: на двух терминалах. Результат скомпоновал из логов этих терминалов.

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

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