【MQL5でパラボリックSARの売買シグナルを取得する方法】

EA制作お役立ち記事

スポンサーリンク
スポンサーリンク

パラボリックSARとは?

パラボリックparabollicとは「放射線」という意味です。

その名の通り、チャート上に放射線の点の連なり(Stop And Reverse Point=SAR)が描画されるインジケータです。

単にパラボリックとだけ言ったり、逆にSARとだけ言ったりします。

パラボリックSARは上昇トレンドのときは、点がチャート価格の下に、

逆に下降トレンドのときは、点がチャート価格の上に表示される仕組みになっています。

トレンドが切り替わると、パラボリックSARの位置関係も上下に入れ替わります。

今回は、このパラボリックSARの値を取得し、それを売買シグナルとするEAを制作していきたいと思います。

※なお、パラボリックSARについては、

MT5に標準実装されているパラボリックSARインジケータのソースコードを解説した記事もありますので、よろしければご覧ください。MQL5に必要な知識がかなり網羅的に勉強・確認できるはずです。↓

パラボリックSARの売買シグナル取得のロードマップ

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

<メインプログラム>

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

<シグナル発信関数

  • シグナル用の文字列変数を宣言
  • パラボリックSARの値を取得する記述を行う
  • シグナルを定義する記述を行う

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

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

MqlTradeRequest構造体型のインスタンスにオーダー詳細を入力→OrderSend()

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

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

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

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

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

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

シグナルを生成する関数は後ほど、グローバル領域(イベントハンドラーの外の領域)に記述します。

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

現在値の取得と正規化

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

のことを言います。

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

通貨ペアに関する適切な桁数については、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関数については↓をご覧ください。

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

メインプログラムでの記述が終わったので、グローバル領域にパラボリックSARを使った、シグナル生成関数を定義していきます。

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

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

引数や実引数って何だっけ?」という人は

MQL5 EA講座 第43回「値渡しについて」

MQL5 EA講座 第25回「関数について」

などで確認・復習できますのでご覧ください。

MqlRates構造体型を使い、マーケット情報を取得

構造体というのは、

複数の変数をセットで持てるデータ型のことで、

MqlRates構造体MQL5側で事前に定義済みの構造体です。

開始時間、始値、終値、高値、安値・・・等の情報をお弁当パックのように収納できるようになっています。

  //MqlRates構造体型の変数配列を宣言
   MqlRates priceArray[];
   
   //配列を時系列にセット
   ArraySetAsSeries(priceArray,true);
   
   //配列にチャート情報をコピー
   int data=CopyRates(_Symbol,_Period,0,3,priceArray);

MqlRates構造体についてはこの記事でも解説しているので、よろしければご覧ください↓

構造体について確認したい方は↓をご覧ください。

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

パラボリックSARをもとにして生成される売買シグナルを格納する変数を用意します。

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

パラボリックSARの値を取得する記述を行う

MQL4とは違い、MQL5ではパラボリックSARの値の取得がiSAR関数だけでは完結しません。

SARの値取得には、

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

今回は、現在足の1本前、2本前のSAR値の位置関係で売買シグナルを決定しますので、値を格納する変数もそれ用に2つ用意します。

 //SARの値を格納する変数配列を宣言
   double SARArray[];
   
   //SARのハンドルを取得
   int SARHandle=iSAR(_Symbol,_Period,0.02,0.2);
   
   //SAR格納配列を時系列にセット
   ArraySetAsSeries(SARArray,true);
   
   
   
   
   
   //SARを取得し、配列に格納
   CopyBuffer(SARHandle,0,0,3,SARArray);
   
   //1本前ののSAR値を変数に格納
   double SARValue1=NormalizeDouble(SARArray[1],_Digits);
   
    //2本前ののSAR値を変数に格納
   double SARValue2=NormalizeDouble(SARArray[2],_Digits);

※ステップ幅、最大値はメタトレーダー5内蔵のパラボリックSAR初期値を採用しています。

配列についての知識を確認されたい方は、以下の記事群をご覧ください。

【超入門】MQL5 EA講座 第18回「配列(Array)について」

【超入門】MQL5 EA講座 第19回「静的配列と動的配列」

【超入門】MQL5 EA講座 第20回「多次元配列」

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

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

<買いシグナル>

  • 1本前SARが1本前の足の安値より小さいとき
  • 2本前SARが2本前の足の高値より大きいとき

↑これは言い換えれば、パラボリックSARが下降放物線から上昇放物線に転じたことを意味します。

<売りシグナル>

  • 1本前SARが1本前の足の高値より大きいとき
  • 2本前SARが2本前の足の安値より小さいとき

↑これは言い換えれば、パラボリックSARが上昇放物線から下降放物線に転じたことを意味します。

以上を踏まえてコードに落とし込んでいきます。

//買いシグナルの定義  
   //1本前SARが1本前の足の安値より小さいとき
   if(SARValue1<priceArray[1].low)
   {
      //2本前SARが2本前の足の高値より大きいとき
      if(SARValue2>priceArray[2].high)
      {
         signal="Buy";
      }//if(SARValue2>priceArray[2].high)
   }//if(SARValue1>priceArray[1].low)
   
 //売りシグナルの定義  
   //1本前SARが1本前の足の高値より大きいとき
   if(SARValue1>priceArray[1].low)
   {
      //2本前SARが2本前の足の安値より小さいとき
      if(SARValue2<priceArray[2].high)
      {
         signal="Sell";
      }//if(SARValue2<priceArray[2].high)

全体のプログラムコード

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

#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"
#property strict 
//+------------------

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

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

void OnTick()
  {
      //エントリーシグナルを格納する変数を宣言
      string entrySignal=CheckEntryBasedOnSAR();
      
      //現在値の取得と正規化                  
      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 CheckEntryBasedOnSAR()
{
   
   
   //MqlRates構造体型の変数配列を宣言
   MqlRates priceArray[];
   
   //配列を時系列にセット
   ArraySetAsSeries(priceArray,true);
   
   //配列にチャート情報をコピー
   int data=CopyRates(_Symbol,_Period,0,3,priceArray);
   
   //シグナル用の文字列変数を宣言
   string signal="";
   
   //SARの値を格納する変数配列を宣言
   double SARArray[];
   
   //SARのハンドルを取得
   int SARHandle=iSAR(_Symbol,_Period,0.02,0.2);
   
   //SAR格納配列を時系列にセット
   ArraySetAsSeries(SARArray,true);
   
   
   
   
   
   //SARを取得し、配列に格納
   CopyBuffer(SARHandle,0,0,3,SARArray);
   
   //1本前ののSAR値を変数に格納
   double SARValue1=NormalizeDouble(SARArray[1],_Digits);
   
    //2本前ののSAR値を変数に格納
   double SARValue2=NormalizeDouble(SARArray[2],_Digits);
 
 //買いシグナルの定義  
   //1本前SARが1本前の足の安値より小さいとき
   if(SARValue1<priceArray[1].low)
   {
      //2本前SARが2本前の足の高値より大きいとき
      if(SARValue2>priceArray[2].high)
      {
         signal="Buy";
      }//if(SARValue2>priceArray[2].high)
   }//if(SARValue1>priceArray[1].low)
   
 //売りシグナルの定義  
   //1本前SARが1本前の足の高値より大きいとき
   if(SARValue1>priceArray[1].low)
   {
      //2本前SARが2本前の足の安値より小さいとき
      if(SARValue2<priceArray[2].high)
      {
         signal="Sell";
      }//if(SARValue2<priceArray[2].high)
   }//if(SARValue1>priceArray[1].low)
   
   Comment("シグナル: ",signal);
   
   //戻り値としてsignalを返す
   return signal;
   
}//CheckEntryBasedOnSAR()


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

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

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

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

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

最後までお読みいただきありがとうございました<(_ _)>

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

<MQL5でEAを作ろう講座>

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

【言語基礎編】

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

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

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

パラボリックを使った講座記事では動的トレーリングストップについて解説した↓

MQL5 EA講座 第98回「動的トレーリングストップについて」

などもあります。

コメント

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