2015年04月24日

MT4で3桁区切り表示にする方法

昨日、FX-ON様にて新しいMT4用の運用管理ツールをリリースさせていただきました。

詳しくは是非この記事(クリックで記事に飛べます)をご参照いただければと思いますが、このツールを作成する際にいちばん困ったのが、意外にも3桁区切り表示をできるようにすることでした。

DisplayShow.png

↑みにくいですが、証拠金とか確定利益の表示とかですね。

こういう表示の仕方って、アルゴリズムを使って変換しようとすると結構頭の体操になったりします。
たぶん実現方法は無数にあるかと思いますが、私はこんな感じで関数を切り出して作ってみました。

-----
string addcomma(double inputdata, int dig)
{
string returnstr = DoubleToStr(inputdata,dig);
int length;
int noofcomma;
int firstcomma;

length = StringLen(DoubleToStr(MathFloor(inputdata),0));
if (inputdata >= 0) noofcomma = (int)MathFloor((length - 1) / 3);
else noofcomma = (int)MathFloor((length - 2) / 3);
if (noofcomma == 0) return (returnstr);

firstcomma = length - noofcomma * 3;
if (firstcomma == 0) firstcomma = 3;

for (int i = 0; i < noofcomma; i++){
returnstr = StringConcatenate(StringSubstr(returnstr, 0, firstcomma + i * 4),",",StringSubstr(returnstr, firstcomma + i * 4));
}

return (returnstr);
}

-----

使い方はDoubleToStrと同じで、

string display = addcomma(表示させたい数値(double指定), 小数点以下桁数(整数指定))


というような感じで使えるかと思います(ほとんど使う機会は無いと思いますがwww)。
割とシンプル化してみたつもりですが・・・どうでしょうかね。

もし実現方法に困っていたら、是非使ってみてください。(バグが潜んでいるかもしれません・・・)
タグ:FX MT4
posted by しがないあらさー at 03:49 | Comment(0) | TrackBack(0) | MT4 | このブログの読者になる | 更新情報をチェックする
2015年03月05日

オアンダジャパンでの通貨ペア名変更に関する注意点(EA制作編)

オアンダジャパンの通貨ペア名変更について、昨日は運用のための注意点を書いてみました。
今日は、制作する際の注意点などを書いてみたいと思います。

昨日、「こんなケースがまずいんじゃないか」というケースを挙げてみましたが、これはそういった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回エラーを挟ませる処理になるので、コード上の問題はないですがあまり推奨できないかな〜という感じです。
他に良いやり方があれば教えていただけると嬉しいです。

以上です。ご参考にしてみてください。
タグ:OANDA EA MT4
posted by しがないあらさー at 01:05 | Comment(0) | TrackBack(0) | MT4 | このブログの読者になる | 更新情報をチェックする
2015年03月04日

【注意】オアンダジャパンMT4の両建て時挙動に微妙な仕様変更が加わっているようです。。。

オアンダジャパンで通貨ペア表示が変わってからEAをテスト運用しているんですが、あわせて微妙な仕様変更がされているようです。。。

両建て不可なのは今までどおりなのですが、両建てしようとした時の挙動が変わっているようなのです。

今までは、両建てしようとした際には後発ポジションの注文が成立しない(=すでに持っているポジションはそのまま)という形でした。
それが、今週からはどうやら、反対方向のポジションが相殺されるような仕様に変更されている模様です。

こういう情報は重要なので、事前に教えておいてもらいたいものですが・・・。

ということで、買い・売りの両ポジションを保有するような設定をしている方は、先週までと違った挙動になると思いますのでお気をつけ下さい。
#必然的に部分約定・部分決済も増えるので、複数設定していると挙動がおかしくなるEAが出てくるかもしれません。注意!(私の出品しているEAは大丈夫ですw)
タグ:OANDA MT4
posted by しがないあらさー at 00:26 | Comment(0) | TrackBack(0) | MT4 | このブログの読者になる | 更新情報をチェックする
ゼニカル
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。