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

 
TYRBO:
проблему решил по сравнению цен
В тестере? В реальном рынке на счёте с плавающим спредом, цена безубытка будет меняться через один тик
 
Artyom Trishkin:

В данном контексте я веду к чему:

  1. Нам нужно добиться как можно меньшего количества циклов на одном тике.
  2. Нам нужно иметь один постоянный массив с данными рыночных ордеров и позиций и один массив с данными удалённых/закрытых ордеров и позиций
  3. Если иметь массив локально в функции, то повторное к нему обращение требует очередного его заполнения. Я предлагаю его заполнять один раз на новом тике - значит массив глобальный - иначе мы его потеряем при выходе из функции.
  4. Для того, чтобы что-то в нём (в массиве) найти, нам нужен заполненный массив и функции, которые будут возвращать найденные данные. Уже внутри функций можно объявить вспомогательные массивы для необходимых расчётов.

Исходя их этого - массивы всё же лучше иметь глобальные - для закрытых и открытых ордеров и позиций. Один раз на новом тике мы проходим по одному разу по необходимому количеству ордеров/позиций, заполняя ими два массива. А далее уже на этом же тике мы получаем с них все нужные нам данные. Причём у меня рассчитываются не только последний закрытый/открытый ордер/позиция и все их данные, но и ищутся все родительские и дочерние тикеты всех позиций при частичном закрытии. Соответственно, я в любой момент времени могу поглядеть от какого тикета произошла та или иная позиция если она не единожды закрывалась частично - всё это уже работает в одном классе, который работает в таймере. Ну и многие другие необходимые мне данные я имею при небольшом итоговом количестве циклов. Для тестера задаётся нужная глубина истории для массивов.

И т.д., и т.п. ...

Sorry. Ишо дополню (не в противовес, а как дополнение), что не теряются локальные массивы со static. То есть, если условия позволяют, то можно обходиться без объявления их на глобальном уровне.

 
P./S.: Дополняю, естетстно, исходя из собственного "шкурного" интереса))). Поскольку в допустимых случаях могу применять локальные со static.
 
Vitaly Muzichenko:

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

Я так понимаю, что эта шляпа "SymbolInfoTick" нужна для получения актуальных цен?

Так для получения актуальных Ask и Bid в mql4 по-любому надо было вызывать рефреш. И получается что по нагрузке вряд-ли что изменится по сравнению с вызовом SymbolInfoTick()

Только вот такое дополнение, для безошибочного получения актуальных цен, я пишу SymbolInfoTick() в такой цикл

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Если с первого раза получим нормальные цены, то этот цикл не увеличит время выполнения. А если какой-то сбой то повтор лучше чем хрензнаетчто вместо актуальных цен.

 
Alexey Viktorov:

Так для получения актуальных Ask и Bid в mql4 по-любому надо было вызывать рефреш. И получается что по нагрузке вряд-ли что изменится по сравнению с вызовом SymbolInfoTick()

Только вот такое дополнение, для безошибочного получения актуальных цен, я пишу SymbolInfoTick() в такой цикл

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Если с первого раза получим нормальные цены, то этот цикл не увеличит время выполнения. А если какой-то сбой то повтор лучше чем хрензнаетчто вместо актуальных цен.

Ясно, а куда это ставить, во внутрь цикла, или до?
 
Vitaly Muzichenko:
Ясно, а куда это ставить, во внутрь цикла, или до?
Так это-же отдельный цикл до получения актуальных цен. А куда поставишь уже обсудили. Если есть вариант засады с неактуальными ценами, то надо ставить в цикле перебора ордеров.
 
Alexey Viktorov:

Так для получения актуальных Ask и Bid в mql4 по-любому надо было вызывать рефреш. И получается что по нагрузке вряд-ли что изменится по сравнению с вызовом SymbolInfoTick()

Только вот такое дополнение, для безошибочного получения актуальных цен, я пишу SymbolInfoTick() в такой цикл

        do
         while(!SymbolInfoTick(_Symbol, mqlTick));

Если с первого раза получим нормальные цены, то этот цикл не увеличит время выполнения. А если какой-то сбой то повтор лучше чем хрензнаетчто вместо актуальных цен.

А если вообще не получит? Как тормозишь цикл?
 
Artyom Trishkin:
А если вообще не получит? Как тормозишь цикл?

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

Как всё-же лучше получать актуальные цены, и при этом менее ресурсозатратно, напомню - для трала сетки. 

 
Vitaly Muzichenko:

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

Как всё-же лучше получать актуальные цены, и при этом менее ресурсозатратно, напомню - для трала сетки. 

глянь страниц 10- назад, там есть неплохая схемка
 
trader781:
глянь страниц 10- назад, там есть неплохая схемка
Не нашёл, да и не помню здесь такого
Причина обращения: