1минутный OHLC против каждого тика - противоположные результаты

 

Я получаю полностью противоположный результат при тестировании на каждом тике или 1min OHLC. советник и входные параметры точно такие же, но в случае 1min ohlc я получаю 50000 прибыли, в то время как на каждом тике я получаю -7000 убытков.

это происходит на многих парах, тестирование на периоде 2 года 0811-0813.

У кого-нибудь была такая же проблема? Я не понимаю, в чем здесь проблема и что мне делать при торговле реальными деньгами.

оба графика ниже

1-минутный OHLC

1минута олк

каждый тик

каждый тик

 

Без информации о том, как ваш советник принимает решение о покупке/продаже, ответить на этот вопрос сложно.

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

Поэтому тестер генерирует до 11 тиков для такого бара. В зависимости от вашей логики он ведет себя совершенно по-разному (только в тестировании).

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

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

С наилучшими пожеланиями

Уве

 
ugo58:

Без информации о том, как ваш советник принимает решение о покупке/продаже, ответить сложно.

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

Поэтому тестер генерирует до 11 тиков для такого бара. В зависимости от вашей логики он ведет себя совершенно по-разному (только в тестировании).

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

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

С наилучшими пожеланиями

Уве

Высылаю трюк для "тиканья" только на одном баре. Вам просто нужно поместить эту логику в начало тика. Если бар не новый, то происходит выход...

Как вы думаете, в каких ситуациях этот трюк может сработать?

   //--- Let's first check if a new bar has come!         
   if(CopyTime(_Symbol, _Period, 0, 1, m_currentBarTime) > 0) 
     {
      if(m_previousBarTime != m_currentBarTime[0])
        {
         m_isNewBar = true;
         m_previousBarTime = m_currentBarTime[0];
        }
     }
   else
     {
      Alert("Error copying historical data, error: ", GetLastError());
      return;
     }
     
   if(!m_isNewBar) return;

Что бы вы порекомендовали для решения проблемы лишних тиков? Есть ли статья или что-то подобное, объясняющее это? Спасибо.

 
laplacianlab:

Теперь я прислал трюк для "тиканья" только в одном баре. Нужно просто поместить эту логику в начало тика. Если бар не новый, то он выходит...

Как вы думаете, в каких ситуациях этот трюк может сработать?

Что бы вы порекомендовали для решения проблемы лишних тиков? Есть ли статья или что-то подобное, объясняющее это? Спасибо.

Что вы имеете в виду под "решить эти лишние тики"?
 
ugo58:

Без информации о том, как ваш советник принимает решение о покупке/продаже, ответить на этот вопрос сложно.

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

Поэтому тестер генерирует до 11 тиков для такого бара. В зависимости от вашей логики он ведет себя совершенно по-разному (только в тестировании).

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

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

С наилучшими пожеланиями

Уве

привет,

Что значит использовать значения предыдущего бара? Использовать maVal[1] (где maVal содержит значения скользящего среднего и массив задан как серия) вместо maVal[0]?

или проверить, было ли условие проверено на последнем баре и войти на открытии этого бара?

ниже часть кода моего очень простого советника

 triggerLong=maVal[1]-diff;
 triggerShort=maVal[1]+diff; 

......
.......

Buy_Condition_1=(now_ask<triggerLong);
Sell_Condition_1=(now_bid>triggerShort);

Exit_long_Condition=(closeAtCross? now_ask>=maVal[1]:false) || Sell_Condition_1;
Exit_short_Condition=(closeAtCross? now_bid<=maVal[1]:false) || Buy_Condition_1;

независимо от того, использую ли я maVal[1] или maVal[0], ситуация не сильно меняется, ohcl по-прежнему прибылен, а каждый тик - нет.

спасибо

 
ugo58:

Без информации о том, как ваш советник принимает решение о покупке/продаже, ответить сложно.

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

Поэтому тестер генерирует до 11 тиков для такого бара. В зависимости от вашей логики он ведет себя совершенно по-разному (только в тестировании).

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

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

С наилучшими пожеланиями

Уве

Это неправда, тестер может генерировать гораздо больше, чем 11 тиков. См. этот пост.
 
angevoyageur:
Что вы имеете в виду под "решить проблему лишних тиков"?

Я абсолютно согласен с ugo58. Большие бары могут вызывать событие OnTick много раз, в то время как маленькие бары будут вызывать его гораздо реже.

Это может повлиять на вашу автоматизированную торговую стратегию, поэтому нам, разработчикам, приходится искать решения, смягчающие тот факт, что событие OnTick может выполняться много раз за бар.

Я думаю, что то, что я отправил ранее, является лишь одним из решений. ugo50 предложил другое решение: запуск логики OnTick на последнем прошедшем баре. В любом случае, если вы хотите запустить логику OnTick на текущем баре, возможно, вы можете использовать что-то похожее на то, что я отправил ранее.

Мы пытаемся реализовать что-то вроде события OnBar.

Что вы думаете по этому поводу?

 
michelino:

привет,

что значит использовать значения предыдущего бара? использовать maVal[1] (где maVal содержит значения скользящей средней, а массив задан как серия) вместо maVal[0]?

или проверить, было ли условие проверено на последнем баре и войти на открытии этого бара?

ниже часть кода моего очень простого советника

независимо от того, использую ли я maVal[1] или maVal[0], ситуация не сильно меняется, ohcl по-прежнему прибылен, а каждый тик - нет.

спасибо

Очевидно, есть большая разница, если в вашем коде используется maVal[1] или maVal[0], или вообще, если вы работаете только на закрытом баре, или на открытом баре, или внутри бара.

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

 
angevoyageur:
Это неправда, тестер может генерировать гораздо больше, чем 11 тиков. См. этот пост.

Спасибо. О, ну. Мне просто пришлось заново учиться. ;)


Как я уже сказал, это зависит от вашей логики.

Есть много способов решить эти проблемы, maVal[1]- одно из самых простых решений, так как скользящие средние могут не так быстро меняться на каждом баре (в зависимости от длины периода и метода сглаживания).

Это может быть по-разному, если, например, вы зависите от максимума и минимума диапазона баров.

 
Спасибо, что поделились... Хороший
 
Возможно, эта ссылка также будет полезна,https://www.mql5.com/en/articles/159
"New Bar" Event Handler
"New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.