Помогите написать код.
//+==================================== Замок ======================================+ for ( int y = OrdersTotal() - 1; y >= 0; y -- ) { if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType() == OP_BUY) { if (!ExistOrders("0", OP_SELLSTOP, Magic,0) && ( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200 != PriceOpenLastPos("0", OP_SELL, Magic))) { lots=LotsCounting(); ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,3,PriceOpenLastPos("0", OP_BUY, Magic)-Point*150,Ask - 2000*Point,"Покупаем- хи-хи ",Magic,0,Magenta); if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); Sleep(10000); prevtime = Time[1]; return (0); } } } if (ExistPositions("0", OP_BUY, Magic) == false) { if (OrderType() == OP_SELLSTOP) { OrderDelete(OrderTicket()); // закрываем позицию } } //-----------------------------------------------------------------------------------попробовал так, но чтото не получается((
везде с функциями отправки ордеров используй нормализацию double NormalizeDouble( double value, int digits);
=OrderSend(Symbol(),OP_SELLSTOP,lots,PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,3,PriceOpenLastPos("0", OP_BUY, Magic)-Point*150,Ask - 2000*Point,"Покупаем- хи-хи ",Magic,0,Magenta);
Должно быть
=OrderSend(Symbol(),OP_SELLSTOP,lots, NormalizeDouble (PriceOpenLastPos("0", OP_BUY, Magic)-Point*200, Digits),3,NormalizeDouble (PriceOpenLastPos("0", OP_BUY, Magic)-Point*150, Digits),NormalizeDouble (Ask - 2000*Point, Digits),"Покупаем- хи-хи ",Magic,0,Magenta);
Тут в логическом сравнении:
if (!ExistOrders("0", OP_SELLSTOP, Magic,0) && ( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200 != PriceOpenLastPos("0", OP_SELL, Magic)))
то же нужно использовать нормализацию иначе второе условие может всегда быть Истина.
if (!ExistOrders("0", OP_SELLSTOP, Magic,0) && (NormalizeDouble( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200, Digits) != NormalizeDouble( PriceOpenLastPos("0", OP_SELL, Magic), Digits)))Я точно не знаю структуры функций ExistOrders и PriceOpenLastPos .
Но если это то
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 12.03.2008 | //| Описание : Возвращает флаг существования ордеров. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любой ордер) | //| mn - MagicNumber (-1 - любой магик) | //| ot - время открытия ( 0 - любое время установки) | //+----------------------------------------------------------------------------+ bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) { int i, k=OrdersTotal(), ty; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ty=OrderType(); if (ty>1 && ty<6) { if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } return(False); }
То в выражении ExistOrders("0", OP_SELLSTOP, Magic,0) алгоритм пытается найти ордер СеллСтоп с магическим номером Маджик и символ инструмента "0"
Попробуй делать запрос
ExistOrders(NULL, OP_SELLSTOP, Magic,0)
sy - Накладывает ограничение на наименование инструмента. По умолчанию параметр равен "" - отсутствие ограничений, то есть любой инструмент. Если передать NULL, то отбор ордеров будет ограничен текущим инструментом.
Найдено здесь https://forum.mql4.com/ru/11287/page2
Логично заключить что в функции PriceOpenLastPos("0", OP_BUY, Magic)
нужно делать запрос
PriceOpenLastPos(NULL, OP_BUY, Magic)
Вроде все получилось. Код следующий:
//+==================================== Замок ======================================+ for ( int y = OrdersTotal() - 1; y >= 0; y -- ) { if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType() == OP_BUY) { if (!ExistOrders("0", OP_SELLSTOP, Magic,0) && ( PriceOpenLastPos("0", OP_BUY, Magic)-Point*200 != PriceOpenLastPos("0", OP_SELL, Magic))/* && (PriceOpenLastPos("0", OP_SELL, Magic)-Point*200 != PriceOpenLastClosePos("0", OP_sel, Magic))*/) { if (Close[2] > PriceOpenLastPos("0", OP_BUY, Magic)-Point*200) { lots=LotsCounting(); ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Magenta); if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); Sleep(10000); prevtime = Time[1]; return (0); } } } } if (ExistPositions("0", OP_BUY, Magic) == false) { if (OrderType() == OP_SELLSTOP) { OrderDelete(OrderTicket()); // закрываем позицию } } } //if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) } //if (OrderSelect(y, SELECT_BY_POS, MODE_TRADES)) } //for ( int y = OrdersTotal() - 1; y >= 0; y -- ) for ( int h = OrdersTotal() - 1; h >= 0; h -- ) { if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) if(OrderType() == OP_SELL) { if(OrderOpenPrice()-Ask > Point*Lock) { OrderModify(OrderTicket(),OrderOpenPrice(),PriceOpenLastPos("0", OP_BUY, Magic)-Point*200,OrderTakeProfit(),0,Blue); } } // Symbol() } // select } //total
Но столкнулся со следующей проблемой:
Все работает прекрасно до тех пор пока появляется еще одна позиция на бай. И все условия сбиваются на новую позицию. Помогите решить.
Логично заключить что в функции PriceOpenLastPos("0", OP_BUY, Magic)
нужно делать запрос
ExistOrders("0", OP_SELLSTOP, Magic,0) загляните внутри функции увидите: if (sy=="0") sy=Symbol();
в том то и дело что мне нужно чтоб эти замки зависели от баев на которых они ставятся. дело в том что у меня работает 2 советника: первый на Buy, а второй на Sell. И если сделать масив на магик, то они начнут путаться между советниками, как я понимаю. А может можно както реализовать через case?
А оптимизировать код, это как?
Как думаете, а сели использовать массив из учебника? https://book.mql4.com/ru/build/orders и использовать значение "Номер ордера" к примеру. только как это сделать не пойму.
Вот не пойму, допустим занеслись данные в массив по О№1 ну и потом еще №2,3 как мне доставать из массива значения нужной позиции, если в любой момент времени я не знаю где он находится.
Идея такова, я извлекаю из масива, тикет интересующей позиции О№1 и далее сопровождаю ее. Только вот как из этого массива извлекать интересующую меня позицию с ее данными?

- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите написать код для такой вот ситуации.