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

 
Alexey Viktorov:

1. Eu disse verificar, não substituir. iFractals retorna 0 se não houver fractal. Não o uso regularmente e, naturalmente, não entupo os restos não secos da memória com tais trivialidades.

2. A função, embora horrivelmente escrita, ainda funciona corretamente.

3. O último valor é exibido em Comentário. Substitua-o por.

e ver quantas vezes imprime

Muita coisa, mas nunca falsa. Como se a condição estivesse sempre preenchida. Mas deveria ser falso.

 
Ghabo:

Muita coisa, mas nunca falsa. É como se a condição estivesse sempre preenchida. Mas deveria ser falso, na imagem da tela, a situação contradiz a condição, mas é verdadeira.


Na imagem da tela, o primeiro fractal e o segundo fractal estão marcados. Mas, de acordo com a condição, a função procura ainda mais até encontrar a que está abaixo da primeira. E o quarto fractal é mais baixo que o primeiro. Que é o que diz a condição.

Se a condição for complementada com

      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1)
         return(true);
          else break;
        }

Também imprimirá falso.

 
Alexey Viktorov:

O primeiro fractal e o segundo fractal estão marcados na captura de tela. Mas, de acordo com a condição, a função procura ainda mais até encontrar a que está abaixo da primeira. E o quarto fractal é mais baixo que o primeiro. Que é o que diz a condição.

Se a condição for adicionada

Também imprimirá falso.

Inverteu a condição
 if(fr2>fr1) return(true);
        else break;

As impressões são falsas, mas a condição é cumprida.

aqa1

 

O segundo ciclo sempre retorna o preço do fractal encontrado no primeiro ciclo.

   for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        return(NormalizeDouble(fr2, d));
        //if(fr2>fr1) return(true);
        //else break;
        }
     }
 
Ghabo:

O segundo ciclo sempre retorna o preço do fractal encontrado no primeiro ciclo.

Você parece ter um problema de lógica.

Tente descrever a ordem de busca em palavras simples. Pense se você escreveu tudo corretamente. E então faça uma função de busca que retornará o preço de um fractal encontrado por seu número de série. Assim que você fizer isso, e devolver o preço correto para o fractal especificado por seu número de seqüência, comece a fazer a lógica para encontrar o preço do próximo fractal (você já terá uma função que devolve seu preço naquele momento). E então tudo o que resta é comparar esses preços.

E você faz um monte de tudo de uma só vez.

 

Talvez eu tenha entendido mal como funciona?

Primeiro encontro um fractal, o primeiro acima do MA - (marcado com o número 1 na captura de tela),

int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=EMPTY_VALUE) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }

Eu olho a partir dela, mais além na história, o primeiro fractal (marcado com o nº 2 na captura de tela). Se o fractal nº 2 for maior que o fractal nº 1, eu retorno verdadeiro.

      for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        if(fr2>fr1) return(true);
        else break;
        }
     }

Está tudo correto?

aq11

 
Artyom Trishkin:

retornará o preço do fractal encontrado por seu número de seqüência.

Não por número, eu procuro por condição que o fractal esteja acima do MA, o número ordinal pode ser qualquer. O preço deste fractal no primeiro laço está escrito corretamente na variável "fr1".

O problema está na segunda etapa, se eu entendi corretamente, é claro. O motivo pelo qual o preço do fractal número 2 não é encontrado não é claro.

 
Ghabo:

Não por número, procuro por condição que o fractal esteja acima do MA, o número ordinal pode ser qualquer. O preço deste fractal no primeiro ciclo está escrito corretamente na variável "fr1".

O problema está na segunda etapa, se eu entendi corretamente, é claro. Não entendo porque o preço do fractal número 2 não pode ser encontrado.

Tenho que recontar toda a lógica para você. Há alguma coisa em que você possa pensar por conta própria?

