break- in

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

break- in

Messaggio da texcs » 12/04/2019, 14:01

photo1.jpg
Salve a tutti amici vorrei graficare questa situazione per emettere un alert quando l'ombra della seconda candela è più alta dell'ombra della prima candela, ho creato la seguente funzione

Codice: Seleziona tutto


if(High[1]<High[0])// Sell
       {
        AllertoPerIlRibasso();
        return - 1; 
       }
però non riesco a capire cosa non va a livello teorico mi sembra giusta però quando vado a fare il test non funziona come vorrei; qualcuno ha idee
Ringrazio anticipatamente
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

texcs
Messaggi: 129
Iscritto il: 29/05/2014, 23:08

Re: break- in

Messaggio da texcs » 13/04/2019, 15:49

Correggo

Codice: Seleziona tutto

int breakIn()
   {
   //double HighPrec= High[1], HighCurr= High[0], LowPrec= Low[1], LowCurr= Low[0];
      
      if(High[1]<High[0])// Sell
       {
        AllertoPerIlRibasso();
        return - 1; 
       }
      else if(Low[1] < Low[0])//buy
       {
        return + 1;
       }
       
       return 0;
   }
   

texcs
Messaggi: 129
Iscritto il: 29/05/2014, 23:08

Re: break- in

Messaggio da texcs » 19/04/2019, 12:42

Ragazzi allora aggiorno il post
Praticamente questa funzione deve funzionare a tick a non a candela chiusa, quindi entre è in formazione l'ultima candela;

Sell
Se l'ombra superiore della candela in formazione supera il massimo della candela precedente quindi "high[0] > high[1] "
deve ritornarmi -1;

Buy
Se l'ombra inferiore della candela in formazione è più basso del minimo della candela precedente quindi "Low[0]< Low [1] "
deve ritornarmi +1;


Allego immagine esplicativa
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

Avatar utente
Dainesi
Messaggi: 401
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: break- in

Messaggio da Dainesi » 23/04/2019, 10:51

