Erros, bugs, perguntas - página 2016

 
fxsaber:

O CopyBuffer inteiro está lá INF.

Com um algoritmo de contagem deslizante, apenas dois preços DBL_MAX são suficientes no início para fazer com que todo o buffer se torne INF

DBL_MAX + DBL_MAX = INF

e depois o INF não deixará o cálculo

Deve alterar o código de todos os indicadores para ignorar EMPTY_VALUE
 
A100:

Com um algoritmo de contagem deslizante, apenas dois preços DBL_MAX são necessários no início para que todo o buffer se torne INF

DBL_MAX + DBL_MAX = INF

e então INF não mais escapará dos cálculos

Esta variante é bastante provável porque é DBL_MAX que é preenchida com valores abaixo do período MAA. Depois há um erro na média recorrente do algoritmo - MODE_SMA.

É verdade! Fiz algumas alterações e funciona!

// Вычисляем Машку от Машки через хэндл самого себя
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 

#property  indicator_type1   DRAW_LINE 
#property  indicator_color1  clrRed 
#property  indicator_style1  STYLE_SOLID 
#property  indicator_width1  1 

input bool CustomData = false; // true - кастомный режим для iCustom
input int MAPeriod = 1 e1;      // Период МАшки

string GetMyName( void )
{
  const int Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
  const string Path = MQLInfoString(MQL_PROGRAM_PATH);
  
  return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}

double Buffer[];
const bool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);

const int handleMA = CustomData ? iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_OPEN) // от этой МАшки будет брать другую Машку, но не напрямую, а кастомно
                                : iMA(NULL, PERIOD_CURRENT, MAPeriod, 0, MODE_SMA, iCustom(_Symbol, PERIOD_CURRENT, GetMyName(), true));

int Replace( double &Array[], const double NewValue = 1 e3, const double PrevValue = EMPTY_VALUE )
{
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    if (Array[i] == PrevValue)
      Array[i] = NewValue;
      
  return(0);
}

int OnCalculate( const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[] )       // Spread 
{
  return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}

Pode-se afirmar com certeza que o algoritmo recorrente iMA não tem em conta o caso quando DBL_MAX é alimentado com a entrada. Bug.


@A100, Obrigado!

 

O MetaEditor fica pendurado quando se tenta compilar um ficheiro anexo

Se não pendurar de imediato, espere um pouco ou vá para a linha de resumo e veja o tempo de compilação

Arquivos anexados:
Test0.mq5  1 kb
 

Porque não mostrar o número de ordem/transacção numa janela pop-up quando se está a pairar com o rato? Pediram-na há mil anos, faltava-a!

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

Tais construções devem ser evitadas. A ordem em que os operandos são executados não é regulada em C++, pelo que cabe ao compilador individual decidir. As excepções são os operadores && e ||, onde os operandos são sempre executados da esquerda para a direita.

 
Alexey Navoykov:

Tais construções devem ser evitadas. A ordem em que os operandos são executados em C++ não está regulamentada, pelo que cabe ao compilador individual decidir. As excepções são && e || operadores, onde os operandos são sempre executados da esquerda para a direita.

Bem, nós estamos em MQL!

 
fxsaber:

Bem, nós estamos em MQL!

Em parte alguma da documentação diz algo específico sobre qualquer encomenda em particular. Assim, podem alterá-lo como acharem melhor a qualquer momento.

Já contactei uma vez o Service-desk para esclarecer esta questão.

 

Olá. Pode dizer-me que funções podem ser utilizadas para obter a lista de indicadores apresentada no gráfico e os seus parâmetros? Só encontrei uma função que devolve o número de indicadores no gráfico

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

Olá. Pode dizer-me que funções podem ser utilizadas para obter a lista de indicadores apresentada no gráfico e os seus parâmetros? Só encontrei a função que devolve o número de indicadores no gráfico

IndicadorParametros (+ IndicadorLançamento)

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

Emparte alguma da documentação diz algo específico sobre qualquer encomenda em particular. Assim, podem alterá-lo como acharem melhor a qualquer momento.

Não me preocupo com isso. Há muitas coisas que não estão aí descritas.

Fora do topo da minha cabeça

  • Classificar os registos do histórico comercial por tempo em MT4/5.
  • Possibilidade de inicializar a variável global/estática por função - é relativamente nova.
  • Directivas de pré-processador que se fixam numa linha - em breve serão, no entanto, desactivadas.
  • Execução de operandos da esquerda para a direita.
  • OrderSend está 99% sincronizado com o ambiente comercial.
  • GráficoAplicarTemplate é assíncrono.
  • E há muitas outras subtilezas indocumentadas. E depois há casos em que a documentação não corresponde à realidade. E isto não é um insecto, mas um insecto raro que simplesmente não é mencionado.

O precedente foi uma rejeição de fundição, mas havia ali uma razão.

Portanto, não utilizar algo só porque não está descrito é uma decisão questionável.


Penso que tal código não causaria dúvidas aos programadores.

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

No entanto, não é muito agradável. Faz sentido escrever MyCopyBuffer mas é feio mostrar num código curto que se precisa dele para evitar um bug. Por isso, a utilização da prioridade de execução sem documentos é apenas uma forma correcta de mostrar que esta é uma solução temporária.

Razão: