← К каталогу
Исходный код · ID 2772

breakout_1.1_daytrade_gbpm1(1).mq4

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный советник для MetaTrader 4 реализует стратегию торговли на пробое ценового диапазона. В начале каждого торгового сеанса он анализирует исторические бары за настраиваемый период наблюдения и определяет уровни входа по верхней и нижней границам диапазона, добавляя к ним спред и дополнительные пункты.

Советник размещает отложенные ордера BUYSTOP и SELLSTOP, а также управляет ими в течение торгового дня. Встроена система управления денежными средствами с расчётом лота на основе баланса счёта, установленного множителя риска и кредитного плеча.

Для защиты позиций реализованы различные механизмы: фиксация стоп-лосса с максимальным ограничением, перевод в безубыток после достижения определённой прибыли, трейлинг-стоп на основе ATR на таймфреймах M15 и H1, а также автоматическое закрытие ордеров в конце торгового дня или по истечении заданного времени жизни.

Настройки программы

НастройкаОписание
LotsIfNoMM Лот без управления средствами — Размер лота при отключённом управлении денежными средствами.
UseMM Управление средствами — Переключатель управления денежными средствами: при включении лот рассчитывается автоматически по формуле на основе баланса.
MMRiskFactor Множитель риска — Множитель риска для расчёта размера лота при включённом управлении денежными средствами.
MMBalanceExcludeAmt Исключаемая сумма баланса — Сумма в долларах, исключаемая из баланса счёта при расчёте лота для управления средствами.
MMBalanceShareDivisor Делитель доли баланса — Делитель доли баланса, используемый в формуле расчёта лота для управления средствами.
TradeOpenTime Время открытия торговли — Час начала торгового сеанса для размещения ордеров.
LookBackHrs Часы обратного просмотра — Количество часов исторических данных для расчёта ценового диапазона и определения уровней входа.
PipsAddedToRange Пункты к диапазону — Количество пунктов, добавляемых к верхней и нижней границам диапазона для расчёта уровней входа.
StopLossMax Максимальный стоп-лосс — Максимальное расстояние стоп-лосса от уровня входа в пунктах.
BreakEvenPlus5At Безубыток плюс 5 пунктов — Уровень безубытка в пунктах: после достижения прибыли стоп-лосс переводится на уровень безубытка плюс 5 пунктов.
TakeProfit Тейк-профит — Уровень тейк-профита в пунктах от цены входа.
blTakeProfitOverrideMatchSL Тейк-профит равен стоп-лоссу — Переключатель: при активации тейк-профит пересчитывается равным расстоянию до стоп-лосса от цены входа.
blCloseAtEOD Закрытие в конце дня — Переключатель автоматического закрытия открытых позиций и удаления отложенных ордеров в конце торгового дня.
EOD Время окончания дня — Час окончания торгового дня для автоматического закрытия и удаления ордеров.
blOneTradeOnly Одна сделка — Переключатель режима одной сделки: при активации вторая позиция не открывается, если первая уже исполнена.
ClosedBarLowTrailAfterBE Трейлинг после безубытка по закрытому бару — После перевода в безубыток трейлинг-стоп по закрытому бару в пунктах от уровня стоп-лосса.
Multiplier15mATR3TrailAfterBE Множитель ATR M15 для трейлинга — Множитель ATR(3) на таймфрейме M15 для трейлинг-стопа после перевода в безубыток.
MultiplierH1ATR4TrailAfterBE Множитель ATR H1 для трейлинга — Множитель ATR(4) на таймфрейме H1 для трейлинг-стопа после перевода в безубыток.
RangeMax Максимальный диапазон — Максимальный диапазон в пунктах для фильтрации — при превышении этого значения ордера не размещаются или ограничиваются.
blIfRangeMaxStillOpenFarTrade Поведение при превышении диапазона — Переключатель поведения при превышении максимального диапазона: определяет, размещать ли ордер на дальней стороне диапазона.
OrderHoursExpiry Срок жизни ордеров — Количество часов жизни отложенных ордеров до их автоматического удаления.
blCancelPendingAtStartTime Удаление отложенных ордеров при старте — Переключатель автоматического удаления отложенных ордеров перед началом торгового сеанса.
MagicNum Число-магнит — Число-магнит для идентификации ордеров, созданных данным советником.
TradeComment Комментарий к ордерам — Текстовый комментарий, присваиваемый ордерам советника.
Получить полный код

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

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 и перейдите к оплате.

Стоимость полного кода
1 171,80₽ ≈ $14.32