【EA制作記】iCustom()関数の使い方!バッファと入力パラメーターについて

【EA制作記】iCustom()関数の使い方!バッファと入力パラメーターについて EA
【EA制作記】iCustom()関数の使い方!バッファと入力パラメーターについて

まだ【EA制作記】の前置きを読んでない方は、

必ず、下記リンクの記事を読んでから

再度、この記事に戻ってきてください。

 

【EA制作記】前置き ※必ず最初に読んでください※

 

今回は、カスタムインジケーターを使用した

EAの制作代行を引き受けた時の話です。

 

もちろん使うのは、あの関数

カスタムインジケーターを使用する時点で

あれ使ったのね?と察した人も多いと思うけど

皆大好き、iCustom()関数を使用しました。

 

※悪用厳禁※

このiCustom()関数、本当に便利です。

変な話、ちょっと悪用出来るレベルで

めちゃくちゃ利便性が高いんですが…

 

初心者の方は、使わない方が良いです。

というか、なるべく使わないでください。

 

理由は、単純に危ないからです。

 

せめて、カスタムインジケーターを

自分で制作出来るレベルになってから

初めて使用を検討するくらいの代物です。

 

いきなり、問題発生!?

今回の依頼があったEA制作の内容は、

市販のカスタムインジケーターが表示する

数値を基に売買をする物だったんですが、

実は、いきなり問題にぶち当たりました。

 

普通にiCustom()関数を使用して、

カスタムインジケーターの名前を入れて

とりあえず、Print()関数で動作確認。

(別にCommentでも良かったんだけど、

個人的には、Printの方が好きなので)

 

「なんの値が反って来てるのかな~?」

 

と、いつもの様に出力されたログを見たら

ん…?ファイルがロードできない…?

え?どうゆうこと?何が起こってんの?

 

何か操作を間違えてるわけでもないし、

もしかして、カスタムインジケーターが

ファイルが何かの原因で壊れたのかも?

って思って、他のインジケーターも確認。

 

そしたら、まさかの全滅でした(苦笑)

 

パソコンが壊れてた

カスタムインジケーター単体では

動作は問題ない感じなのになんで?

 

ってなって、とりあえずMT4再起動。

残念ながらそれでも解決しなくて、

パソコン自体を一旦再起動しました。

 

そしたら、普通に直ったんだけど…

本当になんだったのか今でも不明です。

 

もし原因不明な不具合が発生したら

パソコンの再起動を試してみましょう。

 

なんで分けたんだろう

さて、iCustom()関数の話に戻ります。

無事に反って来る数値は判明したけど、

ここで新たな問題に直面します(苦笑)

 

実は、今回、EA制作で使用する

カスタムインジケーター自体が

2種類あったんだけど、これが厄介で…

 

1つ目のカスタムインジケーターは、

チャート上に矢印を描写するタイプで

バッファに数値を格納してたんだけど…

 

2つ目のカスタムインジケーターは、

1つ目のカスタムインジケーターから

数値を取得した物をオブジェクトとして

チャート上に文字列を描写してたという。

 

正直、なんで分けたのか分からないです。

最初に販売したインジケーターを基に

新しいインジケーターを作ったとしても

1つにまとめる事も出来たはずです。

(その方が使い勝手は良いはず…)

 

と、制作者に文句を言う立場でもないし

その辺は色々と事情があったと思いますが、

依頼主としては、2つ目の表示してる

文字列(と数値)を基に売買して欲しいと。

 

例えば、オブジェクトとして矢印とかを

チャート上に表示している場合なら

ObjectFind()関数でオブジェクトを探して、

表示されてたら・表示されてなかったら

売買する方法もあるみたいですが…

 

ただ、今回のカスタムインジケーターは、

常に文字列がチャート上に表示されてて

表示のオンオフでは判定出来なかったです。

 

オブジェクトの文字列を取得してから

数値を得る事は出来たとは思うけど…

 

→試した方いたら教えてください!

 

結果的に、この方法は試さないまま

1つ目のカスタムインジケーターを

上手い事活用して解決出来ました。

 

同じ計算式じゃなかった

1つ目のカスタムインジケーターは、

(以後、①インジと呼称します。)

単純移動平均線を主体にした物で、

角度の計算に応じてチャート上の

移動平均線に矢印を表示する物でした。

 

2つ目のカスタムインジケーターは、

(以後、②インジと呼称します。)

①インジの角度の計算を基にして

文字列(言葉と数字)をチャート上に

オブジェクトで表示する物でした。

 

念の為、iCustom()関数を使用して

①インジの角度の数値をチャート上に

オブジェクトとして表示させた所、

②インジのそれと微妙に違ったんです…

 

バッファの可能性は無限大

結論から言うと、移動平均線の計算方式が

 

①インジでは、Simpleになっていて

②インジでは、Exponentialでした。

 

これに気が付いたのは、依頼主様からの

アドバイスというか、助言があったのと

実際に、iCustom()関数を使用して

バッファを1つずつ確認したからです。

 

念入りに調べよう

iCustom()関数の仕組みが分かっていれば、

比較的簡単に調べる事が可能です。

 

double iCustom
  (
  string symbol,   // 通貨ペア
  int timeperiod,  // 時間足
  string ing_name, // カスタムインジケータの名前
  0,               // カスタムインジケータの入力パラメータ(複数化)
  int line_index,  // ラインインデックス
  int shift        // shift (0が現在、1が1つ前...)
  );

 

ラインインデックスを調べよう

ちなみに、矢印の情報(角度)は、

ラインインデックスの6にありました。

 

最初、0~4で探してたから見つからず…

オカシクナイデスカコレ?ってなったけど、

やっぱり、手を抜いたらダメですね。

 

反省の意味も込めて記載しておきます↓

 

ラインインデックスは、0~7で指定可能

MQL4の場合、最大で8個となります。

SetIndexBuffer()関数で指定されている

インデックスと一致する必要があります。

 

とりあえず、Print()関数を使って確認。

 

for (int i = 0; i < 8; i++)
  {
  double CheckLineIndex =
  iCustom
  (
  NULL,            // 通貨ペア → 今回は指定しません。
  PERIOD_CURRENT,  // 時間足 → 表示しているチャートの時間足
  "名前を入力",     // インジケータの名前 → ""で囲んで名前を入力
  i,               // ラインインデックス → これを「0~7」まで調べる
  1                // shift → 今回は「1」を指定。
  );

  Print(i," = ",CheckLineIndex);
  }

※今回は、入力パラメーターを省略してます。

 

これで、8個全てのバッファの中に

何が格納されているか確認出来ます。

今回は、0と3と6に格納されてました。

 

もし、サインが出た時のみ矢印を

描写するタイプのインジケーターなら

Comment()関数を使った方が楽です。

※今回は、割愛します。

 

入力パラメーターを調べよう

今回は、計算方式を変えたかったので…

①インジの入力パラメーターの中身を

省略せずに入力していく事によって、

移動平均線の計算方式を変更します。

 

って事で、やっとこの記事の本題です。

 

要するに、入力パラメーターの数値を

1つずつ確認すれば良いって話です。

 

例えば、今回の場合で考えるのであれば

移動平均線を使っている事は分かってて、

SimpleではなくExponentialで計算したい。

 

更に、①インジの設定を開いた際に、

パラメーターの入力箇所を見てみると

・MAの計算期間(本数)
・MAの計算方法(平均化)
・MAの計算方法(価格)

上記3つは、手動入力可能になっている。

 

って事で、iMA()関数を見てみると…

 

double iMA
  (
  string symbol,     // 通貨ペア
  int timeperiod,    // 時間足
  int ma_period,     // MAの計算期間(本数)¥)
  int ma_shift,      // MAの表示をズラす(オフセット)
  int ma_method,     // MAの計算方法(平均化)
  int applied_price, // MAの計算方法(価格) → 終値など
  int shift          // shift →(0が現在、1が1つ前...)
  );

 

上記の順番になっているのが分かります。

ここでiCustom()関数と比べてみると…

 

double iCustom
  (
  string symbol,   // 通貨ペア
  int timeperiod,  // 時間足
  string ing_name, // カスタムインジケーターの名前
  0,               // カスタムインジケーターの入力パラメーター
  int line_index,  // ラインインデックス
  int shift        // shift (0が現在、1が1つ前...)
  );

 

最初の通貨ペア、時間足は同じなので

インジケーターの名前の後の部分に

・MAの計算期間(本数)
・MAの計算方法(平均化)
・MAの計算方法(価格)

上記の3つが入っているはずです。

(本来は、シフトもあるんですが…)

 

というか、実際3つ入ってました♪

 

double iCustom
  (
  string symbol,     // 通貨ペア
  int timeperiod,    // 時間足
  string ing_name,   // カスタムインジケーターの名前
//--------------入力パラメータ部分-----------------------
  int ma_period,     // MAの計算期間(本数) 
  int ma_method,     // MAの計算方法(平均化)
  int applied_price, // MAの計算方法(価格) → 終値など
//------------------------------------------------------
  int line_index,    // ラインインデックス
  int shift          // shift(0が現在、1が1つ前...)
  );

 

って事で、MAの計算方法(平均化)が

初期値は、Simple(0)になってたので、

Exponential(1)に変更して完了です。

 

double iCustom
  (
  NULL,              // 通貨ペア → 今回は指定なし
  PERIOD_CURRENT,    // 時間足 → 表示しているチャートの時間足
  "名前を入力",      // インジケーターの名前 → ""で囲んで名前を入力
  20,                // MAの計算期間(本数) → 今回は20本
  1,                 // MAの計算方法(平均化)→ 0=Simple 1=Exponential...
  PRICE_CLOSE,       // MAの計算方法(価格) → 今回は終値
  6,                 // ラインインデックス → 今回は「6」
  1                  // shift → 今回は「1」
  );

 

まとめ

今回は、iCustom()関数を使用した

各バッファに格納されている数値と

入力パラメーターの確認方法を記載しました。

 

最初に冒頭でも説明した通り、

iCustom()関数はめちゃくちゃ便利です。

 

ただ、危険が多いのも事実です。

 

他人が作ったカスタムインジケーターを

全く中身が分からない状態であっても

とりあえず、使えてしまうわけなので…

予期せぬ動きをする可能性があります。

 

とにかく、むやみやたらに使用するのは

推奨出来ない関数なのは間違いないので、

どうしても使用したい場合であっても

あくまでも個人での使用に留めて下さい。

※全て自己責任でお願い致します。

コメント

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