TRUE Forex

Просмотр кода форекс советника ZigZagTrader v5.3.mq4

//+---------------------------------------------------------------------------+
//|                                                               ZigZagScalp |
//|                                        Copyright © 2011, Хлыстов Владимир |
//|---------------------------------------------------------------------------+
#property copyright "Copyright © 2011, Vladimir Hlystov"
#property link      "cmillion@narod.ru"
//+------------------------------------------------------------------ 
extern bool    BUY         = true;  //разрешить торговать 
extern bool    SELL        = true;  //разрешить торговать
extern string Managing.capital = " If a lot = 0, then the lot is calculated as a percentage(LOTrisk) of available funds";
extern double LOT          = 0.1;
extern double LOTrisk      = 5.0;      //если LOT=0, то LOT=процент от депозита<if LOT = 0, LOT = percentage of the deposit>
extern int    takeprofit   = 500;      //TP
extern double K_lot        = 2.0;      //Коэффициент увеличения лота<Zoom Ratio Lot>
extern double Maxlot       = 5.0;      //ограничение максимального лота<limiting the maximum lot>
extern int    MaxRisk      = 100;      //закрывать ордера если лосс достиг MaxRisk процент от депозита<close the warrant if the loss has reached MaxRisk percentage of the deposit>
extern double MaxLoss      = 1000.0;   //ограничение максимальноq просадки (в валюте депозита)
extern int    MaxOrders    = 10;       //змаксимальное кол-во ордеров одного направления
//---------------------------  
extern string Away.from.the = " fractal, candles or Zigzag Отступ от фрактала";
extern int    Delta        = 0;      //отступ выставления отложенного ордера пунктов от фрактала<Indent nominations pending order items from the fractal> 
extern bool   Trend        = false;  //разрешать добавлять ордера только против тренда
//--------------------------- TrailingStop
extern string Options.Trailing = "(0)-notTral (-1)-fractals (-2)-candl (-3)-ZigZag (>0)-PipsTral";
extern int    TrailingStop  = 100;     //если= (-1), то трейлинг по фракталам <if = (-1), then trailing by fractals>
                                       //если= (-2), то трейлинг по свечам    <if = (-2), then trailing by candlelight>
                                       //если= (-3), то трейлинг по ZigZag    <if = (-3), then trailing by ZigZag>
                                       //если= (=0), то нет трейлинга         <if = (=0), not trailing>
                                       //если= (>0), то трейлинг по пипсам    <if = (>0), then trailing by Pips>
//+-------------------------- Time работы
extern string Duration.of.open.orders  = " to close to the minimum profit";
extern int   AllTimeStopOrders = 10;   //в часах закрытие ордеров достигших общего профита и имеющих большое общее время <closure orders reaching a total profit and having a great time overall>
extern string Time.Work = "RestDay - weekday (0-Sunday,1,2,3,4,5,6); TimeStart,TimeEnd - (0-24)";
extern int     RestDay_I   = 0 ,       //weekday (0-Sunday,1,2,3,4,5,6)
               RestDay_II  = 0 ,       //weekday (0-Sunday,1,2,3,4,5,6)
               TimeStart   = 0 ,
               TimeEnd     = 24;
