ウィリアムズ%レンジとは?
ウィリアムズ%レンジはシンプルな計算式で構成されたオシレーター系の指標です。
–(N期間の最高値-最新足の終値)
÷
(N期間の最高値-N期間の最安値 )
を%したものです。
値幅における現在値の位置を算出する、オシレーター系指標のいつものやつなんですが、計算式の頭にマイナスがついているので、値は0から-100の間で構成されています。0が最大値というのは個人的に見やすくて好きです。
一般にWPRと略されます。
※MT5内臓のインディケーターではN期間のデフォルト値は「14」になっています。
今回はこのウィリアムズ%レンジを売買シグナルとした簡単なEAを作っていきたいと思います。
ウィリアムズ%レンジの売買シグナルを取得するロードマップ
以下の手順でコードを記述していきます
<メインプログラム>
<シグナル発信関数>
- エントリ-チェック関数の定義
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 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()
サンプルコードの挙動は以下のようになります↓
★注意再掲:ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、
デモ口座でお試しいただくようお願いします。コード内に発注記述が入っています。
リアル口座に導入するといきなりポジションを持ってしまいます。ソースコードを利用されたことによって金銭的被害を被られたとしても当方では責任を負うことができません。
詳しくは免責事項をご確認ください。
コメント