Ну во-первых, ошибка при определении свободной маржи (кстати зачем она нужна при модификации ордера? лот все равно не можете менять на filled позиции)
request.type = ORDER_TYPE_BUY;
request.volume = 0.01;
//---проверим хватает ли средств для открытия позицииdouble margin = 0.0;
if (!OrderCalcMargin(request.type, request.symbol, request.volume, price, margin))
{
Print("Условия по марже, ошибка:", GetLastError());
return(false);
}
То есть, не хватает type, volume и price (я заменил для пробы request.price -> price, поскольку request.price не определена)
Во-вторых, перед вызовом OrderSend(request,result), Вы не задаете номер ордера, который нужно модифицировать в структуре request. MT5 принимает на модификацию ордер 0, которого не существует. Вот и все.
Mike_Kharkov: собственно я же пост поэтому и создал, что бы уточнить как необходимо прописывать модификацию.
Я бы передавал тикет ордера в функцию модификации, СЛ и ТП. Затем по данным выбранного ордера заполнял нужные request поля и потом OrderSend.
Проверку маржи только на открытие позиции, или при изменении лота отложенных ордеров... хотя особого смысла в этом не вижу даже при открытии, разве что на микро счетах работать...
Я бы передавал тикет ордера в функцию модификации, СЛ и ТП. Затем по данным выбранного ордера заполнял нужные request поля и потом OrderSend.
Проверку маржи только на открытие позиции, или при изменении лота отложенных ордеров... хотя особого смысла в этом не вижу даже при открытии, разве что на микро счетах работать...
А вы не могли бы пример привести как правильно прописывается модификация?
Попробовал разные варианты, в том числе и вот такой:
//функция формирующая модификацию торгового запроса и проверки результата -------------------+bool ModifyOrder(double price, double prc_bid)
{
MqlTradeRequest request = {0};
MqlTradeResult result = {0};
//---заполняем поля торгового запроса
request.action = TRADE_ACTION_MODIFY; // Тип выполняемого действияrequest.order = result.order; //Тикет ордера
request.symbol = _Symbol; // Имя торгового инструмента
request.tp = prc_bid; // Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении
request.sl = price - 270*_Point; // Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении//---отправка запроса на сервер и проверка результата отправкиif (OrderSend(request,result))
{
Print ("Запрос отправлен, результат:",result.retcode);
if ( result.retcode == TRADE_RETCODE_DONE)
{
Print("TRADE_RETCODE_DONE");
return (true);
};
}
else
{
Print("Ошибка при отправке запроса #", GetLastError());
};
return(false);
};// функция модификации торгового запроса-------------------------------------------------------------------------------------------------+
Mike_Kharkov: вы не могли А вы не могли бы пример привести как правильно прописывается модификация?
Попробовал разные варианты, в том числе и вот такой: и получил вот такую ошибку:
Так Вы не указываете номер ордера для модификации. Укажите его.
Вы обнулили структуру result, и задаете request.order = result.order , по сути 0. А нужно указать номер Вашего ордера, который Вы хотите модифицировать.
К тому же посмотрите какой ТП вы выставляете, он равен цене Bid, чего брокер не примет никогда. Либо закрывайте ордер, либо ставьте на минимально допустимое расстояние от текущей цены.
Продолжая работу над экспертом из предыдущей статьи "Рецепты MQL5 - Изучение свойств позиции в тестере MetaTrader 5", внедрим в него еще целый ряд полезных функций, а также усовершенствуем и оптимизируем уже имеющиеся. На этот раз эксперт будет снабжен внешними параметрами, которые можно будет оптимизировать в тестере MetaTrader 5. Это уже будет немного похоже на простую торговую систему.
К тому же посмотрите какой ТП вы выставляете, он равен цене Bid, чего брокер не примет никогда. Либо закрывайте ордер, либо ставьте на минимально допустимое расстояние от текущей цены.
да. компилировал.
Можите сами проверить.
(если есть желание.)
Ну во-первых, ошибка при определении свободной маржи (кстати зачем она нужна при модификации ордера? лот все равно не можете менять на filled позиции)
То есть, не хватает type, volume и price (я заменил для пробы request.price -> price, поскольку request.price не определена)
Во-вторых, перед вызовом OrderSend(request,result), Вы не задаете номер ордера, который нужно модифицировать в структуре request. MT5 принимает на модификацию ордер 0, которого не существует. Вот и все.
кстати зачем она нужна при модификации ордера?
Я так понимаю что в справке неточность:
· SL & TP Modification
Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 4 полей:
·action
·symbol
·sl
·tp
А должно быть по сути
SL & TP Modification
Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 5 полей:
·action
·order
·symbol
·sl
·tp
собственно я же пост поэтому и создал, что бы уточнить как необходимо прописывать модификацию.
Я бы передавал тикет ордера в функцию модификации, СЛ и ТП. Затем по данным выбранного ордера заполнял нужные request поля и потом OrderSend.
Проверку маржи только на открытие позиции, или при изменении лота отложенных ордеров... хотя особого смысла в этом не вижу даже при открытии, разве что на микро счетах работать...
Я бы передавал тикет ордера в функцию модификации, СЛ и ТП. Затем по данным выбранного ордера заполнял нужные request поля и потом OrderSend.
Проверку маржи только на открытие позиции, или при изменении лота отложенных ордеров... хотя особого смысла в этом не вижу даже при открытии, разве что на микро счетах работать...
Попробовал разные варианты, в том числе и вот такой:
и получил вот такую ошибку:
вы не могли А вы не могли бы пример привести как правильно прописывается модификация?
Попробовал разные варианты, в том числе и вот такой:
и получил вот такую ошибку:
Так Вы не указываете номер ордера для модификации. Укажите его.
Вы обнулили структуру result, и задаете request.order = result.order , по сути 0. А нужно указать номер Вашего ордера, который Вы хотите модифицировать.
bool ModifyOrder(int pTicket, double price, double prc_bid)
{
...
request.order = pTicket;
...
}
А сам номер тикета передавайте при вызове ModifyOrder.
К тому же посмотрите какой ТП вы выставляете, он равен цене Bid, чего брокер не примет никогда. Либо закрывайте ордер, либо ставьте на минимально допустимое расстояние от текущей цены.
Посмотрите веточку https://www.mql5.com/ru/articles/643
К тому же посмотрите какой ТП вы выставляете, он равен цене Bid, чего брокер не примет никогда. Либо закрывайте ордер, либо ставьте на минимально допустимое расстояние от текущей цены.
Посмотрите веточку https://www.mql5.com/ru/articles/643
(у меня на демо именно такой счет.)
>> Либо закрывайте ордер
А это реально сделать, как то кроме модификации?
(я что уже только не пробовал.)
Даже на ECN счетах нельзя закрытся по биду?
(у меня на демо именно такой счет.)
>> Либо закрывайте ордер
А это реально сделать, как то кроме модификации?
(я что уже только не пробовал.)
Ну закрытие вычитанием лота позиции вроде бы. Хотя рекомендуют все же стандартные библиотеки.
А выставить ТП текущей ценой никто не даст.
Ну закрытие вычитанием лота позиции вроде бы. Хотя рекомендуют все же стандартные библиотеки.
А выставить ТП текущей ценой никто не даст.