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

システムの概要

 今回はパラボリックストップアンドリバースシステム(SAR)指標によるトレードです。
下記はその計算式です。
ロングポジション
SAR (i) = SAR (i - 1) + ACCELERATION * (HIGH (i - 1) - SAR (i - 1))
ショートポジション
SAR (i) = SAR (i - 1) + ACCELERATION * (LOW (i - 1) - SAR (i - 1))
ここで
SAR (i - 1) :パラボリックSARの一つ前の値
ACCELERATION : 加速ファクター
HIGH (i - 1):— 一つ前の足の最高値
LOW (i - 1) : 一つ前の足の最安値
となります。

 EM10_SAR.mq5  のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。

ダウンロード

 ソースファイルはExpertsフォルダーに格納します。
Expertsフォルダーの開き方は、メタエディタのナビゲータでExpertsを選択し、
マウスの右ボタンをクリックします。そして「フォルダーを開く」を選択します。
Expertsフォルダーを開いた後、ファイルをコピー&ペーストします。

 コンパイルすると問題がなければ次のように表示されます。
0 error(s), 0 warning(s), compile time: 5318 msec  1 1

プログラムの変更箇所

 
  MQL5のテクニカル指標iSARの使い方は殆ど移動平均線と同じです。
パラボリックSARラインの上に終値が超えた時、
今までのポジションをクローズして新しくポジションをオープンします。
主だった追加、変更は次のようになります。
----------
int OnInit()でのiSARを使ったコードの追加
saH=iSAR(_Symbol,_Period,step,step);

----------
void OnTick()での今までのポジションをクローズするコードの追加と、
ポジションをオープンするときのストップルとテイクプロフィットの設定の変更

ロングポジションのクローズ
 if(Sell_sig) 
        {
         CTrade m_trade;
         m_trade.PositionClose(Symbol());
         return;
        
        }  
ショートポジションのクローズ
if(Buy_sig)  
        {
         CTrade m_trade;
         m_trade.PositionClose(Symbol());
         return; 
        
        } 

ポジションをオープンするときのストップレベルとテイクプロフィットレベルの設定変更
変更前
double s =NormalizeDouble(l_pr.ask - STP*_Point,_Digits);
double t =NormalizeDouble(l_pr.ask + TKP*_Point,_Digits);
変更後(設定しないときは0にします)
double s =0;
double t =0;
//-------------------

iSARの使用法 
放物線のストップと反転システム指標
int  iSAR( 
   string           symbol, 
   ENUM_TIMEFRAMES  period, 
   double           step,         
   double           maximum       
   );
Parameters
Symbol:通貨ペア設定(_Symbol)
period:通貨ペアの時間足設定(_Period)
Step:価格の増加ステップ-加速ファクター
Maximum:ステップの最大値 

プログラムコード

 

 EA10_SAR..mq5  のプログラムコードは以下のようになります。
赤字の部分は変更箇所です。
#property copyright "T.S"
#property link      "http://mt5myprogrammingts.blogspot.com"
#property version   "1.00"

#include <Trade/Trade.mqh>
//--- input parameters
input int      Magic=1001;
input double    Lots=0.01;
input int    Slipage=10;
input double    step=0.05;   
input double maximum=0.2; 
//---------------------------
int saH;
double maV[3];

double sclose;
int STP,TKP,SL;
//+---------------------------+
// Expert initialization function   
//+---------------------------+
int OnInit()
  {
//---

   saH=iSAR(_Symbol,_Period,step,step);

//------ 
   if(saH==INVALID_HANDLE)
     {
      Print("SIGNAL ERROR1");
      return(INIT_FAILED);
     }
//---
     SL  = Slipage;
   if(_Digits==5 || _Digits==3) //EURUSD=5
     {
       SL  = Slipage*10;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+----------------------------+
// Expert deinitialization function     
//+----------------------------+
void OnDeinit(const int reason)
  {
//---
   IndicatorRelease(saH);
   Comment("");
  }
//+-----------------------------+
// 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(saH,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]);

   Comment("sig   =  ",maV[1]);

   if(Buy_S1)
     {
       if(Buy_sig)  return;
       
       if(Sell_sig) 
        {
         CTrade m_trade;
         m_trade.PositionClose(Symbol());
         return;
        
        }  

      double l= Lots;
      double p=NormalizeDouble(l_pr.ask,_Digits);
      double s =0;
      double t =0;

      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)  
        {
         CTrade m_trade;
         m_trade.PositionClose(Symbol());
         return; 
        
        }       

      double l = Lots;
      double p = NormalizeDouble(l_pr.bid,_Digits);
      double s =0;
      double t =0;

      CTrade m_trade;
      m_trade.SetExpertMagicNumber(Magic);
      m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,l,p,s,t,"");          
      
     }
  }
//END

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