2013年7月19日金曜日

ドテン決済判定のプログラミング



前回は、「発注判定」のプログラミングについて書きました。 今回は、その「発注判定」プログラムを活かして、「ドテン決済」するプログラムの書き方です。


この「ドテン決済」のプログラムの書き方・理屈がわかれば、これまでの記事で、最低限必要な「発注」~「決済」のプログラミングができる様になります。


※ 説明に使用する「無料EAサンプル」を、入手されていない方は、以下のリンクからダウンロードしてください。
   → 「無料EAサンプル」ダウンロードへ
   ●「1.2移動平均交差システム-1」
      2つの移動平均線が交差したタイミングで売買します。 MT4組み込み
      テクニカル指標のiMA()関数を使用しています。
      ファイル名:CEF2MACross_01.mq4



1.ドテン決済プログラミングの考え方



さて「ドテン決済」は、「発注判定」での買い・売りシグナルが逆になった場合に、保有中のポジションを決済し、反対方向の新規ポジションの発注をします。  

ドテン決済の流れを図で表すと、以下の様なイメージです。






つまり「ドテン決済」は、本来的に「発注判定」のプログラムを流用する事ができる概念です。


2.具体的なプログラミングの方法



さて、具体的なプログラミング方法についてです。  サンプルEAで使われている「COMFFERED MT4 EA Framework」での決済プログラムは、コールバック関数「EAToClose()」内に書きます。

※ 「EAToClose()」の詳細は、ユーザーズガイド「4.1.5 コールバック関数:EAToClose()」を参照ください。


しかし、実際にプログラミングする事は、発注判定のプログラムを呼び出し、現在のポジションと反対方向のシグナルが出ているか確認するだけです。  実はこのプログラムは、製品が提供しているMQ4形式テンプレート・ファイルに書かれており、EA作成者は特段、プログラムを追加で書く必要がありません。


具体的には、MQ4形式テンプレート・ファイルで、以下の様に書かれています。



bool EAToClose(int vTicket , double vCmd, int vCond, int vOrderBarIdx , int vBarIdx)
{
    bool result = FALSE;
    double openPrice , slPrice , targetPrice , lots;
 
    //-- ここに処理を記述する
 
    // 決済したい場合は、resultにTRUEを代入する
    // if( 何か条件式 ) result = TRUE;
    if( !result ) result = EAToOrder(vCmd*(-1),1, FALSE , vBarIdx, openPrice , slPrice , targetPrice , lots); // ドテンによる手仕舞い

    //--
 
    return (result);
}



今回一番のミソは、上記プログラムの下線部です。



3.プログラムの解説



呼び出している「EAToOrder」は、お客様が発注判定をプログラミングする「コールバック関数」です。  ここで第一引数の「vCmd*(-1)」の部分で、現在のポジションの向きと反対方向のシグナルを指定します。  

この「EAToOrder」の結果がTRUE(真)であれば、反対方向のシグナルが出た、という事ですので、結果、EAToClose()からTRUEが返却され、製品側で決済オーダをFX業者に送信します。


「vCmd」には、現在のポジションの向きが数値で格納されており、「買いポジション」であれば「1」、「売りポジション」であれば「-1」です。  つまり前述のプログラムの様に、vCmdに「-1」を掛けることで符号を逆転させ、現在のポジションと逆向きのポジションを表す数値に変換する事ができます。




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

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

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

  【 問い合わせ先 】


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サンプル・ソース集

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

  【 問い合わせ先 】

ではでは




2013年2月21日木曜日

発注判定プログラミングの考え方


前回は、サンプルEA利用の様子を書きました。 今回は、発注を判定するプログラミングの考え方について説明しようと思います。

※ 説明で使用する「無料サンプルEA」は、コチラから入手ください → 無料EAサンプル・ソース集

今回からは第一弾として、一番シンプルなEAサンプル・プログラムをつかった説明です。


【サンプルEAの売買ルール】

今回のブログ記事から使用するサンプルEAは、以下のものを使います。

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

ファイル名:CEF2MACross_01.mq4

・短い期間(period1)の移動平均が、長い期間(period2)の移動平均を上抜いた、次のバーで買い注文、
 短い期間(period1)の移動平均が、長い期間(period2)の移動平均を下抜いた、次のバーで売り注文します。
・ロット数は、FX業者指定の最小ロット数を使います。
・注文方法は「成行き」注文です。
・StopLoss/TakeProfitの指定はありません。
・決済方法は「ドテン」です。例えば買いポジションの決済とともに、売り注文を行います。

【売買タイミングを書く】

まずは、売買タイミングのプログラミングです。 売買タイミングのサンプル・プログラムを理解すれば、サンプルを修正して、自分だけの売買ルールを実現する事も、簡単になるのではないでしょうか?

今回のサンプルEAは、移動平均の短い線が長い線を、上抜いた時に「買い」注文を出します。 イメージとしては以下の様になります。 (「売り」の場合は逆です)




移動平均線の値取得は、MT4に関数(iMA())が用意されていますので、それを使います。
そして、「短い期間の移動平均線」が「長い期間の移動平均線」の下にある状態から、上にある状態に変わったら、「買い」注文します。

気をつけなければならない点は、発注するタイミングが、ローソク足が完成し、移動平均線が上抜いた事が「確定」してからになる点です。 上図で言うと、「1本前のローソク足」(index=1)のローソク足が完成し、次の「今のローソク足」(shift=0)が始まったタイミングでの発注になります。


●「shift」について

上図で、「shift=0」などの、「shift=n」という表現が出てきます。 これは、プログラムを作る際に理解が必要な、概念です。

EAは、新しい為替レートを受信するたびに呼び出さます。 つまり、プログラムでは、新しい為替レートを受信したら、どう動くのか、を書く事になります。

