零分法(发现问题--但为什么?) - 页 3

 
double loss_for_1_lot = pips_to_bsl/ ts * tv ;

它不是tv,结果是div 0。它只能是ts。在一个5位数的经纪商,ts可能会打印为0(4位数)。

在我看来,在从其他地方下载历史记录 之前,你从来没有打开那个交易对,从你的经纪人那里获得市场信息。

 

我很难相信零除数 是由发布的代码产生的。

DomGilberto编译了这个脚本,并将其附在你认为返回零刻度的图表上。

int start()
  {
//----
   int i = Bars-1;
   int cnt;
   int tscnt = 0;
   int tvcnt = 0;
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   while(i >=0)
   {if(ts < 0.00001) tscnt++;
    if(tv < 0.00001) tvcnt++;
    i--;
   }
   Alert("TickSize returned an erroneous value ",tscnt," times.");
   Alert("TickValue returned an erroneous value ",tvcnt," times.");
//----
   return(0);
  }
 
DomGilberto:

我希望我做的这个视频(40秒左右)能说明我在说什么(因为我不确定我是否说清楚了)。

视频:http://screencast.com/t/uMHY5DpM

你会看到,第一部分,当我把脚本放到实时图表(真实账户)上时,在那个 "名义账户 "上,刻度值和刻度大小返回 "0",我在手数窗口(单位)中说明了这一点。

第二部分是在同一个经纪商那里,但在一个基于手数的饲料上,这一次它返回了一个刻度值和刻度大小。我再次说明,你使用lot.... 进行交易。

因此,关于策略测试器,我不知道为什么它一直在工作,有时却不工作。在我进行回溯测试时,账户也一直连接着(在一个模拟名义上的喂养账户(单位)上)。

我的下一个问题是,如果这是我从名义联储账户得到的典型反应,你能建议我在这种情况下如何纠正我的头寸大小的计算吗? 它对基于手数的喂养来说是完美的......希望这能更好地解释它?

如果你在你的 "测试 "代码中使用不同的代码,那么它能证明什么?

您是否意识到TICKVALUE从现在开始返回当前值 ... ...即使在策略测试运行期间也是如此? 所以对于任何基础货币不是入金货币的货币对,它将是不正确的,您的手数计算将是错误的 ... ...

 

在你的视频中,你在第一个例子中使用了GBPUSD,然后在第二个例子中使用了GBPJPY。

我认为,如果你将你的脚本连接到GBPUSD正常手数的图表上,你会得到一个tickvalue的值,但是ticksize也会是0。

这是因为你的脚本警报使用的是双数,所以0.00001会打印成0。

使用DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8)代替。

 

好的,首先感谢大家的帮助。

这里是 "Gumrai "和 "SDC "的视频,确认了你们两个人要求我做的事情。我已经用你的MQL4别名标记了脚本,这显然与你在这里发布的代码相对应。视频:http://screencast.com/t/kglCd2hCae

在暂停期间,经纪人和相应的饲料没有改变。这也是一个名义上的饲料账户(单位)。

@RaptorUK:是的,我知道TICKVALUE从现在开始返回的是当前值。 我想你的第二部分现在看是有点逻辑的。我对我如何利用tickvalue作为我的名义进货账户的一部分来确保头寸大小正确感到困惑...?

 
DomGilberto:

好的,首先感谢大家的帮助。

这里是 "Gumrai "和 "SDC "的视频,确认了你们两个人要求我做的事情。我已经用你的MQL4别名标记了脚本,这显然与你在这里发布的代码相对应。视频:http://screencast.com/t/kglCd2hCae

在暂停期间,经纪人和相应的饲料没有改变。这也是一个名义上的饲料账户(单位)。

@RaptorUK:是的,我知道TICKVALUE从现在开始返回的是当前值。 我想你的第二部分现在看是有点逻辑的。我对我如何利用tickvalue作为我的名义进货账户的一部分来确保头寸大小的正确性感到困惑......?


那些视频很麻烦,对我的屏幕来说太大了。

为什么不直接发布脚本代码和警报结果。

我不知道你在脚本中放了什么,那应该是我建议的代码,但不可能导致 "08"。

使用

Alert("TICKVALUE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8));
Alert("TICKSIZE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKSIZE),8));
 
DomGilberto:


@RaptorUK:是的,我知道TICKVALUE从现在开始返回当前值。 我想你的第二部分现在看是有点逻辑的。我对我如何利用tickvalue作为我的名义饲料账户的一部分来确保头寸大小正确感到困惑...?

首先,你必须确认TICKVALUE确实返回了一个零的结果,而你还没有这样做。
 
GumRai:


这些视频很麻烦,对我的屏幕来说太大了。

为什么不直接公布脚本代码和警报结果。

我不知道你在脚本中放了什么,那应该是我建议的代码,但它不可能导致 "08"。

使用


对不起 - 我现在意识到我忘了放 "DoubleToStr",我的错!!

TickSize = 0.00100000

TickValue = 0.00001026

(滴在GBPJPY名义上的饲料)

@SDC 我只是从这里复制了你的代码,并将其放入一个新的脚本。这就是被返回的东西。

 
好了,新的更新,我已经玩了一圈,重复了零除法 发生的精确位置。

在我的代码中的这个区域,我让它打印出公式来分解数学--这发生在买入挂单上......然而代码的这一部分 "pips_to_ssl "是pips到卖出的止损......。这不是用于买入止损挂单....

double loss_for_1_lot1 = pips_to_ssl/  ts * tv  ;
   if( loss_for_1_lot1 == 0.0 )Print(" ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: ", pips_to_ssl,"/",ts,"*",tv);


2013.10.02 11:57:19     2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: 0/0.001*0.0001

double pips_to_ssl=SellStopPrice-sellPrice;
   if(pips_to_ssl == 0)Print(" ERROR - pips_to_ssl = 0 || The formula for this is: ", SellStopPrice,"-",sellPrice); 

2013.10.02 12:08:01	2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - pips_to_ssl = 0 || The formula for this is: 117.249-117.249

 
DomGilberto:
好了新的更新,我已经玩过了,重复了零除法发生的精确位置。

在我的代码中的这个区域,我让它打印出公式来分解数学 - 这发生在买入待定订单上......然而代码的这一部分 "pips_to_ssl "是卖出止损的点数这不是用于买入止损挂单....



我请你回看我之前的帖子

"注意

double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?

如果pips_to_bsl为零,也将导致零。这可能吗?"

bsl或ssl,同样的编码。