Come estrarre solo i punti di svolta in basso estratti dall'indicatore zigzag? - pagina 2

 
jackprobe:

Ciao deVries,

grazie. Sì, è come l'immagine che hai mandato. Ma voglio sapere come codificarlo. Deve calcolare ogni gamba precedente Zigzag, e poi disegnare il livello di Fibonacci, in modo da sapere quanto è la corrente / ultimo zigzag va.

modifica: ho inviato il codice sul post precedente. Non avrebbe disegnato la linea fibo ...

Grazie



Puoi mostrarmi come ottieni con questo indicatore i valori 0,0 e 100,0?
 
deVries:

Puoi mostrarmi come ottieni con questo indicatore i valori 0.0 e 100.0?

L'ho fatto manualmente usando MT4 fibo retracement tools ..... :) Voglio effettivamente come quell'immagine, ma ancora non so come codificare.

A proposito di iCustom, dovrei chiamarlo come questo qui sotto (chiamando il tuo file TopBottomZigzag.ex4)?

double top[i] = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,2,i);
double bottom[i] = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,1,i);

Grazie

 
jackprobe:

L'ho fatto manualmente usando MT4 fibo retracement tools ..... :) Voglio effettivamente come quell'immagine, ma ancora non so come codificare.

A proposito di iCustom, dovrei chiamarlo come questo qui sotto (chiamando il tuo file TopBottomZigzag.ex4)?

Grazie


no che sono i buffer sbagliati e devi trovare il valore di i a quale barra la parte superiore o inferiore sarà

Se lo confronto con la versione che ho postato in CodeBase vedo Zigzag con linea ai minimi e linea ai massimi

//+------------------------------------------------------------------+
//|                                              ZigZag practise.mq4 |
//|                                Copyright © 2012, Tjipke de Vries |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Tjipke de Vries"
#property link      ""

//---- input parameters  ZigZag
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

double P0,P1,P2,P3,P4,P5;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

   call_zigzag();


   subPrintDetails();
//----
   return(0); 

  }
//+------------------------------------------------------------------+

//----------------------- PRINT COMMENT FUNCTION
void subPrintDetails()
{
   string sComment   = "";
   string sp         = "----------------------------------------\n";
   string NL         = "\n";


       
   sComment = "ZigZag practise           Copyright © 2012, Tjipke" + NL;
   sComment = sComment + NL;
   sComment = sComment + "P0 " + DoubleToStr(P0,Digits) + NL;
   sComment = sComment + "P1 " + DoubleToStr(P1,Digits) + NL;
   sComment = sComment + "P2 " + DoubleToStr(P2,Digits) + NL;
   sComment = sComment + "P3 " + DoubleToStr(P3,Digits) + NL;
   sComment = sComment + "P4 " + DoubleToStr(P4,Digits) + NL;
   sComment = sComment + "P5 " + DoubleToStr(P5,Digits) + NL;            
   sComment = sComment + "Buffervalue 0  ZigZag " + NL;


   Comment(sComment);
}
//+------------------------------------------------------------------+

void call_zigzag ()
{
//This function calls the custom indicator zigzag and returns it´s values. THE INDICATOR ZIGZAG MUST BE IN THE FOLDER C:\...\MetaTrader 4\experts\indicators AND MUST BE NAMED "zigzag"!!!!
   int n, i = 0;
      while(n<6)
      {
      if(P0>0) {P5=P4; P4=P3; P3=P2; P2=P1; P1=P0; }
      P0=iCustom(Symbol(),0,"zigzag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
      if(P0>0) {n+=1; }
      i++;
      }
}

questo è come ho fatto con lo zigzag normale prima di creare l'indicatore di questo topic

vedi se trovi la logica

.

(modificare il post per dare il link versione corretta si trova in CodeBase)

 
deVries:


no, sono i buffer sbagliati e devi trovare il valore di i in quale barra sarà il top o il bottom

se lo confronto con la versione che ho postato in CodeBase vedo Zigzag con linea ai minimi e linea ai massimi

questo è come ho fatto con zigzag normale prima di creare l'indicatore di questo argomento

vedi se trovi la logica

.

(modificare il post per dare il link versione corretta si trova in CodeBase)


Ciao deVries,

Grazie per il link. Ho appena provato ad usare iCustom per chiamare il tuo indicatore che ho chiamato "TopBottomZigzag.ex4". Il risultato è ottimo. Questa volta la linea Fibo è creata dal codice ... :)

Non riesco ancora a fare il Fibo della gamba ZZ precedente .... :( Disegna sempre e solo l'ultima gamba ZZ. E inoltre non posso ancora definire la lunghezza della linea di livello Fibo ...

Grazie per il tuo bel codice ....

- jackprobe

//+------------------------------------------------------------------+
//|                                                       zzFibo.mq4 |
//|                        based on "TopBottomZigzag.mq4" by deVries |
//|                                            edited by : Jackprobe |
//+------------------------------------------------------------------+

#property copyright "deVries & Jackprobe"
#property link      "https://forum.mql4.com/54660"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_width1 2
#property indicator_color2 DeepPink
#property indicator_width2 2

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
 
//---- indicator buffers
double UpBuffer[];
double DnBuffer[];
int    jmlTitik=0;
double prevPrc=0;
int    topCandle=0, bottomCandle=0;
string myObjName = "myZZFibo";
double objWidth = 1.0;
double objStyle = 2.0;
color  objLevelColor = Aqua;
color  objColor = Gold;

//+------------------------------------------------------------------+
//| INIT() Function                                                  |
//+------------------------------------------------------------------+
int init()  {
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,indicator_color1); 
   SetIndexBuffer(0,UpBuffer);
   SetIndexArrow(0,221);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,indicator_color2); 
   SetIndexBuffer(1,DnBuffer);
   SetIndexArrow(1,222);
   string short_name;
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   short_name="TopBottomZZFibo";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"Up");
   SetIndexLabel(1,"Dn");
   SetIndexEmptyValue(0,EMPTY_VALUE);
   SetIndexEmptyValue(1,EMPTY_VALUE);   
   return(0);
}

//+------------------------------------------------------------------+
//| DEINIT() Function                                                |
//+------------------------------------------------------------------+
int deinit() {
   ObjectDelete(myObjName);
}

//+------------------------------------------------------------------+
//| START() Function                                                 |
//+------------------------------------------------------------------+
int start() {
   int  shift, counted_bars=IndicatorCounted(),limit;
   double topPrc=0, bottomPrc=0;      
   if ( counted_bars > 0 )  limit=Bars-counted_bars;
   if ( counted_bars < 0 )  return(0);
   if ( counted_bars ==0 )  limit=Bars-1; 
   if ( counted_bars < 1 ) 
   
   for(shift=limit;shift>=0;shift--)  { 
      topPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,2,shift);
      bottomPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,1,shift);
      
      if ((topPrc>0)&&(topPrc!=EMPTY_VALUE)) {
         DnBuffer[shift]= topPrc + 0.0003;
         jmlTitik++;
         ObjectDelete(myObjName);
           ObjectCreate(myObjName, OBJ_FIBO, 0, Time[bottomCandle], prevPrc, Time[shift], topPrc);
         ObjectSet(myObjName, OBJPROP_LEVELWIDTH, objWidth);
         ObjectSet(myObjName, OBJPROP_LEVELSTYLE, objStyle); 
         ObjectSet(myObjName, OBJPROP_LEVELCOLOR, objLevelColor); 
         ObjectSet(myObjName, OBJPROP_COLOR, objColor);
         //-- ganz unten
         prevPrc = topPrc;
         topCandle = shift;
      }
      else if ((bottomPrc>0)&&(bottomPrc!=EMPTY_VALUE)) {
         UpBuffer[shift]= bottomPrc - 0.0003;         
         jmlTitik++;
         ObjectDelete(myObjName);
         ObjectCreate(myObjName, OBJ_FIBO, 0, Time[topCandle], prevPrc, Time[shift], bottomPrc);
         ObjectSet(myObjName, OBJPROP_LEVELWIDTH, objWidth);
         ObjectSet(myObjName, OBJPROP_LEVELSTYLE, objStyle); 
         ObjectSet(myObjName, OBJPROP_LEVELCOLOR, objLevelColor); 
         ObjectSet(myObjName, OBJPROP_COLOR, objColor);
         //-- ganz unten
         prevPrc = bottomPrc;
         bottomCandle = shift;
      }
   }       
   //----
        return(0);      
}
 

domani vado avanti

