Professional Documents
Culture Documents
// --- 3.3 PROCESS TRADE SIGNALS PER BAR & GO-IN-CASH LOGIC --- //
dt = DateTime();
//MaxPortHeat=1;
//if (VarGet("_MaxPortHeat")>0){MaxPortHeat=VarGet("_MaxPortHeat");}
// Loop through signals per bar. Here you can change signals.
// if (Heat>5)
// {
// sig.PosSize = 0; // Long: no-scale in if signal
price > entryprice of first trade
// }
if (sig.Type == 5)
//If signal type is scale-in
{
trade = bo.FindOpenPos(sig.Symbol);
if (trade)
{
if (trade.entryprice < sig.price AND
trade.IsLong()==True AND sig.type==5 )
{
sig.PosSize = 0; // Long: no-scale in if
signal price > entryprice of first trade
}
if (trade.IsLong()==False AND sig.type==5 AND
trade.entryprice > sig.price)
{
sig.PosSize = 0; // Long: no-scale in if signal
price > entryprice of first trade
}
if
(trade.Getpositionvalue()>(VarGet("_MaxScaleIn"))*Sig.PosSize)
{
sig.PosSize = 0; // Long+Short: no-scale in if current
position exceeds _MaxScaleIn*positionsize
}
}
}
}
prevcash = bo.cash;
// Set resulting invested cash
after trades
trade.AddCustomMetric("LogRet", NumToStr(LogRet,1.5) );
trade.AddCustomMetric("RangeRet", NumToStr(LogRange,1.5) );
trade.AddCustomMetric("%ofEquity",NumToStr(PercentOfEquity,1.2) );
prevRet=logRet;
}
//RMathDebugOn();
//RMathSetArray(trades,"trades");
//RMathDebugOff();
// --- 3.6 LIST TRADES (This adds custom trade metrics) --- //
bo.ListTrades();
s=1;
results=0;
first = LastValue(ValueWhen(Status("firstbarinrange"),
BarIndex()));
last = LastValue(ValueWhen(Status("lastbarinrange"),
BarIndex()));
testperiod = Last-First;
for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
{
results[s] = trade.GetPercentProfit();
s++;
s=Min(s,testperiod);
}
pgainmdd=0;
if (s>1) {pgainmdd = Resample(results,"resample.csv",Min(s,testperiod-
1),0.20,10000);}
if (trade)
{
Lastdate=trade.entrydatetime;
for( Lasttrade = bo.GetFirstTrade(); Lasttrade; Lasttrade = bo.GetNextTrade()
)
{
LastDate = Max(lastdate,LastTrade.Exitdatetime);
}
Entryd= DateTimeConvert(0,trade.entrydatetime);
Days = BarsSince(DateNum()==entryd);
Daysn = StrToNum( WriteVal(Days,5.5));
Text = StrRight(NumToStr( trade.entrydatetime, formatDateTime ),4);
Years = ceil(DateTimeDiff(Lastdate,trade.entrydatetime) / 31557600);
DaysInTest =
NumToStr( ceil(DateTimeDiff(Lastdate,trade.entrydatetime)*365.25/ 31557600),1.0);
Ratio = stats.getvalue("EndingCapital") / stats.getvalue("InitialCapital");
CAGR = NumToStr((Ratio ^ (1/Years)-1)*100,1.2);
firstentry = NumToStr( trade.entrydatetime, formatDateTime );
Lastexit = NumToStr( Lastdate, formatDateTime);
}
first = LastValue(ValueWhen(Status("firstbarinrange"),
BarIndex()));
last = LastValue(ValueWhen(Status("lastbarinrange"),
BarIndex()));
testperiod = Last-First;
ret = Nz(ROC(e,1)/100,0);
DiffRet = ret;//-(ROC(RiskFreeTicker,1)/100);
MeanReturns = LastValue(Sum(DiffRet,testperiod)/testperiod,True);
StdDevReturns = LastValue(StDev(DiffRet,testperiod),True);
SR_ret_ann = ((MeanReturns*sharpperiod)-RiskFree)/
(StdDevReturns*(sharpperiod^0.5));
r2 = Correlation( e, refline, Daysn ) ^ 2; //r2
= Correlation( e, refline, BarCount - 1 ) ^ 2;
sr = stats.getvalue("SharpeRatio");
dvr = NumToStr(r2 * SR_ret_ann,1.2);
srStr = NumToStr(sr,1.2);
r2Str = NumToStr(r2,1.2);
proz_w = NumToStr(stats.getvalue("WinnersPercent"),1.2);
proz_Avg = NumToStr(stats.getvalue("AllAvgProfitLossPercent"),1.2);
TotalTrades = NumToStr(stats.getvalue("WinnersQty") +
stats.getvalue("LosersQty"),1.0,False);
MaxDD = NumToStr(stats.getvalue("MaxSystemDrawdownPercent"),1.2);
CAGRMaxDD = NumToStr(-(Ratio ^ (1/Years)-
1)*100/stats.getvalue("MaxSystemDrawdownPercent"),1.2);
RAR = NumToStr(stats.getvalue("RAR"),1.2);
UI = NumToStr(stats.getvalue("UlcerIndex"),1.2);
UIP = NumToStr(stats.getvalue("UlcerPerformanceIndex"),1.2);
ClipboardSet(""+RAR + "\n" + CAGR + " \n" + DVR + " \n" + srstr + "\n"
+NumToStr(SR_ret_ann,1.2)+ "\n"+ r2str + "\n" + proz_w + "\n" + proz_avg + "\n" +
MaxDD +"\n" + pgainmdd + "\n" + CAGRMaxDD + "\n" + Totaltrades );
// --- 3.8 CREATE OUTPUT FILES --- //
e = Foreign( "~~~Equity", "C" );
AddToComposite(e/1000,"~~"+SystemName,"X",atcFlagDefaults |
atcFlagEnableInPortfolio | atcFlagEnableInBacktest);
if( True )
{
fdelete(ExportPath+SystemName+"_stats.csv" );
fh = fopen(ExportPath+SystemName+"_stats.csv","w" );
for (m=1;m<45;m++)
{
switch(m)
{
case 1: metric="Initialcapital";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 2: metric="EndingCapital";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 3: metric="NetProfit";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 4: metric="NetProfitPercent";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 5: metric="ExposurePercent";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 6: metric="NetRAR";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 7: metric="CAR";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 8: metric="RAR";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 9: metric="AllQty";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 10: metric="AllPercent";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 11: metric="AllAvgProfitLoss";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 12: metric="AllAvgProfitLossPercent";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 13: metric="AllAvgBarsHeld";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 14: metric="WinnersQty";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 15: metric="WinnersPercent";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 16: metric="WinnersTotalProfit";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 17: metric="WinnersAvgProfit";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 18: metric="WinnersAvgProfitPercent";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 19: metric="WinnersAvgBarsHeld";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 20: metric="WinnersMaxConsecutive";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 21: metric="WinnersLargestWin";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 22: metric="WinnersLargestWinBars";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 23: metric="LosersQty";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 24: metric="LosersPercent";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 25: metric="LosersTotalLoss";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 26: metric="LosersAvgLoss";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 27: metric="LosersAvgLossPercent";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 28: metric="LosersAvgBarsHeld";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 29: metric="LosersMaxConsecutive";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 30: metric="LosersLargestLoss";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 31: metric="LosersLargestLossBars";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 31: metric="MaxTradeDrawdown";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 32: metric="MaxTradeDrawdownPercent";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 33: metric="MaxSystemDrawdown";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 34: metric="MaxSystemDrawdownPercent";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 35: metric="RecoveryFactor";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 36: metric="CAR/MDD";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 37: metric="RAR/MDD";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 38: metric="ProfitFactor";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 39: metric="StandardError";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 40: metric="RRR";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 41: metric="UlcerIndex";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 42: metric="UlcerPerformanceIndex";qs =
StrFormat("%.4f", stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 43: metric="SharpeRatio";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
case 44: metric="KRatio";qs = StrFormat("%.4f",
stats.GetValue(Metric) ); fputs(Metric+","+qs+"\n", fh );
}
qs = StrFormat("%.4f", LastValue( r2 )); fputs("R-
Squared"+","+qs+"\n", fh );
qs = DVR; fputs("DVR"+","+qs+"\n", fh );
}
}
fclose( fh );
}