//+----------------------------------------------------------------------------+
//|                                                        a-ATR_Trailing.mqh  |
//|                                                Copyright © 2004, Aborigen  |
//|                                                                            |
//|  25.08.2006  Реализация в виде универсального модуля by KimIV.             |
//|              Рекомендуется для пробойных ТС.                               |
//|                                                                            |
//|  Для использования добавить строки:                                        |
//|  - вне функций    : #include <a-ATR_Trailing.mqh>                          |
//|  - в функции start: if (UseTrailing) TrailingPositions();                  |
//+----------------------------------------------------------------------------+

//------- Внешние параметры модуля --------------------------------------------+
extern string _P_Trailing = "---------- Параметры трала";
extern bool   UseTrailing       = True;     // Использовать трал
extern int    ATR_TF            = 0;        // Таймфрейм
extern int    ATR_Period        = 9;        // Период усреднения
extern double Fast_ATR_Trailing = 1.0;
extern double ATR_Trailing      = 2.0;

//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
void TrailingPositions(string sy="", int op=-1, int mn=-1) {
  if (sy=="") sy=Symbol();
  double Trailing1=Fast_ATR_Trailing*iATR(sy, ATR_TF, ATR_Period, 1);
  double Trailing=ATR_Trailing*iATR(sy, ATR_TF, ATR_Period, 1);
  double pAsk=MarketInfo(sy, MODE_ASK);
  double pBid=MarketInfo(sy, MODE_BID);
  int    cnt, total=OrdersTotal();

  for (cnt=0; cnt<total; cnt++) {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol()==sy && (op<0 || OrderType()==op)) {
      if (mn<0 || OrderMagicNumber()==mn) {

        // First Trailing ----------
        if (OrderType()==OP_BUY
        && OrderOpenPrice()<pBid-Trailing1
        && OrderStopLoss()<OrderOpenPrice()) {
          ModifyOrder(sy, -1, pBid-Trailing1, 0, clModifyBuy);
        }
        if (OrderType()==OP_SELL
        && OrderOpenPrice()>pAsk+Trailing1
        && (OrderStopLoss()>OrderOpenPrice() || OrderStopLoss()==0)) {
          ModifyOrder(sy, -1, pAsk+Trailing1, 0, clModifySell);
        }
        // End of First Trailing ---------- 

        if (OrderType()==OP_BUY
        && OrderOpenPrice()<pBid-Trailing
        && OrderStopLoss()<pBid-Trailing) {
          ModifyOrder(sy, -1, pBid-Trailing, 0, clModifyBuy);
        }
        if (OrderType()==OP_SELL
        && OrderOpenPrice()>pAsk+Trailing
        && (OrderStopLoss()>pAsk+Trailing || OrderStopLoss()==0)) {
          ModifyOrder(sy, -1, pAsk+Trailing, 0, clModifySell);
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+

