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

システムの概要

 ストキャステックはジョージ・レーンによって1950年代に考案されたテクニカル指標です。
MT4、MT5では、シグナルは%Kと%Dを組み合わせたファースト・ストキャスティクスです。
計算式は下記のようになります。


%K=(CLOSE-MIN(LOW(%K)))/(MAX(HIGHT(%K))-MIN(LOW(%K)))
%D=SMA(%K、N)
CLOSE=今日の終わり値
MIN(LOW(%K))=%K 期間の最小の最低値
MAX(HIGHT(%K))=%K 期間の最大の最高値

%Kが%Dを上抜けたときが買いシグナル、
逆に%Kが%Dを下抜けたときが売りシグナルになります。
人によってはゾーンを設け、買いシグナルは20%以下、
売りシグナルは80%以上とする事もあるようです。
今回作ったエキスパートアドバイザーではゾーンは設けておりません。
ストキャステックのシグナルと合わせ、
指数移動平均をクロスしたとき売買を行うようになります。
 EM06_Stochastic.mq5  のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。

ダウンロード

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

 コンパイルすると問題がなければ次のように表示されます。

0 error(s), 0 warning(s), compile time: 15976 msec  1 1

プログラムの変更箇所

  コードは以前作ったEMA_EA02.mq5を変更していますが、
変更箇所は次のようになっています。

----------
追加コード

input int      Kperiod=5;
input int      Dperiod=3;
input int      slowing=3;

int S_Handle;

double    Stochastic[3];
double    Signal[3];

----------
int OnInit()の追加コード

S_Handle=iStochastic(_Symbol,_Period,Kperiod,
         Dperiod,slowing,MODE_SMA,STO_LOWHIGH);

if(S_Handle==INVALID_HANDLE)
     {
      Print("SIGNAL ERROR2");
      return(INIT_FAILED);
     }

----------
void OnDeinit(const int reason)の追加コード

IndicatorRelease(S_Handle);  

----------
void OnTick()の追加コード

if(CopyBuffer(S_Handle,MAIN_LINE,0,3,Stochastic)<0)  return;
if(CopyBuffer(S_Handle,SIGNAL_LINE,0,3,Signal)<0)  return;

Comment("  Stochastic  =  ",Stochastic[1],"  Signal  =  ",Signal[1]);

int sig=0;

   if(Stochastic[1]>= Signal[1] ) sig = 1;

   if(Stochastic[1]<= Signal[1] ) sig =-1;

-----------
void OnTick()の変更箇所

if(Buy_S1 && sig==1)

if(Sell_S1 && sig==-1)

//-------------------
iStochasticの使用方法

int  iStochastic( 
   string           symbol,           
   ENUM_TIMEFRAMES  period,          
   int              Kperiod,        
   int              Dperiod,       
   int              slowing,       
   ENUM_MA_METHOD   ma_method,    
   ENUM_STO_PRICE   price_field     
   );

Symbol:通貨ペア設定(_Symbol)
period:通貨ペアの時間足設定(_Period)
Kperiod:%Kの計算期間
Dperiod:%D の計算期間
slowing:平均値計算期間
ma_method:スムージングタイプ(SMA)
price_field:ストキャステック計算方法

プログラムコード

  EA06_Stochastic.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=3;
input int      Kperiod=5;
input int      Dperiod=3;
input int      slowing=3;

int maH;
double maV[3];

int S_Handle;

double    Stochastic[3];
double    Signal[3];

double sclose;
int STP,TKP,SL;

//+---------------------------+
// Expert initialization function   
//+---------------------------+

int OnInit()
  {
//---
   maH=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
   S_Handle=iStochastic(_Symbol,_Period,Kperiod,
           Dperiod,slowing,MODE_SMA,STO_LOWHIGH);
//--- What if handle returns Invalid Handle

   if(maH==INVALID_HANDLE)
     {
      Print("Indicators error1 ");
      return(INIT_FAILED);
     }
//---
   if(S_Handle==INVALID_HANDLE)
     {
      Print("SIGNAL ERROR2");
      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);
   IndicatorRelease(S_Handle);
   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(maH,0,0,3,maV)<0)  return;
   if(CopyBuffer(S_Handle,MAIN_LINE,0,3,Stochastic)<0)  return;
   if(CopyBuffer(S_Handle,SIGNAL_LINE,0,3,Signal)<0)  return;

   Comment("  Stochastic  =  ",Stochastic[1],"  Signal  =  ",Signal[1]);
//-----   

   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]);

   int sig=0;
   if(Stochastic[1]>= Signal[1] ) sig = 1;
   if(Stochastic[1]<= Signal[1] ) sig =-1;

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