questa parte

   for(shift=limit;shift>=0;shift--)  { 
      topPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,2,shift);
      bottomPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,1,shift);

deve essere cambiata

 

se si guarda alla tua immagine si vede fibonnacci è solo disegnare a livelli di ultimi 2 punti Zigzag

il tuo problema è "non può fare il Fibo della gamba ZZ precedente .... :( Disegna sempre e solo l'ultima gamba ZZ. E inoltre non può ancora definire la lunghezza della linea del livello Fibo ..."

Quindi devi controllare cosa sta facendo il tuo codice e come arriva al risultato che hai ora

.

vogliamo sapere cosa sta facendo il tuo codice in questa parte

  for(shift=limit;shift>=0;shift--)  { 
      topPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,2,shift);
      bottomPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,1,shift);
      
      if ((topPrc>0)&&(topPrc!=EMPTY_VALUE)) {
         DnBuffer[shift]= topPrc + 0.0003;
         jmlTitik++;
         ObjectDelete(myObjName);
           ObjectCreate(myObjName, OBJ_FIBO, 0, Time[bottomCandle], prevPrc, Time[shift], topPrc);
         ObjectSet(myObjName, OBJPROP_LEVELWIDTH, objWidth);
         ObjectSet(myObjName, OBJPROP_LEVELSTYLE, objStyle); 
         ObjectSet(myObjName, OBJPROP_LEVELCOLOR, objLevelColor); 
         ObjectSet(myObjName, OBJPROP_COLOR, objColor);
         //-- ganz unten
         prevPrc = topPrc;
         topCandle = shift;
      }
      else if ((bottomPrc>0)&&(bottomPrc!=EMPTY_VALUE)) {
         UpBuffer[shift]= bottomPrc - 0.0003;         
         jmlTitik++;
         ObjectDelete(myObjName);
         ObjectCreate(myObjName, OBJ_FIBO, 0, Time[topCandle], prevPrc, Time[shift], bottomPrc);
         ObjectSet(myObjName, OBJPROP_LEVELWIDTH, objWidth);
         ObjectSet(myObjName, OBJPROP_LEVELSTYLE, objStyle); 
         ObjectSet(myObjName, OBJPROP_LEVELCOLOR, objLevelColor); 
         ObjectSet(myObjName, OBJPROP_COLOR, objColor);
         //-- ganz unten
         prevPrc = bottomPrc;
         bottomCandle = shift;
      }
   }       

iniziando con alcune dichiarazioni di stampa dobbiamo scoprire cosa sta succedendo

for(shift=limit;shift>=0;shift--)  
      { 
      topPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,2,shift);
      bottomPrc = iCustom(Symbol(),0,"TopBottomZigzag",ExtDepth,ExtDeviation,ExtBackstep,1,shift);
//..
      Print("topPrc  =  ",topPrc,"  bottomPrc  =  ",bottomPrc);
//.....
      }

cosa vedi che succede?

 

Ciao deVries,

Io uso Alert invece di Print. Se la candela all'interno della gamba (non alla fine o all'inizio della gamba), non possiamo prendere il prezzo. Ma alla fine della gamba, possiamo vedere il prezzo (vedi la freccia rossa e verde sul grafico). Quindi, penso che iCustom può essere utilizzato, ma c'è una codifica sbagliata, e io ancora non so dove sia ...

edit: forse devo usare Array / Buffer per tenere tutte le informazioni fine punto zigzag (prezzo di fine punto Zz & numero candela di fine punto Zz & numero di fine punto Zz accurance). Forse devo usare un array 3x1 di tipo = doppio, o semplicemente usare un array 1x1 di tipo stringa (ma prima devo "concatenare" tutte le informazioni del punto di fine zigzag) ????


