iCustomでカスタムインジケーターを使ったEAを作ろう

こんにちは~。

MQLをマスターしたくて、お腹が空き過ぎるとご飯を作らずにすぐに食べられるお菓子ばっかり食べちゃうりょうです。

今回は、EAの作成にiCustomを利用してみる試みです。

TOC

iCustomとは?

通常、EAを作成していくなかでテクニカルを使用するときは、

  • iMA ・・・ 移動平均線の値を取得する関数
  • iRSI ・・・ RSIの値を取得する関数
  • iStochastic ・・・ ストキャスティクスの値を取得する関数

など、MQLに組み込まれたロジック関数を使用すると思います。

りょう

まぁ、普通はそうだよね

にゃんぽこ

よく見るやつ


対してiCustom関数は任意のカスタムインジケータのロジックを使用することができます。

りょう

どゆこと?


iCustom関数を使えば上記のようなMT4に既存で入っているテクニカル指標以外にも、自分でつくったインジケータや別の人が作成して手に入れたインジケータなどを使うことができるので、オリジナリティのあるロジックでEAを組むことなどができます。

りょう

なるほど それはなんだか凄そうだ!


iCustomを使ってEAを作ってみた

早速ですが、今回僕が作ってみたEAがこちらです↓。

//+------------------------------------------------------------------+
//|                                                   heikenTEST.mq4 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

datetime NewBar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//---

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {

//1本前の平均足の値を取得
  double HeiOpen1 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 2, 1);
  double HeiClose1 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 3, 1);
//2本前の平均足の値を取得
  double HeiOpen2 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 2, 2);
  double HeiClose2 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 3, 2);

//以下、新しいローソク足になった時の処理
   if( NewBar != Time[0]) {
      NewBar = Time[0];

//陽線から陰線に切り替わったらロング決済、陰線から陽線に切り替わったらショート決済
      for( int i = OrdersTotal() - 1; i >= 0; i--) {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) {
            if((OrderType() == OP_BUY && HeiOpen2 < HeiClose2 && HeiOpen1 > HeiClose1) ||
                  ( OrderType() == OP_SELL && HeiOpen2 > HeiClose2 && HeiOpen1 < HeiClose1)) {
               int result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 0);
               if(result < 0) {
                  Print("注文に失敗しました");
               } else {
                  bool orderSelectResult = OrderSelect(result, SELECT_BY_TICKET);
                  Print("注文に成功しました。決済価格は " + (string)OrderClosePrice() + " です。");
               }
            }
         }
      }

//エントリー
//平均足が陰線から陽線に切り替わったらロングエントリー
      if( HeiOpen2 > HeiClose2 && HeiOpen1 < HeiClose1 ) {
         int result = OrderSend( Symbol(), OP_BUY, 0.5, Ask, 1, 0, 0, NULL );
         if(result < 0) {
            Print("注文に失敗しました");
         } else {
            bool orderSelectResult = OrderSelect(result, SELECT_BY_TICKET);
            Print("注文に成功しました。エントリー価格は " + (string)OrderOpenPrice() + " です。");
         }
      }
//平均足が陽線から陰線に切り替わったらショートエントリー
      if( HeiOpen2 < HeiClose2 && HeiOpen1 > HeiClose1 ) {
         int result = OrderSend( Symbol(), OP_SELL, 0.5, Bid, 1, 0, 0, NULL );
         if(result < 0) {
            Print("注文に失敗しました");
         } else {
            bool orderSelectResult = OrderSelect(result, SELECT_BY_TICKET);
            Print("注文に成功しました。エントリー価格は " + (string)OrderOpenPrice() + " です。");
         }
      }
   }
}
//+------------------------------------------------------------------+


今回は、平均足というMT4に既存で入っているインジケータを使用しました。

平均足とは、見た目はローソク足に似ていますが、始値終値がローソク足とは違う値です。

計算方法は以下のようになっています↓。

始値・・・(1本前の平均足の始値+終値)÷ 2
終値・・・(現在の時間足の始値+高値+安値+終値)÷ 4


ローソク足と違い、平均化で均されているのでノイズが少なく、トレンドを掴みやすいという特徴があります。

りょう

でも平均足の値を取得できる専用の関数は無いんだなぁ

にゃんぽこ

iHeikenAshi()なんて言うのは無いからね
こういう時にiCustomを使えばいいのだ



そこでiCustom関数を使い、平均足の値を取得してみました↓。

//1本前の平均足の値を取得
  double HeiOpen1 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 2, 1);
  double HeiClose1 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 3, 1);
//2本前の平均足の値を取得
  double HeiOpen2 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 2, 2);
  double HeiClose2 =  iCustom(Symbol(), PERIOD_CURRENT, "Heiken Ashi", 3, 2);



今回使用したiCustomの引数はこのようになっています↓。


ムゥ

ヘイキンアシじゃなくてヘイケンアシなんだにゃ

にゃんぽこ

もともとMT4に入ってるのがそうだからね

りょう

多分海外の人が聞き間違えたんや!

知らんけど


平均足の始値と終値の取得方法ですが、MT4に入っている“Heiken Ashi”のソースコードを一部抜粋したものがこちらになります↓。



ここから、始値は『2』、終値は『3』に設定されていることが読み取れるので、



こちらに『2』と『3』を入れて始値と終値の値を取得しています。

ロジックに関しては1本前の平均足が陰線から陽線に変わったらロング陽線から陰線に変わったらショートという単純なものです。

にゃんぽこ

ドテンロジック

テストしてみた結果がこちらです↓。



白い足が平均足の陽線、赤い足が平均足の陰線です。

エントリーはめちゃくちゃですが、平均足が切り替わったらエントリーという、ちゃんと平均足を使ったロジックになっています!

りょう

とりあえずiCustomを使うことができたぞ!

ムゥ

まずは第一歩にゃ

りょう

独自のインジケーターを使ってEAを作るのは更に難易度が高そうやから頑張るぞ~

TOC
閉じる