Как закрыть торговлю асинхронно в MQl4 / MT4?

 

Я написал скрипт для закрытия открытых ордеров.

void OnStart()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
               OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(Symbol(),SYMBOL_BID),3,clrRed);
            else
               if(OrderType()==OP_SELL)
                  OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(Symbol(),SYMBOL_ASK),3,clrLime);
  }

Это хорошо работает. Но он закрывается очень медленно. Для закрытия одной сделки требуется почти 1 секунда. Где я открыл 10 сделок. Означает, что для закрытия сделки потребуется 10 секунд.

Но я хочу закрыть их быстро или, по крайней мере, отправить асинхронный или основанный на потоках запрос на закрытие.

Но я ничего не вижу в MQL4 для этого.

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

 
jaffer wilson:

Я написал скрипт для закрытия открытых ордеров.

Это хорошо работает. Но он закрывается очень медленно. Для закрытия одной сделки требуется почти 1 секунда. Где я открыл 10 сделок. Означает, что для закрытия сделки потребуется 10 секунд.

Но я хочу закрыть их быстро или, по крайней мере, отправить асинхронный или основанный на потоках запрос на закрытие.

Но я ничего не вижу в MQL4 для этого.

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

В mql4 нет асинхронного закрытия\открытия позиций и не будет.

 
jaffer wilson:

Я написал скрипт для закрытия открытых ордеров.

Это хорошо работает. Но он закрывается очень медленно. Для закрытия одной сделки требуется почти 1 секунда. Где я открыл 10 сделок. Означает, что для закрытия сделки потребуется 10 секунд.

Но я хочу закрыть их быстро или, по крайней мере, отправить асинхронный или основанный на потоках запрос на закрытие.

Но я ничего не вижу в MQL4 для этого.

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

  1. Посчитайте неттинговую позицию - в какую сторону направлена,
  2. Откройте противоположную позицию с равнозначный объёмом (залокируйте все существующие позиции).
  3. И уже теперь, начиная от самой убыточной пары "покупка-продажа" закрывайте попарно (покупка-продажа) по одной.
 
Artyom Trishkin :
  1. Посчитайте неттинговую позицию - в какую сторону направлена,
  2. Откройте противоположную позицию с равнозначный объёмом (залокируйте все существующие позиции).
  3. И уже теперь, начиная от самой убыточной пары "покупка-продажа" закрывайте попарно (покупка-продажа) по одной.

Спасибо за помощь. Но я не понял, так как я являюсь разработчиком MQL5 и хочу знать о MQL4. Не могли бы вы показать мне, как я могу это сделать?

 
вы не проверяете результат закрытия ордера.

Если сделок много и происходит сильное движение цены, ордера будут оставаться открытыми.

пс. и slippage ставьте 100-300, чтобы закрывалось по любой цене.
 
Taras Slobodyanik :
вы не проверяете результат закрытия ордера.

Если сделок много и происходит сильное движение цены, ордера будут оставаться открытыми.

пс. и slippage ставьте 100-300, чтобы закрывалось по любой цене.

Что это за проскальзывание, которое вы хотите поставить от 100-300? Я обязательно сделаю эту проверку. Но решает ли это мою проблему и ускоряет ли закрытие? Пожалуйста, дайте мне знать об этом.

 
Artyom Trishkin :
  1. Посчитайте неттинговую позицию - в какую сторону направлена,
  2. Откройте противоположную позицию с равнозначный объёмом (залокируйте все существующие позиции).
  3. И уже теперь, начиная от самой убыточной пары "покупка-продажа" закрывайте попарно (покупка-продажа) по одной.

@ Артём Тришкин, мой друг, пожалуйста, дайте мне знать, как это делается, потому что я думаю, что это принесет мне больше потерь, если я открою два разных типа сделок. Пожалуйста, дайте мне знать, как это делается?

 
jaffer wilson:

@ Артём Тришкин, мой друг, пожалуйста, дайте мне знать, как это делается, потому что я думаю, что это принесет мне больше потерь, если я открою два разных типа сделок. Пожалуйста, дайте мне знать, как это делается?

Это возможно только в том случае, если ДЦ разрешает встречное закрытие ордеров. К сожалению, в последнее время все чаще сталкиваюсь с тем, что такую возможность ДЦ не предоставляет. Для проверки откройте на демо-счете ордера Buy и Sell на одном символе с одинаковым объемом. А потом выберите закрытие одного из ордеров. В окне

 

нужно выбрать "Встречное закрытие" (Close by). Тогда появится список с выбором ордера, который необходимо использовать в качестве закрывающего. При таком закрытии получаем минус один спред, будто закрыли один ордер, а не два.

При программном закрытии нужно использовать функцию OrderCloseBy().

 
Ihor Herasko :

Это возможно только в том случае, если ДЦ разрешает встречное закрытие ордеров. К сожалению, в последнее время все чаще сталкиваюсь с тем, что такую возможность ДЦ не предоставляет. Для проверки откройте на демо-счете ордера Buy и Sell на одном символе с одинаковым объемом. А потом выберите закрытие одного из ордеров. В окне

 

нужно выбрать "Встречное закрытие" (Close by). Тогда появится список с выбором ордера, который необходимо использовать в качестве закрывающего. При таком закрытии получаем минус один спред, будто закрыли один ордер, а не два.

При программном закрытии нужно использовать функцию OrderCloseBy().

Нужно ли повторять открытые позиции для противоположной сделки с одинаковым размером лота? Есть ли простой способ сделать это? OrderCloseBy () использует два билета. Один я знаю, но как получить другой? Есть ли автоматический способ?

 
jaffer wilson:

Нужно ли повторять открытые позиции для противоположной сделки с одинаковым размером лота? Есть ли простой способ сделать это? OrderCloseBy () использует два билета. Один я знаю, но как получить другой? Есть ли автоматический способ?

Пример:

Имеем пять открытых позиций BUY и не важно по каким ценам.

  1. тикет 2 лот 0.3
  2. тикет 4 лот 0.5
  3. тикет 7 лот 0.1
  4. тикет 8 лот 0.6
  5. тикет 9 лот 1.8
Итого сумма лотов 3.3

Чтобы закрыть их все сразу, открываем позицию SELL лотом 3.3 в результате открытия получим тикет позиции. И затем каждыйую из позиций BUY закрываем встречной SELL

Но надо понимать и помнить, что при закрытии одной из позиций BUY получим другую позицию SELL с другим тикетом и другим объёмом. И каждую следующую позицию BUY надо будет закрывать встречной позицией SELL со своим тикетом.

 
Alexey Viktorov :

Пример:

Имеем пять открытых позиций BUY и не важно по каким ценам.

  1. тикет 2 лот 0.3
  2. тикет 4 лот 0.5
  3. тикет 7 лот 0.1
  4. тикет 8 лот 0.6
  5. тикет 9 лот 1.8
Итого сумма лотов 3.3

Чтобы закрыть их все сразу, открываем позицию SELL лотом 3.3 в результате открытия получим тикет позиции. И затем каждыйую из позиций BUY закрываем встречной SELL

Но надо понимать и помнить, что при закрытии одной из позиций BUY получим другую позицию SELL с другим тикетом и другим объёмом. И каждую следующую позицию BUY надо будет закрывать встречной позицией SELL со своим тикетом.

Вау, это превосходная идея. Спасибо. Только я должен рассчитать торговые лоты с уважением, а затем просто использовать их для закрытия сделки. Это замечательно.