5桁検出 - ページ 6

 
cameofx 2010.07.29 10:52

I use below functions now, and it's usable across different brokers & instruments.

double vPoint; 
if(Digits == 2 || Digits == 4) vPoint = Point; else
if(Digits == 3 || Digits == 5) vPoint = Point*10; // I use this for my indies; call once on init() & use where Point supposed to be used in start() 

double Poin() 
{ 
   int d = Digits;
   switch(d){
   case 2 : {return(Point); break;}
   case 4 : {return(Point); break; }
   case 3 : {return(Point*10); break;}
   case 5 : {return(Point*10); break:}
   default : return;
} // I just come up with this. Untested but should be ok/robust. To be used to replace Point for trade parameters calculations. 

cheers, ~ cameo

ここで、私が使っている別の解決策を紹介すると...。

int init()
  {
   double SymPoint;
   if (Point == 0.00001) SymPoint = 0.0001; //5 digits
   else if (Point == 0.001) SymPoint = 0.01; //3 digits
   else SymPoint = Point; //Normal
   
   return(0);
  }

そして、Point変数の代わりにSymPoint変数を使用するだけです。Cameoと非常によく似ています。

 

ただ、もう少し混乱させたいのは、BrocoTraderでは、各種証券に0〜5桁の数字が入っているのですが・・・。

 
kennyhubbard:

7bitさん、こんにちは。

防弾コードを作ろうとするのは正しいと思いますが、常に限界があります。

The Collective FXのデモフィードを見れば、問題の大きさがわかると思います。ここでは、異なる流動性プロバイダーの独立したフィード(複数のソースからの単一の合意フィードとは対照的)を、それぞれ独自の通貨ペアサフィックス(ついにサフィックスの用途が見つかったか)で組み合わせてテストしています。つまり、1つのプラットフォームの中で、EURUSD_fxやEURUSDm、EURUSD_dbfxを好きなように選択することができるようになるのです。これだけでも、4桁の価格設定と5桁の価格設定のものがあり、戦略に大きな穴が開くことになる。

if (Digits == 3 || Digits == 5)」は、2種類のブローカー、つまり全ピップスフィードと10分の1ピップスフィードしかないという単純な前提で動くので、ほぼ全方位に対応することができます。このケースは、2/3/4/5の通貨ペアとブローカーをカバーしています。

参考までに、例外となるようなケースを見たことがありますか?金の場合、ずっと2桁の気配値で、新しい1/10pipブローカーは3桁で気配値を出しているので、このケースでも十分カバーできます。

私は、見つけた例外は例外として扱い、その特定の問題をハードコードすることで、すべてを解決しようとするのではなく、単純に解決することをお勧めします。


この話題になったときに気づいたのは、人々はサフィックスについて話すことはあっても、プレフィックスについては決して話さないということです。接頭辞をつけることは可能です。私は、プレフィックスを持つブローカーに出会ったことがあります。

私は、クライアントのためにできるだけ堅牢な製品を 作りたいので、後で修正するためにコーディングを増やすようなリスクは冒したくありません。私のコード全体がその1つの変更に巻き込まれる可能性があり、それを修正するために何千行ものコードを調べるには、開発者の時間がかかるかもしれません。ですから、最初に正しく修正することで、後戻りして修正するリスクとコストを減らすことができるのです。これはバグですが、私たちのコードのバグというより、MQLの弱点であることに私も同意します。

しかし、私は解決策を考えてもいました。私の解決策の1つは、シンボルリストを調べて、サブストリングを使用してEURUSDを見つけ、それを取得することでした。そして、そのビッド値を取得します。入札値がわかったら、doubletostrを実行し、strlenのような文字列の文字数をカウントする方法を考え出すことができました。面倒ですが、4桁か5桁の数字がわかれば、かなり確実です。そこから、Goldのような奇妙な現象の根拠を確立することができるのです。

これはあくまでも仮説で、まだ試したことはありません。今のプロジェクトを片付けるだけで精一杯なんです。

 

私のEAでは、Pipの計算にこのコードを使っています。このPipは、SL、TP、TSのようなPipで入力される外部ブールを扱うとき、あるいはPipで利益を見たいときにどこでも使います。3つの異なるブローカーでテストしましたが、異なるペア、DAX 1/2 小数点数で問題ありません。


Pip = Point;
if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;
else if( Digits==1 || Digits==3 || Digits==5) Pip = 10*Point; 

他の指標では、JPYのシンボルも探しているのですが・・・ :-)

Tmp_int = StringFind(Symbol(), "JPY", 0);
if(Tmp_int<0) Pip = 10000;
else Pip = 100;
 
seic:

私のEAでは、Pipの計算にこのコードを使っています。このPipは、SL、TP、TSのようなPipで入力される外部ブールを扱うとき、あるいはPipで利益を見たいときにどこでも使います。3つの異なるブローカーでテストしましたが、異なるペア、DAX 1/2 小数点数で問題ありません。


私の他の指標では、JPYシンボルも探すようにしています... :-)

日本円を探す代わりに、各通貨の "Point "を探したいと思います。これは私が試したことです。

  ObjectSetText("pi_Pair01",MarketInfo(Pair01,MODE_POINT));

ということは、Pair01に格納されているペアのそれぞれの値が得られると期待されます。 しかし、これは0しか返しません。なぜでしょうか?私の例の Pari01 は "AUDCAD" で、インジケータは EURUSD チャートに添付されています。

さらに実験してみると、ある通貨ではうまくいくが、他の通貨ではうまくいかないことがわかりました。これはかなり困惑しています。MODE_DIGITSの方がうまくいくようです。どうしてそうなるのでしょうか?

pi

 
seic:

私のEAでは、ピップの計算にこのコードを使用しています。このピップは、SL、TP、TSのようにピップで入力された外部ブールを扱う場合や、ピップで利益を確認したい場合に使用します。

if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;

あなたが5桁のブローカーであるためだけです。4桁のブローカーでは、PIPとPointは同じ です。
TICKとは何 ですか?-MQL4とMetaTrader 4 - MQL4プログラミングフォーラム

 

また、InstaForexではUSDSEKとUSDNOKは4桁、EURUSDは5桁となっています。


なので、ティックではなくピップ数を取得するためには、各クオート通貨ごとに設定した配列を用意する必要があると思います。