【超入門】MQL5 EA講座 第114回「インジケータによるトレードシグナルにON/OFF機能をつける」【EAの作り方】

MQL5でEA作ろう講座


前回インジケータの値をトレードシグナルに使う具体的な方法について解説しました。

インジケータを利用したトレード条件の設定パターンには主に

為替価格とインジケ-タ値との関係性から作るパターン

インジケータの複数のラインの位置関係で考えるパターン

時間経過に伴うインジケータの変化具合で考えるパターン

特定の基準となる数値に対する、インジケータの値との関係性で考えるパターン

上記のパターンを組みあせたもの

に分類できる事をお伝えし、それぞれのパターンの具体例を示しながら解説を行いました。

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

インジケータによるトレードシグナルのON/OFFとは?-はじめに-

さて、今回は開発するEAに、インジケータによるトレードシグナルにON/OFF機能を実装する方法について解説していきたいと思います。

前回の記事を読めば、インジケータを使っての、エントリー条件記述はほぼできるようになっていると思いますが、今回学ぶON/OFF機能はその条件付けにさらに柔軟性を加えるものです。

例えば、複数のインジケータをエントリー条件に用いるようなEAを開発する局面においては、個々のインジケータをオン・オフできるような機能が実装されていると便利です。

これができるようになると、例えばRSIボリンジャーバンドをエントリー条件に用いているEAがあったとして、

「日足や4時間足のような長時間足チャートに挿入して動かすEAの場合はボリンジャーバンドだけ使って、RSIはエントリー判断には使わないようにしよう」

「5分足や1分足の短時間足チャートに挿入して動かす時だけ、RSIボリンジャーバンド両方をONにしよう」

といった、EA運用における幅・柔軟性を持たせることができるようになります。

このように、特定のインジケータに対して、エントリー条件に使う・使わないをEA実運用前の設定画面で選択できるようにするのがON/OFF機能の実装という訳です。

このOn/OFF機能実装には、特別難しい知識は必要なく、これまでに解説してきた基礎部分を組み合わせることによって簡単に実現できます。

とはいえ、一つ一つの項目については改めて丁寧な解説を心掛けていきたいと思います。

必要となる基本知識に関するリンクも細かく張り巡らせ、記事の途中で疑問点が生じたら、すぐに立ち戻って復習できるよう記事を構成しております。安心して読んでください。

今回も是非楽しんで学習していただければと思います。

インジケータOn/OFF機能実装の為のロードマップ

インジケータのOn/OFF機能実装にあたっては以下の手順を踏んでおこないます。

インジケータOn/OFFを制御するinput変数の宣言

インジケータOn/OFFを制御する為のエントリー条件をメインプログラム内で記述する

順を追って見ていきましょう。

インジケータOn/OFFを制御するinput変数の宣言

まずはインジケータOn/OFFを制御するinput変数の宣言します。

今回はボリンジャーバンドRSIを使用するEAを作成する場合を考えてみます。

想定するEAの仕様は以下の通りです。

ボリンジャーバンドの価格が下限バンドを下回り、RSIが売られすぎの領域(30以下)にある場合、買いポジションを建てる。

ボリンジャーバンドの価格が上バンドを上回り、RSIが買われすぎの領域(70以上)にある場合、売りポジションを建てる。

RSIを売買条件に利用するかどうかは、EAをチャートに挿入した際のパラメータ調整画面で変更できるものとする。

↑の条件でEAを作るとします。この仕様は、言い換えれば

RSIを売買条件に利用する場合は、RSIボリンジャーバンドを売買の判断材料にする

RSIを売買条件に利用しない場合は、ボリンジャーバンドのみを売買の判断条件にする

という事になります。このRSI利用可否をinput変数で制御します。

input bool OkayRSI=true;

void OnTick()
  {
//---
   
  }


グローバル領域(関数の外の領域)にinput変数を1つ宣言しました。

input変数名は「OkayRSI」としました。初期値はtrueとします。

falseの場合は、RSIを使わず、ボリンジャーバンドのみを売買の判断条件にするような記述を後程行います。

On/Offを切り替えるような判断を担わせるので、必然的にデータ型bool型になります。

