//+------------------------------------------------------------------+
//|                                                 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);
}
//+------------------------------------------------------------------+
             
            
            
            
Comments