isNewCandle

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
Rispondi
texcs
Messaggi: 144
Iscritto il: 29/05/2014, 23:08

isNewCandle

Messaggio da texcs »

Codice: Seleziona tutto

bool isNewCandle(){
//TRUE nuova candela
//FALSE vecchia candela

   bool v_isNewCandle = false;
   //se la candela restituita è la 0 è quella già memorizzata
   int v_shift = iBarShift(NULL, 0, g_lastCandleOpenTime, true);
 
   if (v_shift == 0)
      v_isNewCandle = false;
   else{
      v_isNewCandle = true;
      //memorizzo l'orario della nuova candela
      g_lastCandleOpenTime = Time[0];
   }
 
   return (v_isNewCandle);
}

for(int j = 0; j <= limit; j++) 
   {
   
    
      mainnow = iStochastic(NULL,1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,j);
      mainprevious = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,j+1);
      //mainafter = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,j-1);
      
      signalnow = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,j);
      signalprevious = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,j+1);
    //  signalafter = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,j-1);
       
    
      if( isNewCandle() && (mainnow > signalnow));// && (mainprevious < signalprevious) && (mainafter < signalafter) )//&&(signalnow<21)&& (mainnow<21))
       {
        Print(" incrocio Time = " + TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()));
        Print("Valore Main: " + mainnow + "; Valore signal:" + signalnow + Symbol());
        
      /* if(ObjectFind("etichetta") == -1){         
         //DrawAllert("etichetta","incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()),10,10,Green);
         Print("incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime())")
        }
       else{
       }
       } 
   
 return (0);
   }  
Raga in questo programma il problema è questo:
Il print dopo un incrocio viene printato ad ogni "tick"(allego screenshoot) e non come servirebbe a me 1 volta quando si crea la nuova barra dopo l'incrocio come dovrebbe fare visto la funzione "isNewCandle()"che ho messo nell'if.
Ringrazio anticipatamente
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: isNewCandle

Messaggio da carlo10 »

Ciao texcs,

il codice che hai incollato non può compilare.

Manca lo start e c'è sicuramente un errore:

Codice: Seleziona tutto

if( isNewCandle() && (mainnow > signalnow));
Dopo l'if non puoi mettere il punto e virgola.

Credo quindi che il programma che ti sta andando in esecuzione sia una versione precedente a questa (l'ultima che compilava correttamente).
texcs
Messaggi: 144
Iscritto il: 29/05/2014, 23:08

Re: isNewCandle

Messaggio da texcs »

scusa misono confuso il codice è questo:

Codice: Seleziona tutto

extern int       KPeriod1     =  5;
extern int       DPeriod1     =  3;
extern int       Slowing1     =  3;
extern string note3 = "0=sma, 1=ema, 2=smma, 3=lwma";
extern int       MAMethod1    =   0;
extern string note4 = "0=high/low, 1=close/close";
extern int       PriceField1  =   0;

int deinit()
  {
//----
   ClearObjects(); 
   return(0);
  }
void ClearObjects() 
{ 
  for(int i=0;i<ObjectsTotal();i++) 
  { ObjectDelete(ObjectName(i)); i--; } 
}
void DrawAllert(string text, int xdistance, int ydistance, color C=LightGray)
{

         ObjectCreate         ("rect",OBJ_LABEL,0,0,0,0,0);
         ObjectSet            ("rect",OBJPROP_XDISTANCE,xdistance);
         ObjectSet            ("rect",OBJPROP_YDISTANCE,ydistance);
         ObjectSetText ("rect",text,20,"Times New Roman",C);
}
bool NewBar()
{
   static datetime lastbar;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
      
   }
   else
      return(false);
}
int start() {
   int limit;// i, counter;
   double mainnow, signalnow, mainprevious, signalprevious, mainafter, signalafter;
  // double Range, AvgRange;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;
   
   for(int j = 0; j <= limit; j++) 
   {
   
    
      mainnow = iStochastic(NULL,1,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,j);
      mainprevious = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,j+1);
      mainafter = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,0,j-1);
      
      signalnow = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,j);
      signalprevious = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,j+1);
      signalafter = iStochastic(NULL,0,KPeriod1,DPeriod1,Slowing1,MAMethod1,PriceField1,1,j-1);
      
      
      if( NewBar() && (mainnow > signalnow)// && (mainprevious < signalprevious) && (mainafter < signalafter) )//&&(signalnow<21)&& (mainnow<21))
       {
         DrawAllert("incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()),10,10,Green);
         DrawAllert("incrocio 2 Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()),15,15,Green);
       } 
   }
 return (0);
   }  

Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: isNewCandle

Messaggio da carlo10 »

Questa vedo che utilizza la funzione NewBar al posto della isNewCandle.

Prova ad utilizzare la funzione isNewCandle come illustrato qui:

https://metatrader-forex-trading.blogsp ... la-in.html

In questo modo non dovrebbe darti problemi.
texcs
Messaggi: 144
Iscritto il: 29/05/2014, 23:08

Re: isNewCandle

Messaggio da texcs »

ho provato pure ma il problema è sempre quello
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: isNewCandle

Messaggio da carlo10 »

Ciao texcs,

ho l'impressione che tu cerchi di andare troppo di fretta copiando pezzi di codice e cercando di metterli assieme.

L'ultimo pezzo di codice che hai incollato ad esempio non può funzionare perchè manca una parentesi tonda alla fine dell'if.

Oltretutto questo codice non fa il Print ma stampa il commento sul grafico quindi di fatto non è possibile nemmeno capire se lo faccia ad ogni tick mandandolo in esecuzione.

Dovresti partire in questo modo: utilizzi la sola funzione isNewCandle così come la trovi spiegata nell'articolo che ti ho indicato e ci metti dentro la stampa di prova. In questo modo escludi malfunzionamenti di questa funzione. Il passo successivo è quello di aggiungere la tua logica sui segnali dello stocastico. Se c'è qualcosa che non ti torna devi stampare i valori delle variabili oppure mettere delle stampe di prova per vedere in quali parti del codice si entra quando è in esecuzione ed in quale altre no.

Se cerchi di mettere insieme tutti i pezzi in un colpo solo e poi vedi che non funziona è più difficile capire quale sia il problema.
texcs
Messaggi: 144
Iscritto il: 29/05/2014, 23:08

Re: isNewCandle

Messaggio da texcs »

Allora ho fatto queste prova l'ho fatta e ti faccio vedere, se io faccio girare il programma cosi:
Prova 1:

Codice: Seleziona tutto

if( isNewCandle() && (mainnow = signalnow))// && (mainprevious < signalprevious) && (mainafter < signalafter) )//&&(signalnow<21)&& (mainnow<21))
       {
       //Print(" nuova candela con incrocio");
        Print(" incrocio Time = " + TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()));
        Print("Valore Main: " + mainnow + "; Valore signal:" + signalnow + Symbol());
        
      /* if(ObjectFind("etichetta") == -1){         
         //DrawAllert("etichetta","incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()),10,10,Green);
         Print("incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime())")
        }
       else{
        // ObjectDelete("etichetta");
         DrawAllert("etichetta", "incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()),10,10,Green);*/
       }
       }   