Se devi lavorare in Tick allora non devi concentrarti su High[0] ma bensì sul valore del Bid (l'unico che rimane a livello grafico), per cui dovrai scrivere:

Codice: Seleziona tutto

if(Bid>High[1])AlertPerRibasso();

if(Bid<Low[1])AlertPerRialzo();
P.S. Scrivere return - 1 o return +1 è sbagliato. Se si vuole ritornare un valore questo deve essere l'argomento della return e quindi return(1) o return(-1).

texcs
Messaggi: 129
Iscritto il: 29/05/2014, 23:08

Re: break- in

Messaggio da texcs » 28/04/2019, 12:10

Allora ringrazio anticipatamente ho provato il codice però mi succede che richiama le funzioni "AllertoPerIlRibasso() e AllertoPerIlRialzo()(che creano delle linee verticali rosse e verdi"per ogni candela anziché solo quanto è verificata la condizione
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

Avatar utente
Dainesi
Messaggi: 401
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: break- in

Messaggio da Dainesi » 28/04/2019, 17:56

Per stanare l'errore occorrerebbe che tu postassi il codice completo.

texcs
Messaggi: 129
Iscritto il: 29/05/2014, 23:08

Re: break- in

Messaggio da texcs » 29/04/2019, 9:34

Codice: Seleziona tutto

    
  
void AllertoPerIlRialzo()
{
 ObjectCreate(ChartID(),IntegerToString(Time[0],0,0),OBJ_VLINE,0,Time[0],0);
 ObjectSetInteger(ChartID(),IntegerToString(Time[0],0,0),OBJPROP_COLOR,clrDarkGreen);
 }

void AllertoPerIlRibasso()
{
 ObjectCreate(ChartID(),IntegerToString(Time[0],0,0),OBJ_VLINE,0,Time[0],0);
 ObjectSetInteger(ChartID(),IntegerToString(Time[0],0,0),OBJPROP_COLOR,clrDarkRed);
  }
  
  void OnTick()
{
    if(Bid>High[1])
      AllertoPerIlRibasso();
    if(Bid<Low[1])
      AllertoPerIlRialzo();
}

Avatar utente
Dainesi
Messaggi: 401
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: break- in

Messaggio da Dainesi » 29/04/2019, 11:22

Ho testato il codice e pare funzionare. Se vuoi la certezza del risultato prova a far scrivere nel log dei consiglieri il momento esatto ed il motivo per cui genera la riga. Per fare ciò modifica il codice come riportato qui sotto:

Codice: Seleziona tutto

void AllertoPerIlRialzo()
{
 if(ObjectFind(ChartID(),IntegerToString(Time[0],0,0))<0)
 {
    ObjectCreate(ChartID(),IntegerToString(Time[0],0,0),OBJ_VLINE,0,Time[0],0);
    ObjectSetInteger(ChartID(),IntegerToString(Time[0],0,0),OBJPROP_COLOR,clrGreen);
    
    Print("Rottura sopra il massimo precedente Bid: " + DoubleToStr(Bid, Digits) + " Massimo precedente: " + DoubleToStr(High[1],Digits));     
 }
 
 }

void AllertoPerIlRibasso()
{
 if(ObjectFind(ChartID(),IntegerToString(Time[0],0,0))<0)
 {
    ObjectCreate(ChartID(),IntegerToString(Time[0],0,0),OBJ_VLINE,0,Time[0],0);
    ObjectSetInteger(ChartID(),IntegerToString(Time[0],0,0),OBJPROP_COLOR,clrRed);

    Print("Rottura sotto il minimo precedente Bid: " + DoubleToStr(Bid, Digits) + " Minimo precedente: " + DoubleToStr(Low[1],Digits));     
 }
}
  
  void OnTick()
{
    if(Bid>High[1])
      AllertoPerIlRibasso();
    if(Bid<Low[1])
      AllertoPerIlRialzo();
}

texcs
Messaggi: 129
Iscritto il: 29/05/2014, 23:08

Re: break- in

Messaggio da texcs » 29/04/2019, 12:54

Allora vi ringrazio tanto dei suggerimenti, volevo aggiungere una condizione:
quando si entra nella condizione sell (prima condizione) "disegna" una linea ROSSA e poi non ne disegna più fin quando non si verifica la condizione
opposta qundi disegna UNA linea VERDE è fino a quando non si ri verifica la condizione inversa...ho modificato così il codice:

Codice: Seleziona tutto

bool orderBuy = false,orderSell = false; 
void OnTick()
{
    if(Bid>High[1] && orderBuy==false)
    {
      AllertoPerIlRibasso();
      orderBuy =true;
      orderSell=false;
    }
    
    if(Bid<Low[1]&& orderSell==false)
    {
      AllertoPerIlRialzo();  
      orderBuy =true;
      orderSell=false;
    }
ma nn va forse sbaglio ragionamento

Avatar utente
Dainesi
Messaggi: 401
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: break- in

Messaggio da Dainesi » 29/04/2019, 13:44

Ho compreso la finalità ed allora conviene il codice seguente che cancella la linea di segnale opposto se pre-esistente:

Codice: Seleziona tutto

void AllertoPerIlRialzo()
{
 ObjectDelete(ChartID(),IntegerToString(Time[0],0,0) + "S");
 if(ObjectFind(ChartID(),IntegerToString(Time[0],0,0) + "L")<0)
 {
    ObjectCreate(ChartID(),IntegerToString(Time[0],0,0) + "L",OBJ_VLINE,0,Time[0],0);
    ObjectSetInteger(ChartID(),IntegerToString(Time[0],0,0) + "L",OBJPROP_COLOR,clrGreen);
    
    Print("Rottura sopra il massimo precedente Bid: " + DoubleToStr(Bid, Digits) + " Massimo precedente: " + DoubleToStr(High[1],Digits));     
 }
 
 }

void AllertoPerIlRibasso()
{
 ObjectDelete(ChartID(),IntegerToString(Time[0],0,0) + "L");
 if(ObjectFind(ChartID(),IntegerToString(Time[0],0,0) + "S")<0)
 {
    ObjectCreate(ChartID(),IntegerToString(Time[0],0,0) + "S",OBJ_VLINE,0,Time[0],0);
    ObjectSetInteger(ChartID(),IntegerToString(Time[0],0,0) + "S",OBJPROP_COLOR,clrRed);

    Print("Rottura sotto il minimo precedente Bid: " + DoubleToStr(Bid, Digits) + " Minimo precedente: " + DoubleToStr(Low[1],Digits));     
 }
}
  
  void OnTick()
{
    if(Bid>High[1])
      AllertoPerIlRibasso();
    if(Bid<Low[1])
      AllertoPerIlRialzo();
}

Chi c’è in linea

Visitano il forum: CC [Bot], Google [Bot] e 0 ospiti