TRUE Forex

Просмотр кода форекс советника e-Droba-ZigZag_V2.01.mq4

#property link      "www.fxgeneral.com"
extern int   slip=5;
extern int   MaxSPREAD=5;
extern bool Reverse=false;

extern int     ExtDepth      = 12; 
extern int     ExtDeviation  = 5; 
extern int     ExtBackstep   = 3;
extern int     _point        = 1;
//extern double  _lots       = 0.1;
extern int     _takeProfit  = 94;
extern int     _stopLoss    = 65; 
extern int     BBUSize      = 10;   
extern int     BBUSizepip   = 4; 

extern int  MAGICMA=20100612;
extern bool   TrailingStopFr  = false; //true трейлинг по фракталам
// MM start
extern string  MM_SETUP     = "Money managment setup";
extern string _s1             = "redefinition  minLot, maxLot, stepLot - if = 0, autodefinition";
extern double s_minLot        = 0.1; //можем переопределить минимальный, максимальный размер лота и шаг лота - если оставить ноль, то автоматическое определение
extern double s_maxLot        = 0;
extern double s_stepLot       = 0.1;
extern string s2="---";
extern double DecreaseFactor  = 3; //эта штука уменьшает возможные потери при серии убыточных сделок, уменьшая лот до минимума.

extern string _s2             = "Percent of free margin";
extern double MaximumRisk     = 60; //можем работать процентом от свободных средств.
extern string _s3             = "or fixed lot"; 
extern bool fixedLots         = false; //или фиксированным лотом, если здесь поставим true
extern double Lot             = 0.1;  //а тут размер фиксированного лота

double minLot;
double stepLot;
double maxLot;


double _lastExtremum=0.0;
double _currentExtremum=0.0;
double _previousExtremum=0.0;
int _extType=-1;
double _workLots=0.0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   minLot = s_minLot;
   stepLot = s_stepLot; 
   maxLot = s_maxLot;

   if (s_minLot == 0)
   {
      Print("Автоматическое определение минимального лота");
      Comment("Автоматическое определение минимального лота");
      minLot = MarketInfo(Symbol(),MODE_MINLOT);
   }
   Print("Размер минимального лота: " + minLot);
   Comment("Размер минимального лота: " + minLot);
   Print("---");

   if (s_maxLot == 0)
   {
      Print("Автоматическое определение максимального лота");
      Comment("Автоматическое определение максимального лота");
      maxLot = MarketInfo(Symbol(),MODE_MAXLOT);
   }
   Print("Размер максимального лота: " + maxLot);
   Comment("Размер максимального лота: " + maxLot);
   Print("---");

   if (s_stepLot == 0)
   {
      Print("Автоматическое определение минимального шага лота");
      Comment("Автоматическое определение минимального шага лота");
      stepLot = MarketInfo(Symbol(),MODE_LOTSTEP);
   }
   Print("Размер минимального шага лота: " + stepLot);
   Comment("Размер минимального шага лота: " + stepLot);
   Print("---");
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int err1;
int start()
  {
   int spr=MarketInfo(Symbol(),MODE_SPREAD);
   int ticket=0;
   double _sl=0.0, _tp=0.0;
   double _price=0.0;
   
   if (TrailingStopFr) TrailingStop();
   
 if(BBUSize>0){err1=BBU();}

//----
   if (Volume[0]>1) return;
   _lastExtremum=GetExtremumZZPrice(1);
   Comment (_lastExtremum);
 if(!Reverse)
 {
   if (Close[0]<_lastExtremum){
      if (_extType!=OP_BUYSTOP){
         _CheckOrder(OP_BUYSTOP);
         _price=NormalizeDouble((_lastExtremum+_point*Point),Digits);
         if (_stopLoss>0) _sl=NormalizeDouble(_price-_stopLoss*Point,Digits);
         if (_takeProfit>0) _tp=NormalizeDouble(_price+_takeProfit*Point,Digits);
         _extType=OP_BUYSTOP;
          if(spr<MaxSPREAD)
         ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0);
      }
   }
   if (Close[0]>_lastExtremum){
      if (_extType!=OP_SELLSTOP){
         _CheckOrder(OP_SELLSTOP);
         _price=NormalizeDouble((_lastExtremum-_point*Point),Digits);
         if (_stopLoss>0) _sl=NormalizeDouble(_price+_stopLoss*Point,Digits);
         if (_takeProfit>0) _tp=NormalizeDouble(_price-_takeProfit*Point,Digits);
         _extType=OP_SELLSTOP;
         if(spr<MaxSPREAD)
         ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0);
      }
   }
  }
  
   if(Reverse)
 {
   if (Close[0]<_lastExtremum){
      if (_extType!=OP_SELLLIMIT){
         _CheckOrder(OP_SELLLIMIT);
         _price=NormalizeDouble((_lastExtremum+_point*Point),Digits);
         if (_stopLoss>0) _sl=NormalizeDouble(_price+_stopLoss*Point,Digits);
         if (_takeProfit>0) _tp=NormalizeDouble(_price-_takeProfit*Point,Digits);
         _extType=OP_SELLLIMIT;
          if(spr<MaxSPREAD)
         ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0);
      }
   }
   if (Close[0]>_lastExtremum){
      if (_extType!=OP_BUYLIMIT){
         _CheckOrder(OP_BUYLIMIT);
         _price=NormalizeDouble((_lastExtremum-_point*Point),Digits);
         if (_stopLoss>0) _sl=NormalizeDouble(_price-_stopLoss*Point,Digits);
         if (_takeProfit>0) _tp=NormalizeDouble(_price+_takeProfit*Point,Digits);
         _extType=OP_BUYLIMIT;
         if(spr<MaxSPREAD)
         ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0);
      }
   }
  }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
