В советниках нет OnStart(), но я понял, что вы имели в виду. Однако ОП даже в ответ на ваши комментарии сказал, цитирую:
Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение "во время работы советника". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".
Нам нужна дополнительная информация от paranoyakX.
Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение фразе "пока советник работает". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".
Нам нужна дополнительная информация от paranoyakX.
Привет, ребята,
позвольте мне прояснить следующее. Мой код ищет очень базовый паттерн на предыдущих барах и решает, будет ли открыт ордер, но открытие нового ордера будет проверяться только при появлении нового бара. Я имею в виду, что я жду закрытия последнего бара, затем проверяю паттерн, если он в порядке, я открываю ордер. Таким образом, открытие ордера происходит при открытии нового бара. Как сказал @jjc, я храню основную информацию о паттерне в глобальных переменных, например, когда паттерн начался и закончился, какое самое высокое и самое низкое значение и т.д.
Так или иначе, если мне придется повторно запускать советника, я хочу найти эту базовую информацию снова (начало и конец бара, самая высокая и самая низкая цены и т.д.) и снова заполнить мои глобальные переменные, вот почему мне это нужно. Я буду использовать информацию о начале и конце, чтобы решить, когда закрыть мой ордер. Так что достаточно, если новый бар не появится в OnInit, во время работы советника, это не проблема.
Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение фразе "пока советник работает". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".
Нам нужна дополнительная информация от paranoyakX.
Да! Вы правы! Судя по последней информации от ОП, он определенно запускает все в OnInit(), а не в OnTick(). Я ошибочно предположил, что OP делает все немного более правильно. Мне и в голову не приходило, что вся его логика находится в OnInit().
Позвольте мне прояснить следующее. Мой код ищет очень базовый паттерн на предыдущих барах и решает, будет ли открыт ордер, но открытие нового ордера будет проверяться только при появлении нового бара. Я имею в виду, что я жду закрытия последнего бара, затем проверяю паттерн, если он в порядке, я открываю ордер. Таким образом, открытие ордера происходит при открытии нового бара. Как сказал @jjc, я храню основную информацию о паттерне в глобальных переменных, например, когда мой паттерн начался и закончился, какое самое высокое и самое низкое значение и т.д.
Так или иначе, если мне придется повторно запускать советника, я хочу найти эту базовую информацию снова (начало и конец бара, самая высокая и самая низкая цены и т.д.) и снова заполнить мои глобальные переменные, вот почему мне это нужно. Я буду использовать информацию о начале и конце, чтобы решить, когда закрыть мой ордер. Так что достаточно, если новый бар не появится в OnInit, во время работы советника, это не проблема.
Вы НЕ должны делать все это в OnInit(). Вы должны делать всю эту логику (включая восстановление) в OnTick(). Это очень важно! Выполнение этого в OnInit() приведет к дальнейшим проблемам, которые вы не предусмотрели, и советник будет находиться в состоянии "инициализации", пока вы выполняете всю эту логику. Поэтому делайте все правильно! Выполняйте только инициализацию (например, переменные, проверку внешних параметров и т.д.) в OnInit(), а все остальное - в OnTick().
FMIC: Вы НЕ должны делать все это в OnInit(). Вы должны делать всю эту логику (включая восстановление) в OnTick(). Это очень важно! Выполнение этого в OnInit() приведет к дальнейшим проблемам, которые вы не предусмотрели, и оставит ваш советник в состоянии "инициализации", пока вы выполняете всю эту логику. Поэтому делайте все правильно! Выполняйте только инициализацию (например, переменные, проверку внешних параметров и т.д.) в OnInit(), а все остальное - в OnTick().
Нет, нет, нет! Я не смог объяснить, извините, я запускаю все в OnTick. но просто я проверяю, принадлежит ли этот тик новому бару и делаю свой персонал. Что я запускаю в OnInit, так это заново нахожу ордера и паттерн, который я рассчитал ранее, пересчитываю его. Я сказал, что это работает в OnInit, найти мой паттерн, что в настоящее время открытый ордер принадлежит.
Нет, нет, нет! Я не смог объяснить, извините, я запускаю все в OnTick. но просто я проверяю, принадлежит ли этот тик новому бару и делаю свой персонал. Что я запускаю в OnInit, так это заново нахожу ордера и паттерн, который я рассчитал ранее, пересчитываю его. Я сказал, что это работает в OnInit, найти мой паттерн, что в настоящее время открытый ордер принадлежит.
Надеюсь, я могу объяснить.
Да, я понял это в вашем посте! Я хочу сказать, что не надо делать этого в OnInit(). Вы должны найти свои ордера, паттерны и все эти вычисления в OnTick().
Просто определите локальную статическую переменную в OnTick() и сделайте все ваши проверки и определение паттернов, а затем установите переменную в false.
voidOnTick()
{
staticbool FirstOnTick = true;
if( FirstOnTick )
{
// Check Orders, Patterns, whatever
FirstOnTick = false;
}
// Here you do your normal OnTick handling
}
Да, я понял это в вашем сообщении! Я хочу сказать, что НЕ делайте этого в OnInit(). Вы должны найти свои ордера, паттерны и все эти вычисления в OnTick().
Просто определите локальную статическую переменную в OnTick() и сделайте все ваши проверки и определение паттернов, а затем установите переменную в false.
Тогда извините, я неправильно вас понял. Почему я не делаю это в OnInit ? Разве это не удобнее? Когда я это сделаю, то для каждого тика после первого я буду выполнять оператор if, который не будет истинным каждый раз. Я подумал, что это лишняя нагрузка на код.
Разве OnInit существует не для того, чтобы инициализировать что-то вроде моих глобальных переменных?
Я думаю, что нам нужно увидеть код, чтобы быть уверенными в том, о чем вы говорите. Например, неясно, ищете ли вы исторический паттерн, который породил существующую открытую сделку, потому что (а) это подскажет вам, как управлять открытой сделкой, где/когда ее закрыть и т.д., или (б) просто для того, чтобы нарисовать на графике маркеры, объясняющие, почему была открыта существующая сделка.
Я в целом согласен с FMIC, что вы должны стараться делать как можно больше в OnTick(), и хранить как можно меньше состояния в глобальных переменных.
Тогда извините, я вас неправильно понял. Почему я не делаю это 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;
intOnInit()
{
//---
DetectExistingPattern();
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+int LastBar=0;
double HighestValue, LowestValue;
voidOnTick()
{
//---
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 )) returntrue;
};
returnfalse;
};
bool CheckTrendPattern(){
for(int i=10; i>=1; i--) {
if (High[i]>High[i-1])
returnfalse;
};
HighestValue = High[10];
LowestValue = Low[1];
returntrue;
};
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.
};
В советниках нет OnStart(), но я понял, что вы имели в виду. Однако ОП даже в ответ на ваши комментарии сказал, цитирую:
Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение "во время работы советника". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".
Нам нужна дополнительная информация от paranoyakX.
Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение фразе "пока советник работает". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".
Нам нужна дополнительная информация от paranoyakX.
Привет, ребята,
позвольте мне прояснить следующее. Мой код ищет очень базовый паттерн на предыдущих барах и решает, будет ли открыт ордер, но открытие нового ордера будет проверяться только при появлении нового бара. Я имею в виду, что я жду закрытия последнего бара, затем проверяю паттерн, если он в порядке, я открываю ордер. Таким образом, открытие ордера происходит при открытии нового бара. Как сказал @jjc, я храню основную информацию о паттерне в глобальных переменных, например, когда паттерн начался и закончился, какое самое высокое и самое низкое значение и т.д.
Так или иначе, если мне придется повторно запускать советника, я хочу найти эту базовую информацию снова (начало и конец бара, самая высокая и самая низкая цены и т.д.) и снова заполнить мои глобальные переменные, вот почему мне это нужно. Я буду использовать информацию о начале и конце, чтобы решить, когда закрыть мой ордер. Так что достаточно, если новый бар не появится в OnInit, во время работы советника, это не проблема.
Да, я имел в виду OnTick(). Вы все еще придаете слишком большое значение фразе "пока советник работает". Это не обязательно или даже наиболее правдоподобно означает "пока советник выполняет OnTick()", а не "пока советник привязан к графику, т.е. в течение всего времени его работы".
Нам нужна дополнительная информация от paranoyakX.
Привет, ребята,
Позвольте мне прояснить следующее. Мой код ищет очень базовый паттерн на предыдущих барах и решает, будет ли открыт ордер, но открытие нового ордера будет проверяться только при появлении нового бара. Я имею в виду, что я жду закрытия последнего бара, затем проверяю паттерн, если он в порядке, я открываю ордер. Таким образом, открытие ордера происходит при открытии нового бара. Как сказал @jjc, я храню основную информацию о паттерне в глобальных переменных, например, когда мой паттерн начался и закончился, какое самое высокое и самое низкое значение и т.д.
Так или иначе, если мне придется повторно запускать советника, я хочу найти эту базовую информацию снова (начало и конец бара, самая высокая и самая низкая цены и т.д.) и снова заполнить мои глобальные переменные, вот почему мне это нужно. Я буду использовать информацию о начале и конце, чтобы решить, когда закрыть мой ордер. Так что достаточно, если новый бар не появится в OnInit, во время работы советника, это не проблема.
Вы НЕ должны делать все это в OnInit(). Вы должны делать всю эту логику (включая восстановление) в OnTick(). Это очень важно! Выполнение этого в OnInit() приведет к дальнейшим проблемам, которые вы не предусмотрели, и оставит ваш советник в состоянии "инициализации", пока вы выполняете всю эту логику. Поэтому делайте все правильно! Выполняйте только инициализацию (например, переменные, проверку внешних параметров и т.д.) в OnInit(), а все остальное - в OnTick().
Нет, нет, нет! Я не смог объяснить, извините, я запускаю все в OnTick. но просто я проверяю, принадлежит ли этот тик новому бару и делаю свой персонал. Что я запускаю в OnInit, так это заново нахожу ордера и паттерн, который я рассчитал ранее, пересчитываю его. Я сказал, что это работает в OnInit, найти мой паттерн, что в настоящее время открытый ордер принадлежит.
Надеюсь, я могу объяснить.
Нет, нет, нет! Я не смог объяснить, извините, я запускаю все в OnTick. но просто я проверяю, принадлежит ли этот тик новому бару и делаю свой персонал. Что я запускаю в OnInit, так это заново нахожу ордера и паттерн, который я рассчитал ранее, пересчитываю его. Я сказал, что это работает в OnInit, найти мой паттерн, что в настоящее время открытый ордер принадлежит.
Надеюсь, я могу объяснить.
Да, я понял это в вашем посте! Я хочу сказать, что не надо делать этого в OnInit(). Вы должны найти свои ордера, паттерны и все эти вычисления в OnTick().
Просто определите локальную статическую переменную в OnTick() и сделайте все ваши проверки и определение паттернов, а затем установите переменную в false.
Да, я понял это в вашем сообщении! Я хочу сказать, что НЕ делайте этого в OnInit(). Вы должны найти свои ордера, паттерны и все эти вычисления в OnTick().
Просто определите локальную статическую переменную в OnTick() и сделайте все ваши проверки и определение паттернов, а затем установите переменную в false.
Тогда извините, я неправильно вас понял. Почему я не делаю это в OnInit ? Разве это не удобнее? Когда я это сделаю, то для каждого тика после первого я буду выполнять оператор if, который не будет истинным каждый раз. Я подумал, что это лишняя нагрузка на код.
Разве OnInit существует не для того, чтобы инициализировать что-то вроде моих глобальных переменных?
Надеюсь, я смогу объяснить.
Я думаю, что нам нужно увидеть код, чтобы быть уверенными в том, о чем вы говорите. Например, неясно, ищете ли вы исторический паттерн, который породил существующую открытую сделку, потому что (а) это подскажет вам, как управлять открытой сделкой, где/когда ее закрыть и т.д., или (б) просто для того, чтобы нарисовать на графике маркеры, объясняющие, почему была открыта существующая сделка.
Я в целом согласен с FMIC, что вы должны стараться делать как можно больше в OnTick(), и хранить как можно меньше состояния в глобальных переменных.
Тогда извините, я вас неправильно понял. Почему я не делаю это OnInit ? Разве это не удобнее? Когда я это сделаю, для каждого тика после первого, я буду запускать оператор if, который не будет истинным каждый раз. Я подумал, что это лишняя нагрузка на код.
Разве OnInit существует не для того, чтобы инициализировать что-то вроде моих глобальных переменных?
спасибо за совет, вот очень простая версия моего кода, это не мой реальный код, но я надеюсь, что это будет более понятно.
как я уже сказал, это не настоящий код, поиск паттерна и т.д. - это просто пример. причина, по которой я открыл эту тему - функция DetectExistingPattern()