错误、漏洞、问题 - 页 1661

 

是错误还是问题,但有些东西是无法理解的...在测试器和调试器中都在发生...欧元兑美元一切正常,但美元兑日元出现了问题...

代码的一部分

void funArrPositionTicket(ulong & arrBuy[], int & buySize, ulong & arrSell[], int & sellSize)
{
 double bp, sp;
  buyProfit = 0; sellProfit = 0; buyVolume = 0; sellVolume = 0;
   int i, total = PositionsTotal();
    for(i = 0; i < total; i++)
     {
      if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol)
       {
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          buySize = ArraySize(arrBuy);
           ArrayResize(arrBuy, buySize+1);
            arrBuy[buySize] = (int)PositionGetInteger(POSITION_TICKET);
           buyProfit += PositionGetDouble(POSITION_PROFIT);
          buyVolume += PositionGetDouble(POSITION_VOLUME);
         }
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          sellSize = ArraySize(arrSell);
           ArrayResize(arrSell, sellSize+1);
            arrSell[sellSize] = (int)PositionGetInteger(POSITION_TICKET);
           sp = PositionGetDouble(POSITION_PROFIT);
           sellProfit += sp;
          sellVolume += PositionGetDouble(POSITION_VOLUME);
         }
       }
     }
}/*******************************************************************/

我对代码中的内容感兴趣,从截图中可以看出...它在代码中被标记。

有一个卖出订单,损失为7.39,但代码显示损失仅为0.93。


以下截图中的绿色箭头显示,调试在这一行停止了...



也就是说,sl变量已经被设置为PositionGetDouble(POSITION_PROFIT)。


问题:为什么会发生这种情况?这是一个错误还是一个模式,是mql5测试器/调试器的一个特殊功能?

变量sp是稍后引入的,最初检查的是变量sellProfit,当函数被输入时,它被设置为零。

 
Alexey Viktorov:

不管是错误还是问题,但有一点不清楚...发生在测试器和调试器中...欧元兑美元一切正常,但美元兑日元出现了问题...

在十几年前的构建中,有一个问题,当时可视化器显示的是未来的一个刻度,而MQL是正常工作的--未来是看不到的。

尝试在下一个tick上比较PositionGetDouble(POSITION_PROFIT)。如果它与 "展示台 "之前显示的内容相吻合--问题就在那里。斯拉瓦给出了解释,并承诺予以纠正。

如果不是--在这种情况下,又是一个错误。

 
fxsaber:

在比现在的版本早十几二十年的版本中,有一个问题,当可视化器在一个刻度上显示未来时,而MQL工作正常--看不到未来。

尝试在下一个tick上比较PositionGetDouble(POSITION_PROFIT)。如果它与 "展示台 "之前显示的内容相吻合--问题就在那里。斯拉瓦给出了解释,并承诺予以纠正。

如果不是--在这种情况下,又是一个错误。

也许是这样,但代码中没有提供下一个刻度的检查。只有在新酒吧开业的时候才有一次。又有什么能保证这些数值是来自下一个刻度?没有...我又试了一次;损失是2.55,但调试器仍然显示0.93。

但是,手指穿过...测试员5比测试员4好得多......。只有小故障和不充分的操作...你如何调试一个有这种故障的专家顾问?人们还怎么做优化?其实,优化就是自欺欺人,有了这样的忽悠,就是自欺欺人,达到了说谎的程度8。

我必须在一个演示中测试它...几个星期以来...

 

可视化器显示的是无稽之谈,并不意味着测试器本身是错误的。测试人员并不关心可视化问题,完全不关心。

使用TickValue来计算利润大小,并与POSITION_PROFIT 进行比较。你会看到,一切都一样。可视化似乎是一个错误。

 
fxsaber:

可视化器显示的是无稽之谈,并不意味着测试器本身是错误的。测试人员并不关心可视化问题,完全不关心。

使用TickValue来计算利润大小,并与POSITION_PROFIT 进行比较。你会看到,一切都一样。可视化似乎是一个错误。

是的,我在发布问题前重新计算了一下。似乎是真的,你可以根据屏幕截图重新计算。我没有开始检查的原因。损失的计算是基于手数的大小,这将导致在关闭止盈时的预期利润。在欧元兑美元上一切计算都是正确的,但在美元兑日元上突然损失没有得到补偿...我开始检查配方...并达到这个错误。事实证明,"展示台 "与此毫无关系。

 
Alexey Viktorov:

是的,在发布问题之前算过了。似乎是真的,你可以根据截图重新计算。我没有开始检查的原因。亏损的计算是基于预期利润将被平仓的手数大小。在欧元兑美元上一切计算都是正确的,但在美元兑日元上突然损失没有得到补偿...我开始检查配方...并达到这个错误。事实证明,"展示台 "与此毫无关系。

对不起,但我不明白你的意思。你认为谁是错误的--测试者还是视觉者?
 

编译Script1.mq5时出错

//Script.mqh
typedef void (*fn)();
#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void h();
        void h( fn );
#import
class A {
public:
        void f1() { h( g ); } //Error: #1 - no one of the overloads can be applied to the function call
                              //Error: #2 - cannot resolve function address
        void f2() {    g(); } //нормально (*)
        void f3() { Print( __FUNCTION__ ); }
};
//Script1.mq5
#property library
#include "Script.mqh"
void g() export
{
        A a;
        a.f3();
}

错误#1。在这里,h调用的签名是毫不含糊的。

错误#2。在A::f1()中,在g的意义上调用h( g )--似乎是模棱两可的,但另一方面,在A::f2()中,编译器不会问关于g()的不必要的问题(而且正确地问了--至少在最初包括头文件与模块中的函数声明 及其实现和进一步在这个模块中使用的问题早就被解决了)。此外,否则很难重写,因为Script.mqh是一个普通的头文件。

 
fxsaber:
对不起,但我不明白你的意思。你认为谁错了--测试者还是展示者?

如果它显示的值与事实相似,但使用错误的数据进行计算,那么问题就出在mql5中,而不是在测试器或可视化器中。

总而言之,感谢你的意见,从长远来看,我将会战胜这个问题。并将在今天检查另一块类似的货币。也许是那个地方的蜱虫问题,hz?

 

为什么警告是在一个公平的竞争环境中?

void OnStart()
{
  uchar Data[];  
  ArrayInitialize(Data, UCHAR_MAX); // Warning: truncation of constant value
}
 
亲爱的专业人士,请帮助我了解这个问题。专家顾问通过指标的信号工作,指标的周期可以在3条到10000条的大范围内改变,甚至更多。该指标本身工作良好,并在这些限度内对周期的变化作出充分的反应。然而,策略测试器中的专家顾问不接受高于1002条的设置,并报告 "零除法"。问题可能是什么?我没有在专家顾问的代码中发现任何限制。