今日は、制作する際の注意点などを書いてみたいと思います。
昨日、「こんなケースがまずいんじゃないか」というケースを挙げてみましたが、これはそういったEAにありそうな処理から考えたものです。
それは、通貨ペア名を直接指定するようなコーディングをしなければ実現しにくい機能ということです。
例えば、チャート上の通貨ペア(例えば買値)を調べたければ、
・Ask
・MarketInfo(Symbol(),MODE_ASK)
などで調べることができます。
なお、保有しているポジションの情報もOrderSymbol()を用いればいいので、通貨ペア名が変わっても特に問題はありません。
問題はこういうコーディングが入っているケース。
例1)特定の通貨ペア以外は許容しないコーディング
If (Symbol() != "USDJPY"){
Print("許容しない通貨ペアです!");
return (0);
}
【解説】
Symbol()で呼び出した通貨ペアが"USDJPY"でなければ弾くような処理となっています。
つまり・・・このコードでは"USDJPY-a01"≠"USDJPY"のため、不正な通貨ペアとして扱われてしまうのです。。。
例2)チャート以外の通貨ペアの情報を取得するようなコーディング
チャート上の通貨ペア以外の情報を取得する場合は、ペア名を直接指定する方法しかないかと思います。
こういった場合、このような命令が現れるかと思います。
・USDJPY_AskInfo = MarketInfo("USDJPY",MODE_ASK);
【解説】
これがオアンダであれば、MarketInfoで読みだしても「"USDJPY"?・・・そんな通貨ペアないよ・・・?」と、こうなってしまうのです・・・。
#この場合、USDJPY_AskInfo = 0となってしまいます。
大きくは、この2パターンを用いるケースで問題が出るかと思います。
では、これをオアンダ対応にするためにはどうすればよいでしょうか?
オアンダだけに対応するのは簡単です。
"USDJPY"となっているところを"USDJPY-a01"に変更すれば終わりです。
しかし、業者依存しないようにしたいとなると、こんなことをしてしまうとオアンダ以外で使えない微妙なEAになってしまいます。ではどうすればよいか?
簡単なのは、オアンダ専用コードに分岐させることです。
IF (AccountCompany() == "OANDA DIVISION9"){
--- オアンダ用コード ---
}
こうすれば良いですが・・・これだと通貨ペア変更していないプロモードで使えない可能性がある(プロモードではないので未確認ですが)という問題が更に発生します・・・。
ということで、できるだけ業者種別に依存しないようにする方法を考えてみました。
こんな感じで対応すれば、少しは汎用性の高いコーディングになるかと思います。
例1)のケースの対策
通貨ペア名の”先頭6文字”で判別するようにしてしまいましょう。
こうすれば、後ろに何をつけてこられようが対応できますね。
<修正前>
If (Symbol() != "USDJPY"){
Print("許容しない通貨ペアです!");
return (0);
}
<修正後>
If (StringSubstr(Symbol(), 0, 6) != "USDJPY"){
Print("許容しない通貨ペアです!");
return (0);
}
例2)のケースの対策
このケースでは、"USDJPY-a01"を指定してやるようなコーディングをしなければいけないので、残念ながら例1のような汎用性は実現できないかと思います。
そこで、こんな関数コードを組んでみました。
double MarketInfoAdvance(string OriginalSymbol, int Mode)
{
double ret;
int errclear;
string OandaSymbol;
OandaSymbol = StringConcatenate(OriginalSymbol, "-a01");
//LastErrorを一旦呼び出してゼロクリア
errclear = GetLastError();
ret = MarketInfo(OriginalSymbol, Mode);
if (GetLastError() == 0) return (ret);
ret = MarketInfo(OandaSymbol, Mode);
if (GetLastError() == 0) return (ret);
else return (0);
}
プログラムに上記コードを貼っつけて、以下のとおりコードを変更すればオアンダ対応が可能です。
USDJPY_AskInfo = MarketInfo("USDJPY",MODE_ASK);
→ USDJPY_AskInfo = MarketInfoAdvance("USDJPY",MODE_ASK);
オアンダ以外で似たようなことをやってる業者があったら、"xxxSymbol"変数をつくって同じような分岐処理を入れていけば対応可能かと思います。
ただ、あまりうまいやり方ではないかな〜と思っています。
MarketInfoと比較すると、MarketInfoAdvanceだとエラーコードの呼び出しができないというのがありますし、オアンダの場合は必ず1回エラーを挟ませる処理になるので、コード上の問題はないですがあまり推奨できないかな〜という感じです。
他に良いやり方があれば教えていただけると嬉しいです。
以上です。ご参考にしてみてください。