bool型については↓の記事をご参照ください

MQL5 EA講座 第14回「データ型その4 Bool(ブール)型」

input変数については↓の記事をご参照ください。

インジケータOn/OFFを制御する為のエントリー条件をメインプログラム内で記述する

続いて、先ほど宣言したinput変数「OkayRSI」も用いつつ、RSIのOn/OFFを制御する為のエントリー条件をメインプログラム(ここでは、イベントハンドラーであるOnTick関数)内で記述します。

OnとOFF両方が成立するような条件記述を行う必要がありますが、一例としては以下のようなものになります。

※On/OFFを制御する為のエントリー条件文解説に的を絞っている為、includeファイルの読み込みや、クラスインスタンスの宣言、必要な配列の用意記述・時系列セットなどは省略しています。

従って、コードとしての厳密さは欠いている点をご了承ください。

void OnTick()
  {
    if(
         (Price.Close(1)<bbLower[1]&& ((rsi[1]<=30 &&OkayRSI==true)||OkayRSI==false))
          
      )
     {
        Trade.Buy(_Symbol,0.1);
     }

     else if(
         (Price.Close(1)>bbUpper[1] && ((rsi[1]>=70 &&OkayRSI==true)||OkayRSI==false))
      
      )
      {
        Trade.Sell(_Symbol,0.1);
     }
   
  }//void OnTick()の終わり

※Price.Close()というのは第104回で作った、OriginalCBarsクラス内のメンバ関数であるClose関数です。このメンバ関数は終値情報を取得します。

Close関数に関しては↓の記事をご参照ください。

MQL5 EA講座 第104回「価格とバーに関するデータへのアクセス:その2バー情報」

配列「bbUpper[]」にはボリンジャーバンドの上バンドの値、配列「bbLower[]」にはボリンジャーバンドの下バンドの値が格納されている想定です。

bbUpper[1]、bbLower[1]は、現在足から1本前におけるボリンジャーバンド上バンド、下バンドの値が格納されていると思ってください。

配列rsi[]に関しても同様で、RSIの値が格納されているという想定です。

rsi[1]には現在足から1本前におけるRSIの値が格納されていると思ってください。

インジケータの値を取得するプロセスについては、↓の記事をご参照ください。

MQL5 EA講座 第108回「インジケータを使ってエントリーシグナルを生成する」

Trade.BuyTrade.Sellは、以前作った発注用オリジナルクラスメンバ関数です。

Trade.BuyTrade.Sellについては↓の記事をご参照ください。

MQL5 EA講座 第73回「Buy関数とSell関数を実装」

サンプルコードのif文内にはカッコが入れ子状に複数入っており、パッと見複雑に見えるのですが、1つ1つ順を追って見ていけばそんなに難しい事は書いていません。

最初にOn/Off機能を実装するインジケータの、Onの時の記述を行う

最初にOn/Off機能を実装するインジケータ(今回はRSI)の、Onの時の記述を行います。

サンプルコードでは

(rsi[1]<=30 &&OkayRSI==true)

↑の記述にあたりますが、この部分が、インジケータがOnの状態を作る時の記述文であり、プログラムが実行される際には、この最も内側のカッコ()内記述が最初に評価されることになります。

今回はRSIを想定して記述しましたが、どの種類のインジケータでも適用できる記述です。

以下のように、インジケータがOnの状態の時に発動させたいインジケータの条件文を論理積 &&で結合させればよいだけです。

(input変数==true && 発動させたい条件文)

↑のような形です。条件文がまず最初に判定されます。論理積 &&で結んだ2つの条件いずれも真であった場合、インジケータがOnであることを意味します。

次にOn/Off機能を実装するインジケータの、Offの時の記述を行い、Onの時の記述と論理和で結ぶ

インジケータがOnの時の記述が完成したので、続いてはインジケータがOffの時の記述です。

インジケータがOffの状態は単純に

input変数==false

と書けばよいです。

インジケータがOnの時の記述とOffの時の記述両方が書けたので、これを論理和 || で結合させます。

サンプルコードで言えば

(rsi[1]>=70 &&OkayRSI==true)||OkayRSI==false

の部分ですが、一般化すると以下のような形になります。

