Erros, bugs, perguntas - página 2654

 

Alguém nos pode esclarecer sobre a seguinte questão:

Ter um dll escrito em C# mas compilado:

- para projecto MT5 C# habitual - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 bit, mas envolto em chamadas C geridas

As fontes dll são 100% idênticas, excepto o invólucro MT4, claro,

OS Win10-64

Bem, a questão é porque é que o MT4 funciona exactamente 4 vezes mais rápido, os números são aproximadamente 100 000 chamadas dll no MT4 durante 7,5 segundos, MT5 durante 30 segundos

 
Igor Makanu:

Alguém nos pode esclarecer sobre a seguinte questão:

Ter um dll escrito em C# mas compilado:

- para projecto MT5 C# habitual - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 bit, mas envolto em chamadas C geridas

As fontes dll são 100% idênticas, excepto o invólucro MT4, claro,

OS Win10-64

Bem, a questão é porque é que o MT4 funciona exactamente 4 vezes mais rápido, os números são aproximadamente 100 000 chamadas dll no MT4 durante 7,5 segundos, MT5 durante 30 segundos

IMHO. C-runtime num caso e uma máquina virtual no outro.

 
perdeu uma nova funcionalidade no fórum, onde o primeiro nome, apelido, data e ao lado do botão traduções, os números - 1 2 3 , nem todos têm, ontem penso que não tinha, porque não todas, e qual é a definição de páginas?
 

Uma interface gráfica é implementada no Expert Advisor. Também são implementados eventos de utilizadores (por exemplo, eventos de mudança de GUI). Realizo depuração de dados reais (F5). Assim que coloco um ponto de paragem num evento do utilizador - o depurador pára, mas a subsequente pressão de F5 (continua debugging) não leva a alterações na própria GUI. Pergunta: deveria ser este o caso, ou trata-se de um bug de depuração?

Se eu remover o ponto de paragem (a depuração continua) - as alterações na GUI são normais.

MT5, construir 2340.

 
Vladimir Simakov:

IMHO. C-runtime num caso e uma máquina virtual no outro.

há um .Net virtual em ambas as dlls

encontrei a diferença no código, até atirei a classe base de 32 bits num fio separado, porque não tem outra forma de trabalhar

Fiz as mesmas manipulações para o MT5, os resultados são mais ou menos os mesmos (três testes cada):

MT5: ciclo 100000 , tempo 8,482981 seg , ciclo 100000 , tempo 8,638789 seg , ciclo 100000 , tempo 8,390046 seg

MT4: ciclo 100000 , tempo 7,128857 seg , ciclo 100000 , tempo 7,176361 seg , ciclo 100000 , tempo 7,205439 seg


OK, vamos assumir que é uma espécie de hooch da Microsoft
 

Saudações! Boas Festas a todos os homens !!!!
Não percebo o que é o estranho insecto com a exibição em ziguezague da equidade no testador. Não compreendo o estranho insecto com ziguezague de exibição de equidade no testador. Se eu alterar a opção "Método de liquidação" de "Troca de Stoks" para "Forex", a equidade é exibida normalmente. Tive a mesma experiência há alguns anos, queria tentar ligar o MT5 a um fundo, testá-lo, assustar-me e desistir. Agora tentei novamente e a mesma coisa. É estranho?

 
Porque não é possível implementar uma função com um argumento "universal" que pode passar qualquer variável independentemente da sua "origem": lvalue, rvalue, variável literal ou temporária?
O problema é solvível para métodos de classes de recipientes "dactilografados", mas não é solvível para funções normais.

A principal contradição é que para transferir estruturas é necessário utilizar a transferência por referência, e para as variáveis literais e temporárias - transferência por valor.
Como resultado, obtemos um erro de compilação para tipos de valores normais, porque ambas as funções sobrecarregadas são adequadas para a chamada.
Como solução parcial e apenas para tipos "primitivos", é possível construir 12 funções sobrecarregadas:
#define  CREATE_LITERAL_PARAMETER_CALL_HANDLERS_VOID_T1_P2_L2(current_func_name, main_func_name, param_1)          \
   template<typename T> void current_func_name(param_1 p1, const string  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const long    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const int     value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const short   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const char    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ulong   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uint    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ushort  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uchar   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const double  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const float   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const bool    value){ main_func_name(p1, value);}    
Mas se uma função deve aceitar dois argumentos "universais", então apenas 144 funções sobrecarregadas são necessárias para a implementar, enquanto que no caso de três desses argumentos, são necessárias todas as funções sobrecarregadas de 1728.


