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

 
Vitaly Muzichenko #:

Vamos ter um exemplo, será sobre o tema

um código a ser atualizado

Não funcionará neste código porque o buffer indicador vive independentemente de nós e nós não organizamos um buffer de anel nele - não há como explicar esta MT.

 
Mihail Matkovskij #:

Com o ArrayCopy, você só pode transferir dados de outro array. Mas não se pode deslocá-los.

Quem lhe disse esse disparate?

Leia atentamente como isso é feito.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta de novatos sobre MQL4 e MQL5, qualquer ajuda e discussão sobre algoritmos e códigos

Alexey Viktorov, 2022.02.13 18:21

Neste código, você precisa especificar uma matriz

int  ArrayCopy(
   void&        dst_array[],         // куда копируем
   const void&  src_array[],         // откуда копируем
   int          dst_start=0,         // с какого индекса пишем в приемник
   int          src_start=0,         // с какого индекса копируем из источника
   int          count=WHOLE_ARRAY    // сколько элементов
   );

Qual índice escrever e de qual copiar depende da direção de offset da matriz. Portanto, se o índice 0 deve sempre conter dados novos e frescos, copie a partir do 0 e escreva a partir do 1. Assim, os valores nos índices 0 e 1 serão idênticos, e depois um novo valor será copiado para 0.

E eu duvido muito que o ArrayCopy() tenha o mesmo loop dentro do usuário. Assim, tendo alguma matriz com um determinado tamanho, ela é deslocada por 1 em cada tick e depois copiada para o buffer indicador que é exibido como uma linha...


 
JRandomTrader #:

Não funcionará neste código porque o buffer indicador vive independentemente de nós e nós não organizamos um buffer de anel nele - não há como explicar esta MT.

Estou vendo.

Bem, funciona - deixe funcionar até agora, sem resultado ainda, devemos esperar por nossos "amigos" de Pindos até a abertura do mercado, e não é tão cedo.

Vou ver o que posso arbitrar.

 
JRandomTrader #:

ou mesmo

E ninguém notou a junta!

static int head=0;
for(i=head,count=0;count<ArraySize(A);count++)
  {
   -if(++i>=ArraySize(A))i=0;
   DoSomething(A[i]);
   +if(++i>=ArraySize(A))i=0;
  }
 
JRandomTrader #:

E ninguém notou a junta!

Eu ainda não vejo isso.

 
Vitaly Muzichenko #:

Ainda não vejo.

deve ser incrementado no final do laço, após o uso.

Mas você também pode verificar se a matriz está ultrapassada no final do loop e no início do próximo.

 
Alexey Viktorov #:

Quem lhe disse tais disparates?

Leia atentamente como isso é feito.


Eu não sabia que esta função era tão universal. Mas mesmo que seja, que diferença isso faz? O ArrayCopy mudará os dados mais rapidamente do que um loop normal?

 
Vitaly Muzichenko #:

O código está funcionando agora, mas há dúvidas sobre a velocidade por causa do ciclo.

O que será?

Quero testar algumas cozinhas para a possibilidade de arbitragem, o indicador irá desenhar a diferença de valores, funciona no timer uma vez em 100ms. Os atrasos na execução do código são críticos para esta situação.

Então eu não sei. Experimente o ArrayCopy. A função parece ser capaz de mudar os dados. Mas dificilmente o fará mais rápido do que um loop habitual. Bem, quem sabe... Você tem que experimentar.

 
Mihail Matkovskij #:

Então eu não sei. Experimente o ArrayCopy. A função parece ser capaz de mudar os dados. Mas é improvável que o faça mais rápido do que um loop normal. Bem, quem sabe... Você tem que experimentar.

Eu não sei por onde começar

 
Vitaly Muzichenko #:

Eu não sei por onde começar.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 H=100;
  double b, a;
  if(prev_calculated==0) {
    ArrayInitialize(Buffer1,EMPTY_VALUE);
    ArrayInitialize(Buffer2,EMPTY_VALUE);
  }

  b=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  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) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
    ArrayCopy(Buffer1, Buffer1, 1, 0, H);
    ArrayCopy(Buffer2, Buffer2, 1, 0, H);
  }
  // записываем новые данные
  Buffer1[0]=b;
  Buffer2[0]=a;
  return(rates_total);
}

É suposto funcionar. Confira.

P.S. E, por favor, escreva a variação de velocidade com a função ArrayCopy. Eu mesmo gostaria de saber.

Razão: