2019年4月11日木曜日

バックテスト 最適化用 敗け月 自動計算器

ぱんださん🐼よりOnTestrer()で、成績を出力すると便利と情報を教えていただきました。

イベント関数の動作と順番はこのような感じです。

int OnInit()
 イベント起動時に一度だけ動作
void OnTick()
 ティックの配信を受け取ると動作
double OnTester()
 テスト、最適化でOnDeinit()直前に動作
 戻り値はテストの時は操作履歴に表示
 最適化の時は最適化結果に表示

void OnDeinit(const int reason)
 終了時に一度動作

月単位で何カ月に1回マイナス月が出るかを出力してみます。
double Profit[2100][13];
double OnTester()
{
int StartYYY=2100,EndYYY=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
int YYY=TimeYear(OrderOpenTime());
int MMM=TimeMonth(OrderOpenTime());
if(YYY<StartYYY)StartYYY=YYY;
if(YYY>EndYYY)EndYYY=YYY;
Profit[YYY][MMM]+=OrderProfit();
}
double cWIN=0,cLOSS=0;
for(int i=StartYYY;i<=EndYYY;i++)
{
for(int j=1;j<=12;j++)
{
if(Profit[i][j]>0)cWIN++;
if(Profit[i][j]<0)cLOSS++;
}
}
return ((cWIN+cLOSS)/cLOSS);
}

変数Profit[][]を宣言していますが、初期化が手間なのでグローバルに出しています。(裏技?です)

0 件のコメント:

コメントを投稿