Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1740

 
Maxim Kuznetsov #:

не учи людей плохому.

свои данные надо помнить и по ним работать

Максим, в той ситуации, не нужно ничего никуда запоминать. Гораздо надёжнее просто посмотреть прошлую закрытую позицию.

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

(Запоминание в комментарии ордера - не сказал бы, что надёжное решение - это означает полагаться на волю брокера/дц)

И самое интересное, что в любом случае, он эти данные будет считывать откуда-то. Так не проще ли их сразу считывать из первоисточника?

 
Sergey Zhukov #:

как компилятору принудительно указать, чтобы компилировал для МТ4, а не MT5?

#ifdef __MQL4__

#else

#endif
 
Artyom Trishkin #:

Максим, в той ситуации, не нужно ничего никуда запоминать. Гораздо надёжнее просто посмотреть прошлую закрытую позицию.

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

(Запоминание в комментарии ордера - не сказал бы, что надёжное решение - это означает полагаться на волю брокера/дц)

И самое интересное, что в любом случае, он эти данные будет считывать откуда-то. Так не проще ли их сразу считывать из первоисточника?

а потом следуют темы "почему OnTimer не укладывается в пару секунд или OnTick дико пропускает" :-)

1 раз при инициализации восстановить состояние (или чтением из файла или просмотром истории/окружение) и всё...Последний ордер вместе с его характеристиками запоминается в переменную и всегда известен

 
Maxim Kuznetsov #:

а потом следуют темы "почему OnTimer не укладывается в пару секунд или OnTick дико пропускает" :-)

1 раз при инициализации восстановить состояние (или чтением из файла или просмотром истории/окружение) и всё...Последний ордер вместе с его характеристиками запоминается в переменную и всегда известен

Чтобы узнать как закрылась последняя позиция, нужно её таки найти. Ведь пока она открыта, записывать и помнить как она была закрыта нет никакой возможности - она же всё ещё открыта.

Можно хранить тикет последней открытой позиции и по нему определять как она закрылась, но ... при манипуляциях с позицией пока она открыта, её тикет может меняться. Соответственно, нужно делать функционал для перезаписи изменившегося тикета. Всё это усложняет код.

Я же лишь предложил искать последнюю закрытую позицию. И это совмещает перебор всех позиций при перезапуске советника и считывание данных только одной позиции при закрытии новой.

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

Думаю, что такой подход наиболее выгоден, потому, что

1. Нужно помнить значение лишь индекса цикла
2. Получать данные только в нужный момент прямым обращением к закрытому ордеру по его индексу.
3. Не нужно городить функционал чтения/записи данных
4. Это быстрее как в работе, так и в написании.

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

 
Ivan Butko #:

Благодарю за информацию!

Если будет время, прошу вас ответить, как исправить:

На истории N свечей назад ставятся две разнонаправленные цели: Close[N]+50*Point и Close[N]-50*Point. 
Затем условие, что цена должна дойти до одной из целей(if (High[i]> Close[N]+50*Point) или  (if (Low[i]< Close[N]-50*Point)
При выполнении условия расстояние от Close[N] до High[i] заносится в массив x[high]=High[i].
Затем рандомно кидается на любой из графиков в любое время. 

И при проверке через Print(x[high]), 1-2 из десяти значений показывают меньше 50! У одного 12, у другого 49. Хотя, строго указано +50*Point. 8-9 правильно показывают (больше 50-ти), а 1-2 аномальные. Это не через тестер, а на реальный график накидываю советник (без торговых функций), а только с вышеуказанными, он работает с историей и такое пишет. 

Чем больше берется значение, тем меньше таких ошибок. Думал, может, спред мешает, но... в МТ4 вроде нет спреда на истории

Решено. 

 
Обязательно ли в OnTimer() добавлять RefreshRates(), или таймер по умолчанию обновляет сам?
 
Ivan Butko #:
Обязательно ли в OnTimer() добавлять RefreshRates(), или таймер по умолчанию обновляет сам?
Не обновляет
 
Aliaksandr Hryshyn #:
Не обновляет

Спасибо

 
Artyom Trishkin #:

Чтобы узнать как закрылась последняя позиция, нужно её таки найти. Ведь пока она открыта, записывать и помнить как она была закрыта нет никакой возможности - она же всё ещё открыта.

Можно хранить тикет последней открытой позиции и по нему определять как она закрылась, но ... при манипуляциях с позицией пока она открыта, её тикет может меняться. Соответственно, нужно делать функционал для перезаписи изменившегося тикета. Всё это усложняет код.

Я же лишь предложил искать последнюю закрытую позицию. И это совмещает перебор всех позиций при перезапуске советника и считывание данных только одной позиции при закрытии новой.

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

Думаю, что такой подход наиболее выгоден, потому, что

1. Нужно помнить значение лишь индекса цикла
2. Получать данные только в нужный момент прямым обращением к закрытому ордеру по его индексу.
3. Не нужно городить функционал чтения/записи данных
4. Это быстрее как в работе, так и в написании.

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

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

Последняя закрытая - а если не один советник торгует на символе, плюс ручная торговля?
 
JRandomTrader #:

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

Последняя закрытая - а если не один советник торгует на символе, плюс ручная торговля?

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

"Последняя закрытая, принадлежащая этому советнику" имеется в виду.