← Назад к списку файлов

breakout_1.1_daytrade_gbpm1(1).mq4

Поиск по коду файла

extern double    LotsIfNoMM=1;
extern bool      UseMM=false;
extern double    MMRiskFactor=0.2;
extern double    MMBalanceExcludeAmt=0;
extern double    MMBalanceShareDivisor=1;
extern int       TradeOpenTime=9;
extern int       LookBackHrs=1;
extern int       PipsAddedToRange=5;
extern int       StopLossMax=50;
extern int       BreakEvenPlus5At=30;
extern int       TakeProfit=999;
extern int       blTakeProfitOverrideMatchSL=0;
int       blExitAtDailyBarRangeIfInProfit=0; //Left experimental code in, but results no good and needs to be made to work on both closed bars and every tick
int       DailyBarRange=120;
extern int       blCloseAtEOD=1;
extern int       EOD=17;
extern int       blOneTradeOnly=0;
extern int       ClosedBarLowTrailAfterBE=0;
extern int       Multiplier15mATR3TrailAfterBE=0;
extern int       MultiplierH1ATR4TrailAfterBE=0;
extern int       RangeMax=0;
extern int       blIfRangeMaxStillOpenFarTrade=1;
extern int       OrderHoursExpiry=0;
extern int       blCancelPendingAtStartTime=1;
extern bool      AdjustDSTwhenBacktesting?=false;
extern bool      Skip1stFriOfMonthIfBacktesting?=false;
int       blTakePartialProfitAtBEtime=0;  //The code is not reliable for anything but backtest
extern int       MagicNum=253661;
extern string    TradeComment="BO_DayTrade";

double CalculateMMLot()
  {
   double lot_min =MarketInfo(Symbol(),MODE_MINLOT);
   double lot_max =MarketInfo(Symbol(),MODE_MAXLOT);
   double lot_step=MarketInfo(Symbol(),MODE_LOTSTEP);
   double lot;

   if(lot_min<0 || lot_max<=0.0 || lot_step<=0.0) 
     {
      Print("CalculateMMLot: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");
      return(0);
     }
   if(AccountLeverage()<=0)
     {
      Print("CalculateMMLot: invalid AccountLeverage() [",AccountLeverage(),"]");
      return(0);
     }

   lot=NormalizeDouble((AccountBalance()-MMBalanceExcludeAmt)/MMBalanceShareDivisor*MMRiskFactor/AccountLeverage()/10.0,2);

   lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;

   return(lot);
  }

