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 и нажмите кнопку, чтобы перейти к оплате.