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

 
EVGENII SHELIPOV #:

Ростислав мне это понятно 

Мне не по не понятно почему если я блокирую флаг внутри этой функции советник начинает открывать и закрывать за  раз 100-200 ордеров 

Потому что если флаг не равен "0", то постоянно вызывает функцию ClosseAll()
 
EVGENII SHELIPOV #:

Мне  не понятно почему если я блокирую флаг внутри этой функции советник начинает открывать и закрывать за  раз 100-200 ордеров 

Объясняю на твоем коде:

Изначально флаг

int flag_close=0;
//+------------------------------------------------------------------+

Далее идет открытие ордеров

//-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
     {

Далее если появляется условие для закрытия ордеров (у тебя их три)

//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if((CountTrade(0) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==1))
     {
      flag_close=1;

флаг получает значение "1" и начинает закрывать ордера

//-------------------------------------------------------------------+  Команда на закрытие ордеров
      if(flag_close==1)ClosseAll();

и как только все ордера закрыты флаг получает значение "0"

   if(CountTrade() == 0)
     {
      flag_close=0;
 
Tretyakov Rostyslav #:
Потому что ели флаг не равен "0", то постоянно вызывает функцию ClosseAll()

Может быть и так при условии что приводит команда на открытие ордера. Вот и происходит своего рода "ЗАЦИКЛИВАНИЕ"   

 
EVGENII SHELIPOV #:

Может быть и так при условии что приводит команда на открытие ордера. Вот и происходит своего рода "ЗАЦИКЛИВАНИЕ"   

У тебя кредитка есть?

Заходишь в магазин и покупаешь пиво по одной бутылке за раз и каждый раз расчитываешься картой пока не получишь "0" на карте,

после этого идешь пополняешь карту и опять идешь за пивом

 
Mihail Matkovskij #:

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

Хеджирование - это абсолютно не lock, и не частичный lock, а совершенно другая система.

 
Vitaly Muzichenko #:

Хеджирование - это абсолютно не lock, и не частичный lock, а совершенно другая система.

Но я же и не говорю, что это losk. Просто перепутал вчера (сказал: нужно открывать противоположную позицию вместо однонаправленной). Время было позднее уже. А сегодня понял где ошибся.

 
Mihail Matkovskij #:

Но я же и не говорю, что это losk. Просто перепутал вчера (сказал: нужно открывать противоположную позицию вместо однонаправленной). Время было позднее уже. А сегодня понял где ошибся.

Тогда всё понятно, бывает и такое :)

 
EVGENII SHELIPOV #:

Может быть и так при условии что приводит команда на открытие ордера. Вот и происходит своего рода "ЗАЦИКЛИВАНИЕ"   

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

Что делать с новыми сигналами и ордерами, которые появились в период заполненного списка? Можно также добавлять их в список закрытия по сигналу выхода. Таким образом, они также закроются в свою очередь. Вот и всё. Создайте такой список и закрываете ордера по тикетам циклически. Можно с интервалом в секунду или несколько секунд на один проход цикла. Осталось реализовать данный алгоритм и всё будет работать.

 
Mihail Matkovskij #:

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

Что делать с новыми ордерами, которые появились в период заполненного списка? Можно также добавлять их в список закрытия. Таким образом, они также закроются в свою очередь. Вот и всё. Создайте такой список и закрываете ордера по этикетам циклически. Можно с интервалом в секунду или несколько секунд на один проход цикла. Осталось реализовать данный алгоритм и всё будет работать.

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

 
Alexander Avksentyev #:

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

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

Причина обращения: