2013年4月16日火曜日

発注判定のプログラミング


前回は、「発注判定プログラミングの考え方」について書きました。 今回は「発注判定」の、より具体的なプログラミングについてです。


1.前回のおさらい

以下の様に、2本の移動平均線が交差したら発注、というEAのプログラムを説明します。



まだ「無料EAサンプル」を、入手されていない方は、以下のリンクからダウンロードしてください。

  → 「無料EAサンプル」ダウンロードへ

 ●「1.2移動平均交差システム-1」
  2つの移動平均線が交差したタイミングで売買します。 MT4組み込み
  テクニカル指標のiMA()関数を使用しています。
  ファイル名:CEF2MACross_01.mq4


2.プログラムの流れ

さて、メタエディターから、前述の「CEF2MACross_01.mq4」を開いてみてください。
次に、"bool EAToOrder(・・・・・"という箇所を探してください。

bool EAToOrder(double vCmd , int vIndex, bool vToOrder , int vBarIdx , double &vOpenPrice , double &vSlPrice , double &vTpPrice , double &vLots)
{
    :
    :
}


この”EAToOrder()”という関数内に、発注判定プログラムを記述します。

プログラムの流れは、以下の様になっています。

1.移動平均線の値を求める
2.「買い」条件を満たしているか、判定する
3.「売り」条件を満たしているか、判定する


3.移動平均線の値を求める

"EAToOrder()"内の最初の方の以下の部分が、移動平均線の値を求めている箇所です。
"iMA()"という関数は、MT4であらかじめ用意されている関数で、これを使う事で、移動平均線の値を取得する事ができます。

"iMA()"の使い方は、以下を参照してください。 他の方が作られた非公式ヘルプです。
  → 移動平均線(Moving Average)【iMA】


         :
    // ==== 移動平均線の値を取得する ====
    // === 追加:短い移動平均線の、vIndexで指定された値を求める
    double maVal1 = iMA(NULL , 0 , period1 , 0 , method , appliedPrice , vIndex + shift);
    // === 追加:長い移動平均線の、vIndexで指定された値を求める
    double maVal2 = iMA(NULL , 0 , period2 , 0 , method , appliedPrice , vIndex + shift);
         :




上記プログラムで、"period1" "period2" "method" "appliedPrice" "shift"は、EAプログラムの最初の方に、EAプロパティとして定義してあり、EA実行時に設定された値が格納されています。

"period1"には短い期間の移動平均線の期間、"period2"には長い期間の移動平均線の期間が格納されています。

"vIndex"は、"EAToOrder"の引数として渡されたもので、"2"か"1"が格納されています。 意味合いとしては、本記事冒頭の図中の"shift"に相当します。

移動平均線の値は、"maVal1"(短い方)、"maVal2"(長い方)に格納されます。


4.判定する

さて、肝心の「移動平均交差の判定」ですが、"vIndex=2"の時には条件を満たしておらず、"vIndex=1"の時に、条件を満たしていれば、発注する様にします。

この関数は、毎回"vIndex=2"と"vIndex=1"の両方が呼び出されます。

従って、プログラムには、"vIndex=1"の時に満たすべき条件を書くことで、判定を実現します。 具体的には以下の様になります。 (以下の例は「買い」の場合)



    ////////////////////////////////////
    // 買い発注かどうかの判定
    ////////////////////////////////////
    if( vCmd == ORDER_LONG )
    {
        if( maVal2 < maVal1 ) // ==== 変更:ここに買い条件を記述。長い移動平均<短い移動平均になったら買い注文
        {
            result = TRUE; // 条件が整った旨を設定する
           :
        }
    }



上記の"maVal2<maVal1"の箇所が、判定部分です。 事前に取得/格納しておいた、"maVal1"(短い移動平均線の値) "maVal2"(長い移動平均線の値)を大小比較を書いて、判定します。

つまり、"maVal1"が"maVal2"よりも大きければ、「買い条件を満たした」と判定しています。そして、条件を満たした場合は、その下の"result=TRUE"が実行されます。

この"EAToOrder"関数では、"result"に、"TRUE"を設定する事で、発注条件を満たした事を、製品に知らせます。 そして、この値が"TRUE"になると、製品側で自動的に発注処理がされます。

ここが、今回の一番のキモの部分です。

「売り」の判定の場合は、さらに下にある、以下の部分で判定しています。


    ////////////////////////////////////
    // 売り発注かどうかの判定
    ////////////////////////////////////
    if( vCmd == ORDER_SHORT)
    {
        if( maVal2 > maVal1 )  // ==== 変更:ここに買い条件を記述。長い移動平均>短い移動平均になったら売り注文
        {
            result = TRUE;  // 条件が整ったする旨を設定する
           :
        }
    }





次回も、サンプルを使ったEAプログラミングの続きを説明しようと思います。
ご不明な点は、お気軽にお問合せください。

今回利用したサンプルEAとドキュメントは、以下のリンクから入手できます
→ 無料EAサンプル・ソース集

ご質問は、ブログコメント以外にも、以下でお待ちしています。
ご不明な点は、お気軽にご質問ください。

  【 問い合わせ先 】

ではでは




0 件のコメント:

コメントを投稿