Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1899

 
JRandomTrader um buffer circular, lembrando a posição atual do primeiro elemento?

Que idéia brilhante! Quem o inventou e qual é sua aplicação prática? Duvido que seja usado exclusivamente para gráficos de janelas deslizantes.

 
Mihail Matkovskij #:

Que idéia brilhante! Quem o inventou e qual é sua aplicação prática? Duvido que seja usado exclusivamente para gráficos de janelas deslizantes.

É verdade, não é descabido saber a quantidade de dados que se pode retroceder. Porque este buffer circular está "pisando nos próprios pés", devido ao seu comprimento limitado.

 
Mihail Matkovskij #:
Esta é a melhor maneira de fazê-lo.

Verifiquei, sim, é uma boa solução - estou mantendo-a.

Mas eu ainda gostaria de verificar se oArrayCopy funciona

---

Decidi fazer desta maneira, porque não é legal arrancar o gráfico:

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_label1  "Bid"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_label2  "Ask"

double Buffer1[];
double Buffer2[];
int H;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
{
  SetIndexBuffer(0,Buffer1);
  ArraySetAsSeries(Buffer1,true);
  SetIndexBuffer(1,Buffer2);
  ArraySetAsSeries(Buffer2,true);
  ArrayInitialize(Buffer1,EMPTY_VALUE);
  ArrayInitialize(Buffer2,EMPTY_VALUE);
  IndicatorSetInteger(INDICATOR_DIGITS,Digits());
  IndicatorSetString(INDICATOR_SHORTNAME,"Tick:");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
{
  H=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
  if(prev_calculated==0) {
    ArrayInitialize(Buffer1,EMPTY_VALUE);
    ArrayInitialize(Buffer2,EMPTY_VALUE);
  }

  double b=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  double a=SymbolInfoDouble(Symbol(),SYMBOL_ASK);

  if(rates_total-prev_calculated==1) {
    Buffer1[H+1]=EMPTY_VALUE;
    Buffer2[H+1]=EMPTY_VALUE;
  } else if(rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
    for(int j=H; j>0; j--) {
      Buffer1[j]=Buffer1[j-1];
      Buffer2[j]=Buffer2[j-1];
    }
  }
// записываем новые данные
  Buffer1[0]=b;
  Buffer2[0]=a;
  return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
{
  if(id==CHARTEVENT_CHART_CHANGE) {
    H=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    int B=Bars(Symbol(),0);
    for(int j=H; j<B; j++) {
      Buffer1[j]=EMPTY_VALUE;
      Buffer2[j]=EMPTY_VALUE;
    }
  }
}
//+------------------------------------------------------------------+
 
JRandomTrader um buffer de anel, lembrando-se da posição atual do primeiro elemento?

No exemplo da Vitali, você pode usar esta idéia. Mas não há maneira de evitar o loop (que é crítico para ele). Em qualquer caso, temos que transferir os dados do buffer de anéis para o buffer indicador usando o loop ou a função ArrayCopy. E o que vai mudar?

 
Mihail Matkovskij #:

Que idéia brilhante! Quem o inventou e qual é sua aplicação prática? Duvido que seja usado exclusivamente para gráficos de janelas deslizantes.

Quem a inventou - sem fim à vista, acho que ela foi reinventada muitas vezes, a idéia é bastante óbvia.

Eu, por exemplo, a utilizo para calcular a média móvel dos dados que não estão armazenados no histórico, mas que só tem um valor instantâneo.

Isto tem sido usado na transmissão de dados desde tempos imemoráveis.

 
Mihail Matkovskij #:

No exemplo da Vitali, você pode usar esta idéia. Mas não há maneira de evitar o loop (que é crítico para ele). Em qualquer caso, temos que transferir os dados do buffer de anéis para o buffer indicador usando o loop ou a função ArrayCopy. E o que seria diferente?

Que um novo valor possa ser inserido e imediatamente copiado do local desejado. O ciclo de cópia permanece, mas não há ciclo de turno.

 
Vitaly Muzichenko #:

Verifiquei, sim, é uma boa solução - estou mantendo-a.

Mas eu ainda gostaria de verificar como oArrayCopy funciona.

Com o ArrayCopy, você só pode transferir dados de outro array. Mas não se pode deslocá-los. Você pode usar um buffer de anéis e transferir dados a partir dele... Mas como você pode fazer isso com oArrayCopy se ele tem um movimento circular. Eu não entendo. E, em princípio, isso não precisa ser entendido. O deslocamento habitual usando um laço não é tão crítico em termos de velocidade. Pelo menos, eu não sei mais rápido. O que pode ser mais rápido, apenas montador? De qualquer forma, deixe as coisas como estão. Funcionará.

 
JRandomTrader #:

Que um novo valor possa ser inserido e copiado imediatamente do local correto. O ciclo de cópia permanece, mas não há ciclo de turno.

Vamos dar um exemplo, seria no

O código para atualização é

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2022.02.13
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Mihail Matkovskij #:

Com o ArrayCopy, você só pode transferir dados de outro array. Mas não é possível deslocá-las. Você pode usar um buffer circular e transferir dados a partir dele... Mas como fazê-lo com oArrayCopy se ele tem um movimento circular... Eu não entendo. E, em princípio, isso não precisa ser entendido. O deslocamento habitual usando um laço não é tão crítico em termos de velocidade. Pelo menos, eu não sei mais rápido. O que poderia ser mais rápido, montador? De qualquer forma, deixe as coisas como estão. Vai funcionar.

Neste momento o código funciona, mas a velocidade é questionável por causa do loop.

O que vai ser?

Eu quero testar algumas cozinhas para a capacidade de arbitragem, o indicador irá desenhar a diferença de valores, funciona com um timer uma vez a cada 100ms. Os atrasos na execução do código são críticos para esta situação.

 
JRandomTrader #:

Isto tem sido usado na transmissão de dados desde tempos imemoráveis.

Conveniente. Você não pode discordar disso. Mas como disse antes, deve-se sempre considerar a quantidade de dados que se pode reverter.