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

 
RaptorUK:

如果你想花几天时间来整理这个简单的问题,那么请随意......。 我不会。

如果你知道它在你的回测中何时发生,那么就很容易找到它 . . . 在它发生的前一天开始回测 . . . 找出它将发生的确切时间,精确到分钟 . . . 对于你代码中的所有分句 .是的,所有的除法,在包含除法的行前添加一个Print(),打印出除数和对相关代码行的引用。

比如说。

当你的代码以除以0的错误结束时,检查日志文件,在最后几个打印中会显示产生错误的代码行以及哪个变量被设置为0 .

. . . 学会更聪明地工作,有逻辑地、有效地寻找你的问题。


感谢你的帮助,为我指明了处理问题的正确方向。我已经找到了问题所在(在花了很长时间在各处拍打印刷品之后!)。

这实际上是源于我的经纪人(ILQ)使用了一个名义饲料的事实,以及本论坛的一个成员对我关于这个问题的帮助。简而言之,这就是下面的代码 - 在ILQ,你可以交易低至1个单位。在MT4交易窗口中,你可以输入你想要的精确单位大小(如0.01||874单位)。

你能帮助我理解这个公式的哪部分出了问题,我把箭头放在哪里?从我的角度看,这个数学公式看起来不错?

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+
void OrderEntry(int direction)
{
   //Padding for the stop and padding for the entry too. 
   double ATR_Pad = iATR(NULL,60,14,1)/2;
      if(ATR_Pad == 0.0)Print(" ATR_Pad = ", ATR_Pad); 
   double Buy_Pad = NormalizeDouble(ATR_Pad,Digits);
   double Sell_Pad = NormalizeDouble(ATR_Pad,Digits);
   
   //Get Highest Price in our lookback range and set buy price above it.
   int iTBT = iBarShift(NULL,60, triggerBarTime, true),
   iHH = iHighest(NULL,60, MODE_HIGH, iTBT + CandlesBeforeBiasObtained, 0);
   double Buy_Here = High[iHH] + Buy_Pad;
   double buyPrice= NormalizeDouble(Buy_Here,Digits);

   //Get Lowest Price in our lookback range and set sell price below it.
   int iTBT_1 = iBarShift(NULL, 60, triggerBarTime, true),
   iLL = iLowest(NULL, 60, MODE_LOW, iTBT_1 + CandlesBeforeBiasObtained, 0);
   double Sell_Here =Low[iLL] - Sell_Pad;
   double sellPrice = NormalizeDouble(Sell_Here,Digits);
   
   //Stop calculations.    
   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,Digits);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,Digits);

   //get our buystop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_bsl = buyPrice-BuyStopPrice;
   double buy_tp_price=(pips_to_bsl*RewardRatio)+buyPrice;
   double buy_takeprofit_price= NormalizeDouble(buy_tp_price, Digits);

   //get our sellstop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_ssl=SellStopPrice-sellPrice;
   double sell_tp_price=sellPrice-(pips_to_ssl*RewardRatio);
   double sell_takeprofit_price= NormalizeDouble(sell_tp_price, Digits);
   
   //Lot calculation - Facilitates Notional and Lots within MT4 - As well as find the tick value relative to the account denomination.   
   double risk_amount = AccountEquity( )*RiskPercent/100;
      if( risk_amount == 0.0 )Print(" risk_amount = ", risk_amount);
   double Lot_Step = MarketInfo(Symbol(), MODE_LOTSTEP);
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
      if( loss_for_1_lot == 0.0 )Print(" loss_for_1_lot = ", loss_for_1_lot);
   //Alert(loss_for_1_lot);
   double LotSize_Buy = MathFloor( risk_amount / loss_for_1_lot/ Lot_Step) * Lot_Step ;
      if( LotSize_Buy == 0.0 )Print(" LotSize_Buy = ", LotSize_Buy);
   //Alert(LotSize_Buy);
      
   double loss_for_1_lot1 = pips_to_ssl/ ts * tv ;  //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
      if( loss_for_1_lot1 == 0.0 )Print(" loss_for_1_lot1 = ", loss_for_1_lot1);
   //Alert(loss_for_1_lot1);
   double LotSize_Sell = MathFloor( risk_amount / loss_for_1_lot1/ Lot_Step) * Lot_Step ;
      if( LotSize_Sell == 0.0 )Print(" LotSize_Sell = ", LotSize_Sell);
   //Alert(LotSize_Sell);
 
DomGilberto:


感谢你的帮助,为我指明了正确的处理方向我已经找到了问题所在(在花了很长时间在各处拍打印刷品之后!)。

这实际上是源于我的经纪人(ILQ)使用了一个名义饲料的事实,以及本论坛的一个成员对我关于这个问题的帮助。简而言之,这就是下面的代码 - 在ILQ,你可以交易低至1个单位。在MT4交易窗口中,你可以输入你想要的精确单位大小(如0.01||874单位)。

你能帮助我理解这个公式的哪部分出了问题,我把箭头放在哪里?从我看的地方看,这个数学公式看起来不错?

好吧,我已经简要地读了你的另一个关于替代手数计算的主题,但不够详细,但一般来说,为了解决这个问题,我可能会这样做 . .

是什么导致了这个问题? TS?TV?还是两者都是? 如果两者都是0.0,那么TS和TV的乘积 将是0.0 ......但是如果只有一个偶尔被返回为0.0,那么你只需要解决其中一个的问题 ......


TickSize不会改变(据我所知) ......你不需要继续读取它,在init()中读取它,但要检查你是否得到一个0.0的返回值,或者继续读取它,但如果它不是0.0的话,只使用返回的内容。

TickValue可以改变,但它不应该是0.0,所以如果你读到它是0.0,就不要更新它的值......或者再试一次然后更新。

这不是火箭科学 . .

 

我不明白你为什么要一直问这个问题,简单的常识应该告诉你要做Raptor刚才说的事情。如果结果发现ts*tv不是问题,就打印出所有其他被用作除法的变量。

 

@SDC - 我已经这样做了,笑吗?我已经确定了它的来源,我只是说,对我来说,手的大小的公式看起来不错,而不是绕弯子,我发布了代码,看看我是否错过了什么?

你会注意到代码中的"<<<<"表示打印出的是 "0 "或零除数....。

@ RaptorUK - 谢谢你,很感谢你把它分解了。我想我知道如何从你所说的内容中解决这个问题--我过一会儿会玩一下,然后回来报告,以确认问题已经解决 :)

 
好吧,"TickValue "返回的是 "0"。

我试着使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,然后在每个新的H1蜡烛上更新静态双倍数,如果 "tv=0",但它仍然不会产生任何高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester 中进行的)。

如果我说得太慢,请原谅...?
 
DomGilberto:
好吧,"TickValue "返回的是 "0"。

我试着使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,然后在每一个新的H1蜡烛上更新静态双倍数,如果 "tv=0",但它仍然不会产生任何高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester中进行的)。

如果我说得太慢,请原谅...?
如果TICKVALUE返回一个错误的值0.0,你为什么要更新tv 的值?
 

对不起,我想说的是,我基本上两种方法都试过了。所以我尝试在 "int init "部分只做 "tv = MarketInfo(Symbol(), MODE_TICKVALUE);"...(和 "static double tv = 0;")

基本上tick值总是 "0"?(当然,我已经为我打印好了!)

同样,当我翻到欧元兑美元的回测时,tick值也告诉我是 "0",然而它成功地运行了整个回测,从2001-2013年没有出现零除法 错误?

更新:所以我在一个普通经纪商的实盘市场上进行了测试,该经纪商有一个基于手数的反馈,tick值返回的数字>0。然而,当我把这个相同的脚本放到同一实盘市场经纪商的名义反馈上,tick值返回为 "0"?有什么办法可以让我在使用名义交易选项(低至1个单位的交易)时绕过这个手数错误?

 
DomGilberto:

对不起,我想说的是,我基本上两种方法都试过了。所以我尝试在 "int init "部分只做 "tv = MarketInfo(Symbol(), MODE_TICKVALUE);"...(和 "static double tv = 0;")

基本上tick值总是 "0"?(当然,我已经为我打印好了!)

同样,当我翻到欧元兑美元的回测时,tick值也告诉我是 "0",然而它成功地运行了整个回测,从2001-2013年没有出现零除法错误

从你显示的代码来看 ......这是不可能的,除非你没有调用你所显示的函数......

   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ;

如果TICKVALUE总是0.0,那么tv就是0.0,所以ts * tv = 0.0,所以你将总是得到一个除以0的错误 ......

你的终端与你的Broker连接了吗?或者你在运行时是断开连接的?

 

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

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

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

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

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

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

 
DomGilberto:
好的,所以它的 "TickValue "会返回 "0"。

我已经尝试使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,如果 "tv==0",则在每个新的H1蜡烛上更新该静态双倍数,但它仍然不会产生高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester中进行的)。

对不起,如果我太慢了...?


你是如何打印TickValue的?

由于GBPJPY的数字通常是3,很可能TickValue打印的是0,因为没有足够的小数位。

为了完全确定,也许可以延长打印的小数点。

DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8)

请注意

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

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