Optimization 時の各PASSテストでのS/L回数を知る。

3/22の記事では、Optimization 時の各PASSテストでの勝率を知る。というものでしたが、S/L回数を知りたいとの質問がありましたので、回答します。


MT4 の注文履歴を参照する関数には、注文のオープン価格、クローズ価格、それぞれの時刻を知る関数( OrderOpenPrice(),OrderOpenTime()...)がありますが、どのようにクローズされたのかを直接知る為の関数はありません。。クローズのされ方は、OrderClose() で意図的に閉じたのか、tp/sl のどちらかの指値注文によって自動的に閉じられたのかの 3種類の閉じ方があり、その区別をどうやるかというと…





OrderComment() の中に、[sl]や、[tp]が含まれているかどうかで識別します..。なんとなく、MT4設計時にはそこまで考えが及ばなくて、あとからとってつけたような仕様になっている..気がしますが、Optimization 時も OrderComment()は内部データとして参照できるので、これでカウントすればOKです。


細かなやり方は 3/22 の記事を見ていただくとして、sl 回数を出力するコードは以下のようになります。

int start()
{
if(TimeCurrent()==1269028784){//←テスト終了時刻を埋め込む
//←必要ならこのあたりで全注文を決済するようにする。
   int i,handle,hstTotal=OrdersHistoryTotal();
   int tp=0,sl=0,close=0;
   for(i=0;i < hstTotal;i++)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
      if(StringFind(OrderComment(),"[sl]") != -1){ sl++;}
      else if(StringFind(OrderComment(),"[tp]") != -1){ tp++;}
      else close++;
   }
   handle=FileOpen("WinTPSLCLS.csv", FILE_CSV|FILE_READ|FILE_WRITE, ',');
   if(handle>0)
   {
      FileSeek(handle, 0, SEEK_END);
      FileWrite(handle, sl,tp,close,TakeProfit,StopLoss);//←シミュレーション時のパラメータを適宜追加すること。
      FileClose(handle);
   }
   Comment(" tp=",tp,"  sl=",sl," close=",close);
   return(0);
}else{
   Comment(TimeCurrent());
}


↑ちなみに、[sl]や、[tp]が含まれているかどうかで識別は、EAの中に組み込んで、直前の売買の結果がどうだったのかを参考に売買戦略を変更する..といった使い方にも応用できますので、いろいろと考えてみると良いかもしれません..。