breakout_1.1_daytrade_gbpm1(1).mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.