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

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

  【 問い合わせ先 】

ではでは~


0 件のコメント:

コメントを投稿