tracciando la H_line sul massimo più alto degli ultimi 36 massimi - pagina 2

 

Non mi interessa la chiusura dello stoch, quindi è sufficiente il K% attuale.

codice per controllare gli oggetti:

 int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
      if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
      }
   if (StringSubstr(id,0,6)=="olive ")
      {
      if (StringSubstr(id,6,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      }  
}

Questo cancella la linea id dopo 96 candele.

quello che devo fare ora è impedire all'ea di disegnare nuove linee di pomodoro se una linea di pomodoro è già sul grafico.

Sto pensando di aggiungere

if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ..............
         }

......... = stop e dall'inizio (ma continua a leggere le condizioni dell'oliva)

codice ora:

int start()
  {
/////////// K% over >75 or under <25 (no waiting for close)
double stoch;
stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);  
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];
datetime H=Time[high_nr];
string Hdate = TimeToStr(H,TIME_DATE|TIME_MINUTES);
datetime L=Time[low_nr];
string Ldate = TimeToStr(L,TIME_DATE|TIME_MINUTES);


/////////////////////////////////////////////////////////////////////////////////
//---
 int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
      if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
      }
   if (StringSubstr(id,0,6)=="olive ")
      {
      if (StringSubstr(id,6,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      }  
}
//---


////////////////////////////////////////////////////////////////////////////////

if(Bid<high_price && High[0]<high_price && High[1]<high_price && stoch>75)
     {
      ObjectCreate("tomato "+Hdate,OBJ_TREND,0,H,high_price,Time[0],high_price);
      ObjectSet("tomato "+Hdate,OBJPROP_COLOR,Tomato);
      //Print ("tomato ON"+high_price);
     }
       

///////////////////////////////////////////////////////////////////////////////

if(Bid>low_price && Low[0]>low_price && Low[1]>low_price && stoch<25)
   {
   ObjectCreate("olive "+Ldate,OBJ_TREND,0,L,low_price,Time[0],low_price);
   ObjectSet("olive "+Ldate,OBJPROP_COLOR,Olive);
   //Print ("olive ON"+low_price);
   }
 
   
   
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

per riformulare:

voglio che sul grafico ci sia al massimo una linea di pomodoro.

se quella linea sarà usata per OrderSend, cancellare la linea.

se scade (96), cancellare la linea.

lo stesso per l'oliva.

quindi se la linea del pomodoro è già sul grafico, non ci sono più linee di pomodoro fino a quando non ci sono più pomodori sul grafico

sperando che la riformulazione aiuti a trovare la soluzione :)

 
cichichan:

per riformulare:

voglio che sul grafico ci sia al massimo una linea di pomodoro.

se quella linea sarà usata per OrderSend, cancellare la linea.

se scade (96), cancellare la linea.

lo stesso per l'oliva.

quindi se la linea del pomodoro è già sul grafico, non ci sono più linee di pomodoro fino a quando non ci sono più pomodori sul grafico

sperando che la riformulazione aiuti a trovare la soluzione :)


datetime L=Time[low_nr];
string Ldate = TimeToStr(L,TIME_DATE|TIME_MINUTES);

è il momento in cui crei la tua linea ??? come fare ??

 int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
       //  line found
      }
}

Quindi come puoi evitare di disegnare altre linee....??

 

Stavo pensando di cambiare di nuovo il nome dell'oggetto come iniziale per impedire allo script di disegnare linee a causa della limitazione dello stesso nome... ma non ho nessuna funzione per cambiare il nome.

hmm.... non capisco.

La mia mente è bloccata! Mi sento stupido e frustrato

 
cichichan:

Stavo pensando di cambiare di nuovo il nome dell'oggetto come iniziale per impedire allo script di disegnare linee a causa della limitazione dello stesso nome... ma non ho nessuna funzione per cambiare il nome.

hmm.... non capisco.

La mia mente è bloccata! Mi sento stupido e frustrato

quando si crea una nuova linea?

non nel momento in cui si trova la barra più alta o più bassa

e devi creare solo se non c'è una linea

quindi se create una nuova linea usate il tempo di Time[0]

se trovate il vostro oggetto allora che nome ha ?? ==> stringa id=ObjectName (i);

quindi cosa dovete fare?? ottenere questo nome quando ha StringSubstr(id,0,7)=="pomodoro"

 

Torna al tuo primo post:

"Quando lo eseguo ottengo il primo setup per il pomodoro e per l'oliva ok, poi anche se nel journal ottengo "tomato ON" un diverso livello di prezzo, non ottengo la nuova linea del pomodoro sul grafico. lo stesso per l'oliva".

Non ottieni una nuova linea perché quella vecchia esiste già. Cancellala e ne verrà disegnata una nuova.

 

per il momento ho fatto così:

e sembra che funzioni come dovrebbe, solo una linea, e dopo 96 barre di cancellazione, il ridisegno quando la condizione riappare.

int start()
  {
/////////// K% over >75 or under <25 (no waiting for close)
double stoch;
stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);  
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];
datetime H=Time[high_nr];
string Hdate = TimeToStr(H,TIME_DATE|TIME_MINUTES);
datetime L=Time[low_nr];
string Ldate = TimeToStr(L,TIME_DATE|TIME_MINUTES);


/////////////////////////////////////////////////////////////////////////////////
//---
int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
      if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         Print ("tomato valid");
         break;
         }
      }
}

 if (ot==-1)
      {
      if(Bid<high_price && High[0]<high_price && High[1]<high_price && stoch>75)
         {
         ObjectCreate("tomato "+Hdate,OBJ_TREND,0,H,high_price,Time[0],high_price);
         ObjectSet("tomato "+Hdate,OBJPROP_COLOR,Tomato);
         //Print ("tomato ON"+high_price);
         }
      }  
//---


////////////////////////////////////////////////////////////////////////////////
for (i=ot;i>=0;i--)
{
 if (StringSubstr(id,0,6)=="olive ")
      {
      if (StringSubstr(id,6,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,6,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         Print ("olive valid");
         break;
         }   
      }  
 }      

///////////////////////////////////////////////////////////////////////////////
if (ot==-1)
{
if(Bid>low_price && Low[0]>low_price && Low[1]>low_price && stoch<25)
   {
   ObjectCreate("olive "+Ldate,OBJ_TREND,0,L,low_price,Time[0],low_price);
   ObjectSet("olive "+Ldate,OBJPROP_COLOR,Olive);
   //Print ("olive ON"+low_price);
   }
}
   
   
//----
   
//----
   return(0);
  }
 

Questo funziona?

if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))

Le stringhe potrebbero essere < o > l'una rispetto all'altra, questa è una domanda, non lo so.

Lo stai rendendo complicato, perché il giol ti dice che se vuoi diverse linee, devi dare alle linee un nome diverso. E allora aveva ragione.

Se sapesse che vuoi solo una linea, non l'avrebbe detto. La soluzione data da devries è molto buona nel caso in cui uno abbia diverse linee, grazie devries

Ma se vuoi una sola linea chiamala "pomodoro" o "oliva", allora ObjectFind("pomodoro") ObjectDelete ("pomodoro"), risolve i problemi di tempo a parte con Time[96] e Time[0] memorizzati quando la linea è disegnata.

Il prossimo problema che accadrà è che la condizione stoch> 75 potrebbe durare 20 Bars o 50 Bars, quindi, quando cancellerete la vostra linea, la condizione per disegnare la linea sarà ancora valida e non appena la linea sarà stata cancellata, o un ordine preso, una nuova linea sarà disegnata. buona fortuna, non è così difficile.

 

ciao

siccome la cosa dell'oggetto sembrava troppo complicata per le mie due settimane di lettura del codice, ho deciso di impostare il prezzo di livello per vendere e comprare. in questo processo incontro un problema:

void LevelSset()
{

stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);


high_bar=iHighest(NULL,0,MODE_HIGH,34,2);
string H=TimeToStr(Time[high_bar],TIME_DATE|TIME_MINUTES);
LSell=High[iHighest(NULL,0,MODE_HIGH,34,2)];


if(Bid<LSell && High[0]<LSell && High[1]<LSell && stoch>75 && LevelSset==false)
         {
         ObjectCreate("tomato "+H,OBJ_ARROW,0,Time[high_bar],LSell+Point*20);
         ObjectSet("tomato "+H,OBJPROP_ARROWCODE,242);
         ObjectSet("tomato "+H,OBJPROP_COLOR,Tomato);
         LevelSset=true;
         Print("LevelSset on "+LSell);
         }
if (Close[2]>LSell && Close[1]>LSell && LevelSset==true)
   {
      LSell=0;
      LevelSset=false;
      Print ("LSell"+LSell+"expired due to close");
   }
}

il "if (Close[2]>LSell && Close[1]>LSell && LevelSset==true) non funziona.

Se rimuovo il if (Close[2]>LSell && Close[1]>LSell) e lascio (LevelSset==true), o se cambio (Close[2]<LSell && Close[1]<1) la funzione sembra funzionare correttamente.

Grazie

 

qualche idea, cosa c'è di sbagliato... qualcuno?

Grazie