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

売買戦略

 SMA_EA011.mq5の自動売買シグナルは単純移動平均線SMAを元にしています。
前回と同じようにシグナルは、指定した時間足の終値(C1)がその時間足のSMAを越えたときに発生します。
しかし、今回はポジションのSAR(STOP AND REVERS)を行わず、ポジションがStopで損切りで手仕舞いするか、
利益が出てTakeが実行されるまで待つ戦略です。

1、(C1>SMA1)-->BUYシグナル

2、(C1<SMA1)-->SELLシグナル

3、ポジションがすでにあるときはそれ以上売買しない。

4、ポジションがあるときStopあるいはTakeでポジションが手仕舞いされるまで待つ。

5、ポジションがなくなったら上記の1あるいは2のシグナルで、再びポジションにエントリーします。

*(前回のSMA_EA01.mq5で、(C1>SMA1)-->BUYシグナルとすべき所を、
(C1<SMA1)となっていましたのでお詫びいたします。

 SMA_EA01.mq5  のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。
 Expertsフォルダーの開き方は、メタエディタのナビゲータでExpertsを選択し、
マウスの右ボタンをクリックします。
そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。

 コンパイルすると以下の警告がでますが、動作には問題ありません。
return value of 'OrderSend' should be checked SMA_EA011.mq5 126 7
return value of 'OrderSend' should be checked SMA_EA011.mq5 147 7
0 error(s), 2 warning(s), compile time: 13014 msec  1 3

プログラムの変更箇所

プログラムの変更箇所は2箇所です。 売買のオーダーを指示する所で、下のように赤字のコードを追加しています。

 if(Buy_S1 )
     {
      if(Buy_sig)  return;
      if(Sell_sig) return;
   ...


 if(Sell_S1)
     {
      if(Sell_sig) return;
      if(Buy_sig)  return;
      ...

 SMA_EA01.mq5  のプログラムと内容は同じですので
詳しい説明はSMA_EA01.mq5 を参考にしてください。
どちらが良いか、ポジションをどう保持するかの選択は、
やはりマーケットがどう動くかの問題という事になるでしょう。
頻繁に、あるいは漫然とEAを稼動し続ける事が良いとは思いません。
システムの限界を見極めることも大事です。
この2つのうち1つを選ぶと言うならば、FXは方向の変化が頻繁なので、
筆者としてはSARを使ったSMA_EA01.mq5 の方を選びますが、
読者の方々はどちらを選びますか。
それとも他の逆張りシステムを考えますか。?

プログラムコード

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

#property copyright "T.S"
#property link      "http://mt5myprogrammingts.blogspot.com"
#property version   "1.00"

//--- 
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_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;
      if(Sell_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;
      if(Buy_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

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