零分法(发现问题--但为什么?) - 页 2 1234 新评论 Dominic Gilbert 2013.10.01 13:59 #11 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); Simon Gniadkowski 2013.10.01 14:19 #12 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,就不要更新它的值......或者再试一次然后更新。 这不是火箭科学 . . Ian Venner 2013.10.01 14:40 #13 我不明白你为什么要一直问这个问题,简单的常识应该告诉你要做Raptor刚才说的事情。如果结果发现ts*tv不是问题,就打印出所有其他被用作除法的变量。 Dominic Gilbert 2013.10.01 15:58 #14 @SDC - 我已经这样做了,笑吗?我已经确定了它的来源,我只是说,对我来说,手的大小的公式看起来不错,而不是绕弯子,我发布了代码,看看我是否错过了什么? 你会注意到代码中的"<<<<"表示打印出的是 "0 "或零除数....。 @ RaptorUK - 谢谢你,很感谢你把它分解了。我想我知道如何从你所说的内容中解决这个问题--我过一会儿会玩一下,然后回来报告,以确认问题已经解决 :) Dominic Gilbert 2013.10.01 17:43 #15 好吧,"TickValue "返回的是 "0"。 我试着使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,然后在每个新的H1蜡烛上更新静态双倍数,如果 "tv=0",但它仍然不会产生任何高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester 中进行的)。 如果我说得太慢,请原谅...? Simon Gniadkowski 2013.10.01 19:25 #16 DomGilberto: 好吧,"TickValue "返回的是 "0"。 我试着使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,然后在每一个新的H1蜡烛上更新静态双倍数,如果 "tv=0",但它仍然不会产生任何高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester中进行的)。 如果我说得太慢,请原谅...? 如果TICKVALUE返回一个错误的值0.0,你为什么要更新tv 的值? Dominic Gilbert 2013.10.01 20:04 #17 对不起,我想说的是,我基本上两种方法都试过了。所以我尝试在 "int init "部分只做 "tv = MarketInfo(Symbol(), MODE_TICKVALUE);"...(和 "static double tv = 0;") 基本上tick值总是 "0"?(当然,我已经为我打印好了!) 同样,当我翻到欧元兑美元的回测时,tick值也告诉我是 "0",然而它成功地运行了整个回测,从2001-2013年没有出现零除法 错误? 更新:所以我在一个普通经纪商的实盘市场上进行了测试,该经纪商有一个基于手数的反馈,tick值返回的数字>0。然而,当我把这个相同的脚本放到同一实盘市场经纪商的名义反馈上,tick值返回为 "0"?有什么办法可以让我在使用名义交易选项(低至1个单位的交易)时绕过这个手数错误? Simon Gniadkowski 2013.10.01 20:12 #18 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连接了吗?或者你在运行时是断开连接的? Dominic Gilbert 2013.10.01 21:01 #19 我希望我做的这个视频(40秒左右)能说明我在说什么(因为我不确定我是否说清楚了)。 视频:http://screencast.com/t/uMHY5DpM 你会看到,第一部分,当我把脚本放到实时图表(真实账户)上时,在那个 "名义账户 "上,刻度值和刻度大小返回 "0",我在手数窗口(单位)中说明了这一点。 第二部分是在同一个经纪商那里,但在一个基于手数的饲料上,这一次它返回了一个刻度值和刻度大小。我再次说明,你使用lot.... 进行交易。 因此,关于策略测试器,我不知道为什么它一直在工作,有时却不工作。在我进行回溯测试时,账户也一直连接着(在一个模拟名义上的喂养账户(单位)上)。 我的下一个问题是,如果这是我从名义联储账户得到的典型反应,你能建议我在这种情况下如何纠正我的头寸大小的计算吗? 它对基于手数的喂养来说是完美的......希望这能更好地解释它? Keith Watford 2013.10.01 22:07 #20 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为零,也会导致零。这可能吗? 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
如果你想花几天时间来整理这个简单的问题,那么请随意......。 我不会。
如果你知道它在你的回测中何时发生,那么就很容易找到它 . . . 在它发生的前一天开始回测 . . . 找出它将发生的确切时间,精确到分钟 . . . 对于你代码中的所有分句 .是的,所有的除法,在包含除法的行前添加一个Print(),打印出除数和对相关代码行的引用。
比如说。
当你的代码以除以0的错误结束时,检查日志文件,在最后几个打印中会显示产生错误的代码行以及哪个变量被设置为0 .
. . . 学会更聪明地工作,有逻辑地、有效地寻找你的问题。
感谢你的帮助,为我指明了处理问题的正确方向。我已经找到了问题所在(在花了很长时间在各处拍打印刷品之后!)。
这实际上是源于我的经纪人(ILQ)使用了一个名义饲料的事实,以及本论坛的一个成员对我关于这个问题的帮助。简而言之,这就是下面的代码 - 在ILQ,你可以交易低至1个单位。在MT4交易窗口中,你可以输入你想要的精确单位大小(如0.01||874单位)。
你能帮助我理解这个公式的哪部分出了问题,我把箭头放在哪里?从我的角度看,这个数学公式看起来不错?
感谢你的帮助,为我指明了正确的处理方向我已经找到了问题所在(在花了很长时间在各处拍打印刷品之后!)。
这实际上是源于我的经纪人(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 - 谢谢你,很感谢你把它分解了。我想我知道如何从你所说的内容中解决这个问题--我过一会儿会玩一下,然后回来报告,以确认问题已经解决 :)
我试着使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,然后在每个新的H1蜡烛上更新静态双倍数,如果 "tv=0",但它仍然不会产生任何高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester 中进行的)。
如果我说得太慢,请原谅...?
好吧,"TickValue "返回的是 "0"。
我试着使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,然后在每一个新的H1蜡烛上更新静态双倍数,如果 "tv=0",但它仍然不会产生任何高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester中进行的)。
如果我说得太慢,请原谅...?
对不起,我想说的是,我基本上两种方法都试过了。所以我尝试在 "int init "部分只做 "tv = MarketInfo(Symbol(), MODE_TICKVALUE);"...(和 "static double tv = 0;")
基本上tick值总是 "0"?(当然,我已经为我打印好了!)
同样,当我翻到欧元兑美元的回测时,tick值也告诉我是 "0",然而它成功地运行了整个回测,从2001-2013年没有出现零除法 错误?
更新:所以我在一个普通经纪商的实盘市场上进行了测试,该经纪商有一个基于手数的反馈,tick值返回的数字>0。然而,当我把这个相同的脚本放到同一实盘市场经纪商的名义反馈上,tick值返回为 "0"?有什么办法可以让我在使用名义交易选项(低至1个单位的交易)时绕过这个手数错误?
对不起,我想说的是,我基本上两种方法都试过了。所以我尝试在 "int init "部分只做 "tv = MarketInfo(Symbol(), MODE_TICKVALUE);"...(和 "static double tv = 0;")
基本上tick值总是 "0"?(当然,我已经为我打印好了!)
同样,当我翻到欧元兑美元的回测时,tick值也告诉我是 "0",然而它成功地运行了整个回测,从2001-2013年没有出现零除法错误 ?
从你显示的代码来看 ......这是不可能的,除非你没有调用你所显示的函数......
如果TICKVALUE总是0.0,那么tv就是0.0,所以ts * tv = 0.0,所以你将总是得到一个除以0的错误 ......
你的终端与你的Broker连接了吗?或者你在运行时是断开连接的?
我希望我做的这个视频(40秒左右)能说明我在说什么(因为我不确定我是否说清楚了)。
视频:http://screencast.com/t/uMHY5DpM
你会看到,第一部分,当我把脚本放到实时图表(真实账户)上时,在那个 "名义账户 "上,刻度值和刻度大小返回 "0",我在手数窗口(单位)中说明了这一点。
第二部分是在同一个经纪商那里,但在一个基于手数的饲料上,这一次它返回了一个刻度值和刻度大小。我再次说明,你使用lot.... 进行交易。
因此,关于策略测试器,我不知道为什么它一直在工作,有时却不工作。在我进行回溯测试时,账户也一直连接着(在一个模拟名义上的喂养账户(单位)上)。
我的下一个问题是,如果这是我从名义联储账户得到的典型反应,你能建议我在这种情况下如何纠正我的头寸大小的计算吗? 它对基于手数的喂养来说是完美的......希望这能更好地解释它?
好的,所以它的 "TickValue "会返回 "0"。
我已经尝试使用 "静态双倍数tv=0;",然后在 "int init "中分配tick值,如果 "tv==0",则在每个新的H1蜡烛上更新该静态双倍数,但它仍然不会产生高于 "0 "的结果?有问题的货币对是GBPJPY(这都是在Strategy Tester中进行的)。
对不起,如果我太慢了...?
你是如何打印TickValue的?
由于GBPJPY的数字通常是3,很可能TickValue打印的是0,因为没有足够的小数位。
为了完全确定,也许可以延长打印的小数点。
请注意
如果pips_to_bsl为零,也会导致零。这可能吗?