Erros, bugs, perguntas - página 1661

 

É um insecto ou uma pergunta, mas algo incompreensível está a acontecer no testador e no depurador. Está tudo bem no EURUSD, mas há um problema com o USDJPY...

Parte do código

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

O que me interessa no código é claro a partir de capturas de ecrã. Está marcado no código.

Há uma ordem de venda com uma perda de 7,39, mas o código mostra uma perda de apenas 0,93


A seta verde na imagem seguinte mostra que o debug está parado nesta linha...



Ou seja, a variável sl já foi definida para PositionGetDouble(POSITION_PROFIT)


PERGUNTA: Porque é que isto está a acontecer? É um bug ou um padrão, uma característica especial do testador/debugger mql5???

A variável sp foi introduzida um pouco mais tarde, inicialmente a variável sellProfit foi verificada, que foi colocada a zero quando a função foi introduzida.

 
Alexey Viktorov:

Se é um insecto ou uma pergunta, mas há algo que não está claro... acontece no testador e no depurador. Está tudo bem no EURUSD, mas há um problema no USDJPY...

Houve um problema na construção cerca de uma dúzia de anos antes, quando o visualizador mostrava o futuro por um tick, enquanto o MQL estava a funcionar normalmente - o futuro não era visto.

Tente comparar PositionGetDouble(POSITION_PROFIT) no próximo tick. Se coincide com o que o visualizador já mostrou antes - o problema está lá. Slawa deu uma explicação e prometeu corrigi-la.

Se não - outro bug neste caso.

 
fxsaber:

Numa construção uma dúzia ou duas mais cedo que a actual, houve um problema quando o visualizador estava a mostrar o futuro num só tick, enquanto a MQL estava a funcionar bem - o futuro não era visto.

Tente comparar PositionGetDouble(POSITION_PROFIT) no próximo tick. Se coincide com o que o visualizador já mostrou antes - o problema está lá. Slawa deu uma explicação e prometeu corrigi-la.

Se não - outro bug neste caso.

Talvez sim, mas o código não fornece uma verificação no próximo tick. Apenas uma vez no momento da abertura de um novo bar. E que garantia há de que estes valores são do próximo tick? Nenhum... Tentei novamente; a perda é de 2,55, mas o depurador ainda mostra 0,93.

Mas, dedos cruzados... tester 5 é muito melhor que tester 4... Apenas falhas e operação inadequada... Como pode depurar um Expert Advisor com tais falhas? De que outra forma as pessoas fazem a optimização??? De facto, a optimização é auto-engano, e com tais violinos, é auto-engano ao ponto de mentir 8.

Terei de o testar numa demonstração... durante semanas...

 

Só porque o visualizador mostra disparates, não significa que o próprio testador esteja errado. O testador não se preocupa com problemas de visualização, de forma alguma.

Utilizar o TickValue para calcular o tamanho do lucro e compará-lo com POSITION_PROFIT. Verá que tudo é igual. A visualização parece ser um insecto.

 
fxsaber:

Só porque o visualizador mostra disparates, não significa que o próprio testador esteja errado. O testador não se preocupa com problemas de visualização, de forma alguma.

Utilizar o TickValue para calcular o tamanho do lucro e compará-lo com POSITION_PROFIT. Verá que tudo é igual. A visualização parece ser um insecto.

Sim, calculei-a de novo antes de colocar a pergunta. Parece ser verdade, é possível recalcular a partir de capturas de ecrã. Não comecei a verificar por alguma razão. A perda é calculada com base no tamanho do lote que conduzirá ao lucro esperado no fecho do take profit. Tudo foi calculado correctamente em EURUSD, mas de repente as perdas não são cobertas em USDJPY... Comecei a verificar a fórmula... e chegou a este bug. Acontece que o visualizador não tem nada a ver com isto.

 
Alexey Viktorov:

Sim, contou-a antes de afixar a pergunta. Parece ser verdade, é possível recalcular a partir das capturas de ecrã. Não comecei a verificar por uma razão. A perda é calculada com base no tamanho do lote em que o lucro esperado será fechado no momento da tomada. Tudo foi calculado correctamente em EURUSD, mas de repente as perdas não são cobertas em USDJPY... Comecei a verificar a fórmula... e chegou a este bug. Acontece que o visualizador não tem nada a ver com isto.

Lamento, mas não estou a seguir o seu ponto de vista. Quem pensa que é o insecto - o testador ou o visualizador?
 

Erro na compilação do 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();
}

Erro #1. A chamada h é inequívoca por assinatura aqui.

Erro #2. Em A::f1() chamada de h( g ) no sentido de g - pode parecer ambíguo, mas por outro lado em A::f2() compilador por outro lado não faz perguntas desnecessárias sobre g() (e faz correctamente - pelo menos no início os problemas existentes de incluir ficheiro de cabeçalho com declaração de função no módulo com a sua implementação e posterior utilização neste módulo foram resolvidos há muito tempo). E além disso, é difícil reescrever de outra forma, porque Script.mqh é um ficheiro de cabeçalho comum

 
fxsaber:
Lamento, mas não compreendo o seu ponto de vista. Quem acha que está errado - o testador ou o visualizador?

Se mostra valores semelhantes à verdade, mas os calcula utilizando os dados errados, então o problema está em mql5 e não no testador ou visualizador.

Em suma, obrigado pela vossa contribuição, a longo prazo, estarei a vencer o problema. E irá verificar outra moeda hoje em dia, semelhante. Talvez seja o problema das carraças nesse local, hhz?

 

Porque é que o aviso está em pé de igualdade?

void OnStart()
{
  uchar Data[];  
  ArrayInitialize(Data, UCHAR_MAX); // Warning: truncation of constant value
}
 
Caros profissionais, por favor ajudem-me a compreender o problema. O Expert Advisor trabalha pelo sinal do indicador cujo período pode ser alterado dentro de um amplo intervalo de 3 barras até 10000 ou mais. O próprio indicador funciona bem por si só e reage adequadamente às mudanças no período dentro destes limites. Contudo, o Consultor Especialista no Testador de Estratégia não aceita definições superiores a 1002 barras e informa "Divisão Zero". Qual poderá ser o problema? Não encontrei quaisquer limitações no código do Expert Advisor.