Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 589

 
Alexey Viktorov:

1. Ho detto controllare, non sostituire. iFractals restituisce 0 se non c'è nessun frattale. Non lo uso regolarmente e naturalmente non intaso i resti non secchi della memoria con queste banalità.

2. La funzione, anche se scritta in modo orribile, funziona ancora correttamente.

3. L'ultimo valore viene visualizzato in Comment. Sostituiscilo con.

e vedere quante volte viene stampato

Molti, ma mai falsi. Come se la condizione fosse sempre soddisfatta. Ma dovrebbe essere falso.

 
Ghabo:

Molto, ma mai falso. È come se la condizione fosse sempre soddisfatta. Ma dovrebbe essere falso, nello screenshot, la situazione contraddice la condizione, ma vero.


Nello screenshot il primo frattale e il secondo sono contrassegnati. Ma secondo la condizione la funzione cerca ulteriormente finché non trova quello sotto il primo. E il quarto frattale è più basso del primo... Che è quello che dice la condizione.

Se la condizione è completata con

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

Verrà stampato anche falso.

 
Alexey Viktorov:

Il primo frattale e il secondo frattale sono contrassegnati nello screenshot. Ma secondo la condizione, la funzione cerca ulteriormente finché non trova quello sotto il primo. E il quarto frattale è più basso del primo... Che è quello che dice la condizione.

Se la condizione è aggiunta

Verrà stampato anche falso.

Invertire la condizione
 if(fr2>fr1) return(true);
        else break;

Stampa falso, ma la condizione è soddisfatta.

aqa1

 

Il secondo ciclo restituisce sempre il prezzo del frattale trovato nel primo 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:

Il secondo ciclo restituisce sempre il prezzo del frattale trovato nel primo ciclo.

Sembra che lei abbia un problema con la logica.

Prova a descrivere l'ordine di ricerca con parole semplici. Pensate se avete scritto tutto correttamente. E poi fare una funzione di ricerca che restituisca il prezzo del frattale trovato in base al suo numero di serie. Non appena lo fai, e ti restituisce il prezzo corretto per il frattale che hai specificato con il suo numero di sequenza, inizia a fare la logica per trovare il prezzo del prossimo frattale (avrai già una funzione che ti restituisce il suo prezzo in quel momento). E poi non resta che confrontare questi prezzi.

E si fa un mucchio di tutto in una volta.

 

Forse ho capito male come funziona?

Per prima cosa trovo un frattale, il primo sopra la MA - (segnato #1 nello screenshot),

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;}
         
        }
     }

Guardo da esso, più in là nella storia, il primo frattale (segnato #2 nello screenshot). Se il frattale n. 2 è maggiore del frattale n. 1, restituisco true.

      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;
        }
     }

È tutto corretto?

aq11

 
Artyom Trishkin:

restituirà il prezzo del frattale trovato in base al suo numero di sequenza.

Non per numero, cerco per condizione che il frattale sia sopra il MA, il numero ordinale può essere qualsiasi. Il prezzo di questo frattale nel primo ciclo è scritto correttamente nella variabile "fr1".

Il problema è nel secondo ciclo, se ho capito bene ovviamente. Non è chiaro perché non si trovi il prezzo del frattale numero 2.

 
Ghabo:

Non per numero, cerco per condizione che il frattale sia sopra la MA, il numero ordinale può essere qualsiasi. Il prezzo di questo frattale nel primo ciclo è scritto correttamente nella variabile "fr1".

Il problema è nel secondo ciclo, se ho capito bene ovviamente. Non capisco perché non si possa trovare il prezzo del frattale numero 2.

Devo raccontarvi tutta la logica. C'è qualcosa che ti viene in mente da solo?

1. Nel primo ciclo, troviamo il frattale sopra il MA. Il numero della barra è scritto nella variabile num_bar (barra #11 nello screenshot).

2. Nel secondo ciclo iniziamo a cercare il secondo frattale che soddisfa la condizione. Iniziamo la ricerca da num_bar... cioè dalla barra #11 perché nf è zero.

3. Il frattale viene trovato. Il valore è uguale al precedente. La condizione non sarà soddisfatta perché la condizione contiene > allora < ma non uguale. Se impostiamo ==, si verificherà la stessa baggianata, ma dall'altra parte.

Probabilmente, dovremmo cercare il secondo frattale dalla prossima barra num_bar+1 o anche +2.

 
Alexey Viktorov:

Tutta la logica deve essere raccontata a voi. C'è qualcosa che ti viene in mente da solo?

1. Nel primo ciclo troviamo un frattale sopra il MA. Il numero della barra è scritto nella variabile num_bar (barra #11 nello screenshot).

2. Nel secondo ciclo, inizia la ricerca del secondo frattale che soddisfa la condizione. Iniziamo la ricerca dalla barra dei numeri... cioè dalla barra #11 perché nf è uguale a zero.

3. Il frattale viene trovato. Il valore è uguale al precedente. La condizione non sarà soddisfatta, perché nella condizione > allora < ma non uguale. Se ci mettiamo ==, la stessa spazzatura si verificherà ma dall'altra parte.

Probabilmente, dovremmo cercare il secondo frattale della prossima barra num_bar+1 o anche +2.

In generale, l'azione nei primi due paragrafi, l'ho espressa).

Per "num_bar+1" grazie.

Non riesco a trovare il minimo.

La condizione non è soddisfatta, la freccia è impostata, soddisfatta non è impostata.

La condizione è la seguente: se la distanza dal minimo della candela attraversata dalla MA al minimodel iLowest è maggiore o uguale a 100, metto la freccia.

   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];
        }
      //
     }

Da B ad A trovo il minimo di C.

A-C=100 pip al punto B, dovrebbe mettere la freccia.

Perché non lo fa?

basso1

 
Ghabo:

In generale, le azioni nei primi due paragrafi, l'ho detto)

Un po' sbagliato sul secondo punto. Non avete definito da dove cominciamo a cercare e quando otterremo quale valore. Ed è questo che ti fa pensare che dovresti cercare un po' più lontano.

Ghabo:

Il minimo non può essere trovato.

La condizione non è soddisfatta, la freccia è impostata, la condizione non è soddisfatta.

La condizione è che se la distanza dal minimo della candela ha attraversato il MA al minimo del iLowest è maggiore o uguale a 100 tra gli incroci di prezzo e il MA, metto la freccia.

Da B ad A trovo il minimo di C.

A-C=100 pip al punto B, dovrebbe mettere la freccia.

Perché non lo mette?

C'è qualcosa in questo codice che è difficile da afferrare anche la logica.

Come minimo abbiamo bisogno di sapere dove e come sono definite le variabili indexS1 e indexS2 e se sono resettate ad ogni tick.

E cosa succederà se l'attraversamento di МА viene catturato in uno spazio vuoto?


E un'altra domanda: sapete come usare il debugger?

Motivazione: