Этот подход работает только в том случае, если текущий размер позиции равен нулю, а новая сделка успешно исполняется с желаемым размером позиции.
См. код:
#include <Trade\Trade.mqh>
//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick()
{
bool conditions_to_open;
ENUM_ORDER_TYPE order_type;
double lot;
double price,sl,tp;
//---...set variables//--- inside OnTick()if(conditions_to_open && !position_opened) //-- Or position_opened==false
{
if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
&&
(trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
{
//--- set the global variable to true to avoid duplicate orders
position_opened=true;
Print("Success!");
}
else
{
Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
//--- Sets the global variable to false// position_opened=false; //-- Not needed as position_opened is already falsereturn;
}
}
//---
}
Но что если ваш советник разворачивает позицию: из LONG в SHORT или наоборот, и это действие выполняется в двух разных сделках?
После первой сделки булево "position_opened" устанавливается в "TRUE", и советник не может открыть вторую сделку, потому что проверяется условие"if(conditions_to_open && !position_opened)", поэтому вторая сделка будет заблокирована.
А что если позиция открыта лишь частично? Вам нужна вторая сделка, чтобы довести размер позиции до нужного размера.
В итоге, если говорить "коротко", вам всегда нужна функция PositionSelect(Symbol()) для расчета КРУГЛОГО размера позиции, и именно с этого началась вся проблема (и эта тема на форуме).
В критический момент, когда советник вызывает PositionSelect(Symbol()), терминал еще не обновил размер КУРРЕНТНОЙ позиции, и советник работает с неправильным размером позиции и посылает новый двойной ордер на торговый сервер.
Я думаю, что подход из(figurelli) лучше, потому что вы вынуждены ждать, пока советник обновит функцию PositionSelect(Symbol()) до правильного размера позиции.
bool fatalError=false; // atention: declare this as global
....
if(fatalError == false)
{
if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0))
{
Print("Position opened in ", Symbol());
int maxTimeout=0;
while(!PositionSelect(Symbol()))
{
Sleep(100);
maxTimeout++;
if(maxTimeout > 100)
{
Print("### PositionSelect fatal error!");
fatalError = true;
break;
}
}
Print("--> PositionSelect delay=",maxTimeout * 100);
break;
}
}
Этот подход работает только в том случае, если текущий размер позиции равен нулю, а новая сделка успешно исполняется с желаемым размером позиции.
См. код:
Но что если ваш советник разворачивает позицию: из LONG в SHORT или наоборот, и это действие выполняется в двух разных сделках?
После первой сделки булево "position_opened" устанавливается в "TRUE", и советник не может открыть вторую сделку, потому что проверяется условие"if(conditions_to_open && !position_opened)", поэтому вторая сделка будет заблокирована.
А что если позиция открыта лишь частично? Вам нужна вторая сделка, чтобы довести размер позиции до нужного размера.
В итоге, если говорить "коротко", вам всегда нужна функция PositionSelect(Symbol()) для расчета КРУГЛОГО размера позиции, и именно с этого началась вся проблема (и эта тема на форуме).
В критический момент, когда советник вызывает PositionSelect(Symbol()), терминал еще не обновил размер КУРРЕНТНОЙ позиции, и советник работает с неправильным размером позиции и посылает новый двойной ордер на торговый сервер.
Я думаю, что подход из(figurelli) лучше, потому что вы вынуждены ждать, пока советник обновит функцию PositionSelect(Symbol()).
Вы правы, оба подхода имеют свои ограничения.
Теперь источник этой проблемы четко определен. Каждый должен адаптировать свой код в зависимости от своей стратегии. Я не думаю, что существует общий метод, который можно применить во всех случаях.
Теперь происхождение этого вопроса определено четко. Каждый должен адаптировать свой код в зависимости от своей стратегии. Я не думаю, что существует общий метод, который может быть применим во всех случаях.
Или нам придется ждать "официального заявления" от самих ребят из Metaquotes.
Или нам придется ждать "официального заявления" от самих ребят из Metaquotes.
Есть ли уже ответ от службы поддержки?
Нет. Я как раз думал об этом... Возможно, было бы полезно, если бы все заинтересованные люди написали тикет в ServiceDesk по этому вопросу. Однако я очень скептически отношусь к тому, что MQ захочет изменить этот дизайн. Но мы можем попробовать.
Люди могут написать в ServiceDesk и сообщить номер тикета здесь. Мой
Если бы я согласился с вами, вы бы посчитали это бесполезным?
Я просто учил, что решение Sleeping until Terminating Trading напомнило мне OrderSendReliable(). Я учил, что это можно было бы решить более элегантно.
Это также напоминает мне обработку old_documents ... где идет { и вся торговля должна быть остановлена }.
В любом случае, извините, я не хотел придираться к mql5.
Интересно, не может ли подобная проблема существовать и в mql4, я читал по крайней мере 2 темы за последние месяцы на форуме mql4 от пользователей, которые жаловались на двойные сделки. Не уверен, что это связано, но может быть стоит проверить эти темы. Вы тоже читаете эти темы?
angevoyageur: Интересно, не может ли подобная проблема существовать и в mql4, я читал по крайней мере 2 темы за последние месяцы на форуме mql4 от пользователей, которые жаловались на двойные сделки. Не уверен, что это связано, но может быть стоит проверить эти темы. Вы тоже читаете эти темы?
Да, но трудно сказать, связано ли это с плохим кодированием. Двойная торговля была проблемой еще до появления темы о множественной торговле. Традиционно с ней справляется snelle_moda.
Да, но трудно сказать, связано ли это с плохим кодированием. Двойная торговля была проблемой еще до появления темы о множественной торговле. Традиционный способ ее решения - это способ, которым ее решает snelle_moda.
Не уверен, что понимаю, что вы имеете в виду. Проблема, о которой мы говорим в этой теме, вызвана не плохим кодированием, а плохим дизайном в mql5 (это мое мнение, а может это просто ошибка?). Что вы имеете в виду под "несколькими торговыми потоками"?
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Привет
Этот подход работает только в том случае, если текущий размер позиции равен нулю, а новая сделка успешно исполняется с желаемым размером позиции.
См. код:
Но что если ваш советник разворачивает позицию: из LONG в SHORT или наоборот, и это действие выполняется в двух разных сделках?
После первой сделки булево "position_opened" устанавливается в "TRUE", и советник не может открыть вторую сделку, потому что проверяется условие"if(conditions_to_open && !position_opened)", поэтому вторая сделка будет заблокирована.
А что если позиция открыта лишь частично? Вам нужна вторая сделка, чтобы довести размер позиции до нужного размера.
В итоге, если говорить "коротко", вам всегда нужна функция PositionSelect(Symbol()) для расчета КРУГЛОГО размера позиции, и именно с этого началась вся проблема (и эта тема на форуме).
В критический момент, когда советник вызывает PositionSelect(Symbol()), терминал еще не обновил размер КУРРЕНТНОЙ позиции, и советник работает с неправильным размером позиции и посылает новый двойной ордер на торговый сервер.
Я думаю, что подход из(figurelli) лучше, потому что вы вынуждены ждать, пока советник обновит функцию PositionSelect(Symbol()) до правильного размера позиции.
Привет
Этот подход работает только в том случае, если текущий размер позиции равен нулю, а новая сделка успешно исполняется с желаемым размером позиции.
См. код:
Но что если ваш советник разворачивает позицию: из LONG в SHORT или наоборот, и это действие выполняется в двух разных сделках?
После первой сделки булево "position_opened" устанавливается в "TRUE", и советник не может открыть вторую сделку, потому что проверяется условие"if(conditions_to_open && !position_opened)", поэтому вторая сделка будет заблокирована.
А что если позиция открыта лишь частично? Вам нужна вторая сделка, чтобы довести размер позиции до нужного размера.
В итоге, если говорить "коротко", вам всегда нужна функция PositionSelect(Symbol()) для расчета КРУГЛОГО размера позиции, и именно с этого началась вся проблема (и эта тема на форуме).
В критический момент, когда советник вызывает PositionSelect(Symbol()), терминал еще не обновил размер КУРРЕНТНОЙ позиции, и советник работает с неправильным размером позиции и посылает новый двойной ордер на торговый сервер.
Я думаю, что подход из(figurelli) лучше, потому что вы вынуждены ждать, пока советник обновит функцию PositionSelect(Symbol()).
Вы правы, оба подхода имеют свои ограничения.
Теперь источник этой проблемы четко определен. Каждый должен адаптировать свой код в зависимости от своей стратегии. Я не думаю, что существует общий метод, который можно применить во всех случаях.
Нужна ли нам библиотека OrderSendReliable() для великого и могучего mql5?
Вы правы, оба подхода имеют свои ограничения.
Теперь происхождение этого вопроса определено четко. Каждый должен адаптировать свой код в зависимости от своей стратегии. Я не думаю, что существует общий метод, который может быть применим во всех случаях.
Или нам придется ждать "официального заявления" от самих ребят из Metaquotes.
Есть ли уже ответ от службы поддержки?
Если бы я согласился с вами, вы бы посчитали это бесполезным?
.
Я просто учил, что решение Sleeping until Terminating Trading напомнило мне OrderSendReliable(). Я учил, что это можно было бы решить более элегантно.
Это также напоминает мне обработку old_documents ... где идет { и вся торговля должна быть остановлена }.
В любом случае, извините, я не хотел придираться к mql5.
Или нам придется ждать "официального заявления" от самих ребят из Metaquotes.
Есть ли уже ответ от службы поддержки?
Нет. Я как раз думал об этом... Возможно, было бы полезно, если бы все заинтересованные люди написали тикет в ServiceDesk по этому вопросу. Однако я очень скептически отношусь к тому, что MQ захочет изменить этот дизайн. Но мы можем попробовать.
Люди могут написать в ServiceDesk и сообщить номер тикета здесь. Мой
Если бы я согласился с вами, вы бы посчитали это бесполезным?
Я просто учил, что решение Sleeping until Terminating Trading напомнило мне OrderSendReliable(). Я учил, что это можно было бы решить более элегантно.
Это также напоминает мне обработку old_documents ... где идет { и вся торговля должна быть остановлена }.
В любом случае, извините, я не хотел придираться к mql5.
Да, но трудно сказать, связано ли это с плохим кодированием. Двойная торговля была проблемой еще до появления темы о множественной торговле. Традиционно с ней справляется snelle_moda.
Да, но трудно сказать, связано ли это с плохим кодированием. Двойная торговля была проблемой еще до появления темы о множественной торговле. Традиционный способ ее решения - это способ, которым ее решает snelle_moda.