Prova 2

Codice: Seleziona tutto


      if( isNewCandle())// && (mainnow = signalnow))// && (mainprevious < signalprevious) && (mainafter < signalafter) )//&&(signalnow<21)&& (mainnow<21))
       {
       Print(" nuova candela");
       // Print(" incrocio Time = " + TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()));
       // Print("Valore Main: " + mainnow + "; Valore signal:" + signalnow + Symbol());
        
      /* if(ObjectFind("etichetta") == -1){         
         //DrawAllert("etichetta","incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()),10,10,Green);
         Print("incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime())")
        }
       else{
        // ObjectDelete("etichetta");
         DrawAllert("etichetta", "incrocio Time = "+ TimeToStr(CurTime(),TIME_DATE)+" " + TimeHour(CurTime())+":"+ TimeMinute(CurTime()),10,10,Green);*/
       }
       } 
Prova 1 Mi da oltre l'incrocio che è dato da "(mainnow = signalnow)" ogni candela mi da un segnale (screenshoot numero 1)
Prova 2 Mi da gli allert che sono nello screenshoot 2.

Ora io vorrei che mi segnalasse solo la candela dopo l'incrocio sello stoc, hai suggerimenti?
grazie anticipatamente
Allegati
Screenshoot 2.jpg
Screenshoot 2.jpg (33.4 KiB) Visto 812 volte
Screenshoot 1.jpg
Screenshoot 1.jpg (35.04 KiB) Visto 812 volte
Avatar utente
carlo10
Messaggi: 4261
Iscritto il: 08/05/2014, 21:17

Re: isNewCandle

Messaggio da carlo10 »

Dal tuo test posso dedurre che la logica di un solo print per candela funziona. Dato che sei sul grafico ad 1 Minuto vedo che c'è un Print ad intervalli di un minuto. Se stampasse ad ogni tick sarebbero molto più frequenti.

Quindi il problema è nella logica dei valori restituiti dallo stocastico.

Mi sono accorto ora di un grande problema, nell'if utilizzi questo:

Codice: Seleziona tutto

mainnow = signalnow
Che equivale ad un'assegnazione del valore di signalnow alla variabile mainnow mentre tu devi confrontare i 2 valori:

Codice: Seleziona tutto

mainnow == signalnow
Il problema sopra dovrebbe generarti anche un warning in fase di compilazione.

Ora che hai superato questo primo aspetto della nuova candela dovresti quindi concentrarti sui valori delle variabili dello stocastico. Stampale tutte quante e verificane i valori per capire per quale motivo entra dentro all'if ogni volta mentre tu ti aspetti che il numero di segnali sia minore.
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite