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

 
FMIC:

В советниках нет OnStart(), но я понял, что вы имели в виду. Однако ОП даже в ответ на ваши комментарии сказал, цитирую:

Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение "во время работы советника". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".

Нам нужна дополнительная информация от paranoyakX.

 
jjc:

Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение фразе "пока советник работает". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".

Нам нужна дополнительная информация от paranoyakX.

Привет, ребята,

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

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

 
jjc:

Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение фразе "пока советник работает". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".

Нам нужна дополнительная информация от paranoyakX.

Да! Вы правы! Судя по последней информации от ОП, он определенно запускает все в OnInit(), а не в OnTick(). Я ошибочно предположил, что OP делает все немного более правильно. Мне и в голову не приходило, что вся его логика находится в OnInit().
 
paranoyakX:

Привет, ребята,

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

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

Вы НЕ должны делать все это в OnInit(). Вы должны делать всю эту логику (включая восстановление) в OnTick(). Это очень важно! Выполнение этого в OnInit() приведет к дальнейшим проблемам, которые вы не предусмотрели, и советник будет находиться в состоянии "инициализации", пока вы выполняете всю эту логику. Поэтому делайте все правильно! Выполняйте только инициализацию (например, переменные, проверку внешних параметров и т.д.) в OnInit(), а все остальное - в OnTick().
 
FMIC:
Вы НЕ должны делать все это в OnInit(). Вы должны делать всю эту логику (включая восстановление) в OnTick(). Это очень важно! Выполнение этого в OnInit() приведет к дальнейшим проблемам, которые вы не предусмотрели, и оставит ваш советник в состоянии "инициализации", пока вы выполняете всю эту логику. Поэтому делайте все правильно! Выполняйте только инициализацию (например, переменные, проверку внешних параметров и т.д.) в OnInit(), а все остальное - в OnTick().

Нет, нет, нет! Я не смог объяснить, извините, я запускаю все в OnTick. но просто я проверяю, принадлежит ли этот тик новому бару и делаю свой персонал. Что я запускаю в OnInit, так это заново нахожу ордера и паттерн, который я рассчитал ранее, пересчитываю его. Я сказал, что это работает в OnInit, найти мой паттерн, что в настоящее время открытый ордер принадлежит.

Надеюсь, я могу объяснить.

 
paranoyakX:

Нет, нет, нет! Я не смог объяснить, извините, я запускаю все в OnTick. но просто я проверяю, принадлежит ли этот тик новому бару и делаю свой персонал. Что я запускаю в OnInit, так это заново нахожу ордера и паттерн, который я рассчитал ранее, пересчитываю его. Я сказал, что это работает в OnInit, найти мой паттерн, что в настоящее время открытый ордер принадлежит.

Надеюсь, я могу объяснить.

Да, я понял это в вашем посте! Я хочу сказать, что не надо делать этого в OnInit(). Вы должны найти свои ордера, паттерны и все эти вычисления в OnTick().

Просто определите локальную статическую переменную в OnTick() и сделайте все ваши проверки и определение паттернов, а затем установите переменную в false.

void OnTick()
{
   static bool FirstOnTick = true;

   if( FirstOnTick )
   {
      // Check Orders, Patterns, whatever

      FirstOnTick = false;
   }

   // Here you do your normal OnTick handling
}
 
FMIC:

Да, я понял это в вашем сообщении! Я хочу сказать, что НЕ делайте этого в OnInit(). Вы должны найти свои ордера, паттерны и все эти вычисления в OnTick().

Просто определите локальную статическую переменную в OnTick() и сделайте все ваши проверки и определение паттернов, а затем установите переменную в false.

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

Разве OnInit существует не для того, чтобы инициализировать что-то вроде моих глобальных переменных?

 
paranoyakX:

Надеюсь, я смогу объяснить.

Я думаю, что нам нужно увидеть код, чтобы быть уверенными в том, о чем вы говорите. Например, неясно, ищете ли вы исторический паттерн, который породил существующую открытую сделку, потому что (а) это подскажет вам, как управлять открытой сделкой, где/когда ее закрыть и т.д., или (б) просто для того, чтобы нарисовать на графике маркеры, объясняющие, почему была открыта существующая сделка.

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

 
paranoyakX:

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

Разве OnInit существует не для того, чтобы инициализировать что-то вроде моих глобальных переменных?

Нет, неправильно делать это в OnInit(), потому что вы будете задерживать выполнение инициализации, и нет, статические переменные будут поддерживать свое состояние, поэтому вы будете делать проверку только "один раз", а не при каждом OnTick(). Функция "if( FirstOnTick )" выполняется очень быстро и имеет очень небольшую нагрузку, особенно по сравнению со всем остальным кодом, который выполняется в OnTick().
 

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

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

//+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100;


int OnInit()
  {
//---
   DetectExistingPattern();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar=0;
double HighestValue, LowestValue;

void OnTick()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

    if (LastBar == Bars) return;
    LastBar = Bars;

    if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
  for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
    if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true;
  };
  return false;

};


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



void PlaceOrders(){  
    int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
  // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
  // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
  // I will find opened order and find the previos pattern that cause me to open that order.
};
Причина обращения: