Erros, bugs, perguntas - página 2414

 
Andrey Pogoreltsev:

Se utilizar o CSymbolInfo em várias moedas, que é chamado pelo método Nome no momento da inicialização:

Haverá erros para o símbolo USDCAD durante os testes:

O que é a moeda de depósito durante os testes?

 
Slava:

Qual é a moeda do depósito ao testar?

USD. Par de testes EURUSD M1. Vou tentar reproduzi-la numa EA nua. Até agora, ainda não teve sucesso. Mas foram estes métodos que levaram a erros nos registos e exactamente um par.

 
Slava:

Qual é a moeda do depósito ao testar?

Geralmente reproduzido e encontrado uma característica. Anexou as configurações de teste.

O próprio código de Expert Advisor nu:

#include <Trade\SymbolInfo.mqh>

int OnInit()
  {
//---
   CSymbolInfo info;
   info.Name("EURCHF.m");
   info.Refresh();
   info.Name("EURJPY.m");
   info.Refresh();
   info.Name("EURUSD.m");
   info.Refresh();
   info.Name("EURGBP.m");
   info.Refresh();
   info.Name("USDCAD.m");
   info.Refresh();
//---
   return(INIT_SUCCEEDED);
  }


Agora a "característica", como prometido) Se usar o Nome() desta forma:

   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE,m_tick_value))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_PROFIT,m_tick_value_profit))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_LOSS,m_tick_value_loss))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_SIZE,m_tick_size))
      return(false);

então haverá um erro. Mas desta forma, o erro desaparece:

   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_SIZE,m_tick_size))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE,m_tick_value))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_PROFIT,m_tick_value_profit))
      return(false);
   if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_LOSS,m_tick_value_loss))
      return(false);


PS. Tenho pares nomeados com prefixo ".m" no meu cêntimo. O exemplo funciona também em pares regulares.

Arquivos anexados:
test.png  11 kb
 
Andrey Pogoreltsev:

De qualquer modo, reproduzido e encontrado uma característica. Anexei as definições do teste.


Obrigado. Descobrindo-o

 

Bug MT5 build 2007. No modo de optimização, a cadeia de entrada é truncada a 63 caracteres.

Código para teste:

#property strict

sinput string symbols = "AUDUSD,EURGBP,EURUSD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,NZDUSD,USDCAD,USDCHF,USDJPY";
input  bool fortestopt = false;
int OnInit(){
   Print("!!! ",StringLen(symbols)," | ",symbols);

   return INIT_FAILED;
}

void OnTick(){}


Uma única corrida tudo ok: ! 90 | AUDUSD,EURGBP,EURUSD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,NZDUSD,USDCAD,USDCHF,USDJPY

Vamos definir a optimização por parâmetro fortetopt, vamos ao log do agente: ! 63 | AUDUSD,EURGBP,EURUSD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,

 

Qualquer pessoa quer saber...

Não consigo ver o noticiário na minha página... Costumava entrar e ver quem afixava o quê. Agora é uma página em branco... Não mudei nada nas definições...

 

O erro de compilação gera ambiguidade, embora aqui tudo seja inequívoco.O primeiro método deve ser chamado como o mais adequado. Testado em C++.

class A { };

class B
{
  A _a[];
 public:
        A * operator[](uint i)       { return &_a[i]; }
  const A * operator[](uint i) const { return &_a[i]; }  
};

void OnStart()
{
  B b;
  b[0]; // 'operator[]' - ambiguous call to overloaded function
}
 
Evgenii Kuznetsov:

Bug MT5 build 2007. No modo de optimização, a cadeia de entrada é truncada a 63 caracteres.

Código para teste:


Uma única corrida tudo ok: ! 90 | AUDUSD,EURGBP,EURUSD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,NZDUSD,USDCAD,USDCHF,USDJPY

Vamos definir a optimização por parâmetro fortetopt, vamos ao log do agente: ! 63 | AUDUSD,EURGBP,EURUSD,GBPAUD,GBPCAD,GBPCHF,GBPJPY,GBPNZD,GBPUSD,

O facto de também não cortar para 63 caracteres num único teste é apenas um acaso.

O comprimento da cadeia do tipo de parâmetro de entrada não deve exceder 63 caracteres (64 juntamente com o termo nulo)

 
Slava:

O facto de também não reduzir a 63 caracteres no teste único, é apenas um acaso.

O comprimento de um parâmetro de entrada de tipo string não deve exceder 63 caracteres (64 juntamente com o terminador nulo).

Isto é algum tipo de restrição draconiana. Qual é a razão de ser disto nos tempos de hoje? E como é conveniente especificar agrupamentos de um monte de caracteres? Plotagem de uma dúzia de parâmetros diferentes? É conveniente?

 
Slava:

O facto de o teste único não truncar a 63 caracteres é apenas um acidente.

O comprimento do parâmetro de entrada do tipo de string não deve exceder 63 caracteres (64 juntamente com o terminador nulo)

Esta limitação é inadequada, não estamos a escrever o preço de um quilograma de batatas no cordel.

Razão: