Erros, bugs, perguntas - página 1124

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  struct ARGB
  {
    uchar blue;
    uchar green;
    uchar red;
    uchar alpha;
  };
  
  struct N
  {
    uint num;
  };
  
  N n={100288};
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
Embora ambas as estruturas tenham o mesmo tamanho e se copiam uma na outra sem perdas, ainda recebemos um aviso.
 
Fleder:
Embora ambas as estruturas tenham o mesmo tamanho e se copiam uma na outra sem perdas, ainda recebemos um aviso.
Bem, isso é óptimo. Não é assim tão difícil fazer um elenco óbvio. Mas não é tão agradável tentar descobrir o que foi atribuído quando ocorrem bugs.
 
TheXpert:
Portanto, isso é óptimo. Não é assim tão difícil fazer uma casta óbvia. E descobrir onde atribuir o quê quando os insectos começam a rastejar não é muito agradável.
Parece ser o lema do compilador: "Mais vale prevenir do que remediar"!
 

Cópia da candidatura para SR:

Capacidade de autodescarregar séries temporais da RAM de volta à cache *.hc
Erros, MetaTrader 5 MQL, Aberto, Iniciado: 2014.04.12 06:04, #995430

Versão terminal e bit

910 32 bit

Descrição do problema

Olá, caros programadores!

Na MQL5 várias funções do sistema, tais comoCopyRates,CopyTime,CopyOpen, etc., destinam-se a receber dados de séries cronológicas.

Quando se chama qualquer uma destas funções, as séries de tempos solicitadas são carregadas para a RAM dentro do parâmetro "Max barras no gráfico".

No entanto, a combinação de factores tais como:

1. Histórico suficientemente profundo disponível no símbolo ou totalmente carregado a partir do servidor.

2. O parâmetro "Max bars in chart" é "Unlimited".

3. São solicitados dados do menor período de tempo M1.

Uma quantidade muito grande de memória está a ser consumida.

O problema é exacerbado pelo facto de a lógica do programa que executa MQL5 (por exemplo, se for um Expert Advisor com várias moedas ou um indicador)

podem ser estabelecidos para o acesso alternativo a dados de baixo nível de prazos de vários símbolos (por exemplo, pesquisa única).

Como resultado, o consumo de RAM aumenta muitas vezes.

Получение данных нужного таймфрейма из промежуточных данных

Os ficheiros de serviço no formato HCC desempenham o papel da fonte de dados para construir os dados de preços pelos prazos solicitados no formato HC. Os dados no formato HC são séries cronológicas que são preparadas ao máximo para um acesso rápido. São criados apenas a pedido de um gráfico ou programa mql5 no volume que não exceda o parâmetro "Max barras nos gráficos", e são guardados para posterior utilização em ficheiros com a extensão hc.

Para poupar recursos, os dados sobre o período de tempo são carregados e armazenados na RAM apenas quando necessário.Em caso de ausência prolongada de pedidos, os dados são descarregados da RAM, sendo guardados num ficheiro. Os dados para cada período de tempo são preparados independentemente dos dados prontos para outros períodos de tempo. As regras para a preparação e disponibilidade de dados são as mesmas para todos os prazos. Ou seja, apesar de a unidade de armazenamento de dados no formato HCC ser a barra de minutos, a disponibilidade dos dados no formato HCC não significa a disponibilidade e acessibilidade dos dados no formato HC para o período de tempo M1 no mesmo volume.

A recepção de novos dados do servidor provoca a actualização automática dos dados de preços usados em formato HC para todos os períodos de tempo e o recálculo de todos os indicadores, que os utilizam explicitamente como dados de entrada para cálculo.

O tempo do processo destacado em amarelo na citação citada da documentação é bastante grande: cerca de meia hora (as minhas observações).

Como resultado, todas as séries de tempos solicitadas "amontoam-se" em "RAM" sem qualquer razão.

Se a "RAM" não for "borracha E o "voraz" Expert Advisor/indicador necessita cada vez mais de séries temporais, o terminal não tem mais nada a fazer

excepto para um "despejo" urgente de séries de tempos em excesso de volta ao ficheiro (cache). Assim, nesta reposição de emergência, o terminal pode repor as séries cronológicas para

um "cache partido", ou seja, perderá "uma boa metade" dos dados. E da próxima vez que esta série temporal for acedida, o terminal carrega esta "cache quebrada" como uma cache normal.

Como resultado, o gráfico terminal exibe as séries temporais necessárias com um enorme buraco na história.

Resultado esperado

A linguagem MQL5 tende a poupar recursos do ambiente de execução. Um exemplo disto é o seguinte:

1. a funçãoArrayFree

2. FunçãoresourceFree

3.eliminar operador

4. Parâmetro"barras máximas nos gráficos

É possível adicionar uma função do sistema à funcionalidade da linguagem MQL5 que forçaria o terminal a realizar operações com as séries de tempos que já não são utilizadas?

Se não houver um gráfico aberto com esta série temporal, no final do tempo?

Por exemplo, uma função:

bool SeriesFlush(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   );

Isto permitiria:

1. não se preocupar com o transbordo de RAM.

2. não se preocupe com as "caches partidas" das quais só se pode livrar apagando manualmente os ficheiros *.hc quando o terminal é desligado.

3. não tem de depender do modo bit do seu sistema operativo e do tamanho da memória principal.

4. ao desenvolver um produto de software, não utilizar "muletas" que tentem contornar as desvantagens descritas acima.

 
Fleder:

Cópia da candidatura para SR:

Possibilidade de autodescarregar séries temporais da RAM de volta à cache *.hc
Ora, é uma grande ideia.
 
Pode dizer-me como obter dados de um indicador que tem um viés positivo? Estou interessado em dados sobre -1 barra?
 
dentraf:
Pode dizer-me como obter dados indicadores com uma compensação positiva? Estou interessado em dados sobre -1 barra?

Para o fazer, é necessário conhecer as definições de compensação para a linha indicadora de interesse. Este é um exemplo do indicador técnicodo iAlligator

//--- зададим смещение для каждой линии
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);

Isto é uma compensação, não um cálculo indicador para o futuro.

 

Cópia da candidatura para SD:

Funcionamento incorrecto da função do sistema IsStopped nos indicadores
Erros, MetaTrader 5 MQL, Aberto, Iniciado: 2014.04.12 07:59, #995480

Versão terminal e modo bit

910 32 bit

Descrição do problema

Olá, caros programadores!

Uma das recomendações para melhorar a qualidade do código na concepção de loops com um grande número de iterações

é incorporar a verificação de uma paragem forçada de um programa MQL5 utilizando o sistema

Função do sistemaIsStopped();

Contudo, na prática, esta verificação não funciona em indicadores (funciona em scripts e Expert Advisors)

Aqui está o código curto indicador que mostra a essência do problema:

#property  indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit()
{
  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[])
{
  long n=0;
  for(int i=0;i<1 e+10 && !IsStopped();i++) {n++;}
  Print("OnCalculate End");
  return(rates_total);
}

Se tentar remover este indicador do gráfico, o processo de "calcular o indicador" não irá parar como tal,

embora devesse, por causa da verificação da bandeira de paragem do programa.

Pode descobrir isto facilmente monitorizando o processo terminal.exe no Task Manager. Num processador de quad core

é cerca de 25% da carga de CPU. Além disso, a carga terminal não diminui em nada ao longo do tempo até o

encerramento do terminal. E mesmo após o processo de encerramento do terminal.exe, o processo ainda fica pendurado no gestor. E, parece que sim,

que é descarregado pelo sistema operativo como "pendurado".


Resultado esperado

Por favor, resolva este problema.

 
barabashkakvn:

Para o fazer, é necessário conhecer as definições de compensação para a linha indicadora de interesse. Este é um exemplo do indicador técnicodo iAlligator

Isto é uma compensação, não o cálculo do indicador para o futuro.

Tenho um cálculo futuro, mas utilizo uma compensação para o fazer, como calcular -1 barra do Expert Advisor?

Se alguém precisar, use CopyBuffer(Handle_original,0,-2,10,Data_Ind )

 
dentraf:
Exactamente, tenho um cálculo no futuro, mas para fazer uma compensação, como é que leio -1 barra do Expert Advisor?
Não há citação para -1 barra. O offset é: o cálculo para uma barra que existe (por exemplo, barra número 2) e depois este valor calculado é traçado na barra 2 menos o offset. Ou seja, se o offset for 5, o valor calculado na barra 2 é desenhado na barra "-3".