こんにちは~。
MQLをマスターしたくて、お腹が空き過ぎるとご飯を作らずにすぐに食べられるお菓子ばっかり食べちゃうりょうです。
今回は、EAの作成にiCustomを利用してみる試みです。
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を作るのは更に難易度が高そうやから頑張るぞ~