Tecnica Bailout

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
LucaMQL4
Messaggi: 91
Iscritto il: 15/02/2016, 23:11

Tecnica Bailout

Messaggio da LucaMQL4 »

Ragazzi vi chiedo con grande gentilezza e urgenza un aiuto importante per me.
Sto cercando di creare una funzione di uscita ma sto avendo non pochi problemi.E' banale, ma non riesco proprio a programmarla in mql4, se volete vi mando la funzione che ho provato a creare ma che non va. La funzione non fa altro che: "dopo X barre esci alla prima apertura in profitto"

Grazie in anticipo.
zetalakappa
Messaggi: 42
Iscritto il: 06/07/2015, 15:45

Re: Tecnica Bailout

Messaggio da zetalakappa »

Ciao.

Ti propongo un approccio diverso da far avere all'EA:
se sono in profitto e sono passate x barre dall'apertura allora chiudi.

io personalmente creerei 2 funzioni
bool SonoInProfitto()
bool SonoPassateAbbastanzaBarre()

C'è aperta una posizione per volta?

cmq, gira il codice e vediamo un po' se riesco a capire.
LucaMQL4
Messaggi: 91
Iscritto il: 15/02/2016, 23:11

Re: Tecnica Bailout

Messaggio da LucaMQL4 »

Si, viene aperta un'operazione per volta.
Ecco il codice dove ovviamente prende sempre stop loss siccome non c'è un take profit che io voglio sostituire alla tecnica di bailout che ti ho detto, come vedi nel codice ho messo commentato la funzione che non riesco a fare.

Codice: Seleziona tutto

extern int Magic_Number = 500;
extern double Percentuale_Break_Out = 50.00;
extern double Lotti=0.1;
int Ticket=0;

void OnTick()
  {

   if(OrdersTotal()==0){
    if((High[1]-Low[1]) > ((High[2]-Low[2]) + (Percentuale_Break_Out/100.00)*(High[2]-Low[2])))
      if(Open[2]-Close[2] < 0 && Open[1]-Close[1] < 0 ) 
        if(Low[2]<Low[1])
        Ticket=OrderSend(Symbol(),OP_BUY,Lotti,Ask,0,Bid-100*Point,0,"Buy",Magic_Number,0,clrBlue);
         }
         //bailout();
         ;
         
         
    if(OrdersTotal()==0){
     if((High[1]-Low[1]) > ((High[2]-Low[2]) + (Percentuale_Break_Out/100.00)*(High[2]-Low[2])))
      if(Open[2]-Close[2] > 0 && Open[1]-Close[1] > 0 ) 
        if(High[2]>High[1])
        Ticket=OrderSend(Symbol(),OP_SELL,Lotti,Bid,0,Ask+100*Point,0,"Sell",Magic_Number,0,clrRed);
         }  
         //bailout();
         ;    
          
  }
Secondo me con le due funzioni che mi hai esposto penso sia perfetto come approccio.
Grazie per la disponibilità
zetalakappa
Messaggi: 42
Iscritto il: 06/07/2015, 15:45

Re: Tecnica Bailout

Messaggio da zetalakappa »

ok... tu devi creare da zero la funzione bailout()...

Codice: Seleziona tutto

void OnTick()
  {

    if(
       (OrdersTotal()==0) 
       && (High[1]-Low[1]) > ((High[2]-Low[2]) + (Percentuale_Break_Out/100.00)*(High[2]-Low[2]))
      )
       {
        if (Open[2]-Close[2]<0 && Open[1]-Close[1]<0 && Low[2]<Low[1])
         int Ticket=OrderSend(Symbol(),OP_BUY,Lotti,Ask,0,Bid-100*Point,0,"Buy",Magic_Number,0,clrBlue);
        else
         if(Open[2]-Close[2]>0 && Open[1]-Close[1]>0 && High[2]>High[1])
          int Ticket=OrderSend(Symbol(),OP_SELL,Lotti,Bid,0,Ask+100*Point,0,"Sell",Magic_Number,0,clrRed);
       }
    if (OrdersTotal()>0) BeilOut();  
          
  }
//--------------------------------------------------------------------------------------------------------------------------------
void BeilOut()
{
 if (SonoInProfitto() && SonoPassateAbbastanzaBarre()) ChiudoLaPosizione();
 
}
//--------------------------------------------------------------------------------------------------------------------------------
bool SonoInProfitto()
{
int i=OrdersTotal();
int TicketTrovato=False;

while (i>=0 && TicketTrovato==False)
{
  if (
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES)
      && OrderMagicNumber()==MagicNumber
      && OrderSymbol()==Symbol()
     )
      {
       TicketTrovato=True;
      }
   i--;

if (TicketTrovato==True && OrderProfit()>0) return(True); else return (False);

}
//--------------------------------------------------------------------------------------------------------------------------------
bool SonoPassateAbbastanzaBarre()
{

.............
}
//--------------------------------------------------------------------------------------------------------------------------------
bool ChiudoLaPosizione()
{

...........
}

Non mi è troppo chiaro il perché richiami proprio lì la funzione beilout, ne tanto meno perché richiamarla 2 volte.
LucaMQL4
Messaggi: 91
Iscritto il: 15/02/2016, 23:11

