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

システムの概要

 ウイリアムズのパーセントレンジはラリー・ウイリアムズによって
1966年頃に考案されたテクニカル指標です。
%Rとも言います。ストキャステックと非常に良く似ています。
計算式は次のようになっています。
ストキャステックの式。
%K=(CLOSE-MIN(LOW(%K)))/(MAX(HIGHT(%K))-MIN(LOW(%K)))
%D=SMA(%K、N)

ウイリアムズのパーセントレンジの式。
%R = -(MAX (HIGH (i - n)) - CLOSE (i)) / (MAX (HIGH (i - n)) - MIN (LOW (i - n))) * 100

CLOSE=今日の終わり値
MAX (HIGH (i - n)) =n期間の最大の最高値期間の最小の最低値
MIN (LOW (i - n))  =n期間の最小の最低値

-100%から-0%の数値で表され、
-80% と -100%のときが売られ過ぎで買いシグナルに、
-0% and -20%のときが買われ過ぎで売りシグナルになります。
このウイリアムズのパーセントレンジのシグナルと併せ、
指数移動平均で終わり値がクロスしたときに売買を行うようにシステムを作ります。
 
 EM07_WPR.mq5  のプログラムは下のダウンロードから行ってください。
ソースファイルですので、ダウンロードした後コンパイルが必要です。

ダウンロード

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

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

プログラムの変更箇所

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

----------
変更コード
input int      CALC_Period=10;

int W_Handle;

double    WPR[3];

----------
int OnInit()の変更コード

W_Handle=iWPR(_Symbol,_Period,CALC_Period);

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

----------
void OnDeinit(const int reason)の変更コード
 
IndicatorRelease(W_Handle);  

----------
void OnTick()の変更コード

 if(CopyBuffer(W_Handle,MAIN_LINE,0,3,WPR)<0)  return;
   Comment("  WPR  =  ",WPR[1]);
int sig=0;
   if(WPR[1]>= -20 ) sig =-1;
   if(WPR[1]<= -80 ) sig = 1;
  
//-------------------
iWPRの使用方法
int  iWPR( 
   string           symbol,          // symbol name 
   ENUM_TIMEFRAMES  period,          // period 
   int              calc_period      // averaging period 
   );
 
Parameters
Symbol:通貨ペア設定(_Symbol)
period:通貨ペアの時間足設定(_Period)
calc_period:計算期間(CALC_Period) 

プログラムコード

 EA07_WPR.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      CALC_Period=10;

int maH;
double maV[3];

int W_Handle;

double    WPR[3];

double sclose;
int STP,TKP,SL;
//+---------------------------+
// Expert initialization function   
//+---------------------------+
int OnInit()
  {
//---
   maH=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
   W_Handle=iWPR(_Symbol,_Period,CALC_Period);
//--- What if handle returns Invalid Handle

   if(maH==INVALID_HANDLE)
     {
      Print("Indicators error1 ");
      return(INIT_FAILED);
     }

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