「入門」と「実践」の流儀の違い

10月14日に「FXメタトレーダー実践プログラミング」が出版されました。
おそらく「実践」を購入された方の多くは、以前に「FXメタトレーダー入門」もご覧になったことがあるかと思います。
この2冊は同じ著者が書いたものなので、同じ流儀で書かれるべきところですが、わけあってプログラミングの流儀に関して多少違う点があります。以下に簡単に説明しておきます。
カスタム指標プログラムの指標表示の範囲
カスタム指標プログラムでは、
  for(int i=limit-1; i>=0; i–)
として limit-1 から 0 の範囲で指標を表示させています。ここで、limit = Bars-IndicatorCounted() とすることで、チャートの最初からカスタム指標が表示されるようになります。
但し、カスタム指標の種類によっては、ある程度データがたまってからでないと正しい指標値が計算できない場合があります。
「入門」の方では、チャートの描き始めの部分から正しい指標値が表示されるよう、
  if(limit == Bars) limit -= MA_Period-1;
などのように limit の値を修正する記述を追加しています。
これにより、チャートの描き始めの部分に変な指標値が出なくなるのですが、実際、チャートの描き始めの部分はそれほど重要ではありません。
そういうことから、「実践」の方では、特にlimitの値を修正する記述は追加していません。厳密さには欠けますが、実践上問題ないということでご理解ください。
エキスパートプログラムでの最初のチェック
「入門」では、エキスパートプログラムの最初に「バーの始値でトレード可能か」をチェックするため、
  if(Volume[0]>1 || IsTradeAllowed()==false) return(0);
という行が入っています。これは、バーの確定時にトレードを行うための「おまじない」として理解されている方も多いかと思います。
しかし、「実践」の方では、このような行は入っていません。
IsTradeAllowed()のチェックについては、トレード関数のエラー処理の部分に書かれているので、プログラムの最初にチェックする必要はなくなっています。
もう一つ、Volume[0]>1のチェックについては、実践上問題が起きるケースがあるので、記述しないようにしました。
というのも、Volume[0]>1の場合 return するということは、実際にトレードが実行されるのが、Volume[0]=1の場合、つまりバーが確定して、新しいバーができた瞬間に限られてしまうのです。
すべてのtickでエキスパートプログラム通りにトレードが行われるのであれば問題ありませんが、実践上、サーバーとの通信エラーなどにより、シグナルが出てもトレードが行われないケースが起こり得ます。
そういうエラーを防ぐために、Volume[0]>1のチェックは外して、その代わり、現在のポジション状況からトレードを確実に行えるようにしてあるのです。
エキスパートプログラムで利用するシグナル指標
「入門」では、売買ロジックをエキスパートプログラムとして作成する前に、シグナルの発生場所を示すシグナル指標をカスタム指標プログラムとして作成することを推奨しています。
これは、エキスパートプログラムをストラテジーテスターでバックテストした際に、売買のポイントを示すチャートにシグナル指標を挿入して、ロジックが正しくプログラムされているかどうか確認することが目的でした。
一方、「実践」の方では、特にシグナル指標プログラムについては触れていません。
これは、掲載したエキスパートプログラム数が多いということもありますが、単純にシグナルで売買するだけでなく、トレイリングストップなど、シグナルによらない手仕舞いなどがあり、シグナル指標だけでは対応できないケースも多いからです。
またエキスパートプログラム中に組み込みテクニカル指標関数を利用することで、バックテスト時の売買ポイントを示すチャートにテクニカル指標が同時に表示されるので、ロジックが正しいかどうかは、それである程度判断できると考えました。
このように実践面を考えると、どうしても「入門」とはプログラミングの流儀が変わってしまいました。「入門」から「実践」への補足としてご理解いただけると幸いです。



コメントは受け付けていません