(input変数==true && 発動させたい条件文)||input変数==false

↑これが1つのインジケータに関するOn/Offの基本形になるので、この条件全体をカッコ()で括ります

※カッコが多くてわかりずらくなってきたので、対応するカッコを色で分けてあります↓

((input変数==true && 発動させたい条件文) || input変数==false)

()内の記述はOnの時の記述で、論理和 || で繋げたその次の記述がOffの場合の記述、()内の記述がRSIに関するすべての記述、という事になります。

論理積論理和については↓の記事をご参照ください。

最後にボリンジャーバンドの条件を論理積で結びつける

まだこれで終わりではありません。これまでに解説してきたのは、On/Off設定を施すインジケータ、すなわちRSIに関する記述でした。

今回のEAの仕様ではボリンジャーバンドもエントリー判断に利用するので、これまでの一連のRSI記述と、ボリンジャーバンドに関する記述を論理積&&で結びます。

(Price.Close(1)<bbLower[1]&& ((rsi[1]<=30 &&OkayRSI==true)||OkayRSI==false))

↑は買いの場合のエントリー記述ですが、日本語になおすと、

RSI利用モードがOnかつ、1本前のRSIが30以下の状態、もしくはRSI利用モードがOffの時に1本前の終値が一本前のボリンジャーバンドよりも下にある時

と読み解くことができます。赤色の部分がRSIに関する記述であり、緑色の部分がボリンジャーバンドに関する記述となります。

(Price.Close(1)>bbUpper[1] && ((rsi[1]>=70 &&OkayRSI==true)||OkayRSI==false))

↑は売りの場合のエントリー記述ですが、日本語になおすと、

RSI利用モードがOnかつ、1本前のRSIが70以上の状態、もしくはRSI利用モードがOffの時に1本前の終値が一本前のボリンジャーバンドよりも上にある時

と読み解くことができます。買いの時と同様に、赤色の部分がRSIに関する記述であり、緑色の部分がボリンジャーバンドに関する記述となります。

まとめ

今回はインジケータによるトレードシグナルに、ON/OFF機能を実装する方法について解説しました。

まずはそもそも「トレードシグナルに、ON/OFF機能を実装する」とはどういうことか?

についての簡単な解説を行いました。

※詳しくは↓

インジケータによるトレードシグナルのON/OFFとは?-はじめに-セクションをご覧ください。

その上で、具体的なON/OFF機能実装方法のロードマップを示しました。

※詳しくは↓

インジケータOn/OFF機能実装の為のロードマップセクションをご覧ください。

その後、具体的なON/OFF機能実装方法のステップ1として、On/OFFを制御するinput変数の宣言について解説を行いました。

※詳しくは↓

インジケータOn/OFFを制御するinput変数の宣言セクションをご覧ください。

そして最後に、ON/OFF機能実装方法のステップ2として、インジケータOn/OFFを制御する為のエントリー条件を記述する方法を解説しました。

※詳しくは↓

インジケータOn/OFFを制御する為のエントリー条件をメインプログラム内で記述するセクションをご覧ください。

今回お伝えしたような方法で、On/Offを切り替える為にbool型input変数を用意し、それを用いつつ論理積 &&論理和 || で条件文を結合しながら形成させていくことで、状況や好みに応じて運用を柔軟に変更できるトレード条件のEAを実装させることが可能となります。

ただし、条件文の記述時に、カッコ()の中にさらにカッコ()が入る記述になることから、コンパイルエラーが生じやすいです。コンパイルエラーを避けるためにも、対応するカッコには注意を払い、カッコ()の記述が多すぎたり、少なかったりという点には注意を払いましょう。

今回は以上とさせていただきます。

ここ数回にかけて、インジケータに関する講義をしてきましたが、次回からはMQL5で時間と日付を操作する方法について解説していこうと思います。

EAトレードタイマーを実装できる専用クラスも作っていく予定なので、楽しみにお待ちください。

最後までお読みいただきありがとうございました。

MQL5 EA講座 第113回「インジケータの値をトレードシグナルに使う方法」

第115回「チャート上に新しいバーが生成される瞬間にのみ注文できるクラスを作る」

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