double GetExtremumZZPrice(int ne=0) {
   double zz;   
   int    i, k=iBars(Symbol(), 0), ke=0;
   for (i=1; i<k; i++) {
      zz=iCustom(Symbol(),0, "ZigZag", ExtDepth,ExtDeviation,ExtBackstep,0,i);
      if (zz!=0) {
         ke++;
         if (ke>ne) return(zz);     
      }   
   }   
   return(0); 
} 
//+------------------------------------------------------------------+
int _CheckOrder(int _checkType=0){
   int i;
   if (OrdersTotal()>0){
      for (i=0; i<=OrdersTotal()-1; i++){
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if (OrderType()==_checkType && OrderMagicNumber()==MAGICMA) OrderDelete(OrderTicket());
         }
      }
   }
   return(0);
}
//+------------------------------------------------------------------+
int  BBU()
{//описание функции http://fxnow.ru/blog/programming_mql4/2.html
int i;bool err;
   for( i=1; i<=OrdersTotal(); i++)         
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true) 
       {   
        if(BBUSize>0 && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA && OrderStopLoss()<OrderOpenPrice())  
        {                
         if(Bid-OrderOpenPrice()>=BBUSize*Point && BBUSize>0 )
          {
           Print("ПОРА В БезуБыток");
           err=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BBUSizepip*Point,OrderTakeProfit(),0,Green);
           if(err==false){return(-1);}
          }//if(Bid-OrderOpenPrice()
         }//if(BBUSize>0
        }//if(OrderSelect(i
            
       if(OrderSelect(i-1,SELECT_BY_POS)==true) 
       {
        if(BBUSize>0 && OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA && (OrderStopLoss()>OrderOpenPrice() || OrderStopLoss()==0))  
        {        
         if(OrderOpenPrice()-Ask>=BBUSize*Point && BBUSize>0)
          {
           Print("ПОРА В БезуБыток");
           err=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BBUSizepip*Point,OrderTakeProfit(),0,Green);
           if(err==false){return(-1);}
          }//if(OrderOpenPrice()
         }//if(BBUSize>0 
       }// if(OrderSelect
    }// for( i=1;
return(0);
}

//+------------------------------------------------------------------------------+
//|                                                                 TrailingStop |
//|                                           Copyright © 2010, Хлыстов Владимир |
//|                                                            cmillion@narod.ru |
//+------------------------------------------------------------------------------+
void TrailingStop()
{
   int tip,Ticket;
   bool error;
   double StLo,OSL,OOP;
   for (int i=0; i<OrdersTotal(); i++) 
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
         {
            OSL   = OrderStopLoss();
            OOP   = OrderOpenPrice();
            Ticket = OrderTicket();
            if (tip==OP_BUY)             
            {
               StLo = NormalizeDouble(SlLastBar(1,Bid),Digits);        
               if (StLo==0) continue;        
               if (StLo < OOP) continue;
               if (StLo > OSL)
               {  error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,DeepPink);
                  if (!error) Print("Error order ",Ticket," TrailingStop ",GetLastError(),"   ",Symbol(),"   SL ",StLo);
                  else Print("TrailingStopFR ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
               }
            }                                         
            if (tip==OP_SELL)        
            {
               StLo = NormalizeDouble(SlLastBar(-1,Ask),Digits);  
               if (StLo==0) continue;        
               if (StLo > OOP) continue;
               if (StLo < OSL || OSL==0 )
               {  error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,DeepPink);
                  if (!error) Print("Error order ",Ticket," TrailingStop ",GetLastError(),"   ",Symbol(),"   SL ",StLo);
                   else Print("TrailingStopFR "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
               }
            } 
         }
      }
   }
}
//--------------------------------------------------------------------
double SlLastBar(int tip,double price)
{
   double fr;
   int i;
   int    STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (tip== 1)
   {
      for (i=2; i<100; i++) 
      {
         fr = iFractals(NULL,0,MODE_LOWER,i);
         if (fr!=0) {if (price-STOPLEVEL*Point > fr) return(fr);}
         else return(0);
      }
   }
   if (tip==-1)
   {
      for (i=2; i<100; i++) 
      {
         fr = iFractals(NULL,0,MODE_UPPER,i);
         if (fr!=0) {if (price+STOPLEVEL*Point < fr) return(fr);}
         else return(0);
      }
   }
}
//--------------------------------------------------------------------

double fLots()
   {
      if (fixedLots) return(Lot);
      return(LotsOptimized());
       
   }

double LotsOptimized()
  {
   double z_lot;
   int    z_orders=HistoryTotal();     // history orders total
   int    z_losses=0;                  // number of losses orders without a break
//---- select lot size
   z_lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/100/1000.0,2);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int z_i=z_orders-1;z_i>=0;z_i--)
        {
         if(OrderSelect(z_i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) z_losses++;
        }
      if(z_losses>1) z_lot=NormalizeDouble(z_lot-z_lot*z_losses/DecreaseFactor,1);
     }
//---- return lot size
   z_lot=NormalizeDouble(z_lot/stepLot,0)*stepLot;
   if(z_lot<minLot) z_lot=minLot;
   if(z_lot>maxLot) z_lot=maxLot;
   
   return(z_lot);
  }

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

  • X
  • 0% загружено
« советник e-CloseOnTime.mq4
советник e-Droba-ZigZag_V2.mq4 »