この時、2つの移動平均線の上下関係が、2本前では短い線が下にあり、1本前では短い線が上にあった場合に、「買い」注文を出す、というプログラムを書く事になります。

この「2本前」とか「1本前」など、「欲しい情報の時間」を指定するときに指定するのが、「shift」です。 2本前であれば「shift=2」、1本前であれば「shift=1」、現在であれば「shift=0」を指定します。


●サンプル・プログラムの発注判定箇所

COMFFERED MT4 EA Framework」を使って発注を判定するには、「EAToOrder」関数内にプログラムを書きます。 この関数は、新しい為替レートを受け取る毎に2回呼び出されます。 引数の「vIndex」は、上記「shift」に相当し、1回目は「2」、2回目は「1」が渡されます。 以下は、サンプル・ソースの抜粋です。


////////////////////////////////////////////////////
// ●発注判定/価格計算処理
//  発注が必要な条件が整っていればTRUEを返却する。整っていなければFALSEを返却する
//  TRUEを返却する場合で、且つ、vToOrderがTRUEであれば、
//  引数のvOpenPrice/vSlPrice/vTpPrice/vLotsに価格やロット数を設定してTRUEを返却する
//  【引数】
//   ・vCmd : ORDER_LONG(1.0) / ORDER_SHORT(-1.0)
//   ・vIndex : 発注条件を確認するインデックス
//   ・vToOrder : TRUEで、発注条件を満たしていれば、発注情報の設定が必要(vOpenPrice / vSlPrice / vTpPrice / vLots)
//   ・vBarIdx : 現在のBars
//   ・vOpenPrice : 発注する場合は、発注逆指値を指定する。成り行き注文の場合は、設定不要
//   ・vSlPrice : 発注する場合で、ストップロスを設定する場合は、ストップロス価格を設定する
//   ・vTpPrice : 発注する場合で、決済指値を設定する場合は、決済指値を設定する
//   ・vLots : 発注する場合は、ロット数を必ず設定する。
////////////////////////////////////////////////////
bool EAToOrder(double vCmd , int vIndex, bool vToOrder , int vBarIdx , double &vOpenPrice , double &vSlPrice , double &vTpPrice , double &vLots)
{
  :
             ※※ ここに、発注判定のプログラムを書く ※※
  :
}


次回からは、上記関数内のサンプル・ソースの具体的な発注判定プログラムについて説明しようと思います。


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

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

  【 問い合わせ先 】

ではでは~


2013年2月2日土曜日

まずは無料サンプルEAを使うところから


前回は、開発用のMT4の用意を中心に書きました。 今回は、サンプルEA利用の様子もう少し細かく書いてみたいと思います。

より詳細な使い方は、サンプルEA内のドキュメント(PDF形式)に記載していますので、今回は、全体の流れをまとめました。

※ 該当ドキュメント同封のサンプルEAは、コチラから入手ください → 無料EAサンプル・ソース集
  

【全体の流れ】

1.サンプルEAをインストールする
2.EAをコンパイルする
3.EAをテスターで動かす

1.サンプルEAをインストールする

ダウンロードしたファイル内の「experts」を、MT4インストールフォルダ配下の「experts」フォルダにコピーします。
※ サンプルEAの旧版では、「experts」とすべき部分が、「expert」("s"が足りない)になっていました。 
   最新版を入手いただくか、「experts」と修正をお願いします。


2.EAをコンパイルする

EAプログラムの形式は、拡張子が「.mq4」と「.ex4」の2種類があります。 人間がEAプログラムを書く時は「.mq4」を、EAをMT4で動かすときは「.ex4」を使います。  なので「.mq4」形式を「.ex4」形式に変換する必要があり、これを「コンパイル」と呼びます。

まずは、プログラムを書いてコンパイルするための「メタエディター」を起動し、コンパイルする「.mq4」形式のファイルを開きます。



メタエディターの「Compile」ボタンを押下すると、コンパイルが実行されます。


「0 error(s)」が表示されたら、コンパイル成功です。 MT4で動かすための「.ex4」形式ができました。

※ 「'CEF.mqh' - cannot open the program file・・・・」と表示された場合は、最新版のサンプルEAを再度ダウンロードいただくか、EA作成用ソフト「MT4 EA Framework」を追加インストールしてください。


●注意事項

ここまでで、注意点が2点あります。
  1. Windows7(Vistaも?)で、IMEが「Microsoft Office IME 2010」を使用していると、落ちる →  他の「Microsoft IME」等に切り替えないと、メタエディターでプログラムを修正すると落ちてしまいます。
  2. フォントの設定を変更しないと文字が化けます  →  メタエディターのメニュー「Tool」→「Font」タブ内で、「MS ゴシック」等の日本語フォント選択・「Script:」で「日本語」を選択してください。

3.EAをテスターで動かす

MT4で動かすための「.ex4.」形式EAが出来ましたので、過去データを用いて動かしてみます。  テスターで動かすことで、EAの売買ルールを過去データで動かすと、どんな収益になるのかがわかります。

MT4で、「Expert Advisor」と「通貨ペア」・「期間」を指定し、「スタート」ボタンを押下することで動き始めます。




動き終わると、緑のバーが一番右まで伸び、再度「スタート」ボタンを押下できる様になります。  
終わったあと、一番したのタブを選ぶと、収益などの動作結果が表示されます。





ここまで、上手く出来ましたでしょうか?




今回利用したサンプルEAとドキュメントは、コチラから入手できます

→ 無料EAサンプル・ソース集




ご質問は、ブログコメント以外にも、以下でお待ちしています。

ご不明な点は、お気軽にご質問ください。


  【 問い合わせ先 】

ではでは~