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作为点乘数。以上是我的第一个想法,简单地看一下欧元兑美元有多少个数字。有些经纪商把这个符号称为EURUSDm或EURUSDiam或其他由经纪商添加的有趣的废话,除了破坏我们的代码外,还有一些符号名称不完全是6个字符,例如GOLD或GOLDm,上述方法不能处理这个问题。

有没有人有更复杂的算法来找到正确的数字?我认为这一切都归结为一个问题,即首先找到欧元兑美元的符号名称到底是什么,然后剩下的就很容易了。例如,有没有一种简单的方法来列举所有可用的符号,以便我可以搜索一个包含或以 "EURUSD "开头的名称?
 

通常情况下,我只在启动部分检查 一次。

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

通常情况下,我只在初始部分检查一次。

你的代码不是万无一失的,有些符号有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);
}
 

这是一个只适用于一种货币的代码。如果你想将你的EA用于多种货币,你必须为每种情况分别计算。

 
7bit:
我已经找到了一个更好的方法(仍然需要用更多的经纪商来测试)。它读取历史文件夹中的 symbols.raw,找到 eurusd 的名称,然后使用 MarketInfo()。

如果他们改变了 symbols.raw 文件,这个方法就会失效(而且可能无法在旧版本的 MT4 上运行...虽然这可能不是问题)。

 
我使用的方法和罗杰的一样,还没有给我带来任何问题。
这在大多数情况下都是可行的。如果你将来发现它不适合,那么当你发现它时,只要过了那座桥就行了。

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.

你只是在重复我已经发现的不足。单独使用数字变量对问题没有帮助(问题在第一篇帖子中被定义为我),因为它没有考虑到当前运行的是哪个符号以及这个符号应该有多少数字。在一些奇特的对子上可以有从0到5的任何数字,而不仅仅是5或3与4或2。如果这么简单,我就不会开这个话题了。因此,我现在只是使用eurusd的数字,不管它在什么货币对上运行。找到eurusd的实际名称是最大的问题,到目前为止,symbols.raw方法似乎是最简单和最可靠的方法。
 
cloudbreaker:
如果你将来找到一个不适合的,那么当你找到它的时候就过了这个桥。

我正试图写出万无一失的代码,使之不至于崩溃。编写(明知)有缺陷的代码,等到它坏了才去修复,这不符合我对软件开发的理念。
 
7bit wrote>>
我正试图写出万无一失的代码,不会出现故障。编写(明知)有缺陷的代码,并等到它坏了才去修复它,这不符合我对软件开发的理念。


我不会说上面的代码是'bug'--它只是有......限制,而用户是很清楚的。
哲学的美妙之处在于它能以实用性的方式异步运行:)
-BB-
 
这不就是一个简单(也许在数学上不那么简单)的问题,即计算出一个点相对于一个给定的价格是多少,然后决定它与价格的位数相比是哪一位?
一个简单的方法可以实现这一点,即拿一个价格加上一个点,然后与你的乘数+相同的价格进行比较,如果你的结果不一样,就循环增加你的乘数,直到它们匹配。
原因: