Помгите, новичку доработать код, пожалуйста.

 

https://www.mql5.com/ru/articles/1516 - Вот не получается у меня доработать функцию CloseOrder1 из публикуемого файла - библиотеки фунци1 Lite_EXPERT1.mqh. Доработать так, чтобы активный ордер мог бы быть закрыт не по stop loss - параметру ордера, а по уровню текущей прибыли - убытка. Например, хочу закрыть на 100 пунктах убытка, код измеряет текущий убыток, и если он 100 или больше - закрывает ордер. Это очень полезно если брокер ограничивает размещение стоп - лося, как параметр ордера, на каком - то далеком уровне. Например у Альпари на нефть - 250 пунктов. Помогите пожалуйста.

Файлы:
 

Посмотрите функцию Игоря Кима. Ее можно применить целиком или посмотреть, как сделано.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 зеркально отобразить
 

Спасибо, буду разбираться