MT5エキスパートアドバイザー SMA_EA01.mq5
今回はエキスパートアドバイザー、SMA_EA.mq5 を紹介します。ストラテジーテスターがMT4よりMT5の方が良い見たいなので、MT5で作成しています。エキスパートアドバイザーを作ると検証出来るのが便利です。
SMA_EA.mq5 はエキスパートアドバイザー新規作成のテンプレートを使用し、作成したものです。
自動売買のシグナルは単純移動平均線SMAを使っています。
シグナルは、指定した時間足の終値(C1)がその時間足のSMAを越えたとき発生します。
1、(C1>SMA1)-->BUYシグナル
2、(C1<SMA1)-->SELLシグナル
3、ポジションがすでにあるときはそれ以上売買しない。
4、BUYポジションがあるときSELLシグナルでは、SELLポジションにSAR(STOP AND REVERS)します。
5、SELLポジションがあるときBUYシグナルでは、BUYポジションにSARします。
デモトテードでは、プロパティ設定の共有画面で、「自動トレーデイングを許可する」をチェックしてください。「シグナル設定の修正を許可する」は今回チェックする必要はありません。
(注意:SMA_EA.mq5 プログラムはあくまでFX個人投資家の学習のために、
デモ口座によるMQL5売買プログラミングの情報提供を目的としております。
このプログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自らで行ってください。リアルトレードではテストしておりません。)
SMA_EA01.mq5 (テンプレート使用) のプログラムは下のダウンロードから行ってください。
ソースファイルですので、前回のようにダウンロードしコンパイルが必要です。
コンパイルすると以下の警告がでますが、問題ありません。
return value of 'OrderSend' should be checked SMA_EA01.mq5
return value of 'OrderSend' should be checked SMA_EA01.mq5
0 error(s), 2 warning(s), compile time: 17731 msec
SMA_EA01.mq5 のプログラムは次の通りです。
プログラムの説明は次回に予定しております。
//+--------------------------+
// SMA_EA01.mq5
// Copyright 2015, T.S
//+--------------------------+
#property copyright "Copyright 2015, by T.S"
#property link ""
#property version "1.00"
//--- input parameters
input int Stop=50;
input int Take=100;
input int Magic=1000;
input double Lots=0.01;
input int Slipage=10;
//---------------------------
input int MA_Period =10;
int maH;
double maV[3];
double sclose;
int STP, TKP ,SL;
//+---------------------------+
// Expert initialization function
//+---------------------------+
int OnInit()
{
//---
maH=iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE);
//--- What if handle returns Invalid Handle
if( maH==INVALID_HANDLE)
{
Print("Indicators error ");
return(INIT_FAILED);
}
//---
STP = Stop;
TKP = Take;
SL = Slipage;
if(_Digits==5 || _Digits==3) //EURUSD=5
{
STP = STP*10;
TKP = TKP*10;
SL = Slipage*10;
}
//---
return(INIT_SUCCEEDED);
}
//+----------------------------+
// Expert deinitialization function
//+----------------------------+
void OnDeinit(const int reason)
{
//---
IndicatorRelease(maH);
}
//+-----------------------------+
// Expert tick function
//+-----------------------------+
void OnTick()
{
//------------------------------
MqlTradeRequest mreq;
MqlTradeResult mresu;
MqlTick l_pr;
MqlRates mrate[2];
//------------------------------
ZeroMemory(mreq);
ZeroMemory(mresu);
if(!SymbolInfoTick(_Symbol,l_pr))
{
Print("the latest price error");
return;
}
if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
return;
}
//-----
if(CopyBuffer(maH,0,0,3,maV)<0) return;
//-----
bool Buy_sig =false;
bool Sell_sig=false;
if (PositionSelect(_Symbol) ==true)
{
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
Buy_sig = true;
}
else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
Sell_sig = true;
}
}
sclose=mrate[0].close;
bool Buy_S1 = (sclose > maV[1]);
if(Buy_S1)
{
if (Buy_sig) return;
mreq.action = TRADE_ACTION_DEAL;
mreq.price = NormalizeDouble(l_pr.ask,_Digits);
mreq.sl = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);
mreq.tp = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);
mreq.symbol = _Symbol;
mreq.volume = Lots;
mreq.magic = Magic;
mreq.type = ORDER_TYPE_BUY;
mreq.type_filling = ORDER_FILLING_FOK;
mreq.deviation= SL ;
OrderSend(mreq,mresu);
}
bool Sell_S1 = (sclose <maV[1]);
if(Sell_S1 )
{
if (Sell_sig) return;
mreq.action = TRADE_ACTION_DEAL;
mreq.price = NormalizeDouble(l_pr.bid,_Digits);
mreq.sl = NormalizeDouble(l_pr.ask + STP*_Point,_Digits);
mreq.tp = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits);
mreq.symbol = _Symbol;
mreq.volume = Lots;
mreq.magic = Magic;
mreq.type= ORDER_TYPE_SELL;
mreq.type_filling = ORDER_FILLING_FOK;
mreq.deviation= SL ;
OrderSend(mreq,mresu);
}
}
//
//END
本ブログの内容につきましては、
著作権および著作者人格権、プライバシー権、名誉権、パブリシティ権を主張しております。個人使用、学習目的以外の使用はご遠慮ください。
ストラテジーテストの結果については下の画像を参考にしてください。
テスト結果のチャート

テスト結果1
テスト結果2
テストの設定
テストのパラメータ
デモトレードEURUSD H1