MT4 iMAOnArray e iBandsOnArray efeito do número de elementos nos cálculos - página 3

 
Alexey Viktorov:

Não, Vladimir. É um pouco errado.

Neste caso, você deve aplicar o ArraySetAsSeries(array, false); a um array de trezentos elementos entre os quais iMAOnArray() é considerado. Mas é melhor usarmos CopyOpen() em vez do laço de enchimento da matriz.

Segundo entendi, nesta variante será melhor

A forma como a tarefa foi definida, foi assim que eu a demonstrei. O resultado foi muito bom. E então você mesmo :)
 
Alexey Viktorov:

Não, Vladimir. É um pouco errado.

Neste caso, você deve aplicar o ArraySetAsSeries(array, false); a um array de trezentos elementos entre os quais iMAOnArray() é considerado. Mas é melhor usarmos CopyOpen() em vez do laço de enchimento da matriz.

Segundo entendi, nesta variante será melhor

Então me mostre a variante "funcional" do código, o código fonte do original está aqui, você está tentando cortá-lo para 12 elementos em vez dos trezentos solicitados, e deve eventualmente resultar em 3 buffers indicadores com os dados especificados, de modo que pelo menos 300 elementos sejam exibidos no porão, E então, quando uma nova barra chegar, respectivamente, 301 e então o valor será sorteado, mas não esqueça que neste caso, se você usar 0 como limite para o cálculo, somente a nova barra será recalculada, e o tipo de média (suavização) para o segundo buffer não é necessariamente SMA, e pode ser qualquer um dos 4 disponíveis.
 
Sergey Efimenko:

Esta é a questão. Se eu não precisar calcular o conjunto completo, mas apenas os últimos N elementos.

Não entendo bem a lógica de calcular estas funções quando se trata de limitar. Eu tenho uma matriz de séries temporais (um dos buffers indicadores), se eu deixar o número de elementos igual a 0, sem perguntas, tudo é contado e calculado, mas se eu diminuir o número de elementos envolvidos no cálculo pelos mesmos turnos, eu recebo apenas os primários. Simplesmente falando, há uma matriz de 5000 elementos (barras no gráfico), para economizar tempo preciso calcular apenas os últimos 300, mas quando especifiquei o valor 300 no segundo parâmetro, obtive 5000-4700 elementos primários, mas no offset 300-0, e outros valores em uma chamada não mudam. Qual é a vantagem de usar este parâmetro?

O inferno sabe. Basta esquecer. Se você precisar acelerar os cálculos, reduza o número de itens sendo calculados em seu laço.

if(prev_calculated==0)limit=300; else ...; 

Uma de duas coisas: ou é impossível ou você precisa de alguma combinação secreta de séries cronológicas, não de séries cronológicas, instruções de cálculo.

 
Dmitry Fedoseev:

Foda-se, sabe. Basta esquecer. Se você quiser acelerar os cálculos, reduza o número de elementos a serem calculados em seu ciclo.

Uma de duas coisas: ou é impossível ou você precisa de alguma combinação secreta de séries temporais, não de séries temporais, direção do cálculo.

Sim, como já escrevi um pouco antes, há apenas uma possibilidade - usar seus próprios análogos das funções acima, que podem ser usados para calcular pelo menos um elemento.

O paradoxo da situação é que se fizermos um modelo similar, sobrepondo a média ou as barras de bollinger em qualquer indicador (linha de preço), não haverá tal lentidão no cálculo inicial de todas as barras do histórico, como ao usar estas funções no código, ao reiniciar o terminal ou ao trocar o TF, então não está claro, o que leva tanto tempo para ser calculado nestas funções.

 
Dmitry Fedoseev:

Foda-se, sabe. Basta esquecer. Se você quiser acelerar os cálculos, reduza o número de elementos a serem calculados em seu ciclo.

Uma de duas coisas: ou é impossível ou você precisa de alguma combinação secreta de séries cronológicas, não de séries cronológicas, instruções de cálculo.

Também usei tal construção.

if (limit > 300)limit=300;

