Коэффициент Шарпа для MT4 в OnTester

 

Добрый день!


Набрел в интернете на 1 из японских сайтом, где было предложено 2 реализации функции для расчета коэффициента Шарпа в МТ4, с учетом оптимизации в OnTester.


Проблемы в следующем:

1. Первая функция SharpeRatio периодически при оптимизации дает ошибку в строке: 

double MER_Average = SumMER / TradeMonths;


2. Вторая функция SharpeRatio_MT5 дает результаты коэффициента другие в отличии от расчета SharpeRatio.

Показатель достаточно важный, прошу помочь разобраться с текущей реализацией и если есть ошибки, то устранить их.



int OnInit(){
   if(IsTesting() || IsOptimization()) GlobalVariableSet("InitialBalance", AccountBalance());

   return(0);
}

void OnDeinit(const int reason){
   if(IsTesting() || IsOptimization()) GlobalVariableDel("InitialBalance");
}


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; // ゼロ割を回避

   return SR;
}

double SharpeRatio_MT5(double Balance){   
   int TotalTrades = OrdersHistoryTotal();
   int Trades = 0;
   double SumER = 0;

   double EarningRate[];
   ArrayResize(EarningRate, TotalTrades);

   for(int i = TotalTrades - 1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) break;

      double Profit = OrderProfit();

      EarningRate[Trades] = Profit / Balance;
      SumER += EarningRate[Trades];
      Balance += Profit;
      Trades++;
   }

   double ER_Average = SumER / TotalTrades;
   double ER_SD = iStdDevOnArray(EarningRate, 0, TotalTrades, 0, 0, 0);
   double SR_MT5 = 0;
   if(ER_SD != 0) SR_MT5 = ER_Average / ER_SD;

   return SR_MT5;
}

double OnTester(){
   double SR = SharpeRatio(GlobalVariableGet("InitialBalance"));
   Print("SharpeRatio = " + (string)SR);

   double SR5 = SharpeRatio_MT5(GlobalVariableGet("InitialBalance"));
   Print("SharpeRatio_MT5 = " + (string)SR5);

   return(SR);
}


 

В коде не разбирался.

Но, в первом случае - ошибка, вполне вероятно, появляется из-за того, что  нет проверки значения TradeMonths на нулевое значение. Эта проверка либо обязательно должна быть, либо по логике работы - в этом месте никак не может получиться нулевое значение.

Во втором случае - действительно, показатель Шарпа, вычисляемый в МТ5 и вычисляемый согласно формулам - почему-то получается разным. Почему - тоже непонятно, формулы вроде как правильные.

 
Georgiy Merts:

В коде не разбирался.

Но, в первом случае - ошибка, вполне вероятно, появляется из-за того, что  нет проверки значения TradeMonths на нулевое значение. Эта проверка либо обязательно должна быть, либо по логике работы - в этом месте никак не может получиться нулевое значение.

Во втором случае - действительно, показатель Шарпа, вычисляемый в МТ5 и вычисляемый согласно формулам - почему-то получается разным. Почему - тоже непонятно, формулы вроде как правильные.

Можете помочь разобраться с формулами?

Причина обращения: