Посмотрите функцию Игоря Кима. Ее можно применить целиком или посмотреть, как сделано.
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.08.2008 | //| Описание : Возвращает суммарный профит открытых позиций в пунктах | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) { double p; int i, k=OrdersTotal(), pr=0; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { if (mn<0 || OrderMagicNumber()==mn) { p=MarketInfo(OrderSymbol(), MODE_POINT); if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01; if (OrderType()==OP_BUY) { pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p; } if (OrderType()==OP_SELL) { pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p; } } } } } return(pr); }
bool ClosePosByProfitLoss( int ticket, int HandTP, int HandSL ) { //--проверяем инпут параметры if ( HandTP <= 0 && HandSL <= 0 ) { Print( "ClosePosByProfitLoss: Не указаны значения СЛ и ТП, невозможно закрыть позицию!" ); return(false); } if ( ticket < 0 ) { Print( "Не указан тикет позиции!" ); return(false); } //--пытаемся выбрать позицию if ( !OrderSelect( ticket, SELECT_BY_TICKET ) ) { Print( "ClosePosByProfitLoss: Позиция по тикету не выбрана - Ошибка №", GetLastError() ); return(false); } //--собственно пытаемся закрыть if ( OrderType() == OP_BUY ) { if ( HandSL > 0 ) { if ( OrderOpenPrice() - Bid - HandSL*Point > -Point/2.0 ) { Print( "ClosePosByProfitLoss: Цена достигла заданого уровня просадки. Закрываем позицию №", ticket ); if ( OrderClose( ticket, OrderLots(), Bid, 0 ) ) { return(true); } else { Print( "ClosePosByProfitLoss: Ошибка закрытия позиции!" ); return(false); } } } if ( HandTP > 0 ) { if ( Bid - OrderOpenPrice() - HandTP*Point > -Point/2.0 ) { Print( "ClosePosByProfitLoss: Цена достигла заданого уровня прибыли. Закрываем позицию №", ticket ); if ( OrderClose( ticket, OrderLots(), Bid, 0 ) ) { return(true); } else { Print( "ClosePosByProfitLoss: Ошибка закрытия позиции!" ); return(false); } } } } if ( OrderType() == OP_SELL ) { ... } }Думаю можно так. Для Sell зеркально отобразить
Спасибо, буду разбираться
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
https://www.mql5.com/ru/articles/1516 - Вот не получается у меня доработать функцию CloseOrder1 из публикуемого файла - библиотеки фунци1 Lite_EXPERT1.mqh. Доработать так, чтобы активный ордер мог бы быть закрыт не по stop loss - параметру ордера, а по уровню текущей прибыли - убытка. Например, хочу закрыть на 100 пунктах убытка, код измеряет текущий убыток, и если он 100 или больше - закрывает ордер. Это очень полезно если брокер ограничивает размещение стоп - лося, как параметр ордера, на каком - то далеком уровне. Например у Альпари на нефть - 250 пунктов. Помогите пожалуйста.