A propósito,"MovingAverages.mqh" é duas vezes mais rápido que"iMAOnArray", mesmo a versão antiga.

https://www.mql5.com/ru/forum/79988

Использование MovingAverages.mqh в MQL4
Использование MovingAverages.mqh в MQL4
  • www.mql5.com
При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же.
 
Sergey Efimenko:

Sim, como escrevi um pouco antes, existe apenas uma opção - utilizar nossos próprios análogos das funções mencionadas, onde é possível calcular pelo menos um elemento.

O paradoxo da situação é que se fizermos um modelo semelhante anexando as faixas MA e Bollinger a qualquer indicador (linha de preço), não veremos tanta lentidão no cálculo inicial de todas as barras do histórico, como ao usar estas funções no código, ao reiniciar o terminal ou ao trocar o TF, então não está claro o que leva tanto tempo para calcular nestas funções.

Está diminuindo a velocidade mesmo quando se usa o iMAOnArray? Não deveria haver tal coisa. Como você estava, houve uma desaceleração da StdOnArray (ou BandsOnArray, não me lembro) os desenvolvedores não admitiram a existência do bug por um longo tempo. Então, de repente, ele foi consertado e funcionou rapidamente. Quem sabe, talvez o bug tenha voltado. Se o iMAOnArray() também causa lentidão perceptível, é um bug. Parece que houve conversas sobre isso há alguns meses. Mas ainda está lá, aparentemente.

 
Dmitry Fedoseev:

A desaceleração mesmo com o uso do iMAOnArray? Não deveria ser assim. Como em algum momento, houve uma desaceleração da StdOnArray, os desenvolvedores não reconheceram o bug por muito tempo. Então, de repente, eles a consertaram e funcionou rapidamente. Quem sabe, talvez o bug tenha voltado. Se o iMAOnArray() também causa lentidão perceptível, é um bug. Parece que houve conversas sobre isso há alguns meses. Mas ainda está lá, aparentemente.

É difícil julgar se "abranda muito" ou se é aceitável, porque tudo depende do comprimento do gráfico (número de barras), o senão é que para otimização só precisamos calcular um pouco, mas limitar o comprimento do cálculo na verdade é impossível.
 
Sergey Efimenko:
É difícil julgar se é muito lento ou não, porque tudo depende do comprimento do gráfico (número de barras), o problema é que para otimização você só precisa calcular um pouco, e não pode limitar o comprimento do cálculo pelo cálculo real.
Faça o cálculo emMovingAverages.mqh e é muito rápido.
 
forexman77:
Faça o cálculo comMovingAverages.mqh e ele será calculado muito rapidamente.
E esta biblioteca calcula corretamente, se você definir o cálculo não de toda a matriz, mas apenas de sua última parte (valores atuais)? Além disso, é apenas a metade do problema, mas e o iBandsOnArray?
 
Sergey Efimenko:
Então me mostre a variante "funcional" do código, o código original está aqui, que você está tentando reduzir para 12 elementos exibidos em vez dos trezentos solicitados por mim, e deve terminar com 3 buffers indicadores com os dados especificados, de modo que pelo menos 300 elementos foram exibidos no porão, E então, quando uma nova barra chegar, respectivamente, 301 e então o valor será sorteado, mas não esqueça que neste caso, se você usar 0 como limite para o cálculo, somente a nova barra será recalculada, e o tipo de média (suavização) para o segundo buffer não é necessariamente SMA, e pode ser qualquer um dos 4 disponíveis.

Aqui está.

//+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   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[])
{
   int i, limit;
   limit = rates_total-prev_calculated-1;
   double buffer[];

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
       ArrayCopy(buffer, Buffer, 0, i, 12);
      BufferMA[i] = iMAOnArray(buffer, 300, 12, 0, MODE_SMA, 0);
      BufferBMA[i] = iBandsOnArray(buffer, 300, 12, 2.0, 0, MODE_UPPER, 0);
      int x=0;
     }
   return(rates_total);
}
//+------------------------------------------------------------------+