Sugestão:
Finalmente, permitir aos utilizadores passar literais e variáveis temporárias como argumentos da função const ref.
Que seja uma directiva # separada - seja o que for...
 

Defeitos na função do modelo/na operação de cache da classe:
(não fixado pelo MT5(build 2340)) ** Comportamento indefinido, cria-se várias vezes um objecto complexo embrulhado com tipo interno "C" e acaba por ser um tipo de dados completamente diferente, talvez "B", talvez "int", o que se quiser...
(não fixado pelo MT5(build 2340)) * Compile Error, bug ao passar um ponteiro de função como um argumento de modelo de ref. constante.
(não corrigido pelo MT5(build 2340)) * Compile Error, B<int> object can be created after the B<void*> class object, mas se for feito antes, ocorre um erro de compilação.


Defeitos na função/classe do modelo de trabalho:
(não fixado pelo MT5(build 2340)) ** Erro de compilação, bug dentro da função de modelo, ponteiro passado dentro da operação deconversão de tipo explícito comporta-se como uma classe, caso contrário como um ponteiro.
(não fixado pelo MT5(build 2340)) ** Compile Error, bug com geração de código de classe de modelo enquanto se utiliza a classe interna.
(não fixado pelo MT5(build 2340)) ** Erro de compilação, erro na tentativa de acesso à classe interna para parâmetro de função de modelo de modelo.
(não fixado pelo MT5(build 2340)) ** Erro de compilação, erro na geração do método/classe do modelo, o processo de "auto-substituição" do parâmetro do modelo vai para fora do scop para o código principal do programa.
(não fixado pelo MT5(build 2340)) * Compile Error, o erro com a classe template não gera código automaticamente quando a classe template actua como um valor de retorno para o método template.
(não fixado pelo MT5(build 2340)) * Compile Error, bug na definição de classe interna - não há possibilidade de se referir explicitamente ao espaço de nomes global ao especificar a classe base.


Defeitos em função sobrecarregada chamam a descoordenação de prioridades em MQL em comparação com C++:
(não fixado pelo MT5(build 2340)) *** Erro de compilação quando há herança de classe A <= B <= C <= D e duas funções de sobrecarga são implementadas, por exemplo, uma com o parâmetro A* e outra com o parâmetro B*, passando depois em tal função um objecto C* ou D* em MQL causa um erro de compilação "chamada ambígua para função sobrecarregada".
(não fixado pelo MT5(build 2340)) ** Tempo de execução, Descoordenação prioritária para chamadas de funções de modelo sobrecarregadas.



Sugestões:
link- sobre permitir que as variáveis literais e temporárias sejam passadas como argumentos da função const ref.
link- aomover ficheiros de projectos no separador Projecto, para ficheiros movidos que estão abertos e localizados nos separadores ME, para actualizar automaticamente o seu caminho de localização.
link- para introduzir a funcionalidade de declaração de typedef em MQL.
link- sobre a possibilidade de forçar a geração de construtores de cópias por defeito e operadores de atribuição.


 

Estou a pedir ajuda, estou completamente fora do circuito.

Na OnChartEvent, ao pressionar `C` cancelo/restauro a tabela de preços.

E tudo estaria bem, mas se a disposição do teclado não for seleccionada em inglês - não funciona.


Como tornar a detecção da pressão de "C" independente da disposição seleccionada?

 
fxsaber:

Estou a pedir ajuda, estou completamente fora do circuito.

Na OnChartEvent, ao pressionar `C` cancelo/restauro a tabela de preços.

E tudo estaria bem, mas se a disposição do teclado não for seleccionada em inglês - não funciona.


Como fazer com que a detecção da pressão 'C' seja independente do layout seleccionado?

Necessidade de verificarlparam

//+------------------------------------------------------------------+
//|                                                 TranslateKey.mq5 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
     {
      short sym=TranslateKey((int)lparam);
      //--- if the entered character is successfully converted to Unicode
      if(sym>0)
         Print("lparam: ",lparam,", ",sym,"'",ShortToString(sym),"'");
      else
         Print("Error in TranslateKey for key=",lparam);
     }
  }
//+------------------------------------------------------------------+

Tanto para layouts de ru e en teclado (tanto em minúsculas como em maiúsculas) lparam será 67:

TranslateKey (EURUSD,H1)        lparam: 67, 67'C'
TranslateKey (EURUSD,H1)        lparam: 67, 1057'С'
TranslateKey (EURUSD,H1)        Error in TranslateKey for key=20
TranslateKey (EURUSD,H1)        lparam: 67, 1089'с'
TranslateKey (EURUSD,H1)        lparam: 67, 99'c'
Razão: