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);
  }

那么就用SymPoint变量来代替Point变量吧。与Cameo非常相似

 

为了使事情更加混乱,BrocoTrader的各种证券都有0到5位数字的证券...

 
kennyhubbard:

嗨,7bit,

,我认为你试图创建防弹代码是正确的,.......,但总是会有限制。

你只需看看The Collective FX的演示饲料,他们正在测试不同流动性供应商的独立组合饲料(而不是来自多个来源的单一协议饲料),每个都有自己的货币对后缀(我们终于找到后缀的用途了吗?),以实现问题的范围。这意味着,在一个平台上,你可以选择EURUSD_fx或EURUSDm或EURUSD_dbfx,只要你愿意。这本身就会给你的策略带来巨大的漏洞,因为其中一些是4位数的定价,而其他是5位数。

if (Digits == 3 || Digits == 5) "是你能找到的最全面的方法,因为它是在一个简单的前提下工作的,即你只有2种经纪商,即有整点的经纪商和有十分之一点的经纪商。这种情况涵盖了2/3/4/5种货币对和经纪商。

对于我自己的信息,你有没有见过任何例外的情况?就黄金而言,它一直是2位数的报价,而新的1/10点券商的报价是3位数,所以即使这种情况也被很好地覆盖了。

我建议简单地把你发现的任何例外情况当作例外情况来处理,也许对这个特定的问题进行硬编码,而不是试图找到一个万能的解决方案。


我注意到,当这种对话出现时,人们谈论的是后缀,而不是前缀。有可能也有一个前缀。我曾遇到过一个有前缀的经纪人。

我对这个问题的想法与原来的发帖人一致,我希望产品 对我的客户来说尽可能的稳固,我不在乎冒更多的编码风险来解决以后。我的整个代码可能被包裹在这一变化中,并且可能花费我几个开发人员的时间去修改成千上万行的代码。所以,第一次就把它改好,可以减少回头再修改的风险和费用。我也同意这是一个错误,但不是我们代码中的错误,而是MQL中的一个弱点。

然而,我也一直在思考一个解决方案。我的解决方案之一是通过符号列表,使用子串找到欧元兑美元来获得它。然后得到它的出价值。一旦我有了出价值,我就可以做一个doubletostr,然后想出一个办法来计算字符串中的字符,比如strlen或类似的东西。这很麻烦,但它可能会给我一个4或5位数的判断,这将是相当可靠的。由此,我可以为像Gold这样的怪异现象建立基础。

这只是一个理论,我还没有尝试过。我太忙了,只想把目前的项目处理好。

 

在我的EA中,我使用这个代码来计算Pip - 这个Pip在我处理外部bool输入的任何地方都使用,比如SL,TP,TS或者我想看到利润的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; 

在我的其他指数中,我也尝试寻找日元符号... :-)

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

在我的EA中,我使用这个代码来计算Pip - 这个Pip在我处理外部bool输入的任何地方都使用,比如SL,TP,TS或者我想看到利润的Pip ...在3个不同的经纪公司测试 - 在不同的货币对,DAX 1/2小数上没有问题...我知道它看起来和之前的帖子相似,但它的功能 是真实的...


在我的其他指数中,我也尝试寻找日元符号... :-)

我想找到每种货币的 "点",而不是寻找日元。这就是我所尝试的。

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

因此,预期会给出存储在Pair01中的货币对的相应数值。 然而,这只返回0。为什么呢?在我的例子中,Pair01是 "AUDCAD",该指标连接到一个欧元兑美元的图表。

通过进一步的实验,我现在看到它对一些货币有效,但对其他货币无效。这是相当令人困惑的。MODE_DIGITS似乎效果更好。这怎么可能呢?

pi

 
seic:

在我的EA中,我使用这个代码来计算Pip - 这个Pip我在任何地方都使用,我处理外部bool输入的点,如SL,TP,TS或我想看到利润的点...在3个不同的经纪公司测试 - 在不同的货币对,DAX 1/2小数上没有问题...我知道它看起来类似于之前的帖子,但其功能 实际...

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位数字。


因此,我认为你需要有一个数组,为每一种报价货币进行设置,以获得点数而不是点。