MT4でiCustomからインジケータの値を取得できないときは、オブジェクトかも

2016年9月30日

最近、久々にMT4のExpertAdvisorの受託を受け、カタカタとMetaEditorを叩いておりました。

どんなEAかというと、ある海外産のインジケータをもとに売買する、というEAです。インジケータから値さえ取得できれば非常に簡単なEAです。

通常、インジケータから値を取得するにはiCustom関数を使います。

double iCustom(string symbol, int timeframe, string name, …, int mode, int shift);

こんな本もあるくらいなので、非常に有名な関数だと思います。

iCustom(アイカスタム)で変幻自在のメタトレーダー (Modern Alchemists Series)

ウエストビレッジインベストメント株式会社
2,300円(12/03 22:13時点)
Amazonの情報を掲載しています

ですが、世の中にはiCustomではデータが取得できないインジケータもあります。例えばOANDAのオープンオーダーですが、これはiCustomからは取得できません。

さて、そんなOANDAのオープンオーダーからデータ値を取得するにはどうすればいいのでしょうか。

こういう場合、たいていチャート上にObjectが生成され、その中に文字列が入っていることが多いですので、オブジェクト内の文字列を読む方法を紹介します。

MT4でオブジェクトの値を読むには

まずはオブジェクトがあるのか確認してみましょう。

いろいろな方法がありますが一番簡単な方法で。インジケータがセットされたチャート上で右クリックし、「表示中のライン等」をクリックし、

表示された次のウインドウに何かあればオブジェクトがあります。

OANDAオープンオーダーインジケータは何も表示されませんね・・・、ではプログラムから見てみましょう。

超シンプルですが、このようなコードを書いて実行してみます。

for(int i=0;i<ObjectsTotal();i++){
string name = ObjectName(i);
Print(name);
}

ObjectsTotal()にはチャート上のオブジェクト総数(int)が入っていますので、この数までforをブン回し、

オブジェクトの名前をObjectName()で取得します。

するとたくさん出てきました、OANDAオープンオーダーインジケータの中身です。

中身のテキストを取得するために今度はこんなコードを書いてみました。

for(int i=0;i<ObjectsTotal();i++){
string name = ObjectName(i);
Print(getText(name));
}

string getText(string objectName){
if(ObjectType(objectName)==OBJ_TEXT || ObjectType(objectName)==OBJ_LABEL){
return ObjectDescription(objectName);
} else {
return “";
}
}

ObjectDescription()ではオブジェクトの中身の文字列を取得できます。ただし、オブジェクトには矢印とか水平線とか、文字列じゃないものも沢山ありますので、

if(ObjectType(objectName)==OBJ_TEXT || ObjectType(objectName)==OBJ_LABEL)

をくっつけて、テキストかラベルのものしか反応しないようにしています。

するとこんな感じで文字列が取得できます。

厚めの買い注文(100.75-100.80)

厚めの売り注文(101.75-101.80)

これでプログラムからOANDAオープンオーダーインジケータの値が取得できるようになりました。

あとはStringFindで「買い」とか「売り」の部分文字列検索して、その値でOrderSendしてやれば、EAができちゃいますね!(^o^)

MetaTrader4とEA

Posted by auto-ts.net