はじめに
ここではEAプログラミング未経験者や超初心者といった方向けに、EAを使って代表的なインジケータである移動平均線の値を元に、エントリーしていく方法について解説しています。
移動平均線を上抜けたらエントリー、移動平均線が下を向いていたらエントリー等々、移動平均線はインジケータとして、とてもシンプルですがエントリーする根拠として重要な情報が沢山あります。
ここまで学べば自作EAも作れるレベルになってきます!プログラミング入門もこの記事で終わりです!
前回の記事
前回は、EAの新規注文について学びました。まだの方は是非こちらもご確認ください。
移動平均線の値を取得する関数とは
前記事でも述べた通り、EAでの移動平均線を使う場合も特にプログラムをがっつりと書くわけではありません。MQL4として関数がすでに用意されているのでそれを使います。
iMA()関数
EAで移動平均線の値を取得するにはiMA()関数を使います。
()の中の引数が今回も複数ありますので、さっそく引数を確認していきましょう。
double dMA_atai = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
まず、iMA()関数の書き方はこんな感じです。
これだけで『20(日)』の『単純移動平均線』の『現在』の値が変数「dMA_atai」に返ってきます。
この、『』で囲まれている所はもちろん引数で指定しています。詳しく引数を見ていくと、
- 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
- 引数2・・・時間軸です(0でチャートの時間軸になります)
- 引数3・・・期間です(20で20移動平均線、25で25移動平均線になります)
- 引数4・・・表示移動です
- 引数5・・・移動平均の種別です(MODE_SMAで単純移動平均線)
- 引数6・・・適用価格です(PRICE_CLOSEでクローズ値)
- 引数7・・・バーシフトです(0で現在の値、1で1つ前ーのバーの時の値です)
実際にMT4の画面で移動平均線のインジケータの設定を見てみると、もっとイメージしやすくて、引数3、4、5、6の箇所が変更できることがわかりますね。
引数7について画面からも指定できなくて、バーシフトというと?となるかもしれませんが、実際にMT4で見てみるとこんな感じです。
0が現在の移動平均線の値、1が1つ前のバーの移動平均線の値が取れるという形です。バー単位で移動平均線の値が取れるようになっています。
0にすると・・・1.08424
1にすると・・・1.08429
2にすると・・・1.08428
という形で、ユーロ/ドルの値(移動平均線の値)が取れます。
移動平均線を上抜けたらエントリー
では実際に、移動平均線よりも現在の値段が上にいる場合のみロングでエントリーするようにプログラムを組んでみましょう。
前回入門⑦の最後で使ったプログラムに変更を加えていくと、こんな感じです。
void OnTick()
{
//---
//20移動平均線の値を取得する
double dMA_atai = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
if(OrdersTotal()==0 && Ask > dMA_atai) //ポジションを保有していない かつ 移動平均線より上の時だけエントリーする
{
// 新規エントリー注文
int CNo = OrderSend(
NULL, // 通貨ペア
OP_BUY, // オーダータイプ[OP_BUY / OP_SELL]
1, // ロット[0.01単位](FXTFは0.01で1000通貨)
Ask, // オーダープライスレート
20, // スリップ上限 (int)[分解能 0.1pips]
Ask-50 * Point, // ストップレート
Ask+50 * Point, // リミットレート
"EAテスト", // オーダーコメント
0, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
}
}
移動平均線の値を取得し、if(OrdersTotal()==0)の箇所に、移動平均線の値の条件を追加しました。
まずは、iMA()で20移動平均線の値をdMA_atai変数に入れています。そして、その値をAsk(現在の買値)と比較しています。
Ask(現在の買値) > dMA_atai(20移動平均線の値)
という形で、現在の買値が移動平均線より大きい(上にいる)場合、ロングでエントリーするという内容をつけ足しています。
if文のつけ足しているところですが、
if(OrdersTotal()==0)
のところを、以下のようにつけ足しています。
if(OrdersTotal()==0 && Ask > dMA_atai)
&&と書くことによって「ポジションを持っていない事」アンド「現在の買値が移動平均線より大きい事」という風に条件を追加することができます。
ですので、「ポジションを持っていない」けど「現在の買値が移動平均線より小さい」場合は新規注文しませんし、「ポジションを持っている」けど「現在の買値が移動平均線より大きい」場合も新規注文しません。どちらも合致している場合しか新規注文しないという形にしているわけですね。
移動平均線が下を向いたらエントリー
では次に別のエントリータイミングとして、移動平均線が下を向いたらショートでエントリーするプログラムを組んでみましょう。
前回入門⑦の最後で使ったプログラムに変更を加えていくと、こんな感じです。
void OnTick()
{
//---
//20移動平均線(現在値)を取得する
double dMA_atai_0 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
//20移動平均線(1つ前)を取得する
double dMA_atai_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
if(OrdersTotal()==0 && dMA_atai_0 < dMA_atai_1) //ポジションを保有していない かつ 移動平均線が下向きの場合エントリーする
{
// 新規エントリー注文
int CNo = OrderSend(
NULL, // 通貨ペア
OP_SELL, // オーダータイプ[OP_BUY / OP_SELL]
1, // ロット[0.01単位](FXTFは0.01で1000通貨)
Bid, // オーダープライスレート
20, // スリップ上限 (int)[分解能 0.1pips]
Bid+50 * Point, // ストップレート
Bid-50 * Point, // リミットレート
"EAテスト", // オーダーコメント
0, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
}
}
移動平均線の現在の値と1つ前の値を取得し、if(OrdersTotal()==0)の箇所に、移動平均線の値の条件を追加しました。
dMA_atai_0(移動平均線の現在値)< dMA_atai_1(移動平均線の1つ前の値)
という形にして、移動平均線が下を向く条件としています。
どうしてこれで移動平均線が下を向いた条件になるのかわからないかもしれないですが、実際のチャート上の移動平均線を想像してみてください。
移動平均線が下を向くという事は、現在の移動平均線の値の方が前回の移動平均線の値より小さいという事になっていますよね。
※反対に、移動平均線が上を向くという事は、現在の移動平均線の値の方が前回の移動兵器戦の値より大きいという事になっています
したがって、簡単に移動平均線の向きを確認したい場合、移動平均線の前後の値を確認すれば良いという事になりますね。
今回はショートにしましたので、新規エントリー注文の部分も前回入門⑦から若干変わっていますので参考にしてみてください。
おまけ(ロングとショートを組み合わせたパターン)
これで、移動平均線とロング・ショートエントリーを組み合わせたEAが作れると思います。簡単に今回の内容を組み合わせたサンプルプログラムを組んでみました。
void OnTick()
{
//---
int CNo = 0;
//20移動平均線(現在値)を取得する
double dMA_atai_0 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
//20移動平均線(1つ前)を取得する
double dMA_atai_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
//ロングエントリー(ポジションを保有していない かつ 移動平均線より上 かつ 移動平均線が上向き)
if(OrdersTotal()==0 && Ask > dMA_atai_0 && dMA_atai_0 > dMA_atai_1)
{
// 新規エントリー注文
CNo = OrderSend(
NULL, // 通貨ペア
OP_BUY, // オーダータイプ[OP_BUY / OP_SELL]
1, // ロット[0.01単位](FXTFは0.01で1000通貨)
Ask, // オーダープライスレート
20, // スリップ上限 (int)[分解能 0.1pips]
Ask-50 * Point, // ストップレート
Ask+50 * Point, // リミットレート
"EAテスト", // オーダーコメント
0, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
}
//ショートエントリー(ポジションを保有していない かつ 移動平均線より下 かつ 移動平均線が下向き)
if(OrdersTotal()==0 && Bid < dMA_atai_0 && dMA_atai_0 < dMA_atai_1)
{
// 新規エントリー注文
CNo = OrderSend(
NULL, // 通貨ペア
OP_SELL, // オーダータイプ[OP_BUY / OP_SELL]
1, // ロット[0.01単位](FXTFは0.01で1000通貨)
Bid, // オーダープライスレート
20, // スリップ上限 (int)[分解能 0.1pips]
Bid+50 * Point, // ストップレート
Bid-50 * Point, // リミットレート
"EAテスト", // オーダーコメント
0, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
}
}
EA動作の概要
ポジションを保有していない&移動平均線より上&移動平均線が上向きの場合にロングエントリー(利益確定、損切りともに5pips)
ポジションを保有していない&移動平均線より下&移動平均線が下向きの場合にショートエントリー(利益確定、損切りともに5pips)
あとは、実際にこのEAの動作を確認してもらうとわかりますが、わりと自動売買感が出てきて面白いと思います。
最後に
いかがでしたでしょうか。iMA()関数を覚えるだけでさらにEAっぽくなりましたね!
さらに、ロング・ショートエントリーも組みわせることですごく簡単ではありますがEAが出来上がったと思います。
他にも、MACDの値やRSIの値、ボリンジャーバンドの値などもすべて関数で取得できますので、自分が普段トレードで見ているような情報を元にEAを動かして行く事ができる日も近くなってきたのではないかと思います。
EAが完成したら、現在のリアルタイムのチャートで簡単に確認をした後、過去のチャートで本当に使えるEAなのかを確認(バックテスト)する必要があります。バックテストは過去の値動きを全て再現してくれるので、ビジュアルモードで確認してみると、このエントリーじゃまずい!等がよくわかって楽しいですよ。
以下がバックテスト動画です。(※画質が悪い場合、設定で720pを選択すると良くなります)
※バックテスト方法はこちら
※初めてEAを作る際の、トレード戦略の立て方についてはこちら
コメント