【FX自動売買】EA入門 エントリーシグナルを見極める関数【MT4】
この記事は【EAの教科書シリーズ】の一部です。全記事は以下から確認できます。
MT4をまだダウンロードしていない方はこちらのページでダウンロード方法を案内しているので、事前にMT4を用意しておいてください。
関数の概要
今回作る関数はEAに行わせたい取引戦略を記述し、注文を出すタイミングを見極めるための関数です。今回作る関数でトレードタイミングを見極め、タイミングがきたら以前作成したTrade関数を使って実際にトレードを行わせています。Trade関数は細かい設定をつけて注文を出せる関数ですが、詳しくは以下の記事で解説していますので、興味のある方はご覧ください。
今回作る関数の名前はEntrySignal()とします。
今回使用するグローバル変数
- extern int ShortMAPeriod:短期の移動平均線を作成する際に期間を指定するための変数です。初期値は50にします。
- extern int LongMAPeriod:長期の移動平均性を作成する際に期間を指定するための変数です。初期値は100にします。
- extern bool TradeLong:ロング(買い)注文を出したい際にはこの変数をtrueにします。
- extern bool TradeShort:ショート(売り)注文を出したい際にはこの変数をtrueにします。
今回使用するローカル変数
今回はシンプルに短期の移動平均線が長期の移動平均線を上回ったタイミングでロングエントリー、下回ればショートエントリーする戦略をプログラム化していきたいと思います。従って、短期と長期それぞれの直前の移動平均と、二つ前の移動平均を出したうえで、それらを比較する必要があります。
例えば二つ前の短期移動平均が長期移動平均を下回っており、一つ前の短期移動平均が長期移動平均を上回っていればロングでエントリーするということになります。ちなみにこのことをゴールデンクロスと呼びます。
従って、上述した移動平均をそれぞれ保持するためのローカル変数を準備します。
- double ShortMACurrent = iMA(Symbol(),PERIOD_CURRENT,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,1):直前の短期移動平均の値を保持する変数です。iMA関数は移動平均を算出するための関数です。
- double LongMACurrent = iMA(Symbol(),PERIOD_CURRENT,LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,1):直前の長期移動平均の値を保持する変数です。
- double ShortMAPrevious = iMA(Symbol(),PERIOD_CURRENT,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,2):二つ前の短期移動平均の値を保持する変数です。
- double LongMAPrevious =
iMA(Symbol(),PERIOD_CURRENT,LongMAPeriod,0,MODE_SMA, PRICE_CLOSE,2):二つ前の長期移動平均の値を保持する変数です。
それぞれの移動平均を算出するためにグローバル変数として宣言したLongMAPeriodなどが使われていることを確認してください。
関数のコード
void EntrySignal() //1
{
double ShortMACurrent=iMA(Symbol(),PERIOD_CURRENT,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); //2
double LongMACurrent=iMA(Symbol(),PERIOD_CURRENT,LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,1);
double ShortMAPrevious=iMA(Symbol(),PERIOD_CURRENT,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,2);
double LongMAPrevious=iMA(Symbol(),PERIOD_CURRENT,ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,2);
if(TradeLong) //3
{
if(ShortMAPrevious<LongMAPrevious && ShortMACurrent>LongMACurrent) //4
{
Trade(0); //5
}
}
if(TradeShort)
{
if(ShortMAPrevious>LongMAPrevious && ShortMACurrent<LongMACurrent)
{
Trade(1);
}
}
return;
}
- まずは関数の宣言からです。戻り値はないのでvoidとし、関数名をEntrySignal()としましょう。
- 先ほど説明したローカル変数を順番に宣言しています。iMA()関数は移動平均を求めるための関数で、最後の引数は現在使用しているチャート上において何本前の移動平均を求めるかを指定しています。1であれば直前、2は2つ前の移動平均です。
- グローバル変数のTradeLongがtrueであれば買い注文を行わせたいということなので、その後の処理に入ります。ここでは買い注文をするかしないのかを判定し、実際に買いエントリーすべきかはその後の処理でチェックします。
- このif文ではゴールデンクロスが起こっているかを判定しています。具体的には、二つ前の短期移動平均線が長期移動平均線を下回っており、直前で上回っていることをチェックしています。
(SBI FXトレード参照)
- 以前作成したTrade()関数をつかって買い注文を行っています。Trade(0)は買い、Trade(1)は売り注文です。
その後は逆の計算を売り注文のほうで行わせています。
グローバル変数
extern int TakeProfit=50;
extern int StopLoss=25;
extern double LotSize=0.01;
extern bool UseBreakEven=true;
extern int MoveToBreakEven=40;
extern int PipsProfitLock=20;
double pips;
extern bool UseTrailingStop=true;
extern int TrailTrigger=50;
extern int TrailAmount=50;
extern bool UseStopLoss=true;
extern bool UseTakeProfit=true;
extern bool UseRiskReward=true;
extern bool UsePositionSizing=true;
extern int RiskPercent=1;
extern int RewardRatio=2;
extern bool UseCandleClose=true;
extern int CloseAfterCandles=1;
//今回追加した変数
extern int ShortMAPeriod=50;
extern int LongMAPeriod=100;
extern bool TradeLong=true;
extern bool TradeShort=true;
ここまでのグローバル変数は以下のようになっています。
使い方
この関数はOnTick()関数内で使用し、既存の注文がない場合に動作するようにします。
void OnTick()
{
//---
if(IsNewCandle()){
if(TotalOpenOrders()<1){
EntrySignal();
}
if(TotalOpenOrders()>0){
if(UseBreakEven){
BreakEven();
}
if(UseTrailingStop){
TrailingStop();
}
if(UseCandleClose){
CandleClose();
}
}
}
}
注文が一つもないときにはティック毎にEntrySignal()が動作し、チャートをチェックしてくれるので、エントリータイミングが来た瞬間に注文されることになります。
[itemlink post_id=”2236″]
完全無料で通えるプログラミングスクール
プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。
効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。
中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!