2016年7月23日土曜日

ALCHEMY 複数通貨ペア指定 難しいですね

ALCHEMYのブローカーフリーもしくはプロ対応版を作っています。

ALCHEMYは三通貨ペアを使用します。

元々OANDA BASIC専用でしたので通貨ペアは"USDJPY-a01"
そう通貨ペア名に-a01が付きます。

ところがプロコースは"USDJPY"まぁこれがスタンダードなのでしょうが・・・

そしてFXTFの1000通貨は”USDJPY-cd”こちらは-cd

①通貨ペアの文字数を数える
②通貨ペア6文字を抜いた7文字目から最後までの文字をとり
③使用する3通貨ペア名の後ろに引っ付ける

こんな流れですね。



①StringLen(Symbol())でチャートの通貨ペアの文字数を取得
②StringSubstr(Symbol(),6,StringLen(Symbol()-6)①の後半を切り抜き
③StringAdd("USDJPY",StringSubstr(Symbol(),6,StringLen(Symbol()-6))
通貨ペア名に②を引っ付ける。

うまくいくでしょうか

こうゆうのを考えると、前頭葉の頭蓋骨の裏のほうが痒くなってきます。


その後



string x;
void OnTick()
{
x="USDJPY"+StringSubstr(Symbol(),6,StringLen(Symbol())-6);
Comment(x);
}

これで表示されました!StringAddの戻り値はtrue/falseで前半の文字定数に後半が引っ付いたものが入るようです。
”USDJPY"は定数出ないので拒否されて悩みましたが + で十分ですねw









8 件のコメント:

  1. これは、シンボルを自動で取得してくれるって事ですか?
    初歩的な質問ですみません!><

    返信削除
  2. USDJPYのチャートにEAをセットしている時にはSymbol()でシンボルを取得できます。
    会社によってシンボルの後におまけがつく時があります。
    通常は問題ないのですが、USDJPYのチャートにセットしながらEURUSDを発注したいときには正確におまけもつけて記載する必要があります。そこでおまけを自動的につけるプログラムです。
    すべての会社がおまけ無しだといらないのですがね

    返信削除
  3. これは、とてもとても ありがたい機能ですね!^^
    某EAは手入力でしたので、コンマとかハイホンとか一文字でも間違うと
    動かなかったりしたものですから、、、><

    返信削除
    返信
    1. くまのみ様
      励みになるお言葉、ありがとうございます。

      削除
  4. 少し気になりましたのでコメントですが、既にご存知、ご承知、ご対応済みでしたらご容赦お願い致します。
    AMSERを使っているだけなので、ALCHEMYは違うかもしれません。

    TACA様のEAはトレールを使っていると思います(AMSERからです)。ALCHEMYで違うなら下記は的外れですので、ご容赦願います。

    1つのチャートで複数の通貨ペアをコントロールとの事ですが、EAを乗せたチャートではEAが動く(OnTick())のは、その通貨ペアのTickを受信した時と想定すると(自分の理解です。違うかも)、
    他通貨ペアでは状況により既に少し前にTickを受信している可能性もあります。
    そうすると、その通貨ぺアチャートにEAを乗せた方が、処理やトレールが少しでも早くできると思います。
    MT4では各チャートEAは別スレッド(制御処理的で申し訳ありません)で動くらしいので、独立&並列
    になると想定しています。CPUコアが複数なら並列化される筈。
    ようはシングルスレッドで処理するより、マルチスレッドで処理した方が高速にタイムリーに
    トレール処理出来るので、オーダーエラーになりにくい。
    と考えるのですが、如何でしょうか?

    チャートを増やす上での処理増に対しては、チャートを最小化しておけば画面描画のオーバーヘッド
    を少なくし、内部処理へのCPU割り当てを増やし高速化を維持できると思っています。
    私はAMSER使用時、チャート最小化、MT4自体も最小化して出来るだけ内部処理(EAロジックと通信)
    に遅延が出ないようにしています。VPSへも気になる時以外接続しない。
    # VPSだと接続しないだけで、事足りるかも知れませんが。

    TACA様のEAは、兎に角内部処理の高速化が必要ではと想定し、コメント致しました。
    別手法で高速化、軽量化を図られているようでいたら申し訳ありません。

    やや難しいコメントで失礼致しました。

    返信削除
  5. 情報ありがとうございます。
    最も処理能力が求められるのは連続発注を行うところでございます。
    ここは、一つの処理が終わってから次の処理に取り掛かるためその間に価格が変動すると発注が通らなくなるためです。

    Ontickですとティック動作単位で40~120回ほど一分間に動作いたします。
    しかしティックが数秒無いことも普通にございます。
    適応したチャートの通貨ペアが数秒ティックが無くても他の通貨ペアはティックがあることがございます。
    その対策といたしましてOnTimerで定期的に動作させることに致しました。

    わたしもVPSはチャートを最小化しています!
    負荷が減りますね。画面はさみしくなりますがw

    チャート単位でマルチスレッドになる等知らないことが沢山勉強になりました。
    ありがとうございました

    TACA





    返信削除
  6. ご返信ありがとうございます。

    連続発注が処理能力だと上記コメントは余りが該当しないかも。

    寧ろ、MT4自体を通貨ペア単位で複数動かした方が良いかも知れませんね。
    MT4はサーバとのTCPコネクションが一つのようで、1オーダー通信していると
    その終了まで次のオーダーは動かないと思います。
    # スレッド単位には通信していないだろうとの想定

    そうだとすると、一つのMT4で複数通貨ペアで、複数同時的にサーバへ通信が必要だと、
    後続の要求はサーバに届くのが遅れます。
    通貨ペア毎にMT4を立ち上げると、通貨ペア毎の各MT4がTCPコネクションを取るので
    通貨ペアでの競合での待ち合わせは無くなり、自通貨でのオーダー繰り返しで早く終わる
    と想像します。
    ただ複数通貨ペア同時にサーバへオーダーを送るような競合が殆どないレベルであれば、複数MT4
    の立ち上げはOSリソース(CPUとメモリ)の面から不利になるので、現状で問題ないのでしょうね。

    つらつらと長文失礼しました。

    返信削除
    返信
    1. 仰るっとおりでございます。
      1口座2EA同時発注しても1オーダーずつ処理されてしまいます。
      ALCHEMYでは2通貨ペア同時発注はございませんので、
      これでいいのかと思います。

      この様に記述位だたきますと頭の整理になります。
      ありがとうございます^^

      削除