int start()
  {
      // код доступен только после оплаты
   }

   int i,Ticket,LastOrderTime,StartTime,EODTime,CloseUnhitOrdersTime,Bought=0,Sold=0,PeriodToReference=0,ErrTemp=0;
   int PendingTicket,OpenTicket,Last15mATRTrailBarTime,LastH1ATRTrailBarTime;

   double Lots,EntryLong,EntryShort,SLLong,SLShort,TPLong,TPShort,CurrBarTime,LookbackBars,ATRtrail;

   if ( ! IsTesting() ) Comment(" Time ", StringSubstr(TimeToStr(CurTime()),StringLen(TimeToStr(CurTime()))-1-5),"    Tick no. ", iVolume(NULL,0,0));

   if (UseMM) Lots=CalculateMMLot(); else Lots=LotsIfNoMM;

   /*
   if (IsTesting()) PeriodToReference=0; 
      else PeriodToReference=PERIOD_M1;
   */  
   PeriodToReference=0; //I.e. whatever timeframe the chart/backtest is in

   CurrBarTime=iTime(NULL,PeriodToReference,0);

   if(IsTesting() && AdjustDSTwhenBacktesting? && TimeMonth(CurrBarTime)>=4 && TimeMonth(CurrBarTime)<=10)
      {
      StartTime= StrToTime(TradeOpenTime-1+":00");
      CloseUnhitOrdersTime= StrToTime(TradeOpenTime+OrderHoursExpiry-1+":00");
      if(DayOfWeek()==5)   EODTime  = MathMin(StrToTime("22:00"),StrToTime(EOD-1+":00"));
         else              EODTime  = StrToTime(EOD-1+":00");
      }
      else
      {
      StartTime= StrToTime(TradeOpenTime+":00");
      CloseUnhitOrdersTime= StrToTime(TradeOpenTime+OrderHoursExpiry+":00");
      if(DayOfWeek()==5)   EODTime  = MathMin(StrToTime("22:00"),StrToTime(EOD+":00"));
         else              EODTime  = StrToTime(EOD+":00");
      }

   if(blCancelPendingAtStartTime == 1 && CurTime()> StartTime-15*60 && CurrBarTime<StartTime)
      {
      for (i=0;i<OrdersTotal();i++)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)) OrderDelete(OrderTicket());
         }
      }

   if(TimeDay(StrToTime(TimeHour(CurrBarTime)+":00")) == TimeDay(CurrBarTime) && CurrBarTime>= StartTime && StrToTime(TimeHour(CurrBarTime)+":00")<StartTime+60*60)
      {

      LookbackBars=0;

      for (i=0;i<Bars;i++)
         {
         if (iTime(NULL,PeriodToReference,i) < StrToTime(TimeHour(CurrBarTime)+":00")-(LookBackHrs*60*60)) 
            {
            LookbackBars=i+1;
            break;
            }
         }

      if (LookbackBars==0) return(0); //exit if not enough bars on current timeframe

      EntryLong   =iHigh(NULL,PeriodToReference,Highest(NULL,PeriodToReference,MODE_HIGH,LookbackBars,1))+(PipsAddedToRange+MarketInfo(Symbol(),MODE_SPREAD))*Point;
      EntryShort  =iLow (NULL,PeriodToReference,Lowest (NULL,PeriodToReference,MODE_LOW, LookbackBars,1))-PipsAddedToRange*Point;

      SLLong      =MathMax(EntryLong-StopLossMax*Point,EntryShort);
      SLShort     =MathMin(EntryShort+StopLossMax*Point,EntryLong);

      if (blTakeProfitOverrideMatchSL==0)
         {
         TPLong      =EntryLong+TakeProfit*Point;
         TPShort     =EntryShort-TakeProfit*Point;
         }
       else
         {
         TPLong      =EntryLong+(EntryLong-SLLong);
         TPShort     =EntryShort-(SLShort-EntryShort);
         }

      for (i=0;i<OrdersTotal();i++)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_BUY)) 
            {
            Bought++;

            if (OrderStopLoss()<OrderOpenPrice()-(StopLossMax+2)*Point) OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLossMax*Point,OrderTakeProfit(),OrderExpiration(),Green);
            }
         if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol() && (OrderType()==OP_SELLSTOP || OrderType()==OP_SELL)) 
            {
            Sold++;

            if (OrderStopLoss()>OrderOpenPrice()+(StopLossMax+2)*Point) OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLossMax*Point,OrderTakeProfit(),OrderExpiration(),Green);
            }
         }

      if (RangeMax != 0 && EntryLong-EntryShort>=RangeMax*Point) //So we can filter out large ranges
         { 
         if (blIfRangeMaxStillOpenFarTrade==1) 
            {

            if (iClose(NULL,PeriodToReference,1)-EntryShort < EntryLong-iClose(NULL,PeriodToReference,1)) 
               {
               Sold=1;

               }
              else
               {
               Bought=1;
               }
            }
           else
            {

            Bought=1;
            Sold=1;
            }
         }

      if (! (IsTesting() && Skip1stFriOfMonthIfBacktesting? &&  DayOfWeek()==5 && Day()<8)) 
         {
         if(Bought==0 && EntryLong>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) //no buy order and price not right at the top of the range
            {
            Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,EntryLong,3,SLLong,TPLong,TradeComment,MagicNum,0,Green);
            }
         if(Sold==0 && EntryShort<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) //no sell order and price not right at the bottom of the range
            { 
            Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,EntryShort,3,SLShort,TPShort,TradeComment,MagicNum,0,Green);
            }
         }
      }

   if (blOneTradeOnly==1  && CurrBarTime>=StartTime+60*60) //Delete the second pending trade if the other has been hit and new orders are no longer being placed
      {
      OpenTicket=0;
      PendingTicket=0;
      for (i=0;i<OrdersTotal();i++)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {OpenTicket=OrderTicket();}
         if(OrderMagicNumber()==MagicNum && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)) {PendingTicket=OrderTicket();}

Показано первые 50% кода (символов: 11718)

Как получить полную версию?

Введите ваш email и нажмите кнопку, чтобы перейти к оплате.