Re: Tecnica Bailout

Messaggio da LucaMQL4 »

effettivamente hai ragione..
per dirgli sono passate abbastanza barre secondo te va bene in questo modo:

Codice: Seleziona tutto

  
bool abbastanza_barre_passate(){
for(int i=OrdersTotal() -1; i>=0; i--)
     {
      Ticket=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number);
        {
         if(OrderType()==OP_BUY && OrderOpenTime()<Time[BARRE_DA_PASSARE+1])
           {
            return true;
           }
else return false;
}
oppure in questo modo mi controlla se è in profitto solo la prima barra dopo le "BARRE_DA_PASSARE" messe da me esternamente? senza controllare tutte le barre fino alla chiusura del contratto
zetalakappa
Messaggi: 42
Iscritto il: 06/07/2015, 15:45

Re: Tecnica Bailout

Messaggio da zetalakappa »

il profitto non dipende dalle barre, per cui vai liscio... ma forse non ho capito cosa intendi. spiegami meglio l'ultima frase per favore...

io non controllerei il tipo di operazione: che sia buy o sell non fa differenza.

io userei il while e non il for visto che c'è solo un ordine aperto per volta.
soul
Messaggi: 18
Iscritto il: 05/05/2017, 18:24

Re: Tecnica Bailout

Messaggio da soul »

Prova ad adattare questo:

Codice: Seleziona tutto

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int NumeroBarre = 10;

struct BarTools{
  private:
  datetime lastBarOpenTime;
  
  public:
  BarTools(datetime inputLastBarOpenTime){
    this.lastBarOpenTime = inputLastBarOpenTime;
  }
  ~BarTools(){}
  
  bool isNewBar(){
    if(this.lastBarOpenTime != Time[0]){
      this.lastBarOpenTime = Time[0];
      return true;
    }
    return false;
  }
};
    
struct Strategy{
  private:
  int maxHoldingTimeInBars;
  
  public:
  Strategy(int inputMaxHoldingTimeInBars){
    this.maxHoldingTimeInBars = inputMaxHoldingTimeInBars;
  }
  ~Strategy(){}
  
  bool isLong(){
    if(true){ //condizioni long
      //apri long
      return true;
    }
    return false;
  }
  
  bool isShort(){
    if(true){ //condizioni short
      //apri short
    return true;
    }
    return false;
  }
  
  bool checkForExit(){
    for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol()==_Symbol && (OrderType()==OP_BUY || OrderType()==OP_SELL) ){ //aggiungi anche il controllo del magicnumber
        if(OrderProfit()>0 && iBarShift(NULL,0,OrderOpenTime(),false)>this.maxHoldingTimeInBars){
          double priceToClose = OrderType()==OP_BUY ? Bid : OrderType()==OP_SELL ? Ask : -1;
          bool closeResult = OrderClose(OrderTicket(),OrderLots(), priceToClose, 10);
          return closeResult;
          //scegli cosa fare se la chiusura fallisce. potresti aggiungere ulteriori tentativi o una stampa
        }
      }
    }
    return false;
  }
};

BarTools strumentiBarra(Time[0]);
Strategy strategia(NumeroBarre);


int OnInit(){
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason){}


void OnTick(){

  if(strategia.isLong()){
    Print("aperto ordine long");
  }else if (strategia.isShort()){
    Print("aperto ordine short");
  }
  
  if(strumentiBarra.isNewBar()){
    if(strategia.checkForExit()){
      Print("ordine chiuso");
    }
    Alert("Nuova barra aggiunta");
  }
  
}
LucaMQL4
Messaggi: 91
Iscritto il: 15/02/2016, 23:11

Re: Tecnica Bailout

Messaggio da LucaMQL4 »

Non parlo della funzione per vedere se si è in profitto , ma della seconda, ovvero SonoPassateAbbastanzaBArre(). Quella che si deve verificare insieme a SonoInProfitto().
soul
Messaggi: 18
Iscritto il: 05/05/2017, 18:24

Re: Tecnica Bailout

Messaggio da soul »

La struttura BarTools ha un metodo (puoi aggiugere altri metodi se necessario) che ritorna true ogni volta che viene aggiunta una nuova barra.
Infatti nella funzione OnTick l'ho usato per eseguire "checkForExit" solo una volta per barra in modo tale da renderlo meno pesante.
La struttura Strategy definisce il comportamento della tua strategia: isLong() controlla che le condizioni per il long siano valide, quindi apre un ordine long(lo devi aggiungere tu) e ritorna true se l'ordine viene aperto correttamente, altrimenti false. isShort è uguale. checkForExit itera su tutti gli ordini aperti di tipo OP_BUY o OP_SELL, quindi, se l'ordine è in profitto e iBarShift è maggiore del numero barre allora chiude l'ordine.


https://docs.mql4.com/series/ibarshift
LucaMQL4
Messaggi: 91
Iscritto il: 15/02/2016, 23:11

Re: Tecnica Bailout

Messaggio da LucaMQL4 »

Mi servirebbe solo la funzione:
bool AbbastanzaBarrePAssate() che non riesco a creare.
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti