Livelli di Fibonacci in MQL4

 
Buongiorno a tutti, ho una domanda - quando si crea un oggetto Fibonacci Levels, è possibile fare in modo che ogni livello abbia un colore diverso, e come posso assegnare un valore di segnale a un EA per ogni livello? Grazie in anticipo! Cordialmente, Eugene!
 
è meglio calcolare i loro valori direttamente nell'EA
 

È così che la funzione può essere prescritta? Ma il colore non cambia ai singoli livelli, ci può essere un errore da qualche parte o bisogna aggiungere qualcos'altro?

int fibo(datetime X1, double Y1, datetime X2, double Y2)

{

ObjectCreate("Fibo", OBJ_FIBO, 0, 0, 0, 0); // Crea un oggetto dei livelli di Fibonacci

ObjectSet("Fibo",OBJPROP_COLOR,clrRed); // colore della diagonale

//ObjectSet("Fibo",OBJPROP_LEVELCOLOR,clrBlue); //il colore dei livelli è lo stesso

//ObjectSetInteger(0, "Fibo",OBJPROP_BACK,true);//--- visualizzare in primo piano (falso) o sullo sfondo (vero)


ObjectSet("Fibo",OBJPROP_FIBOLEVELS,13); //impostare il numero di livelli dell'oggetto


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+0,0.000); //impostare il valore di ogni livello dell'oggetto

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,0,0.000);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,0,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,0,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,0,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",0, "0.000");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+1,0.146);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,1,0.146);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,1,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,1,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,1,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",1, "0.146");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+2,0.236);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,2,0.236);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,2,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,2,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,2,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",2, "0.236");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+3,0.382);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,3,0.382);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,3,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,3,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,3,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",3, "0.382");



ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+4,0.5);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,4,0.5);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,4,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,4,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,4,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",4, "0.5");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+5,0.618);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,5,0.618);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,5,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,5,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,5,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",5, "0.618");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+6,0.764);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,6,0.764);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,6,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,6,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,6,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",6, "0.764");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+7,1);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,7,1);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,7,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,7,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,7,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",7, "1");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+8,1.236);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,8,1.236);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,8,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,8,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,8,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",8, "1,236");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+9,1.618);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,9,1.618);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,9,clrGreen); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,9,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,9,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",9, "1.618");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+10,-0.236);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,10,-0.236);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,10,clrBlue); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,10,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,10,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",10,"-0.236");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+11,-0.618);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,11,-0.618);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,11,clrBlue); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,11,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,11,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",11,"-0.618");


ObjectSet("Fibo",OBJPROP_FIRSTLEVEL+12,-1);

ObjectSetDouble(0, "Fibo",OBJPROP_LEVELVALUE,12,-1);

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELCOLOR,12,clrBlue); // colore del livello

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELSTYLE,12,STYLE_SOLID);//Linea

ObjectSetInteger(0, "Fibo",OBJPROP_LEVELWIDTH,12,1); //--- spessore del livello

ObjectSetFiboDescription("Fibo",12,"-1");


ObjectMove("Fibo", 1, X1, Y1);

ObjectMove("Fibo",0, X2, Y2);

ritorno(0);

}


 
int fFiboLevels(string Prefix,int Number
              ,int Bar1,double Price1
              ,int Bar2,double Price2
              ,int Bar3,double Price3
              ,color Цвет,color ЦветОтката
              ,int Видимость=0,int Толщина=1
              ,int УровнейПродолжения=6,int УровнейОтката=5
              ,int Стиль=STYLE_SOLID,int СтильУровня=STYLE_DOT
              ,bool Луч=false,bool Фон=false){
   int Error;
   string Name;
   datetime Time1=Time[Bar1],
            Time2=Time[Bar2],
            Time3=Time[Bar3];
   if( Bar1<=Bar2 || Bar2<=Bar3 || Bar3<1
    || Price1<Zero || Price2<Zero || Price3<Zero
    || Price3-MathMax(Price1,Price2)>Zero
    || MathMin(Price1,Price2)-Price3>Zero ) return(MyError);
   Name=Prefix+"Targets ";
   if( Number>0 ) Name=Name+Number;
   if( ObjectFind(Name)>=0 ) {
      if( !ObjectDelete(Name) ) {
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("***** "+Name+" не создан, ошибка удаления "+Error);
         return(Error);
   }  }
   if( ObjectCreate(Name,OBJ_EXPANSION,0,Time1,Price1,Time2,Price2,Time3,Price3) ){
      if( !ObjectSet(Name, OBJPROP_FIBOLEVELS, УровнейПродолжения)
       || !ObjectSet(Name, OBJPROP_COLOR, Цвет)
       || !ObjectSet(Name, OBJPROP_STYLE, Стиль)
       || !ObjectSet(Name, OBJPROP_WIDTH, Толщина)
       || !ObjectSet(Name, OBJPROP_TIMEFRAMES, Видимость)
       || !ObjectSet(Name, OBJPROP_LEVELCOLOR, Цвет)
       || !ObjectSet(Name, OBJPROP_LEVELSTYLE, СтильУровня)
       || !ObjectSet(Name, OBJPROP_RAY, Луч)
       || !ObjectSet(Name, OBJPROP_BACK, Фон)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+0, 1)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+1, 1.618)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+2, 2.618)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+3, 4.236)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+4, 6.854)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+5, 11.09) ){
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("****  "+Name+" - ошибка модификации параметров "+Error);
   }  }
   else {
      Error=GetLastError();
      PlaySound("alert.wav");
      Print("***** "+Name+" не создан, ошибка "+Error);
   }
   Name=Prefix+"Recoils ";
   if( Number>0 ) Name=Name+Number;
   if( ObjectFind(Name)>=0 ) {
      if( !ObjectDelete(Name) ) {
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("***** "+Name+" не создан, ошибка удаления "+Error);
         return(Error);
   }  }
   if( ObjectCreate(Name,OBJ_FIBO,0,Time1,Price1,Time2,Price2) ){
      if( !ObjectSet(Name, OBJPROP_FIBOLEVELS, УровнейОтката)
       || !ObjectSet(Name, OBJPROP_COLOR, Цвет)
       || !ObjectSet(Name, OBJPROP_STYLE, Стиль)
       || !ObjectSet(Name, OBJPROP_TIMEFRAMES, Видимость)
       || !ObjectSet(Name, OBJPROP_LEVELCOLOR, ЦветОтката)
       || !ObjectSet(Name, OBJPROP_LEVELSTYLE, СтильУровня)
       || !ObjectSet(Name, OBJPROP_RAY, false)
       || !ObjectSet(Name, OBJPROP_BACK, Фон)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+0, 0)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+1, 0.236)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+2, 0.382)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+3, 0.618)
       || !ObjectSet(Name, OBJPROP_FIRSTLEVEL+4, 1) ){
         Error=GetLastError();
         PlaySound("alert.wav");
         Print("****  "+Name+" - ошибка модификации параметров "+Error);
   }  }
   else {
      Error=GetLastError();
      PlaySound("alert.wav");
      Print("***** "+Name+" не создан, ошибка "+Error);
   }
   return(Error);
}
 
jekk:

È così che la funzione può essere prescritta? Ma il colore non cambia nei singoli livelli, ci può essere un errore da qualche parte o c'è qualcos'altro da aggiungere?

Stai cercando un indicatore o un Expert Advisor? Se lo state usando per un Expert Advisor, allora il calcolo dei valori di questi livelli sarà sufficiente.

 
Per l'EA - voglio capire quale funzione può essere utilizzata per separare ogni livello per assegnare un valore di segnale? L'idea di ZigZag è quella di trovare le coordinate - l'EA disegna i livelli di Fibonacci e da ogni livello (ad una distanza leggermente più lunga dello spread) facciamo un passo indietro e assegniamo più livelli paralleli - li prendiamo come base per prendere decisioni per aprire un ordine.
 
jekk:
Per l'EA - voglio capire quale funzione può essere utilizzata per separare ogni livello per assegnare un valore di segnale? La mia idea per ZigZag è di trovare delle coordinate - l'Expert Advisor disegna i livelli di Fibonacci e da ogni livello (a una distanza un po' più lunga dello spread) facciamo un passo indietro e stabiliamo dei livelli paralleli - li prendiamo come base per le decisioni di aprire l'ordine.

Per OBJ_FIBO, il colore è lo stesso per tutti i livelli. Se siete davvero disperati, disegnate semplici OBJ_TRENDLINE in diversi colori.
 
jekk:
Per l'EA - voglio capire quale funzione può essere utilizzata per separare ogni livello per assegnare un valore di segnale? La mia idea per ZigZag è quella di trovare delle coordinate - l'EA disegna i livelli di Fibonacci e da ogni livello (ad una distanza un po' più lunga dello spread) facciamo un passo indietro e impostiamo dei livelli paralleli - li prendiamo come base per prendere decisioni sull'apertura di un ordine.

Non è necessario separare nulla, basta prendere la formula e calcolare ogni livello direttamente nell'EA, lavorare con i valori ottenuti, perché avete bisogno di colori e linee?
 
evillive:

Stai cercando un indicatore o un EA? Se per un EA, allora basta calcolare i valori di questi livelli, non c'è bisogno di alcuna bellezza o colore.

La parte visiva dovrebbe essere sempre presente per renderla chiara (almeno all'inizio)
 
evillive:

Non hai bisogno di separare nulla, prendi la formula e calcoli ogni livello direttamente nell'EA, lavori con i valori ottenuti, perché hai bisogno di colori e linee?

Oh, come è fatta la formula, posso mostrarvi un esempio?
 
jekk:

Ah, come è fatta la formula, posso mostrarvi un esempio?

Beh, è difficile chiamarla formula: prendiamo i prezzi minimi e massimi - 0% e 100%, e li dividiamo per i livelli, e i loro valori sono scritti ovunque - 23,6%, 38,2%, 50%, 61,8%, 161,8% (o 0,236, 0,382, 0,5, 0,618, 1,618, ecc. diviso 0,618, arrotondato a 3 cifre).

per i prezzi di 1,3254 e 1,3896 qualcosa del genere:

direttoinvertire
161,80% Livello: 1.42930,0% Livello:1.3896
100,0% Livello: 1.389623,60% Livello:1.3744
61,8% Livello: 1.365138,2% Livello:1.3651
50,0% Livello: 1.357550,0% Livello:1.3575
38,2% Livello: 1.349961,8% Livello:1.3499
23,6% Livello:
1.3406100,0% Livello:1.3254
0,0% Livello: 1.3254161,8% Livello: 1.2857


Cioè, (Prezzo(100%)-Prezzo(0%))*Livello(in migliaia) + Prezzo(0%) per il calcolo a termine e Prezzo(100%) - (Prezzo(100%)-Prezzo(0%)) * Livello (in migliaia) - per il calcolo inverso.

Per ogni valore, una linea separata può essere disegnata con qualsiasi colore della tavolozza di vostra scelta.