//+------------------------------------------------------------------+
//|                                                 e-MondayF_LS.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  31.01.2006  Советник по стратегии Понедельник против пятницы    |
//|  с раздельной системой выходов для позиций LONG и SHORT.         |
//|21/02/2006 Добавил фунцию выбора рабочего лота.                   |
//|Andrei Karasev (av1976)                                           |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"
#define   MAGIC     20060131

//------- Внешние параметры советника --------------------------------
extern string _P_Long = "---------- Параметры для покупок";
extern int  lRangeFriday  = 0;     // Диапазон пятницы (Open-Close)
extern int  lHourOpenPos  = 5;     // Время открытия позиции
extern int  lDayForClose  = 4;     // День для закрытия позиции
extern int  lHourClosePos = 11;    // Время закрытия позиции
extern int  lStopLoss     = 55;    // Размер стопа
extern int  lTakeProfit   = 150;   // Размер тэйка
extern bool lUseTrailing  = False; // Использовать трал
extern int  lTrailingStop = 0;     // Размер трала
extern string _P_Short = "---------- Параметры для продаж";
extern int  sRangeFriday  = 20;     // Диапазон пятницы (Open-Close)
extern int  sHourOpenPos  = 11;    // Время открытия позиции
extern int  sDayForClose  = 5;     // День для закрытия позиции
extern int  sHourClosePos = 13;    // Время закрытия позиции
extern int  sStopLoss     = 55;    // Размер стопа
extern int  sTakeProfit   = 340;   // Размер тэйка
extern bool sUseTrailing  = True;  // Использовать трал
extern int  sTrailingStop = 65;    // Размер трала

//---- Глобальные переменные советника -------------------------------
bool   bLastBuy;
int    Slippage      = 3;
int    NumberOfTry   = 9;
bool   UseSound      = True;
string NameFileSound = "expert.wav";
extern bool   ShowComment   = True;         // Показывать комментарии
color  clOpenBuy     = LightBlue;
color  clOpenSell    = LightCoral;
color  clModifyBuy   = Aqua;
color  clModifySell  = Tomato;
color  clCloseBuy    = Blue;
color  clCloseSell   = Red;
int    TrailingStop, TrailingStep=5;

//------- Поключение внешних модулей ---------------------------------
#include <b-Lots.mqh>
#include <stdlib.mqh>

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

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  int bs=0;

  if (DayOfWeek()==1 && Minute()<5) {
    bs=GetSignal();
    if (Hour()==lHourOpenPos && bs>0) OpenPosition();
    if (Hour()==sHourOpenPos && bs<0) OpenPosition();
  }

  if (bLastBuy) {
    if (DayOfWeek()==lDayForClose && Hour()>=lHourClosePos) CloseAllPositions();
    TrailingStop=lTrailingStop;
    if (lUseTrailing) TrailingPositions();
  } else {
    if (DayOfWeek()==sDayForClose && Hour()>=sHourClosePos) CloseAllPositions();
    TrailingStop=sTrailingStop;
    if (sUseTrailing) TrailingPositions();
  }
    if (!IsTesting() && ShowComment) {
      Lots=GetSizeLot();
      Comment("  Lots="+DoubleToStr(Lots, 1));
    }
}

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

  if (!ExistPosition()) {
    if (bs>0) {
      if (lStopLoss!=0) ldStop=Ask-lStopLoss*Point;
      if (lTakeProfit!=0) ldTake=Ask+lTakeProfit*Point;
      SetOrder(OP_BUY, Ask, ldStop, ldTake);
      bLastBuy=True;
    }
    if (bs<0) {
      if (sStopLoss!=0) ldStop=Bid+sStopLoss*Point;
      if (sTakeProfit!=0) ldTake=Bid-sTakeProfit*Point;
      SetOrder(OP_SELL, Bid, ldStop, ldTake);
      bLastBuy=False;
    }
  }
}

//+------------------------------------------------------------------+
//| Возвращает торговый сигнал                                       |
//+------------------------------------------------------------------+
int GetSignal() {
  double op1=iOpen (NULL, PERIOD_D1, 1);
  double cl1=iClose(NULL, PERIOD_D1, 1);
  int    bs=0;

  if (op1-cl1>lRangeFriday*Point) bs=1;
  if (cl1-op1>sRangeFriday*Point) bs=-1;

  return(bs);
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции по номеру                  |
//+------------------------------------------------------------------+
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;
   Lots=GetSizeLot();
  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 (Bid-OrderOpenPrice()>TrailingStop*Point) {
            if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
              ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy);
            }
          }
        }
        if (OrderType()==OP_SELL) {
          if (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);
}
//+------------------------------------------------------------------+

