システムの概要
売買戦略はSMA_EA011.mq5と同じです。SMAはEMAに変更します。
シグナルは指定時間足の終値(C1)がその時間足のEMAを越えたときに発生し、
ポジションがStopで損切り手仕舞いするか、Takeが実行されるまで待つ戦略です。
今回からOrderSend()関数に代わり、Trade.mqhファイル、
CTradeクラスのPositionOpenメソッドを使用します。
CTradeはMQL5の標準ライブラリークラスになります。
この変更でコンパイル時に警告がでなくなります。
SMA_EA02.mq5 のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。
ダウンロード
Expertsフォルダーの開き方は、メタエディタのナビゲータでExpertsを選択し、
マウスの右ボタンをクリックします。
そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。
コンパイルすると以下のように表示されます。
'EMA_EA02.mq5' EMA_EA02.mq5 1 1
'Trade.mqh' Trade.mqh 1 1
'Object.mqh' Object.mqh 1 1
'StdLibErr.mqh' StdLibErr.mqh 1 1
'SymbolInfo.mqh' SymbolInfo.mqh 1 1
'OrderInfo.mqh' OrderInfo.mqh 1 1
'HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1
'PositionInfo.mqh' PositionInfo.mqh 1 1
'DealInfo.mqh' DealInfo.mqh 1 1
0 error(s), 0 warning(s), compile time: 7196 msec 1 1
プログラムの変更箇所
1.変更箇所
#include <Trade/Trade.mqh>
を追加します。
(MQL5では、バックスラッシュ(¥)とスラッシュ(/)はどちらもデイレクトリを分ける記号です。)
int OnInit()のmaH=iMA()で使用しているMODE_SMAをMODE_EMAに変更します。
変更後は
maH=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
となります。
他にOrderSend()を使わなくなった関係で、次のコードを削除します。
2.削除箇所
MqlTradeRequest mreq;
MqlTradeResult mresu;
ZeroMemory(mreq);
ZeroMemory(mresu);
//------------------------------
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);
//------------------------------
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);
3.上記の削除したコードに代わり、新たにコードを追加します。
追加箇所は2箇所、BUYとSELLの発注箇所になります。
追加コードはCTradeクラスのPositionOpen()メソッドを使用していますが、
PositionOpen()使用時のパラメータ設定は次のようになります。
Bool PositionOpen( const string symbol,
ENUM_ORDER_TYPE order_type,
double volume, double price, double sl, double tp, const string comment="" )
Symbol
注文する通貨ペア。Symbol()を設定。
order_type
ENUM_ORDER_TYPE の値を設定。BUYであればORDER_TYPE_BUY SELLであればORDER_TYPE_SELLを設定。
Volume
注文ロット数の設定。double l = Lots;の変数lを設定。
Price
注文価格の設定。double p=NormalizeDouble(l_pr.ask,_Digits);で計算した、pを設定。
sl
Stop Loss 価格の設定。double s = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);で計算したsを設定。
tp
Take Profit 価格の設定。double t = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);で計算したtを設定。
comment=""
コメントの設定。
4.次はプログラムの追加したコードです。
BUY
double l = Lots;
double p=NormalizeDouble(l_pr.ask,_Digits);
double s = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);
double t = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);
CTrade m_trade;
m_trade.SetExpertMagicNumber(Magic);
m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,l,p,s,t,"");
//------------------------------
SELL
double l = Lots;
double p = NormalizeDouble(l_pr.bid,_Digits);
double s = NormalizeDouble(l_pr.ask + STP*_Point,_Digits);
double t = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits);
CTrade m_trade;
m_trade.SetExpertMagicNumber(Magic);
m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,l,p,s,t,"");
プログラムコード
EMA_EA02.mq5 の全体のプログラムコードは以下のようになります。
赤字の部分は変更箇所です。
#property copyright "T.S"
#property link "http://mt5myprogrammingts.blogspot.com"
#property version "1.00"
#include <Trade/Trade.mqh>
//--- input parameters
input int Stop=50;
input int Take=100;
input int Magic=1001;
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_EMA,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()
{
//------------------------------
MqlTick l_pr;
MqlRates mrate[2];
//------------------------------
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;
if(Sell_sig) return;
double l = Lots;
double p=NormalizeDouble(l_pr.ask,_Digits);
double s = NormalizeDouble(l_pr.bid - STP*_Point,_Digits);
double t = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);
CTrade m_trade;
m_trade.SetExpertMagicNumber(Magic);
m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,l,p,s,t,"");
}
bool Sell_S1=(sclose<maV[1]);
if(Sell_S1)
{
if(Sell_sig) return;
if(Buy_sig) return;
double l = Lots;
double p = NormalizeDouble(l_pr.bid,_Digits);
double s = NormalizeDouble(l_pr.ask + STP*_Point,_Digits);
double t = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits);
CTrade m_trade;
m_trade.SetExpertMagicNumber(Magic);
m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,l,p,s,t,"");
}
}
//END
(注意事項:プログラムはあくまでFX個人投資家の学習のための、
デモ口座によるMQL5売買プログラミングの情報提供を目的としております。
プログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自ら行ってください。
リアルトレードではテストしておりません。)