1. Na primeira etapa, encontramos o fractal acima do MA. O número da barra é escrito na variável num_bar (barra #11 na captura de tela).

2. Na segunda etapa, começamos a procurar o segundo fractal que satisfaça a condição. Começamos a procurar a partir de num_bar... ou seja, da barra nº 11 porque nf é zero.

3. O fractal é encontrado. O valor é igual ao anterior. A condição não será cumprida, pois a condição contém > então < mas não é igual. Se definirmos ==, ocorrerá a mesma algaraviada, mas do outro lado.

Provavelmente, devemos procurar o segundo fractal a partir da próxima barra num_bar+1 ou mesmo +2.

 
Alexey Viktorov:

Toda a lógica tem que ser recontada para você. Há alguma coisa em que você possa pensar por conta própria?

1. No primeiro ciclo, encontramos um fractal acima do MA. O número da barra é escrito na variável num_bar (barra #11 na captura de tela).

2. Na segunda etapa, comece a procurar o segundo fractal que satisfaça a condição. Começamos a procurar a partir da barra num_bar... ou seja, da barra nº 11 porque nf é igual a zero.

3. O fractal é encontrado. O valor é igual ao anterior. A condição não será cumprida, porque na condição > então < mas não igual. Se definirmos ==, o mesmo lixo ocorrerá, mas do outro lado.

Provavelmente, devemos procurar o segundo fractal a partir da próxima barra num_bar+1 ou mesmo +2.

Em geral, a ação nos dois primeiros parágrafos, eu a expressei).

Por "num_bar+1", obrigado.

Não consigo encontrar o mínimo.

A condição não está preenchida, a seta está definida, o cumprimento não está definido.

A condição é a seguinte: se a distância do mínimo da vela cruzada pelo MA até o mínimodo iLowest for maior ou igual a 100, eu coloco a seta.

   if(limit>60)limit=60;
   for(int i=limit; i>0; i--)
     {
      M11=iMA(NULL,0,period,shift_,method,price,i+1);
      if(open[i+1]>M11 && close[i+1]<M11){time_1=time[i+1];}

      indexS1=iBarShift(NULL,PERIOD_CURRENT,time_1,false);

      if(open[i+1]<M11 && close[i+1]>M11){time_2=time[i+1];}

      indexS2=iBarShift(NULL,PERIOD_CURRENT,time_2,false);

      //
      double val=0;
      //--- расчет минимального значения цены на indexS1 последовательных барах 
      //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
      int val_index=iLowest(NULL,0,MODE_LOW,indexS1,i+indexS2);
      if(val_index!=-1) val=Low[val_index];
      else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());

      if(low[indexS1]-val>=100*Point)
        {
        BufferPointDn1[i]=high[i];
        }
      //
     }

De B a A eu encontro o mínimo de C.

A-C=100 pips no ponto B, deve colocar a seta.

Por que não?

baixo1

 
Ghabo:

Em geral, as ações dos dois primeiros parágrafos, eu disse isso)

Um pouco errado sobre o segundo ponto. Você ainda não definiu onde começamos a procurar e quando obteremos que valor. E isto é o que o faz pensar que você deve procurar um pouco mais longe.

Ghabo:

O mínimo não pode ser encontrado.

A condição não é cumprida, a flecha é colocada, a condição não é cumprida.

A condição é que se a distância do mínimo da vela cruzou o MA até o mínimo do iLowest for maior ou igual a 100 entre o cruzamento de preços e o MA, eu coloco a seta.

De B a A eu encontro o mínimo de C.

A-C=100 pips no ponto B, deve colocar a seta.

Por que não o coloca?

Há algo neste código que também é difícil de entender a lógica.

No mínimo, precisamos saber onde e como as variáveis indexS1 e indexS2 são definidas e se elas são redefinidas a cada tick.

E o que acontecerá se a travessia МА ficar presa em uma fenda?


E mais uma pergunta: você sabe como usar o depurador?

Razão: