5桁検出

 
double pointsPerPip(){
   string suffix = StringSubstr(Symbol(), 6);
   int digits = MarketInfo("EURUSD" + suffix, MODE_DIGITS);
   if (digits == 0){
      digits = MarketInfo("EURUSD", MODE_DIGITS);
   }
   if (digits == 0){
      return(1);
   }else{
      if (digits == 5){
         return(10);
      }
   }
   return(1);
}
私は現在、ピップマルチプライヤーとして1または10が必要かどうかを検出するための最も確実な方法を見つけようとしています。上記は私の最初のアイデアで、単純にEURUSDの桁数を調べました。このシンボルがEURUSDmやEURUSDiamと呼ばれるブローカーや、我々のコードを破る以外の理由でブローカーが追加したおかしなナンセンスもありますし、例えばGOLDやGOLDmなど、正確に6文字ではないシンボル名もあり、上記では対処しきれません。

どなたか、正しい数字を見つけるためのさらに高度なアルゴリズムをお持ちの方はいらっしゃいますか?結局のところ、EURUSDのシンボル名がどのようなものかを最初に見つければ、あとは簡単だということだと思います。例えば、利用可能なすべてのシンボルを列挙して、"EURUSD "を含む、あるいは始まる名前を検索できるような簡単な方法はないでしょうか?
 

普段はイニシャルセクションで1回だけチェック します。

int mypoint;
int init()
{
if(MarketInfo(Symbol(), MODE_DIGITS)==3||MarketInfo(Symbol(), MODE_DIGITS)==5)
mypoint=10;
else mypoint=1;
}
...
 
Roger:

普段はイニシャルセクションで1回だけチェックします。

あなたのコードは、1または2(金)または他の桁数のシンボルが存在するため、確実ではありません。

私はより良い方法を見つけました(まだいくつかのブローカーでテストする必要があります)。履歴フォルダのsymbols.rawを読み込んでeurusdの名前を見つけ、MarketInfo()を使用するのです。

/**
* determine the pip multiplier (1 or 10) depending on how many
* digits the EURUSD symbol has. This is done by first
* finding the exact name of this symbol in the symbols.raw
* file (it could be EURUSDm or EURUSDiam or any other stupid name
* the broker comes up with only to break other people's code) 
* and then usig MarketInfo() for determining the digits.
*/
double pointsPerPip(){
   int i;
   int digits;
   double ppp = 1;
   string symbol;
   int f = FileOpenHistory("symbols.raw", FILE_BIN | FILE_READ);
   int count = FileSize(f) / 1936;
   for (i=0; i<count; i++){ 
      symbol = FileReadString(f, 12);
      if (StringFind(symbol, "EURUSD") != -1){
         digits = MarketInfo(symbol, MODE_DIGITS);
         if (digits == 4){
            ppp = 1;
         }else{
            ppp = 10;
         }
         break;
      }
      FileSeek(f, 1924, SEEK_CUR);
   }
   FileClose(f);
   return (ppp);
}
 

1通貨のみのコードでした。多通貨でEAを使用する場合は、それぞれのケースで個別に計算する必要があります。

 
7bit:
より良い方法を見つけました(まだ、いくつかのブローカーでテストする必要があります)。履歴フォルダのsymbols.rawを読み込んでeurusdの名前を見つけ、MarketInfo()を使用するのです。

これだと、もしsymbols.rawファイルを変更したら壊れてしまいます(古いバージョンのMT4では動かないかもしれません...おそらく問題ないでしょうけど)。

 
私はRogerと同じ方法を使っていますが、まだ問題は起こっていません。
ほとんどの場合、これでうまくいくと思います。もし、将来的に合わないものを見つけたら、その時はその橋を渡ればいいだけです。

CB
 
//++++ These are adjusted for 5 digit brokers.
double  pips2points,    // slippage  3 pips    3=points    30=points
        pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int init() {
    if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
 
WHRoeder:
if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.

あなたは、私がすでに不十分であると判断したのと同じことを繰り返しているだけです。Digits変数を使うだけでは、現在どのシンボルが実行されているか、そのシンボルが何桁であるべきかを考慮しないので、問題(最初の投稿で私が定義した問題)を解決できません。エキゾチックなペアには0から5までの任意の桁数があり、5や3、4や2だけではありません。そんなに簡単なことなら、私はこのスレッドを開かなかったでしょう。ですから、私は今、どのペアであろうと、eurusdの数字を使うだけです。eurusdの実際の名前を見つけることが最大の問題で、今のところsymbols.rawの方法が最もシンプルで信頼できるもののようです。
 
cloudbreaker:
将来的に合わないものが出てきたら、その時にその橋を渡ればいいだけです。

私は、壊れないようなフールプルーフのコードを書こうとしているんです。バグがあることを知りながら)バグだらけのコードを書いて、それが壊れるまで待ってから修正するというのは、私のソフトウェア開発のあるべき姿の哲学にそぐわないのです。
 
7bit wrote>>
私は、壊れないようなフールプルーフのコードを書こうとしているのです。バグがあることを承知の上で)コードを書き、それが壊れるまで待ってから修正するというのは、私のソフトウェア開発のあるべき姿の哲学にそぐわないのです。


私は上記のコードを「バグがある」とは言いません - 単に制限があるだけです。
哲学のすばらしさは、それが実用性をもって非同期に実行できることです :)
-BB-
 
単純に(数学的にはそうでもないかもしれませんが)、ある価格に対するあるポイントの相対値を計算し、それが価格の桁と比較してどの桁にあるかを決めるだけではありませんか?
これを実現する簡単な方法は、ある価格に1点を加え、それを自分の乗数+同じ価格と比較し、結果が同じでなければ、それらが一致するまでループで自分の乗数を増加させることです。
理由: