スポンサーリンク
ホーム » EA制作お役立ち記事 » 【MQL5入門】ウィリアムズ%レンジ(WPR)の売買シグナルを取得する方法【EAの作り方】
a

【MQL5入門】ウィリアムズ%レンジ(WPR)の売買シグナルを取得する方法【EAの作り方】

EA制作お役立ち記事
スポンサーリンク
スポンサーリンク

ウィリアムズ%レンジとは?

ウィリアムズ%レンジはシンプルな計算式で構成されたオシレーター系の指標です。

(N期間の最高値-最新足の終値)

          ÷

(N期間の最高値-N期間の最安値 )

を%したものです。

値幅における現在値の位置を算出する、オシレーター系指標のいつものやつなんですが、計算式の頭にマイナスがついているので、値は0から-100の間で構成されています。0が最大値というのは個人的に見やすくて好きです。

一般にWPRと略されます。

※MT5内臓のインディケーターではN期間のデフォルト値は「14」になっています。

今回はこのウィリアムズ%レンジを売買シグナルとした簡単なEAを作っていきたいと思います。

ウィリアムズ%レンジの売買シグナルを取得するロードマップ

以下の手順でコードを記述していきます

<メインプログラム>

  • Trade.mqhのインクルードとCTradeクラスのオブジェクトの宣言
  • エントリーシグナルを格納する変数を宣言
  • 現在値の取得と正規化
  • 発注条件を記述

<シグナル発信関数>

  • エントリ-チェック関数の定義
  • シグナル用の文字列変数を宣言
  • ウィリアムズ%レンジの値を取得する記述を行う
  • シグナルを定義する記述を行う

Trade.mqhのインクルードとCTradeクラスのオブジェクトの宣言

MQL5の基本発注プロセスである、

MqlTradeRequest構造体型変数にオーダー詳細を入力→OrderSend()

という流れは極めて煩雑で、記述ミスも起こりやすいです。

Trade.mqhファイルを呼び出して、CTradeクラスのオブジェクトを宣言し、メインプログラムでの発注記述を簡略化できるようにします。

#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする

CTrade trade;
// CTradeクラスのオブジェクトを宣言

エントリーシグナルを格納する変数を宣言

シグナルはstring型(=文字列)で受け取るようにします。

シグナルを生成する関数は後ほど、グローバル領域に記述します。

//エントリーシグナルを格納する変数を宣言
      string entrySignal=CheckEntryBasedOnWPM();

現在値の取得と正規化

正規化というのは、プログラムが取り扱うルールに則って値を整える作業

のことを言います。

ここで言う「プログラムが取り扱うルール」とは通貨ペアの価格を適切な桁数に整えることを指します。

通貨ペアに関する適切な桁数については、Digits関数(または定義済み変数_Digits)で取得できます。

正規化にはNormalizeDouble関数を用います。

//現在値の取得と正規化                  
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

NormalizeDouble関数についてはコチラをご覧ください。

発注条件を記述

買い注文=「買いシグナルを受け取り、ノーポジのとき」

売り注文=「売りシグナルを受け取り、ノーポジのとき」

と定義します

★注意:以下のソースコードには発注回路が含まれています。

ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、

デモ口座お試しいただくようお願いします。

if(entrySignal=="Buy" && PositionsTotal()==0)
      {
         //買い注文
         trade.Buy(0.01,NULL,Ask,Ask-100*_Point,Ask+100*_Point);
         
      }//if(entrySignal=="Buy" && PositionsTotal()==0)
      
      if(entrySignal=="Sell" && PositionsTotal()==0)
      {
         //売り注文
         trade.Sell(0.01,NULL,Bid,Bid+100*_Point,Bid-100*_Point);
         
      }//if(entrySignal=="Sell" && PositionsTotal()==0)

PositionsTotal関数についてはコチラをご覧ください。

エントリ-チェック関数の定義

メインプログラムでの記述が終わったので、グローバル領域にウィリアムズ%レンジを使った、シグナル生成関数を定義していきます。

※グローバル領域とは関数の外の領域のことです。

戻り値string型、仮引数はなしとします。

//エントリ-チェック関数の定義
string CheckEntryBasedOnWPR()

シグナル用の文字列変数を宣言

ウィリアムズ%レンジをもとにして生成される売買シグナルを格納する変数を用意します。

//シグナル用の文字列変数を宣言
   string signal="";

ウィリアムズ%レンジの値を取得する記述を行う

