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

 
Valeriy Yastremskiy #:

ZZZY substituindo o valor de zero antes do turno, perdemos o valor do índice zero.

Esse é exatamente o meu ponto!

 
Valeriy Yastremskiy #:

O que é um buffer de anel em um µl

Algo como

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

ou mesmo

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

Algo parecido.

ou mesmo

deslocamento do índice na matriz em µl. Embora deva funcionar. E, a propósito, o peso do ciclo de deslocamento índice (que é um ciclo) e o ciclo de atribuição não devem diferir muito.

 
Vitaly Muzichenko #:

Como usar isto, você pode me mostrar?

Aqui está a tarefa.

Aqui está o código acabado, mas o laço é um pouco assustador

---

Novamente, há um loop dentro do ArrayCopy() e provavelmente mais de um. Portanto, o código dificilmente se tornará mais simples e rápido devido a esta substituição.

Neste código, você deve especificar uma matriz

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

de qual índice escrever e a partir do qual copiar depende da direção da mudança de matriz. Assim, se quisermos que o índice 0 contenha sempre dados novos e frescos, devemos copiar do 0 e escrever 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...

 
Por favor, me informe sobre a função de desagregação para os fatos do dia-a-dia.
//+----------------------------------------------------------------------------+
//|Определение пробоя дневного фрактала вверх                                  |
//+----------------------------------------------------------------------------+
int BreakdownSignalUpD1()
  {
   int sig=-1;
   double resistD1 = GetNearestUpFractal(PERIOD_D1);
   if (resistD1 < Ask)
     sig=0;
   if (resistD1 >= Ask)
     sig=1;  
   return(sig);
  }

E aqui está a função que mostra a avaria na tela

ObjectCreate("signal100",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("signal100",OBJPROP_XDISTANCE,600);
   ObjectSet("signal00",OBJPROP_YDISTANCE, 40);
   ObjectSetText("signal100",DoubleToString(BreakdownSignalUpD1(),0),18,"Times New Roman", clrRed);

Você pode me dizer como fazer a tela mostrar não 0 ou 1, mas 0 é "SIM" 1 é "NÃO".

Obrigado

 
EVGENII SHELIPOV #:
Por favor, me informe sobre a função de desagregação para os fatos do dia-a-dia.

E aqui está a função que mostra a avaria na tela

Você pode me dizer como fazer a tela mostrar não 0 ou 1, mas 0 é "SIM" 1 é "NÃO".

Obrigado

string boolToStr(bool value) { return ((value) ? "true" : "false"); }
 
EVGENII SHELIPOV #:
Por favor, diga-me qual é a função de desagregação do factal diurno.

E aqui está a função que mostra a avaria na tela

Você pode me dizer como fazer a tela mostrar não 0 ou 1, mas 0 é "SIM" 1 é "NÃO".

Obrigado

ObjectSetText("signal100",BreakdownSignalUpD1()==0?"Да":"Нет",18,"Times New Roman", clrRed);

Algo parecido com isto.

 
JRandomTrader #:

Algo parecido com isso.

Obrigado

 
Alexey Viktorov #:

Neste código, você precisa especificar uma matriz

qual índice escrever e qual índice copiar depende da direção de offset da matriz. Isto é, se o índice 0 deve sempre conter dados novos e frescos, então 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...

Vou tentar.

---

No total, meu código funciona com sucesso, já se passou mais de uma hora


 
Vitaly Muzichenko #:


Esta é a melhor maneira de fazê-lo.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
    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);
}
Razão: