Анализ баров в обратном направлении в советнике - страница 3

 
paranoyakX:

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

Как я уже сказал, это не настоящий код, поиск паттерна и т.д. - это просто пример. причина, по которой я открыл эту тему - этофункция DetectExistingPattern()

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

Кроме того, вы не можете использовать "Bars" для обнаружения нового бара. Это неверно. Вы должны использовать либо "Time[0]", либо "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Вот пример:

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

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

Кроме того, вы не можете использовать "Bars" для обнаружения нового бара. Это неверно. Вы должны использовать либо "Time[0]", либо "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Вот пример:

Спасибо @FMIC, я добавил простой код, потому что @jjc попросил об этом. Кстати, я научился использовать Bars с самого начала, насколько я помню, все писали так, вот и я так написал. Почему это неправильно? Может ли это работать неправильно ?

ps: Я использую metatrader 4, так что это mql4 правильно?

 
paranoyakX:

спасибо @FMIC, я добавил простой код, потому что @jjc попросил об этом. Кстати, я научился использовать Bars с самого начала, насколько я помню, все писали так, и я тоже. Почему это неправильно? Может ли это работать неправильно ?

ps: Я использую metatrader 4, так что это mql4 правильно?

Нет! На форуме вы найдете, что многие пользователи показали, что метод "Bars" очень устарел и ненадежен, потому что количество баров может быть изменено "Опциями" для графиков или может быть постоянным, когда достигнуто максимальное количество баров на график. Поэтому использовать его неправильно. Используйте либо "Time[0]", либо, если вы хотите, чтобы это было совместимо и с MQL5, используйте "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Пожалуйста, посмотрите мой пример.
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

вау я не знал, что я буду использовать ваш код спасибо большое.
 
Бары ненадежны (обновление/переподключение может изменить количество баров на графике) Объем ненадежен (пропустить тики) Всегда используйте время. Новая свеча - Форум MQL4
 
paranoyakX:

как я уже сказал, это не настоящий код, поиск паттерна и т.д. - это просто пример. причина, по которой я открыл эту тему -функция DetectExistingPattern().

Возвращаясь к вашему первоначальному вопросу... В этом примере одним из вариантов может быть изменение функции CheckTrendPattern() таким образом, чтобы ей можно было указать начать с определенного бара. Вместо того чтобы использовать фиксированный диапазон баров от 1 до 10, вы вместо этого используете смещение от 1 до 10 от указанной начальной точки.

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

Когда нет существующего ордера, и вы хотите проверить, выполняется ли в данный момент паттерн, вы используете CheckTrendPattern(0) вместо CheckTrendPattern().

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

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);
CheckTrendPattern(BarShiftOfOrderOpen);

Однако, как говорит FMIC, предпочтительнее делать эту проверку в первом вызове OnTick(), а не в OnInit(). Мои собственные причины для такого предложения не имеют ничего общего с "задержкой инициализации". Напротив, меня бы беспокоило то, что при повторном запуске MT4 с советником, уже прикрепленным к графику, у вас еще нет на 100% надежного списка ордеров от брокера или обновленной истории баров.

Еще одно соображение, которое вы, возможно, захотите принять во внимание, заключается в следующем сценарии, происходящем в течение времени, охватываемого одним баром:

  • Вы находите паттерн и заключаете сделку
  • Ваша открытая сделка закрывается, например, из-за срабатывания стоп-лосса.
  • MT4 закрывается (преднамеренно или нет).
  • MT4 перезапускается
  • Советник повторно находит текущий паттерн и совершает другую сделку на том же баре, поскольку открытой сделки нет.

Для предотвращения этого вы можете проверить закрытые ордера так же, как и открытые.

 
@jjc, ваши предложения очень хороши. спасибо, что поделились своим опытом.
jjc:

Возвращаясь к вашему первоначальному вопросу... В данном примере одним из вариантов может быть изменение функции CheckTrendPattern() таким образом, чтобы ей можно было указать начать с определенного бара. Вместо того чтобы использовать фиксированный диапазон баров от 1 до 10, вы вместо этого используете смещение от 1 до 10 от указанной начальной точки.

Когда нет существующего ордера, и вы хотите проверить, выполняется ли в данный момент паттерн, вы используете CheckTrendPattern(0) вместо CheckTrendPattern().

