MT5エキスパートアドバイザー EMA_EA02.mq5

システムの概要

 売買戦略は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売買プログラミングの情報提供を目的としております。
プログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自ら行ってください。
リアルトレードではテストしておりません。)