for(shift=limit;shift>=0;shift--)  {    
      topPrc = iCustom(Symbol(),0,"topBottomZZ-2",ExtDepth,ExtDeviation,ExtBackstep,2,shift);
      bottomPrc = iCustom(Symbol(),0,"topBottomZZ-2",ExtDepth,ExtDeviation,ExtBackstep,1,shift);
      
      Alert("topPrc  =  ",topPrc,"  bottomPrc  =  ",bottomPrc, " candle=", shift);
      
      if ((topPrc>0)&&(topPrc!=EMPTY_VALUE)) {
         Alert("Inside first If: topPrc  =  ",topPrc,"  bottomPrc  =  ",bottomPrc, " candle=", shift);
         DnBuffer[shift]= topPrc + 0.0003;
         jmlTitik++;
         ObjectDelete(myObjName);
         ObjectCreate(myObjName, OBJ_FIBO, 0, Time[bottomCandle], prevPrc, Time[shift], topPrc);
         ObjectSet(myObjName, OBJPROP_LEVELWIDTH, objWidth);
         ObjectSet(myObjName, OBJPROP_LEVELSTYLE, objStyle); 
         ObjectSet(myObjName, OBJPROP_LEVELCOLOR, objLevelColor); 
         ObjectSet(myObjName, OBJPROP_COLOR, objColor);
         //-- ganz unten
         prevPrc = topPrc;
         topCandle = shift;
      }
      else if ((bottomPrc>0)&&(bottomPrc!=EMPTY_VALUE)) {
         Alert("Inside second If: topPrc  =  ",topPrc,"  bottomPrc  =  ",bottomPrc, " candle=", shift);
         UpBuffer[shift]= bottomPrc - 0.0003;         
         jmlTitik++;
         ObjectDelete(myObjName);
         ObjectCreate(myObjName, OBJ_FIBO, 0, Time[topCandle], prevPrc, Time[shift], bottomPrc);
         ObjectSet(myObjName, OBJPROP_LEVELWIDTH, objWidth);
         ObjectSet(myObjName, OBJPROP_LEVELSTYLE, objStyle); 
         ObjectSet(myObjName, OBJPROP_LEVELCOLOR, objLevelColor); 
         ObjectSet(myObjName, OBJPROP_COLOR, objColor);
         //-- ganz unten
         prevPrc = bottomPrc;
         bottomCandle = shift;
      }
   }       
 

Ciao deVries,

Sì, hai ragione. Se provo a prendere il valore, e metterlo in Array, il risultato è sempre 0 (zero) ....
Ancora non capisco, perché può visualizzare la freccia (rappresentare la fine di ZZ), ma come provo a metterlo in array, il risultato è zero ...?

Grazie


     if ((topPrc>0)&&(topPrc!=EMPTY_VALUE)) {
         /// Alert("Inside first If: topPrc  =  ",topPrc,"  bottomPrc  =  ",bottomPrc, " candle=", shift);
         DnBuffer[shift]= topPrc + 0.0003;        
         resPrice[jmlTitik] = topPrc;
         resCandle[jmlTitik] = shift;
         resPos[jmlTitik] = 1;
         Alert("1 LastPrice =", resPrice[jmlTitik]);
         Alert("1 LastCandle =", resCandle[jmlTitik]);
         Alert("1 LastPos =", resPos[jmlTitik]);
         //-- ganz unten
         jmlTitik++;
         prevPrc = topPrc;
         topCandle = shift;
      }
 

utilizzare l'indicatore di codebase allora il codice deve essere

//   if ( counted_bars < 1 ) 
   
   for(shift=limit;shift>=0;shift--)  { 
      topPrc = iCustom(Symbol(),0,"Zigzag_with_line_at_lows_and_line_at_highs",ExtDepth,ExtDeviation,ExtBackstep,3,shift);
      bottomPrc = iCustom(Symbol(),0,"Zigzag_with_line_at_lows_and_line_at_highs",ExtDepth,ExtDeviation,ExtBackstep,4,shift);
      
      
       Print("topPrc  =  ",topPrc,"  bottomPrc  =  ",bottomPrc);
      
     }/* 

testando questo sul grafico vedrete stampato (con allert inutile)

2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  1.0298  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  1.0286
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  1.0297  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
2013.10.20 20:48:00     zzFibo USDCAD,M5: topPrc  =  0  bottomPrc  =  0
//....  this is not all

ogni tick lo calcoli di nuovo rimuovi più volte gli oggetti e metti di nuovo nuovi oggetti fino ad arrivare all'ultimo calcolo != 0

cosa sta facendo il codice che ho dato

//+------------------------------------------------------------------+
//|                                              ZigZag practise.mq4 |
//|                                Copyright © 2012, Tjipke de Vries |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Tjipke de Vries"
#property link      ""

//---- input parameters  ZigZag
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

double P0,P1,P2,P3,P4,P5;


//....  you find it in a post above
 
Grazie deVries. lo proverò ...