Indicatore Domanda

 

Ciao a tutti,

Stavo imparando alcuni argomenti generali sugli array da un indicatore di base del codice che ha iFractals con un grande aiuto dai guru nei forum.


Quindi, in ogni caso

Non sono riuscito ad aggiungere operatori condizionali o operazioni logiche per aggiungere la funzione di addizione all'indicatore

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[1000];
double v2[1000];
double v3[1000];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0)
         {        
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Ho provato a inserire if(faster > slower) in varie aree del codice solo per giocare con l'idea. Normalmente queste idee funzionerebbero in un EA ma non in un indicatore

IE if(v1 > 0 && faster > slower)

ma questo fa scomparire l'indicatore.

Molte altre combinazioni che ho pensato dovrebbero produrre l'indicatore desiderato if(altre condizioni) ecc e così via.
Tutte non producono alcun output di dichiarazione di stampa.

Quale punto mi manca qui.

Si prega di consigliare
Grazie





 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar:


Bene, l'ho fatto all'inizio ma poi non ho potuto stampare i valori del buffer che volevo fare

Beh, aspetta, lascia che lo ripeta:

Se non dichiaro il numero di elementi nel buffer, allora l'indicatore funzionerà come con v1[i]=High[i]
Ma Print (v1[i]); non uscirà perché da quello che posso dire non c'è modo di stampare valori di array non dichiarati se il numero di elementi non è stato dichiarato, quindi stamperà sempre 0

Quindi se non lo dichiaro globalmente, allora l'indicatore funziona, tuttavia il if(faster>slower) fa ancora scomparire l'indicatore, E non posso nemmeno stampare i valori.

Se lo dichiaro e reinizializzo nuovamente con v1[i]=High[i] allora posso stampare, tuttavia qualsiasi aggiunta come && faster > slower rimuove nuovamente l'indicatore.

Non capisco completamente perché.

Grazie
 

Ho preso il tuo codice, ho tolto i valori dalle dichiarazioni del buffer e funziona bene.

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if


 
RaptorUK:

Ho preso il tuo codice, ho tolto i valori dalle dichiarazioni del buffer e funziona bene.

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if <----High

------> in questo momento Fractals inconsistente High è inferiore al prev Low <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if <----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if<----High

------> in questo momento Frattali incoerente High è inferiore al prev Low <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if<----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if<----High

------> in questo momento si alternano frattali coerenti <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if <----Low
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if <----High


Interessante, grazie per il risultato Agent86V2. I frattali sono davvero uno di quei modi intriganti ma redditizi di fare trading.

 
RaptorUK:

Ho preso il tuo codice, ho tolto i valori dalle dichiarazioni del buffer e funziona bene.

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if


Posso anche stampare il codice senza produrre valori zero che non era il caso nell'altro thread.
Mi dispiace, ma non riesco a capire. Pensavo di averlo fatto, ma sembra che mi manchi ancora qualcosa.

int start()
   {
   double test[];
   
   test[39] = 45.6;
   Print("test[39]= ",test[39] );
   

      return(0);
   }
Mi avete istruito a dichiarare come sopra:

E hai citato questo argomento:

Quando hai letto il libro sugli array hai visto dove dice questo?

"Quando si dichiara un array, il tipo di dati, il nome dell'array e il numero di elementi di ogni dimensione devono essere specificati:"

Quindi da un lato non posso stampare l'array come in questo script senza dichiarare prima double test[40]; come mi hai detto, ma ora mi sembra di poter stampare anche senza dichiarazione.

Quindi sembra che io possa stampare i valori nel buffer indipendentemente dalla dichiarazione.

Tuttavia, non posso aggiungere condizioni aggiuntive che normalmente produrrebbero il risultato desiderato come if(faster > slower) o && faster > slower
Può essere EMA qualsiasi cosa voglio solo capire perché non funziona.
Fa scomparire i massimi dell'indicatore e l'output di stampa v1 smette di stampare. Mi aspettavo che cadesse in linea con la condizione e stampasse l'output.

Ho provato ad aggiungere ulteriori blocchi di codice per questo anche con gli stessi risultati.

Grazie
 

Ho anche scritto questo . . .

RaptorUK:

I buffer dell'indicatore sono Array speciali . . . non confondere Array e Buffer, sono simili ma diversi.

Nel codice originale v1[] e v2[] sono buffer, nel tuo ultimo codice sono Array, quando dichiari un Array devi dargli una dimensione, per esempio, v1[50] ha 50 elementi da v1[0] a v1[49]. Il Buffer si ridimensiona automaticamente quando ci sono più elementi necessari e i valori si spostano automaticamente nel Buffer. Considerate la barra attualmente in formazione, la barra 0, quando questa barra si completa un valore dell'indicatore associato a quella barra deve spostarsi all'indice 1 . . . questo viene fatto automaticamente con i Buffer . . se volete fare qualcosa di simile con gli Array potete farlo, ma dovete codificarlo voi stessi.

 
Agent86:

Tuttavia, non posso aggiungere condizioni aggiuntive che normalmente produrrebbero il risultato desiderato come if(faster > slower) o && faster > slower
Può essere EMA qualsiasi cosa voglio solo capire perché non funziona.
Fa scomparire i massimi dell'indicatore e l'output di stampa v1 smette di stampare. Mi aspettavo che cadesse in linea con la condizione e stampasse l'output.

Ho provato ad aggiungere ulteriori blocchi di codice per questo anche con gli stessi risultati.

Grazie

Mostra il tuo codice, la roba che non funziona . . . Non uso indicatori tecnici. . . mai, quindi non dare per scontato che io sappia cosa intendi con EMAs, ecc ;-) devi mostrarmi il tuo codice.
 
RaptorUK:

Ho anche scritto questo . . .

RaptorUK:

I buffer dell'indicatore sono Array speciali . . . non confondere Array e Buffer, sono simili ma diversi.

Nel codice originale v1[] e v2[] sono buffer, nel tuo ultimo codice sono Array, quando dichiari un Array devi dargli una dimensione, per esempio, v1[50] ha 50 elementi da v1[0] a v1[49]. Il Buffer si ridimensiona automaticamente quando ci sono più elementi necessari e i valori si spostano automaticamente nel Buffer. Considerate la barra che si sta formando, la barra 0, quando questa barra si completa un valore dell'indicatore associato a quella barra deve spostarsi all'indice 1 . . . questo viene fatto automaticamente con i Buffer . . se volete fare qualcosa di simile con gli Array potete, ma dovete codificarlo voi stessi.

Vero. "Simili ma diversi". Non vedo altri modi migliori per dirlo, se non questo.
 
Ok, simile ma diverso ho capito, inizialmente ho avuto grossi problemi anche a stampare v1[i] in qualsiasi punto del codice, ma ora sembra stampare come mi aspettavo in origine.
Ho solo creato un ciclo secondario perché non ero in grado di stampare all'interno del primo ciclo indicatore, ma ora sta stampando
In ogni caso non voglio rimaneggiare questo, penso di averlo capito.

Quindi il codice che non funzionerà sono alcuni esempi mostrati qui:

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Grazie

 
Agent86:

Quindi il codice che non funzionerà sono alcuni esempi mostrati qui:

Grazie

Ok, posso dirti qual è il tuo problema o posso darti degli indizi. . . . indizi prima, se vuoi che te lo dica basta dirlo e te lo dirò. .

All'interno del Loop, for(i=Bars; i>=0; i--) . . quali sono i valori per faster e slower?

Motivazione: