![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Все чудесатее и чудесатее...
Установил пару флагов и пару фигурных скобок чтобы быть уверенным в исполнении цикла. Один флаг печатает номер ордера сразу после его выбора, а второй печатает номер этого ордера перед началом его модификации. Вот кусок измененного кода:
Получил следующую картину в журнале ошибок:
т.е. в цикле каким то образом происходит подмена выбранного ордера на предыдущий....
Может у кого есть мысли по этому поводу?
int tiketB=OrderModify...
Может всё-таки bool?
И может стоит передавать туда OrderStopLoss(), а не обнулять?Да, Вы правы, исправил на bool, но видимо не это было причиной, т.к. в цикле по прежнему подменяется ордер №2 на ордер №3, что видно по скриншоту из журнала ошибок.
Вот исправленный код:
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+
if (orders[6]>0) //Если есть открытые ордера
{bool tiket1;
if (orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{tiket1=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
{ Print ("Выбираем Ордер №= ", OrderTicket());
{if (tiket1==true)
{
if (OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType() == OP_BUY)
{Print ("Выбранный Ордер №= ", OrderTicket());
if (OrderTakeProfit()!=ND(Sr_Cena(OP_BUY)+take_profit))
{Print ("Выбранный в цикл модификации Ордер №= ", OrderTicket(), " Модифицировать до ", DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8));
Print ("Для модификации Выбираем Ордер №= ", OrderTicket()," Цена открытия ордера", DoubleToString(OrderOpenPrice(),8));
bool tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,ND(Sr_Cena(OP_BUY)+take_profit),0);
if (tiketB==false) Print (GetLastError()," OrderTicket= ",OrderTicket(), " TP= ", DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8), " Ордер ТР= ", DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString((OrderTakeProfit()-ND(Sr_Cena(OP_BUY)+take_profit))*1000000,8) );
Print("Флаг прохождения= ОК");
}
}
}
}
}
}
}
}
flag_new_order=false;
Скрин журнала ошибок:
Попробовал изменить способ перебора ордеров в цикле.
Ранее перебирал с конца, теперь с начала.
Картина ошибок изменилась, но ордер так и подменяется.
Попробовал изменить способ перебора ордеров в цикле.
Ранее перебирал с конца, теперь с начала.
Картина ошибок изменилась, но ордер так и подменяется.
Фигурных скобок как-то многовато. А воообще, есть же готовые функции модификации, зачем изобретать велосипед заново, да с треугольными колесами?
Посоветуйте, пожалуйста, готовую функцию. Насчёт скобок-поставил специально, чтобы быть уверенным что не происходит перескакивание. Сейчас уберу лишние и продемонстрирую.
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+
if(orders[6]>0) //Если есть открытые ордера
{
if(orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
Print("Выбираем Ордер №= ",OrderTicket());
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
{
Print("Выбранный Ордер №= ",OrderTicket());
if(OrderTakeProfit()!=ND(Sr_Cena(OP_BUY)+take_profit))
{
Print("Выбранный в цикл модификации Ордер №= ",OrderTicket()," Модифицировать до ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8));
Print("Для модификации Выбираем Ордер №= ",OrderTicket()," Цена открытия ордера",DoubleToString(OrderOpenPrice(),8));
bool tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,ND(Sr_Cena(OP_BUY)+take_profit),0);
if(tiketB==false) Print(GetLastError()," OrderTicket= ",OrderTicket()," TP= ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8)," Ордер ТР= ",DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString((OrderTakeProfit()-ND(Sr_Cena(OP_BUY)+take_profit))*1000000,8));
Print("Флаг прохождения= ОК");
}
}
}
}
}
}
flag_new_order=false;
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+
if(orders[6]>0) //Если есть открытые ордера
{
if(orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
Print("Выбираем Ордер №= ",OrderTicket());
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
{
Print("Выбранный Ордер №= ",OrderTicket());
if(OrderTakeProfit()!=ND(Sr_Cena(OP_BUY)+take_profit))
{
Print("Выбранный в цикл модификации Ордер №= ",OrderTicket()," Модифицировать до ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8));
Print("Для модификации Выбираем Ордер №= ",OrderTicket()," Цена открытия ордера",DoubleToString(OrderOpenPrice(),8));
bool tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,ND(Sr_Cena(OP_BUY)+take_profit),0);
if(tiketB==false) Print(GetLastError()," OrderTicket= ",OrderTicket()," TP= ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8)," Ордер ТР= ",DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString((OrderTakeProfit()-ND(Sr_Cena(OP_BUY)+take_profit))*1000000,8));
Print("Флаг прохождения= ОК");
}
}
}
}
}
}
flag_new_order=false;
Не получается. В цикле все равно происходит подмена Ордера №2 на уже модифицированный Ордер №3
Вот скрин:
Методом проб и ошибок сам нашел решение. По сути логики в решении не увидел, сделал интуитивно и все заработало.
Если гуру найдут в чем была проблема - пишите, мне интересно почему ранее не работало.
Если кому интересно, то вот итог этого несчастного куска кода:
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+
if(orders[6]>0) //Если есть открытые ордера
{
if(orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
{
bool tiketB;
double new_TP=ND(Sr_Cena(OP_BUY)+take_profit);
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
Print("Выбираем Ордер №= ",OrderTicket());
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderTakeProfit()!=new_TP)
{
Print("Выбранный в цикл модификации Ордер №= ",OrderTicket()," Модифицировать до ",DoubleToString(new_TP,8));
Print("Для модификации Выбираем Ордер №= ",OrderTicket()," Цена открытия ордера",DoubleToString(OrderOpenPrice(),8));
tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,new_TP,0);
if(tiketB==false) Print(GetLastError()," OrderTicket= ",OrderTicket()," TP= ",DoubleToString(new_TP,8)," Ордер ТР= ",DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString(((OrderTakeProfit()-new_TP)*1000000)));
Print("Флаг прохождения= ОК");
}
}
}
}
}
flag_new_order=false;
Вот скрин журнала: