Erros, bugs, perguntas - página 1930

 
Quase uma pergunta infantil: porque é que é assim?
void OnStart()
{
  const double Norm = NormalizeDouble(8905 / 1000.0, 3);
  Print(Norm); // 8.904999999999999
  Print(DoubleToString(Norm, 3)); // 8.905
  
  const double Norm2 = (double)DoubleToString(Norm, 3);
  Print(Norm2); // 8.904999999999999
  Print(Norm == Norm2); // true
}

Por alguma razão, tinha a certeza de que o DoubleToString não fazia sentido após a normalização. Mas não, como mostra o guião. Porque é que é assim?

Parece que a dupla -> conversão de cordas não funciona correctamente.

 
As funções do PositionGet são muito lentas no testador. Para efeitos de demonstração, foi escrito o seguinte Conselheiro Especialista
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


Resultado de uma única corrida com linhas amarelas comentadas

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


Resultado de uma única corrida com linhas amarelas NÃO comentadas

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


Abiblioteca TesterBench mostra a mesma queda no tempo de execução.


HH Não só PositionGet, mas também OrderGet, HistoryDealGet, HistoryOrderGet são lentos.

 

No testador (1629) as negociações são abertas a preços zero

Executar o Expert Advisor no testador utilizando carraças reais do Servidor FIBOGroup-MT5


 

Pergunta para programadores e colegas interessados.

No Testador em modo de visualização há um objecto da classe CiMA - muwings.

Modo = "Cada carraça baseada em carraças reais". A velocidade no Visualizador é próxima da máxima.

O problema é este. Quando uma nova barra aparece, é preciso esperar por uma carga de novos tiquetaques para actualizar os valores dos muwings CiMA, ou melhor, os valores no buffer dos muwings.

E em cada tick a actualização é acelerada pelo método CiMA::Refresh(-1).

Porque é que o Testador funciona tão mal?

Não existem tais problemas no comércio real.

 

A Pusha é estranha hoje em dia:

uest/302788

pedido/302788

Como posso adivinhar, fui eu que fui colocado como candidato e comentei a mesma ordem.

Mas as mensagens são como para os codificadores)

 

A partir da documentação

ENUM_BASE_CORNER

Identificador

Descrição

CANTO_ESQUERDA_ACIMA

Centro de coordenadas no canto superior esquerdo do gráfico

CANTO_ESQUERDA_BAIXO

Centro de coordenadas no canto inferior esquerdo do gráfico

CANTO_DIREITA_BAIXO

Centro de coordenadas no canto inferior direito do gráfico

CORNER_RIGHT_UPPER

centro das coordenadas no canto superior direito do gráfico

Pergunta: Porque não foi possível desenhar a tabela por ordem numérica? Coloca-se 1 - e em vez do esperado"centro de coordenadas no canto superior esquerdo do gráfico" obtém-se"centro de coordenadas no canto inferior direito do gráfico".

Agora é assim que parece

1 - Centro de coordenadas no canto inferior esquerdo do gráfico.
2 - Centro de coordenadas no canto inferior direito do gráfico
3 - Centro de coordenadas no canto superior direito do gráfico
4 - Centro de coordenadas no canto superior esquerdo do gráfico

 
Aleksey Vyazmikin:

A partir da documentação

ENUM_BASE_CORNER

Identificador

Descrição

CANTO_ESQUERDA_ACIMA

Centro de coordenadas no canto superior esquerdo do gráfico

CANTO_ESQUERDA_BAIXO

Centro de coordenadas no canto inferior esquerdo do gráfico

CANTO_DIREITA_BAIXO

Centro de coordenadas no canto inferior direito do gráfico

CORNER_RIGHT_UPPER

centro das coordenadas no canto superior direito do gráfico

Pergunta: Porque é que a tabela não pode estar em ordem numérica? Coloca 1 - e em vez do esperado"Centro de coordenadas no canto superior esquerdo do gráfico" obtém"Centro de coordenadas no canto inferior direito do gráfico".

Parece ser assim

1 - Centro de coordenadas no canto inferior esquerdo do gráfico.
2 - Centro de coordenadas no canto inferior direito do gráfico
3 - Centro de coordenadas no canto superior direito do gráfico
4 - Centro de coordenadas no canto superior esquerdo do gráfico

A contagem começa a partir de zero.

O que o impede de entrar CORNER_LEFT_UPPER em vez de um número? É para isso que serve a enumeração, para que não tenha de pensar em números.

 

No helpdesk

MT4:

Para objectos com tamanho fixo: OBJ_BUTTON, OBJ_RECTANGLE_LABEL e OBJ_EDIT propriedades OBJPROP_XDISTANCE e OBJPROP_YDISTANCE definem a posição do ponto superior esquerdo do objecto em relação ao canto do gráfico (OBJPROP_CORNER), a partir do qual serão contadas as coordenadas X e Y em pixels.


MT5:

Para objectos com tamanho fixo: OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT e OBJ_CHART, as propriedades OBJPROP_XDISTANCE e OBJPROP_YDISTANCE definem a posição do ponto superior esquerdo do objecto em relação ao canto do gráfico (OBJPROP_CORNER), a partir do qual serão medidas as coordenadas X e Y em pixels.

A questão é que o antigo código do MT4 usando ObjectSet permite posicionar objectos relativamente às suas arestas (cantos) - para objectos na parte esquerda o cálculo dos pixels é efectuado a partir do primeiro símbolo, para objectos na parte direita - a partir do último símbolo, enquanto a nova versão calcula sempre o travessão a partir do primeiro símbolo, o que torna difícil o posicionamento de etiquetas com texto, porque nem sempre se sabe quantos símbolos de texto serão. Peço aos programadores que adicionem um método de alinhamento de texto à escolha!

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   ObjectDelete(_name);
   ObjectCreate(_name,OBJ_LABEL,_window,0,0);
   ObjectSet(_name,OBJPROP_CORNER,corner);
   ObjectSet(_name,OBJPROP_XDISTANCE,_x);
   ObjectSet(_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   //corner=4;
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }  


Se alguém souber como obter alinhamento à esquerda e à direita no MT5, por favor partilhe a característica apropriada!

 
Artyom Trishkin:

A contagem começa a partir de zero.

O que o impede de entrar CORNER_LEFT_UPPER em vez de um número? É para isso que serve a enumeração, para que não tenha de pensar em números.

A partir do zero? Bem, OK - que seja do zero - eu não o levei em conta - mas mesmo assim não funciona!

Porque faz mais sentido para mim e eu já o usei antes.

 
Aleksey Vyazmikin:

A partir do zero? Bem, OK - mesmo que seja do zero - não pensei nisso - mas mesmo assim não funciona!

Porque faz mais sentido para mim e já o usei antes...

Devo subir o item da lista que está a tentar identificar com o número 4, que não está lá? Torna-se zero - e tudo está no seu devido lugar.