//+----------------------------------------------------------------------------+
//|                                                      a-SimpleTrailing.mqh  |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  17.11.2005  Модуль сопровождения позиций простым тралом.                  |
//|              Для использования в советнике добавить:                       |
//|              - перед функциями  : #include <a-SimpleTrailing.mqh>          |
//|              - в функции start(): if (UseTrailing) TrailingPositions();    |
//+----------------------------------------------------------------------------+

//------- Внешние параметры модуля --------------------------------------------+
extern string _P_Trailing = "---------- Параметры трала";
extern bool UseTrailing      = True;        // Использовать трал
extern bool ProfitTrailing   = True;        // Тралить только профит
extern int  TrailingStopBuy  = 50;          // Фиксированный размер трала
extern int  TrailingStopSell = 50;          // Фиксированный размер трала
extern int  TrailingStep     = 5;           // Шаг трала

//+----------------------------------------------------------------------------+
//|  Сопровождение позиции простым тралом                                      |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
void TrailingPositions(string sy="", int op=-1, int mn=-1) {
  double p, pp;
  int    i, k=OrdersTotal();

  if (sy=="") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(sy, MODE_BID);
            if (!ProfitTrailing || (pp-OrderOpenPrice())>TrailingStopBuy*p) {
              if (OrderStopLoss()<pp-(TrailingStopBuy+TrailingStep-1)*p) {
                ModifyOrder(sy, -1, pp-TrailingStopBuy*p, 0, clModifyBuy);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(sy, MODE_ASK);
            if (!ProfitTrailing || OrderOpenPrice()-pp>TrailingStopSell*p) {
              if (OrderStopLoss()>pp+(TrailingStopSell+TrailingStep-1)*p || OrderStopLoss()==0) {
                ModifyOrder(sy, -1, pp+TrailingStopSell*p, 0, clModifySell);
              }
            }
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+

