• カテゴリー別アーカイブ 「メタトレーダーではじめるFXシステムトレードプログラミング」
  • ターゲットでポジションを減らすプログラム

    前回の記事では、シグナルが出る度にポジションを増やしていくプログラムを紹介しました。

    今回は、別の読者の方からいただいた次のようなご質問について考えていきます。

    ターゲットでポジションの半分を利食いして、残りのポジションはトレイリングストップで利益を伸ばすEAはどのように考えればよいか?

    このご質問の文字通り、オープンしたポジションの一部を決済することは、MT4でも可能です。ただ、本書のライブラリでは、オープンしたポジションを部分的に決済する仕様にはなっていません。

    そこで、最初からポジションを二つオープンし、その一つをターゲットで決済、もう一つをトレイリングストップで決済、という風に分けて考えてみます。

    EAの本体は、複数のポジションを扱うプログラムとして前回のプログラムが流用できます。

    変更箇所は、POSITIONを「2」にしたところと、待機フィルタ関数WaitSignal()の部分をカットしたところです。

    仕掛けシグナルについては、トレイリングストップで利を伸ばすのであれば、順張りの方が効果があるので、2本の移動平均交差の「EntryMA2Cross.mqh」を利用します。

    手仕舞いシグナルは、今回のEAではポジション毎に異なる方法になるのですが、ここでは、その違いをOnTick()中に記述せずに、インクルードする ExitSignal()の方を書き換えてみます。

    上のプログラムでインクルードした「ExitTrailingStop2.mqh」という手仕舞いシグナルのヘッダファイルは、本書の「ExitTrailingStop.mqh」を基にして修正を加えたものです。次のような内容になっています。

    修正したのは、ポジション番号「pos_id」により処理の内容を分けているところです。

    まず、損切りの設定は共通するので、最初に記述します。

    次にswitch文でpos_idが0の場合と1の場合で区別します。

    pos_id=0の場合、利食いターゲットを設定し、pos_id=1の場合、トレイリングストップを設定します。

    トレイリングストップのところで注意する点は、トレイリングストップを開始する条件です。「profit >= 0」だと、ターゲットに到達する前にトレイリングストップが始まってしまう場合もあるので、別途「profit0」という変数にターゲットを超える利益を取得し、それが0以上になったときにトレイリングストップが開始されるようにします。

    これで、シグナルが出ると二つのポジションが同時にオープンし、損切りか、逆のシグナルが出れば二つのポジションが決済されます。もし利益が伸びていけば、0番目のポジションはターゲットの利益で決済され、1番目のポジションはトレイリングストップで損切り値が更新されていき、価格が逆行したところで決済されます。

    下のチャートはうまく機能した例です。左上のところで売りシグナルが出て、二つの売りポジションができます。そして、ターゲットの200pipsでポジションの一つを決済、もう一つのポジションは更新した安値から100pips上の位置に損切り値を移動して最後に右下の場所で決済されています。

    Image1

    人が考えるEAのロジックはそのままだとプログラムしにくい場合があります。それをプログラムしやすいように翻訳するということも、プログラミングをマスターする上で重要なことだと思います。



  • ポジション数を増やすプログラム(汎用版)

    前回の記事で黄色本のサンプルプログラムのポジション数を2かから3に増やす拡張例を示しました。

    ただ、この方法だと、ポジションを増やす度にコードを追加していかなくてはなりません。

    今回は、「POSITIONS」を変えるだけで、ポジション数を増やす方法を紹介します。前回、配列を使うと書きましたが、よく考えると配列使うまでもありませんでした。for文の繰り返しだけで十分です。

    OnTick()関数だけ書き出すと次のようになります。

    ポジション数を決めるのは「POSITIONS」という定数です。例えば、最大ポジション数を5にしたい場合、

    と定義しておきます。あとは、for文で「i」を「0」から「POSITIONS-1」まで変えて繰り返します。

    for文中のプログラムでは、各関数の最後の引数がポジション番号を表すので、そこに「i」を代入します。

    ただ、一つだけ注意する箇所は、WaitSignal()のところです。これは、1番目のポジションから実行されるので、0番目で実行されないよう、「if(i>0)」という条件をつけておきます。またWaitSignal()の最後の引数は一つ前のポジション番号となるので、「i-1」としておきます。

    以上でポジション数を簡単に増やすことができるプログラムになりました。仕掛けシグナルや手仕舞いシグナルを色々と変えて試してみるとよいでしょう。

     

     



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

    「メタトレーダーではじめる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番のポジションがオープンするのです。

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

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

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



  • 新刊発売中です

    「メタトレーダーではじめるFXシステムトレードプログラミング」アマゾンでも発売始まりました。

    紙の本しか要らないという方は、どこで買われても結構です。

    電子版も欲しいという方は、ラトルズネットで購入すると、DRMフリーのPDF版がついてくるそうです。

    そのうち、アマゾンのkindle版など電子版も出るそうですが、売れるのでしょうか?きっと安売りするのでしょう。

    サンプルプログラムもラトルズネットのページからダウンロードできるようです。ソースプログラムだけあれば説明不要という方は、個人で利用する範囲でご自由に使っていただいて構いません。なんだかわからないけど使ってみたいという方は、是非本書をお買い求めください。

    本書をお持ちの方からの質問にはできる範囲でお答えします。ただし、いい質問であればブログのネタになることをご了承ください。



  • 新刊予約受付中です

    先日ご案内した新しいメタトレプログラミング本ですが、以下のラトルズのサイトで予約受付中です。

    ラトルズネット / メタトレーダーではじめるFXシステムトレードプログラミング

    アマゾンでも予約受付中のようです。発売日はラトルズネットでは12月22日、アマゾンでは12月25日となっています。

    サンプルプログラムもアップされているのですが、読者用サポートページからって書いてあるので、勝手に紹介したらいけないのかな?まあ本をパラパラとめくれば場所は書いてありますけどね。

    バタバタと出してしまった本なので、説明など不十分な箇所があるかもしれません。そのうち、ここのブログ記事で補足していきます。