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

売買戦略

SMA_EA012.mq5の自動売買シグナルは、単純移動平均線SMAを元にしています。 シグナルは、指定した時間足の終値(C1)がその時間足のSMAを越えたときに発生します。 しかし、今回は手動操作で売りあるいは買いのみに限定します。 シグナルはSMA_EA01.mq5 のSAR(STOP AND REVERS)を使います。 ポジションはSARのシグナルが出たとき入り、そして手仕舞います。 次のボジションは、SARのシグナルで、 再び終値(C1)がチャートの時間足のSMAを越えるときまで待ちます。 手動でBUYにしたとき 1、(C1>SMA1)-->BUYシグナル 2、ポジションがすでにあるときはそれ以上売買しない。 4、BUYポジションがあるときのSELLシグナルでは、SAR(STOP AND REVERS)でクローズします。 5、次のBUYシグナルで再びエントリーします。

手動でにSELLにしたとき
1、(C1<SMA1)-->SELLシグナル
2、ポジションがすでにあるときはそれ以上売買しない。
4、SELLポジションがあるときのBUYシグナルでは、SAR(STOP AND REVERS)でクローズします。
5、次のSELLシグナルで再びエントリーします。
 
 SMA_EA012.mq5 のプログラムは下のダウンロードから行ってください。

ダウンロード

 ソースファイルですので、ダウンロードした後コンパイルが必要です。  
Expertsフォルダーの開き方は、メタエディタのナビゲータでExpertsを選択し、
マウスの右ボタンをクリックします。
そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。
 
 コンパイルすると以下のように表示されます。
'SMA_EA012.mq5' SMA_EA012.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
-------------次のように警告がでますが、動作には問題ありません。
return value of 'OrderSend' should be checked SMA_EA012.mq5 145 10
return value of 'OrderSend' should be checked SMA_EA012.mq5 173 10
0 error(s), 2 warning(s), compile time: 3920 msec 1 3

プログラムの変更箇所

 
 プログラムの変更箇所は2箇所です。
下のように赤字のコードを追加しています。



#include <Trade\Trade.mqh>
input int s_b=-1;
input int Magic=1002;

-------------
//buy side 
if(s_b==1){
...
}
if(s_b==-1)
{
CTrade m_trade;
m_trade.PositionClose(Symbol());
return;
}

-------------
//sell side
if(s_b==-1){
...
}
if(s_b==1)
{
CTrade m_trade;
m_trade.PositionClose(Symbol());
return;
}

 
 変更してない箇所はSMA_EA01.mq5 のプログラムと内容が同じです。
詳しい説明はSMA_EA01.mq5 を参考にしてください。
 インクルードしているTrade.mqhは標準ライブラリークラスです。
ポジションのクローズではCTradeクラスのPositionClose()メソッドを使用します。
メソッドにはアルゴリズム的な側面とデータ的な側面があります。
クラスのメソッドはデータ的な側面として捉えると分かり易いかも知れません。    

 さてSMA_EA012.mq5 のプログラムコードは以下のようになります。
 

プログラムコード


#property copyright "T.S"
#property link "http://mt5myprogrammingts.blogspot.com"
#property version "1.00"
#include <Trade\Trade.mqh>
input int s_b=-1;
input int Magic=1002;
//------
input int Stop=50;
input int Take=100;
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");
     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(s_b==1)
    {
     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);
     }
if(s_b==-1)
    {
     CTrade m_trade;
     m_trade.PositionClose(Symbol());
     return;
    }
   }

     bool Sell_S1= (sclose <maV[1]);

    if(Sell_S1)
    {
    if(Sell_sig) return;
if(s_b==-1)
   {
    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);
    }
if(s_b==1)
    {
     CTrade m_trade;
     m_trade.PositionClose(Symbol());
     return;
    }
   }
//---
}
//
//END

(注意事項:プログラムはあくまでFX個人投資家の学習のための、
デモ口座によるMQL5売買プログラミングの情報提供を目的としております。
プログラムによる運用結果につきましては、自己責任であることをご了承ください。
パラメータの設定、最適化は読者自ら行ってください。
リアルトレードではテストしておりません。)