//+-------------------------- Zigzag
extern string Options.Zigzag  = " ";
extern int Zigzag_Depth       = 12;
extern int Zigzag_Deviation   = 5;
extern int Zigzag_Backstep    = 3;
//+-------------------------- Visualization
extern string Options.Visualization  = " ";
color         WhiteColor   = Silver;//цвет вывода информации <color output>
extern bool   DrawInfo     = true;
extern int    Magic        = 0;
//-------------------------------------------------------------------
double MAXLOT,MinLot,TPb,TPs,SLb,SLs;
int OkrLOT;
double STOPLEVEL,lot_s,lot_b;
double доход_SELL,доход_BUY;
int TimeOllOpenBuy,TimeOllOpenSell,TimeBarSell,TimeBarBuy;
//-------------------------------------------------------------------
int init()
{
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   MAXLOT = MarketInfo(Symbol(),MODE_MAXLOT);
   if (Maxlot>MAXLOT) Maxlot = MAXLOT; 
   if (MinLot==0.01) OkrLOT = 2;
   if (MinLot >0.01) OkrLOT = 1;
   if (MinLot >0.1 ) OkrLOT = 0;
   if (DrawInfo){
      ObjectCreate("БАЛАНС", OBJ_LABEL, 0, 0, 0);
      ObjectSet("БАЛАНС", OBJPROP_CORNER, 1);      
      ObjectSet("БАЛАНС", OBJPROP_XDISTANCE, 10 ); 
      ObjectSet("БАЛАНС", OBJPROP_YDISTANCE, 25);
      ObjectCreate("доход", OBJ_LABEL, 0, 0, 0);
      ObjectSet("доход", OBJPROP_CORNER, 1);
      ObjectSet("доход", OBJPROP_XDISTANCE, 10 );
      ObjectSet("доход", OBJPROP_YDISTANCE, 55);
      ObjectCreate("доходS", OBJ_LABEL, 0, 0, 0);
      ObjectSet("доходS", OBJPROP_CORNER, 1);
      ObjectSet("доходS", OBJPROP_XDISTANCE, 10 );
      ObjectSet("доходS", OBJPROP_YDISTANCE, 35);
      ObjectCreate("доходB", OBJ_LABEL, 0, 0, 0);
      ObjectSet("доходB", OBJPROP_CORNER, 1);
      ObjectSet("доходB", OBJPROP_XDISTANCE, 10 );
      ObjectSet("доходB", OBJPROP_YDISTANCE, 45);
   }
   return(0);
}
//-------------------------------------------------------------------
int deinit()
{
   return(0);
}
//-------------------------------------------------------------------
int start()
{
   int H,L, error;
   string name,NameLine;
   int SPREAD = MarketInfo(Symbol(),MODE_SPREAD);
   //----------------------------------------------------------------------- время торговли
   int TekHour  = Hour();
   bool Trede=false;
   if (TimeStart < TimeEnd && TekHour >= TimeStart && TekHour < TimeEnd ) Trede=true; 
   if (TimeStart > TimeEnd && (TekHour >= TimeStart || TekHour < TimeEnd) ) Trede=true; 
   
   if (!Trede) Comment("Торговля запрещена по времени ",TimeStart," - ",TimeEnd);
   
   if (DayOfWeek()==RestDay_I||DayOfWeek()==RestDay_II) 
   {Trede=false;Comment("Торговля запрещена в этот день недели");}
   //----------------------------------------------------------------------- назначение лотов
   double Lot;
   MAXLOT = NormalizeDouble(AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED)-MinLot,OkrLOT);
   if (MAXLOT<0) MAXLOT=0;
   if (MAXLOT>MarketInfo(Symbol(),MODE_MAXLOT)) MAXLOT=MarketInfo(Symbol(),MODE_MAXLOT);
   if (LOT!=0) 
   {
      if (LOT>MAXLOT) 
      {
         if (LOT<MinLot) Lot = 0; 
         else            Lot = MinLot;
      }
      else Lot = LOT; 
   }
   else
   {
      Lot = NormalizeDouble(MAXLOT*LOTrisk/100,OkrLOT);
   }
   if (Lot<MinLot) Lot = MinLot;
   if (MAXLOT<MinLot) Lot = 0; 
   //Comment("MAXLOT ",MAXLOT,"  MinLot ",MinLot,"  Lot ",Lot);
   //-----------------------------------------------------------------------
   STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (takeprofit<STOPLEVEL && takeprofit!= 0) takeprofit=STOPLEVEL;
   if (DrawInfo){
      ObjectDelete("STOPLEVEL_Up");
      ObjectCreate("STOPLEVEL_Up",OBJ_ARROW,0,Time[0],Ask+STOPLEVEL*Point,0,0,0,0);                     
      ObjectSet   ("STOPLEVEL_Up",OBJPROP_ARROWCODE,4);
      ObjectSet   ("STOPLEVEL_Up",OBJPROP_COLOR, Aqua);
      ObjectDelete("STOPLEVEL_Dn");
      ObjectCreate("STOPLEVEL_Dn",OBJ_ARROW,0,Time[0],Bid-STOPLEVEL*Point,0,0,0,0);                     
      ObjectSet   ("STOPLEVEL_Dn",OBJPROP_ARROWCODE,4);
      ObjectSet   ("STOPLEVEL_Dn",OBJPROP_COLOR, DeepPink);}
   //----------------------------------------------------------------------- находим ближайший фракталы Fr
   double FrUp,FrDn;
   for (int i=1; i<500; i++) //находим ближайший верхний фрактал FrUp
   {
      FrUp = iFractals(NULL,0,MODE_UPPER,i);
      if (FrUp==0) continue;
      FrUp = NormalizeDouble(iCustom(NULL,0,"ZigZag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,i), Digits);
      if (FrUp==0) continue;
      FrUp = FrUp+Delta*Point; 
      break;
   }
   for (i=1; i<500; i++) //находим ближайший нижний фрактал FrDn
   {
      FrDn = iFractals(NULL,0,MODE_LOWER,i);
      if (FrDn==0) continue;
      FrDn = NormalizeDouble(iCustom(NULL,0,"ZigZag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,i), Digits);
      if (FrDn==0) continue;
      FrDn = FrDn-Delta*Point;
      break;
   }
   //----------------------------------------------------------------------- проверка установленных стоп ордеров
   double StopOrderUp,StopOrderDn,OOP,MinBuyOrder=1000000000,MaxSellOrder,OldBuyOrder,OldSellOrder,OldBuyLot,OldSellLot;
   int TicketUp,TicketDn,b,s;
   TimeOllOpenBuy=0;TimeOllOpenSell=0;
   double OOL_BUYSTOP,OOL_SELSTOP;
   for (i=0; i<OrdersTotal(); i++)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {  OOP = NormalizeDouble(OrderOpenPrice(), Digits);
         if (Magic==OrderMagicNumber() && OrderSymbol()==Symbol())
         {
            if (OrderType()==OP_BUYSTOP ) {StopOrderUp = OOP; TicketUp=OrderTicket(); OOL_BUYSTOP=OrderLots();}
            if (OrderType()==OP_SELLSTOP) {StopOrderDn = OOP; TicketDn=OrderTicket(); OOL_SELSTOP=OrderLots();}
            if (OrderType()==OP_BUY ) 
            {  
               b++;
               TimeOllOpenBuy = TimeOllOpenBuy + TimeCurrent()-OrderOpenTime();
               if (MinBuyOrder > OOP) MinBuyOrder = OOP; 
               OldBuyOrder=OOP;
               OldBuyLot=OrderLots();
               if (DrawInfo&&!IsTesting()){
                  NameLine="ордер Bay  "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з");
                  ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),OOP ,Time[0],Bid);
                  ObjectSet(NameLine, OBJPROP_COLOR,LightSkyBlue); 
                  ObjectCreate(NameLine+" з",OBJ_ARROW,0,Time[0],Bid,0,0,0,0);
                  ObjectSet(NameLine, OBJPROP_STYLE, STYLE_DOT);
                  ObjectSet(NameLine, OBJPROP_RAY,   false);
                  ObjectSet(NameLine+" з",OBJPROP_ARROWCODE,3);ObjectSet(NameLine+" з",OBJPROP_COLOR,WhiteColor);}  
            }
            if (OrderType()==OP_SELL) 
            {  
               s++;
               TimeOllOpenSell = TimeOllOpenSell + TimeCurrent()-OrderOpenTime();
               if (MaxSellOrder < OOP) MaxSellOrder = OOP; 
               OldSellOrder=OOP;
               OldSellLot=OrderLots();
               if (DrawInfo&&!IsTesting()){
                  NameLine="ордер Sell "+OrderTicket();ObjectDelete(NameLine);ObjectDelete(NameLine+" з");
                  ObjectCreate(NameLine, OBJ_TREND, 0, OrderOpenTime(),OOP ,Time[0],Ask);
                  ObjectSet(NameLine, OBJPROP_COLOR,Pink);
                  ObjectCreate(NameLine+" з",OBJ_ARROW,0,Time[0],Ask,0,0,0,0);
                  ObjectSet(NameLine, OBJPROP_STYLE, STYLE_DOT);// Стиль   
                  ObjectSet(NameLine, OBJPROP_RAY,   false);     // Луч  
                  ObjectSet(NameLine+" з",OBJPROP_ARROWCODE,3);ObjectSet(NameLine+" з",OBJPROP_COLOR,WhiteColor);}
            }
         }
      }   
   }
   if (MinBuyOrder==1000000000 && MaxSellOrder==0 && (OOL_BUYSTOP!=OOL_SELSTOP && TicketUp!=0 && TicketDn!=0))//если серия закрылась
   {
      Print("Удаляем  BUYSTOP ",TicketUp,"  SELSTOP ",TicketDn);
      DELETEORDERS();
   }
   //----------------------------------------------------------------------- открытие и перемещение стоп ордеров
   double Max_Lot;
   if (Max_Lot<OldBuyLot) Max_Lot = OldBuyLot;
   if (Max_Lot<OldSellLot) Max_Lot = OldSellLot;
   if (MinBuyOrder>FrUp || Trend)//разрешать добавлять ордера только против тренда
   {
      if ((StopOrderUp > FrUp || StopOrderUp==0) && FrUp!=0)      //если ордер BuyStop выше верхнего фрактала, меняем его на новый
      {  if (MathAbs(OldBuyOrder - FrUp)/Point>SPREAD && NormalizeDouble((FrUp-Ask)/Point,0)>=STOPLEVEL)           //не открывать если уже открыт по этой цене
         {
            //Comment("открытие");
            if (TicketUp!=0) 
            {  OrderDelete(TicketUp, Blue);Print("удаление ",TicketUp," StopOrderUp ",StopOrderUp," FrUp ",FrUp);
               Sleep(500);
            }
            if (Max_Lot>0)//OldBuyOrder!=0) 
            {
               Lot = NormalizeDouble(Max_Lot*K_lot,OkrLOT);//OldBuyLot
               if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную
            }
            if (Lot!=0) 
            {
               if (Trede&&TimeBarBuy!=Time[0] && b<MaxOrders && BUY) 
               {
                  if (OrderSend(Symbol(),OP_BUYSTOP,Lot,FrUp,3,0,0,NULL,Magic,0,Blue)==-1) 
                     {Print("Ошибка открытия BUYSTOP ",TxtERROR(0),"   ",Symbol()," Тек.цена ",Ask," Lot ",Lot," FrUp ",FrUp);}
                  else TimeBarBuy=Time[0];
               }
            }
            else Comment(Symbol(),"BUYSTOP недостаточно средств Lot=",Lot," MAXLOT ",MAXLOT,"  MinLot ",MinLot);  
         }
      }
   }
   if (MaxSellOrder<FrDn || Trend)//разрешать добавлять ордера только против тренда
   {
      if (StopOrderDn < FrDn)       //если ордер SellStop ниже нижнего фрактала, меняем его на новый
      {  if (MathAbs(OldSellOrder - FrDn)/Point>SPREAD && NormalizeDouble((Bid-FrDn)/Point,0)>=STOPLEVEL)     //не открывать если уже открыт по этой цене
         {
            if (TicketDn!=0) 
            {  OrderDelete(TicketDn, Red);Print("удаление ",TicketDn," StopOrderDn ",StopOrderDn," FrDn ",FrDn);
               Sleep(500);
            }
            if (Max_Lot>0)//OldSellOrder!=0) 
            {
               Lot = NormalizeDouble(Max_Lot*K_lot,OkrLOT);//OldSellLot
               if (Lot>Maxlot) Lot=Maxlot;//ограничение, задаваемое вручную
            }
            if (Lot!=0)
            { 
               if (Trede&&TimeBarSell!=Time[0] && s<MaxOrders && SELL) 
               {
                  if (OrderSend(Symbol(),OP_SELLSTOP,Lot,FrDn,3,0,0,NULL,Magic,0,Red)==-1) 
                     {Print("Ошибка открытия SELLSTOP ",TxtERROR(0),"   ",Symbol()," Тек.цена ",Bid," Lot ",Lot," FrDn ",FrDn);}
                  else TimeBarSell=Time[0];
               }
            }
            else Comment(Symbol()," SELLSTOP недостаточно средств Lot=",Lot," MAXLOT ",MAXLOT,"  MinLot ",MinLot);  
         }
      }
   }
   //-----------------------------------------------------------------------
   TrailingStop();
   TProfit();     // вычисление общего (портфельного) TP
   if (takeprofit!=0) TakeProfit();  //перенос профитов
   //--------------------------------------------------------  закрытие ордеров достигших общего профита и имеющих большое общее время
   //Comment("TimeOllOpenBuy  ",TimeOllOpenBuy,"  TimeOllOpenSell  ",TimeOllOpenSell);
   if (TimeOllOpenBuy+TimeOllOpenSell  > AllTimeStopOrders*3600 && AccountProfit() > 0) CloseAllOrders(100);
      
   /*if (TimeOllOpenBuy  > AllTimeStopOrders && доход_BUY  > 10) 
      CloseAllOrders(OP_BUY);
   if (TimeOllOpenSell > AllTimeStopOrders && доход_SELL > 10) 
      CloseAllOrders(OP_SELL);*/
}
//--------------------------------------------------------------------
void TakeProfit()
{
   int tip,Ticket;
   bool err;
   double OTP;
   for (int i=0; i<OrdersTotal(); i++) 
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
            OTP   = OrderTakeProfit();
            Ticket = OrderTicket();
            if (tip==OP_BUY && MathAbs(OTP - TPb)/Point>STOPLEVEL)             
            {
               if (TPb > Ask+STOPLEVEL*Point && TPb > OTP) 
               {
                  err=OrderModify(Ticket,OrderOpenPrice(),OrderStopLoss(),TPb,0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  if (!err) {Print("Error order ",Ticket," TakeProfit ",TxtERROR(0),"   ",Symbol(),"   TP ",TPb);}
               }
            }                                         
            if (tip==OP_SELL && MathAbs(OTP - TPs)/Point>STOPLEVEL)        
            {
               if (TPs < Bid-STOPLEVEL*Point && (TPs < OTP || OTP == 0))
               {
                  err=OrderModify(Ticket,OrderOpenPrice(),OrderStopLoss(),TPs,0,White);
                  Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  if (!err) {Print("Error order ",Ticket," TakeProfit ",TxtERROR(0),"   ",Symbol(),"   TP ",TPs);}
               }
            } 
         }
      }
   }
}
//--------------------------------------------------------------------
void TrailingStop()
{
   int tip,Ticket;
   bool error;
   double StLo,OSL,OOP,TP;
   for (int i=0; i<OrdersTotal(); i++) 
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
            OSL   = OrderStopLoss();
            OOP   = OrderOpenPrice();
            Ticket = OrderTicket();
            if (tip==OP_BUY)             
            {
               StLo = SlLastBar(1,Bid-STOPLEVEL*Point,TrailingStop);        
               //if (TPb>Ask+STOPLEVEL*Point) TP = TPb; else 
               TP = OrderTakeProfit();
               if (StLo > SLb && StLo<Bid-STOPLEVEL*Point)
               if (StLo > OSL && SLb!=0)
               {  error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,Digits),
                  TP,0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Print("Error order ",Ticket," TrailingStop ",
                              TxtERROR(0),"   ",Symbol(),"   SL ",StLo,"   TP ",TP);
               }
            }                                         
            if (tip==OP_SELL)        
            {
               StLo = SlLastBar(-1,Ask+STOPLEVEL*Point,TrailingStop);  
               if (StLo==0) continue;
               //if (TPs<Bid-STOPLEVEL*Point) TP = TPs; else 
               TP = OrderTakeProfit();
               if (StLo < SLs && StLo>Ask+STOPLEVEL*Point)
               if (StLo < OSL || OSL==0)
               {  error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,Digits),
                  TP,0,White);
                  Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Print("Error order ",Ticket," TrailingStop ",
                              TxtERROR(0),"   ",Symbol(),"   SL ",StLo,"   TP ",TP);
               }
            } 
         }
      }
   }
}
//--------------------------------------------------------------------
double SlLastBar(int tip,double price, int tipTralStop)
{
   double fr;
   int j;
   if (tipTralStop==0) return(0);
   if (tipTralStop>0)//по пипсам 
   {
      if (tip==1) fr = Bid - tipTralStop*Point;  
      else fr = Ask + tipTralStop*Point;  
   }
   if (tipTralStop==-1)//по фракталам
   {
      if (tip== 1)
      for (j=2; j<100; j++) 
      {
         fr = iFractals(NULL,0,MODE_LOWER,j);
         if (fr!=0) {fr =fr - Delta*Point; if (price > fr) break;}
         else fr=0;
      }
      if (tip==-1)
      for (j=2; j<100; j++) 
      {
         fr = iFractals(NULL,0,MODE_UPPER,j);
         if (fr!=0) {fr =fr + Delta*Point; if (price < fr) break;}
         else fr=0;
      }
   }
   if (tipTralStop==-2)//по свечам
   {
      if (tip== 1)
      for (j=1; j<100; j++) 
      {
         fr = iLow(NULL,0,j);
         if (fr!=0) {fr =fr - Delta*Point; if (price > fr) break;}
         else fr=0;
      }
      if (tip==-1)
      for (j=1; j<100; j++) 
      {
         fr = iHigh(NULL,0,j);
         if (fr!=0) {fr =fr + Delta*Point; if (price < fr) break;}
         else fr=0;
      }
   }
   if (tipTralStop==-3)//по зигзагу
   {
      if (tip== 1)
      for (j=2; j<100; j++) 
      {
         fr = iCustom(NULL,0,"Zigzag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,j);
         if (fr!=0) {fr =fr - Delta*Point; if (price > fr) break;}
         else fr=0;
      }
      if (tip==-1)
      for (j=2; j<100; j++) 
      {
         fr = iCustom(NULL,0,"Zigzag",Zigzag_Depth,Zigzag_Deviation,Zigzag_Backstep,0,j);
         if (fr!=0) {fr =fr + Delta*Point; if (price < fr) break;}
         else fr=0;
      }
   }
   return(fr);
}
//-------------------------------------------------------------------- вычисление общего (портфельного) TP
void TProfit()
{
   if (takeprofit==0) return(0);
   int b,s;
   double price,price_b,price_s,lot,LOTmax;
   lot_s=0;lot_b=0;SLb=0;SLs=0;доход_SELL=0;доход_BUY=0;
   for (int i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {  if (Magic==OrderMagicNumber() && OrderSymbol()==Symbol())
         {
            price = OrderOpenPrice();
            lot   = OrderLots();
            if (OrderType()==OP_BUY ) {price_b = price_b+price*lot; b++;  lot_b=lot_b+lot; доход_BUY  = доход_BUY  +OrderProfit();}//Bay                       
            if (OrderType()==OP_SELL) {price_s = price_s+price*lot; s++;  lot_s=lot_s+lot; доход_SELL = доход_SELL +OrderProfit();}//Sell
   }  }  }
   //--------------------------------------
   if (b==0) TPb=NormalizeDouble((Ask + takeprofit*Point),Digits);
   else      TPb=NormalizeDouble((price_b/lot_b + takeprofit*Point),Digits);
   if (s==0) TPs=NormalizeDouble((Bid - takeprofit*Point),Digits);
   else      TPs=NormalizeDouble((price_s/lot_s - takeprofit*Point),Digits);
   if (TPb<Ask+STOPLEVEL*Point) TPb=Ask+STOPLEVEL*Point;
   if (TPs>Bid-STOPLEVEL*Point) TPs=Bid-STOPLEVEL*Point;
   //--------------------------------------
   if (DrawInfo){ObjectDelete("SLb");ObjectDelete("SLb_");}
   if (b!=0) 
   {  SLb = price_b/lot_b;
      if (DrawInfo){
         ObjectCreate("SLb",OBJ_ARROW,0,Time[0],TPb,0,0,0,0);                     
         ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLb",OBJPROP_COLOR, Blue);
         ObjectCreate("SLb_",OBJ_ARROW,0,Time[0],SLb,0,0,0,0);                     
         ObjectSet   ("SLb_",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLb_",OBJPROP_COLOR, Navy);}
   }
   if (DrawInfo){ObjectDelete("SLs");ObjectDelete("SLs_");}
   if (s!=0) 
   {  SLs = price_s/lot_s;
      if (DrawInfo){
         ObjectCreate("SLs",OBJ_ARROW,0,Time[0],TPs,0,0,0,0);                     
         ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLs",OBJPROP_COLOR, Red);
         ObjectCreate("SLs_",OBJ_ARROW,0,Time[0],SLs,0,0,0,0);                     
         ObjectSet   ("SLs_",OBJPROP_ARROWCODE,6);
         ObjectSet   ("SLs_",OBJPROP_COLOR, Maroon);}
   }
   //-------------- баланс
   double Balans = AccountBalance();
   if (DrawInfo)
      {double доход=доход_BUY+доход_SELL;
      color TextColor=Green;
      ObjectSetText("БАЛАНС","  БАЛАНС = "+DoubleToStr(Balans,2)+" |своб "+DoubleToStr(AccountFreeMargin(),2)+" | "+DoubleToStr(MAXLOT,2)+" | "+WindowFirstVisibleBar(),8,"Arial",WhiteColor);
      if (доход<0) TextColor=Red;
      ObjectSetText("доход",StringConcatenate("Общий доход = ",DoubleToStr(доход,2)),8,"Arial",TextColor);
      if (доход_SELL<0) TextColor=Red; else TextColor=Green;
      ObjectSetText("доходS",StringConcatenate(s," SELL ",DoubleToStr(lot_s,OkrLOT)," лот  доход = ",DoubleToStr(доход_SELL,2),"     Т ",TimeToStr(TimeOllOpenSell,TIME_MINUTES)),8,"Arial",TextColor);
      if (доход_BUY<0) TextColor=Red; else TextColor=Green;
      ObjectSetText("доходB",StringConcatenate(b," BUY  ",DoubleToStr(lot_b,OkrLOT)," лот  доход = ",DoubleToStr(доход_BUY ,2),"     Т ",TimeToStr(TimeOllOpenBuy,TIME_MINUTES)),8,"Arial",TextColor);}
   
   

   if (-(доход_BUY+доход_SELL) > (Balans*MaxRisk/100)) CloseAllOrders(100);
   if (-(доход_BUY+доход_SELL) > MaxLoss) CloseAllOrders(100);
   
/*   if (-доход_BUY  > (Balans*MaxRisk/100)) CloseAllOrders(OP_BUY);
   if (-доход_SELL > (Balans*MaxRisk/100)) CloseAllOrders(OP_SELL);*/
}
//--------------------------------------------------------------------
string TxtERROR(int e)
{
   if (e==0) e = GetLastError();
   switch ( e )
   {                  
      case 0:   return;
      case 1:   return;
      case 2:   return("Общая ошибка  ");
      case 3:   return("неправильные параметры   ");
      case 6:   return("Нет связи с торговым сервером   ");
      case 130: return("Неправильные стопы   ");
      case 131: return("Неправильный объем ");
      case 133: return("Торговля запрещена ");
      case 134: return("Недостаточно денег   ");
      case 136: return("Нет цен ");
      case 146: return("Подсистема торговли занята ");
      case 129: return("Неправильная цена ");
      case 131: return("Неправильный объем ");
      case 4051:return("Недопустимое значение параметра функции ");
      case 4059:return("Функция не разрешена в тестовом режиме");
      case 4063:return("Ожидается параметр типа integer ");
      case 4105:return("Ни один ордер не выбран ");
      case 4107:return("Неправильный параметр цены для торговой функции ");
      case 4108:return("Неверный номер тикета ");
      case 4109:return("Торговля не разрешена. Необходимо включить опцию `Разрешить советнику торговать` в свойствах эксперта.");
      case 4200:return("Объект уже существует ");
      default:  return(StringConcatenate("Error  ",e,"   "));
   }
}
//------------------------------------------------------------------------------------------------------------
int CloseAllOrders(int tip)
{  
   bool error=true;
   int Ошибка,nn;
   while(true)
   {
      string txt;
      for (int j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
               if ((tip==OP_BUY || tip==100) && OrderType()==OP_BUY) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Red);
                  if (error) txt=StringConcatenate(txt,"Закрыт ордер N ",OrderTicket(),"  прибыль ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n");
               }
               if ((tip==OP_SELL || tip==100) && OrderType()==OP_SELL) 
               {
                  error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,Red);
                  if (error) txt=StringConcatenate(txt,"Закрыт ордер N ",OrderTicket(),"  прибыль ",OrderProfit(),
                                     "     ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n");
               }
               if (!error) 
               {
                  j--;
                  Ошибка = GetLastError();
                  if (Ошибка<2) continue;
                  if (Ошибка==129) //Неправильная цена
                  {
                     Sleep(5000);
                     RefreshRates();
                     continue;
                  }
                  if (Ошибка==146) //Подсистема торговли занята
                  {
                     if (!IsTesting()) if (IsTradeContextBusy()) Sleep(2000);
                     continue;
                  }
                  txt=StringConcatenate("Ошибка закрытия ордера N ",OrderTicket(),"   ",TxtERROR(Ошибка),"   ",TimeToStr(TimeCurrent(),TIME_MINUTES),"\n");
               }
            }
         }
      }
      Comment(txt);
      int n=0;
      txt="";
      for (j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == tip || tip==100)) {txt=StringConcatenate(txt,OrderTicket(),"\n"); n++;}
         }  
      }
      if (n==0) break; else {Sleep(2000);Comment("Не все ордера удалены, осталось еще ",n,"\n",txt);}
      nn++;
      if (nn>100) {Comment("не могу закрыть ордер");break;}
   }
   return(0);
}
//+------------------------------------------------------------------+
void DELETEORDERS() 
{
   for (int i=0; i<OrdersTotal(); i++)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol() &&  OrderMagicNumber() == Magic)
         { 
            if (OrderType()>1) if (!OrderDelete(OrderTicket())) Print("=== Error DeleteStopOrders ",GetLastError());
         }
      }
   }
return;
}
//--------------------------------------------------------------------

Комментарии к исходному коду форекс советника ZigZagTrader v5.3.mq4
В целях безопасности и борьбы со спамом в тексте комментариев запрещено размещать html-теги и ссылки. Благодарим за понимание.

  • X
  • 0% загружено
« советник ZigZagTrader v4~.mq4
советник ZigZag_Fibo_Alert.mq4 »