黄色本のサンプルプログラムの拡張例(ポジションを増やす)

「メタトレーダーではじめるFXシステムトレードプログラミング」、長いので略称を考えたいのですが、適当な名前が思いつきません。

しょうがないので、「メタトレ黄色本」にしておきます。

さて最近、黄色本の読者から質問をいただいたので、一つ紹介したいと思います。

137ページの「複数のポジションを扱う売買システム」、同時に二つのポジションまでオープンさせるシステムです。

ただ、二つといっても、売りと買いのように両建てするわけではなく、時間を空けてポジションを追加していく、いわゆるナンピンのようなものです。

この二つのポジションを3個以上に増やすためにはどうすればよいかというご質問でした。

シストレでナンピンするのはあまりお勧めできませんが、ポジションを増やしたときのリスクの増え方を確認する上でも試してみる価値はあるかと思います。

実際、プログラムは簡単です。ここでは、ポジションを3個まで増やす場合に追加、修正する箇所だけ抜粋しておきます。

まず、オリジナルライブラリをインクルードする直前に「POSITIONS」という定数を「3」にしておきます。

これで、0, 1, 2 というインデックスで3つのポジションを扱うことができるようになります。

次に仕掛けシグナルの追加です。次のように「sig_entry1」の下に「sig_entry2」というのを追加します。

EntrySignal()の関数の引数がポジションの番号なので、1, 2と変えておきます。

この関数は、ポジションがオープンしていないときに、テクニカル指標が売買条件を満たすと売買シグナルを返します。なので、ポジションが一つもオープンしていなければ、sig_entry, sig_entry1, sig_entry2ともに同じタイミングで売買シグナルを返します。このままだと3つ同時にポジションがオープンしてしまいますが、そうならないようにするのが、後に出てくるWaitSignal()というフィルタ関数です。

その前に、ポジションを決済するコードを追加しておきましょう。ここでは簡単のため、手仕舞いシグナルが出たら、すべてのポジションを決済するようにします。単にMyOrderClose()を追加するだけです。

そして、ポイントとなるフィルタ関数の部分ですが、ここでは、二つのフィルタを使っているので混乱しないようにしてください。

最初のフィルタ関数、FilterSignal()は、単にシグナルを採用するかどうかを判断するフィルタなので、すべてのシグナルに共通にかけることになります。以下のように「1」のところを「2」にするだけです。

もう一つのフィルタ関数WaitSignal()は引数に注意してください。

sig_entry1にかけるWaitSignal()の3番目の引数が、待つ対象のポジションのインデックスなでの、「0」となっています。つまり、sig_entry1に売買シグナルが入っていたとしても、0番のポジションがオープンしていないか、オープンしてもWaitingMin(分)経過するまでは、0という値を返すため、sig_entry1のシグナルは無効となるのです。

同様に考えると、sig_entry2のシグナルは、1番のポジションを対象にしてオープン後の経過時間を待つということなので、最後の引数に「1」を代入すればよいのです。

最後に、フィルタリングされたシグナルにしたがって実際の発注を行う部分は、「1」を「2」に変えたものを追加するだけで終わりです。

これで、0番のポジションがオープンしてWaitingMin経過後にシグナルが出れば1番のポジションがオープンし、その後WaitingMin経過後にシグナルが出れば2番のポジションがオープンするのです。

ポジションが増えると、一つ目をチェック、二つ目をチェック・・・となんだか条件が複雑になるような気がするかもしれませんが、単にひとつ前のポジションだけチェックするようにしておけば、ポジションが何個に増えても、コードを機械的に追加するだけで済むのです。

ご自身でライブラリを作成される際に参考にしていただければと思います。

なお、本記事の方法はポジションが増える毎にコードを追加しなくてはいけないので、汎用性がありません。次回は、配列などを使って簡単にポジション数を変えられるようなプログラムを紹介します。



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