MQL4とは違い、MQL5ではウィリアムズ%レンジのの値の取得がiWPR関数だけでは完結しません。

  • 値を格納する配列の宣言
  • iWPR関数によるハンドル(ウィリアムズ%レンジの値を取得する鍵のようなもの)の取得
  • ArraySetAsSeries関数による、配列の時系列セット
  • CopyBuffer関数による、ウィリアムズ%レンジの値情報を配列にコピー

↑以上の工程をたどる必要があります。

   //WPRの配列を格納する配列を用意
   double WPRPrice[];
      
      //WPRを計算するハンドルを取得する
      int WPRHandle=iWPR(_Symbol,_Period,14);
      
      //データを時系列にセット
      ArraySetAsSeries(WPRPrice,true);
      
      //取得したハンドルを使って、配列にWPRの計算値を格納
      CopyBuffer(WPRHandle,0,0,3,WPRPrice);
      
      //配列に格納したWPRの値を正規化
      double WPRValue=NormalizeDouble(WPRPrice[0],2);

シグナルを定義する記述を行う

売買シグナルを発出する定義は

<買いシグナル>

  • ウィリアムズ%レンジの値が-80~-100の時

<売りシグナル>

  • ウィリアムズ%レンジの値が-20~0の時

とします。

/ //WPRの値を基準として売買シグナルを発出
   if(WPRValue<-80 && WPRValue>-100)signal="sell";
   if(WPRValue>-20 && WPRValue<0)signal="buy";
   
   Comment("シグナル: ",signal);
   
   //戻り値としてsignalを返す
   return signal;

全体のプログラムコード

全体のプログラムコードは以下のようになります


#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする

CTrade trade;
// CTradeクラスのオブジェクトを宣言

void OnTick()
  {
      //エントリーシグナルを格納する変数を宣言
      string entrySignal=CheckEntryBasedOnWPR();
      
      //現在値の取得と正規化      
           
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
      
      if(entrySignal=="buy" && PositionsTotal()==0)
      {
         //買い注文
         trade.Buy(0.01,NULL,Ask,Ask-100*_Point,Ask+100*_Point);
         
      }//if(entrySignal=="buy" && PositionsTotal()==0)
      
      if(entrySignal=="sell" && PositionsTotal()==0)
      {
         //売り注文
         trade.Sell(0.01,NULL,Bid,Bid+100*_Point,Bid-100*_Point);
         
      }//if(entrySignal=="sell" && PositionsTotal()==0)
      
     
      
  }//void OnTick()
//+------------------------------------------------------------------+

//エントリ-チェック関数の定義
string CheckEntryBasedOnWPR()
{
   //シグナル用の文字列変数を宣言
   string signal="";
   
   //WPRの配列を格納する配列を用意
   double WPRPrice[];
      
      //WPRを計算するハンドルを取得する
      int WPRHandle=iWPR(_Symbol,_Period,14);
      
      //データを時系列にセット
      ArraySetAsSeries(WPRPrice,true);
      
      //取得したハンドルを使って、配列にWPRの計算値を格納
      CopyBuffer(WPRHandle,0,0,3,WPRPrice);
      
      //配列に格納したWPRの値を正規化
      double WPRValue=NormalizeDouble(WPRPrice[0],2);
   
   //WPRの値を基準として売買シグナルを発出
   if(WPRValue<-80 && WPRValue>-100)signal="sell";
   if(WPRValue>-20 && WPRValue<0)signal="buy";
   
   Comment("シグナル: ",signal);
   
   //戻り値としてsignalを返す
   return signal;
   
}//string CheckEntry()

サンプルコードの挙動は以下のようになります↓

★注意再掲:ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、

デモ口座でお試しいただくようお願いします。コード内に発注記述が入っています

リアル口座に導入するといきなりポジションを持ってしまいます。ソースコードを利用されたことによって金銭的被害を被られたとしても当方では責任を負うことができません。

詳しくは免責事項をご確認ください。

※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる

<MQL5でEAを作ろう講座>

をメインコンテンツとして展開しています。

【言語基礎編】

【中級実際にEAを作ろう編】

【発展編・MT5用EAを作る工程をカスタマイズしていく】

第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。

EA制作お役立ち記事
スポンサーリンク
シェアする
エムキューエルをフォローする
スポンサーリンク
【超入門】MQL5 でEAを作ろうブログ

コメント

タイトルとURLをコピーしました