//+------------------------------------------------------------------+
//|                                             e-Friday-3172552.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 23.10.2005  Эффект пятницы. Вариация 3172552.                    |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"
#define   MAGIC     20051023

//------- Внешние параметры советника --------------------------------
extern string _Parameters_Trade = "----- Параметры торговли";
extern double Lots           = 0.1;    // Размер торгуемого лота
extern int    StopLoss       = 95;     // Размер фиксированного стопа
extern int    HourOpenPos    = 6;      // Время открытия позиции
extern bool   UseClosePos    = True;   // Использовать закрытие позиции
extern int    HourClosePos   = 23;     // Время закрытия позиции
extern bool   UseTrailing    = False;  // Использовать трал
extern bool   ProfitTrailing = True;   // Тралить только профит
extern int    TrailingStop   = 60;     // Фиксированный размер трала
extern int    TrailingStep   = 5;      // Шаг трала
extern int    Slippage       = 3;      // Проскальзывание цены

extern string _Parameters_Expert = "----- Параметры советника";
extern color clOpenBuy    = LightBlue;    // Цвет открытия покупки
extern color clOpenSell   = LightCoral;   // Цвет открытия продажи
extern color clModifyBuy  = Aqua;         // Цвет модификации покупки
extern color clModifySell = Tomato;       // Цвет модификации продажи
extern color clCloseBuy   = Blue;         // Цвет закрытия покупки
extern color clCloseSell  = Red;          // Цвет закрытия продажи

//---- Глобальные переменные советника -------------------------------
int prevDay;

//------- Подключение внешних модулей --------------------------------

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void deinit() {
  Comment("");
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  double Op1=0, Cl1=0;
  int    i=0;

  if (DayOfWeek()==5 && Hour()==HourOpenPos) {
    while (TimeHour(Time[i])!=6) i++;
    Cl1=Close[i];
    while (TimeHour(Time[i])!=14) i++;
    Op1=Close[i];
    if (Op1>Cl1+20*Point) OpenPosition(1);
    if (Op1<Cl1-20*Point) OpenPosition(0);
  }
  if (UseClosePos) {
    if (Hour()>=HourClosePos || prevDay!=Day()) CloseAllPositions();
  }
  if (UseTrailing) TrailingPositions();
  prevDay=Day();
}

//+------------------------------------------------------------------+
//| Открытие позиции                                                 |
//+------------------------------------------------------------------+
void OpenPosition(int op) {
  double ldStop=0, ldTake=0;

  if (!ExistPosition()) {
    if (op==1) {
      if (StopLoss!=0) ldStop=Ask-StopLoss*Point;
      SetOrder(OP_BUY, Ask, ldStop, ldTake);
    }
    if (op==0) {
      if (StopLoss!=0) ldStop=Bid+StopLoss*Point;
      SetOrder(OP_SELL, Bid, ldStop, ldTake);
    }
  }
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции                            |
//+------------------------------------------------------------------+
bool ExistPosition() {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}

//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   pp     - цена                                                  |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake) {
  color clOpen;

  if (op==OP_BUY) clOpen=clOpenBuy;
  else clOpen=clOpenSell;
  OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,"",MAGIC,0,clOpen);
}

//+------------------------------------------------------------------+
//| Закрытие всех позиций по рыночной цене                           |
//+------------------------------------------------------------------+
void CloseAllPositions() {
  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUY) {
          OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
        }
        if (OrderType()==OP_SELL) {
          OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUY) {
          if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*Point) {
            if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
              ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy);
            }
          }
        }
        if (OrderType()==OP_SELL) {
          if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*Point) {
            if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) {
              ModifyStopLoss(Ask+TrailingStop*Point, clModifySell);
            }
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//|   clModify   - цвет модификации                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStop, color clModify) {
  double ldOpen=OrderOpenPrice();
  double ldTake=OrderTakeProfit();

  OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify);
}
//+------------------------------------------------------------------+