Мой реальный паттерн не такой, поэтому в нем нет фиксированных чисел (как в примере 10), он динамический, но мой метод проверки паттерна отличается, поэтому я не смог вспомнить его, и это действительно беспокоит меня, потому что я написал похожий код для поиска паттерна снова. Проблема в том, что пока советник работает, я просто проверяю последний бар, если мой паттерн все еще продолжается, и если это так, то я ничего не делаю, когда паттерн нарушен, я открываю ордер. Поэтому я не могу использовать этот код при повторном поиске паттерна, потому что в этот раз мне нужно вернуться назад по барам, а не вперед. Я также не хотел искать паттерн в обратном направлении, потому что в этом случае я буду проверять одни и те же бары снова и снова. Я просто беспокоился о проблеме производительности, но как я вижу, это не будет проблемой, поэтому я думаю изменить мой метод поиска паттерна, чтобы я мог использовать его при запуске и во время работы, как вы сказали. Это также предотвратит возможные проблемы, например, если я изменю свой паттерн, мне придется изменить процедуру повторного поиска паттерна, о которой я могу забыть. спасибо за это. Также, как сказал @FMIC, возможно, мне стоит сделать эту часть как индикатор (который я не так много написал), чтобы не было проблем с поиском и повторным нахождением.
jjc:

При запуске, если у вас есть существующий ордер, вы можете искать паттерн, который его вызвал, следующим образом. Это то же самое предложение, которое я сделал в самом начале: вы получаете индекс бара, который эквивалентен времени открытия существующего ордера, и начинаете поиск в обратном направлении. Однако, как говорит FMIC, предпочтительнее делать эту проверку в первом вызове OnTick(), а не в OnInit(). Мои собственные причины для такого предложения не имеют ничего общего с "задержкой инициализации". Напротив, меня бы беспокоило то, что при повторном запуске MT4 с советником, уже прикрепленным к графику, у вас еще нет на 100% надежного списка ордеров от брокера или обновленной истории баров.

Еще одно соображение, которое вы, возможно, захотите принять во внимание, заключается в следующем сценарии, происходящем в течение времени, охватываемого одним баром:

  • Вы находите паттерн и заключаете сделку
  • Ваша открытая сделка закрывается, например, из-за срабатывания стоп-лосса.
  • MT4 закрывается (преднамеренно или нет).
  • MT4 перезапускается
  • Советник повторно находит текущий паттерн и совершает другую сделку на том же баре, поскольку открытой сделки нет.

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

@WHRoeder Ваш новый контроль проверки бара так прост и красив. Я добавил ваш метод в свой код, спасибо.

 

Привет всем,

Как советовал @FMIC, я написал индикатор, который находит мой паттерн, дает сигнал и еще несколько данных, которые будут использоваться для моих ордеров (я могу открыть несколько ордеров по разным ценам). Теперь я хочу использовать его в своем советнике, но у меня есть вопрос, мне нужен ваш опыт. Когда я получаю сигнал от моего индикатора, я открываю ордер или выставляю ордер (лимит на продажу или лимит на покупку и т.д.), если мой mt4 падает по какой-либо причине, когда я открываю его снова, как я могу определить, что открытый ордер принадлежит какому сигналу в моем индикаторе. нормально ли использовать сдвиг бара для этого? как мы говорили ранее, я могу найти время создания ордера, затем найти сдвиг бара и я должен попытаться получить значение индикатора, используя этот сдвиг? Как я могу сопоставить этот ордер и сдвиг индикатора?

спасибо.

 
paranoyakX: Привет всем, как советовал @FMIC, я написал индикатор, который находит мой паттерн, дает сигнал и еще несколько данных, которые будут использоваться для моих ордеров (я могу открыть несколько ордеров по разным ценам). Теперь я хочу использовать его в своем советнике, но у меня есть вопрос, мне нужен ваш опыт. Когда я получаю сигнал от моего индикатора, я открываю ордер или выставляю ордер (лимит на продажу или лимит на покупку и т.д.), если мой mt4 падает по какой-либо причине, когда я открываю его снова, как я могу определить, что открытый ордер принадлежит какому сигналу в моем индикаторе. нормально ли использовать сдвиг бара для этого? как мы говорили ранее, я могу найти время создания ордера, затем найти сдвиг бара и я должен попытаться получить значение индикатора, используя этот сдвиг? Как я могу сопоставить этот ордер и сдвиг индикатора?
Да, вы можете использовать iBarShift(), как jjc объяснил вам в предыдущем сообщении, чтобы затем ссылаться на данные вашего индикатора через функцию iCustom().
 
FMIC:
Да, вы можете использовать iBarShift(), как jjc объяснил вам в предыдущем сообщении, чтобы затем ссылаться на данные вашего индикатора через функцию iCustom().
Большое спасибо @FMIC, значит, использование сдвига - хорошее решение. Сделать мой паттерн индикатором было действительно хорошим советом. Конечно, я изменю весь свой код, но он будет более последовательным.
Причина обращения: