gryps2/UI-code/T-056_バックテスト時csv出力.txt

118 lines
9 KiB
Text
Raw Permalink Normal View History

2025-05-30 14:58:21 +02:00
<EFBFBD><EFBFBD>// <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>S<EFBFBD>_
double InitialBalance;
int OnInit()
{
//+------------------------------------------------------------------+
// Rg<<3C><><62>S<EFBFBD>_
if(IsTesting() || IsOptimization())
{
InitialBalance = AccountBalance();
}
//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
double OnTester()
{
// <00><>zv<7A>0<EFBFBD>0<EFBFBD>0 Development = true g00BTBfn0<6E>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>Q<EFBFBD>Rh00return<00>Q<05><>v<EFBFBD>0OnTesterkh<6B>:y
if (Development && IsOptimization())
{
string filename = "BacktestResults.csv";
int filehandle = FileOpen(filename, FILE_CSV|FILE_WRITE|FILE_READ, ",");
// CSV<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>fM0<4D><30><EFBFBD>0
if (FileTell(filehandle) == 0)
{
FileWrite(filehandle, " d<>v", "<00>}<7D>S_pe", "PF", "g<>_)R<>_", "DD$", "DD%",
"RF", "<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0", "<00>R<EFBFBD>s", "RRR", "<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>01", "<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>02");
}
// <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0P}<7D>gK0<4B>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>S<EFBFBD>_
double totalProfit = NormalizeDouble(TesterStatistics(STAT_PROFIT), 2);
int totalTrades = (int)TesterStatistics(STAT_TRADES);
double PF = NormalizeDouble(TesterStatistics(STAT_PROFIT_FACTOR), 2);
double ExPayoff = NormalizeDouble(TesterStatistics(STAT_EXPECTED_PAYOFF), 2);
double DDAmount = NormalizeDouble(TesterStatistics(STAT_EQUITY_DD), 2);
double DDPer = NormalizeDouble(TesterStatistics(STAT_EQUITYDD_PERCENT), 2);
double RF = NormalizeDouble(TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD), 2);
double Sharpre = NormalizeDouble(SharpeRatio(InitialBalance), 2);
double WinPercent = NormalizeDouble(100*TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES), 2);
double RRRatio = NormalizeDouble((TesterStatistics(STAT_GROSS_PROFIT) / TesterStatistics(STAT_PROFIT_TRADES))/
(-TesterStatistics(STAT_GROSS_LOSS) / TesterStatistics(STAT_LOSS_TRADES)), 2);
// eQ<65>R<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<6E>S<EFBFBD>_
int parameters1 = MA_TF;
int parameters2 = MA_Period;
// P}<7D>g<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0k0<6B>fM0<4D><30><EFBFBD>0
for(int i = 0; i < 5000; i++)
{
FileClose(filehandle); // <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0L0<4C><30>M0c0q0j0W0g0<67><30>Q0j0D0<44>0<EFBFBD>0<EFBFBD>0<EFBFBD>02<30>P0
filehandle = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_CSV, ',');// <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0(csv)01YWe;b<>0$Po0-1
if (filehandle != INVALID_HANDLE)
{
FileSeek(filehandle, 0, SEEK_END); // <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0+g>\k0<6B>y<EFBFBD>R
FileWrite(filehandle, totalProfit, totalTrades, PF, ExPayoff, DDAmount, DDPer,
RF, Sharpre, WinPercent, RRRatio, parameters1, parameters2);
FileClose(filehandle);
break;
}
if (filehandle == -1) Print("Error=", GetLastError(), " <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<6E>fM0<4D><30>0k01YWeW0~0W0_0");
}
// <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
return(NormalizeDouble(SharpeRatio(InitialBalance), 2));
// <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
//return(NormalizeDouble(TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD), 2));
// <00>R<EFBFBD>s
// return(NormalizeDouble(100*TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES), 2));
}
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<08><>{ |
//+------------------------------------------------------------------+
double SharpeRatio(double Balance)
{
int i;
int CalcMonth = 0;
int TradeMonths = 0;
double MonthlyProfit[];
for(i = 0; i < OrdersHistoryTotal(); i++){
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) break;
int CloseMonth = TimeMonth(OrderCloseTime());
if(CalcMonth != CloseMonth){
CalcMonth = CloseMonth;
TradeMonths++;
ArrayResize(MonthlyProfit, TradeMonths);
}
MonthlyProfit[TradeMonths - 1] += OrderProfit();
}
double MonthlyEarningRate[];
ArrayResize(MonthlyEarningRate, ArraySize(MonthlyProfit));
double SumMER = 0;
for(i = 0; i < ArraySize(MonthlyProfit); i++){
MonthlyEarningRate[i] = MonthlyProfit[i] / Balance;
SumMER += MonthlyEarningRate[i];
Balance += MonthlyProfit[i];
}
double MER_Average = SumMER / TradeMonths;
double MER_SD = iStdDevOnArray(MonthlyEarningRate, 0, TradeMonths, 0, 0, 0);
double SR = 1;
if(MER_SD != 0) SR = MER_Average / MER_SD; // <00>0<EFBFBD>0rR<72>0<EFBFBD>V<56>
return SR;
}
//+------------------------------------------------------------------+