Espongo 2 strategie semplici e efficaci

Condivisione di strategie e tecniche di trading

Moderatore: riccardo1981

Rispondi
LucaMQL4
Messaggi: 91
Iscritto il: 15/02/2016, 23:11

Espongo 2 strategie semplici e efficaci

Messaggio da LucaMQL4 »

Vi espongo due strategie molto semplici ma allo stesso tempo efficaci. Dove però sto riscontrando sempre problemi quando vado a operare con dei pendenti.
Chi è disponibile sono pronto a collaborare e dunque vi analizzo per bene le due strategie con allegati i codici.

STRATEGIA_1
Fisso le variabili esterne take profit e stop loss in base ad una percentuale sula media range degli ultimi N giorni
(5 per fare un esempio)

Se un ADX a N periodi è maggiore di un certo Z che ha un certo valore percentuale( nel codice allegato rendono le idee i valori)
e il giorno e quello da me prefissato allora applica un BUY LIMIT al minimo dei minimi(NN)degli ultimi N giorni , e un SELL LIMIT
al massuni dei massimi(MM) degli ultimi N giorni.
Uscita tramite stop loss e take profit prefissati e riportati ovviamente negli ordini pendenti.
ATTENZIONE quando il prezzo prende un ordine pendente, automaticamente l'altro viene chiuso, nel caso in cui nessuno dei due viene
preso entro la chiusura della gionata in cui sono stati aperti allora elimina entrambi i pendenti.

Allego codice mql4 che nonostante l'impegno non è funzionante, ma rende bene l'idea essendo codice pulito chiaro
e sistemato.
L’allegato strategia1+2.rar non è più disponibile
STRATEGIA_2
E' una strategia agente sul DAX30 dove consideriamo una barra giornaliera. Supponiamo che il mercato aprfe in GAP UP o GAP DOWN(aperture pure),
è un evidente dimostrazione di forza del mercato nella direzione del GAP.
Se però il prezzo arriva al MAX di ieri(o MIN a seconda del GAP UP o DOWN) esco con tecnica di BAYLOUT.

Analizzo il codice come si vede nella seguente foto.
Trading system semplicissimo dove se applico un semplice ordine buy o sell al posto del pendente il mio trading system
funziona perfettamente, nel momento in cui applico il pendente al posto del classico ordine il mio algoritmo smette di funzionare.


Per chi gli è più comodo allego anche direttamente scritto in articoli i due codici(anche se più chiari nei file allegati)

STRATEGIA 1 (CODICE)

Codice: Seleziona tutto

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

enum day{
LUN=1, //LUNEDI
MAR=2, //MARTEDI
MER=3, //MERCOLEDI
GIO=4, //GIOVEDI
VEN=5, //VENERDI
SAB=6, //SABATO
DOM=0, //DOMENICA
};

extern int    Magic_Number1= 500; //MAGIC NUMBER 1 
extern int    Magic_Number2= 1000;//MAGIC NUMBER 2
extern int    n=5; //GIORNI MEDIA RANGE
extern int    z1=5; //N°BARRE MAX
extern int    z2=5; //N°BARRE MIN
extern double V_ADX=10; //VALORE ADX
extern int    PERIOD_ADX=5; //PERIODO ADX
extern double x=0.1; //X STOPLOSS
extern double y=0.1; //Y TAKEPROFIT
extern double Lotti=0.1; //LOTTI

input day GIORNO=LUN;

int Ticket=0;
int    MassimoAssoluto,MinimoAssoluto;
double PrezzoMax,PrezzoMin,ADX,p;

int OnInit(){
if(Point == 0.00001) p=0.0001;
else if (Point==0.001) p=0.01;
else p=Point;

return(INIT_SUCCEEDED);

}

void OnTick()
  {
//---
   double MEDIA_RANGE=0;
   for(int i=1;i<n+1;i++){          

        MEDIA_RANGE=MEDIA_RANGE+(High[i]-Low[i]);
  }
double SL,TP;
SL=(MEDIA_RANGE*x)*1/p;
TP=(MEDIA_RANGE*y)*1/p; 

ADX=iADX(NULL,PERIOD_CURRENT,PERIOD_ADX,PRICE_CLOSE,MODE_MAIN,1);
MassimoAssoluto=iHighest(NULL,PERIOD_CURRENT,MODE_HIGH,z1,1);
MinimoAssoluto=iLowest(NULL,PERIOD_CURRENT,MODE_LOW,z2,1);
PrezzoMax=High[MassimoAssoluto];
PrezzoMin=Low[MinimoAssoluto];
printf("SL=%g TP=%g",SL,TP);

 if(DayOfWeek()==LUN && ADX>V_ADX && OrdiniApertiChiusiSuBarra_1()==false && OrdiniApertiChiusiSuBarra_2()==false && OrdersTotal()==0){
    Ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lotti,PrezzoMin,0,Ask-(SL*p),Ask+(TP*p),"Buy Limit",Magic_Number1,0,clrBlue);
    Ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lotti,PrezzoMax,0,Bid+(SL*p),Bid-(TP*p),"Sell Limit",Magic_Number2,0,clrRed);}
    
    if(OrdersTotalByMagic1(Magic_Number1)==1 && OrderType()==OP_SELL)
    { Ticket=OrderDelete(OrderTicket());
   // Ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);
    }
    if(OrdersTotalByMagic2(Magic_Number2)==1 && OrderType()==OP_BUY)
           {
           Ticket=OrderDelete(OrderTicket());
          //  Ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Blue);
            }       
              
  }
//+------------------------------------------------------------------+

int OrdersTotalByMagic1(int Magic_Number){
   int total = 0;
   
   for(int j = 0; j < OrdersTotal(); j++)
      if(OrderSelect(j, SELECT_BY_POS))
         if(OrderMagicNumber() == Magic_Number1 && OrderSymbol() == Symbol() && OrderType()==OP_BUY)
            total++; 
            
   return(total); 
}

int OrdersTotalByMagic2(int Magic_Number){
   int total = 0;
   
   for(int j = 0; j < OrdersTotal(); j++)
      if(OrderSelect(j, SELECT_BY_POS))
         if(OrderMagicNumber() == Magic_Number2 && OrderSymbol() == Symbol() && OrderType()==OP_SELL)
            total++; 
            
   return(total); 
}


bool OrdiniApertiChiusiSuBarra_1(){

for(int i=OrdersHistoryTotal()-1;i>=0;i--){
Ticket=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number1 && OrderOpenTime() >= Time[0])
return true;}
return false;
}

bool OrdiniApertiChiusiSuBarra_2(){

for(int i=OrdersHistoryTotal()-1;i>=0;i--){
Ticket=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number2 && OrderOpenTime() >= Time[0])
return true;}
return false;
}
STRATEGIA 2 (CODICE)

Codice: Seleziona tutto

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

extern int    Magic_Number=500; // Magic Number
extern double Lotti=0.1; 
extern double X=5.00;
extern double SL=100.00; //Stop Loss
extern int    X_BARRE_BAILOUT  = 20;


int Ticket;

/* 
CODIFICA GIORNI DELLA SETTIMANA
LUN=1, //LUNEDI
MAR=2, //MARTEDI
MER=3, //MERCOLEDI
GIO=4, //GIOVEDI
VEN=5, //VENERDI
SAB=6, //SABATO
DOM=0, //DOMENICA
*/


void OnTick()
  { 
//---

   //se il giorno dopo è sabato o domenica chiudi lunedi
   //if il giorno attuale è il giorno dopo all apertura del pendente
   //modificare nella funzione "new del" filtro se hai trovato BUYSTOP o SELLSTOP il giorno dopo(il giorno dopo tramite il filtro precedente nella OnTick)
   
   if(OrdersTotal()==0 && OrdiniApertiChiusiSuBarra()==false){
   if(Low[2]-Open[1]>(X)) 
   if(Ask >= Low[2])
 //  DAY=DayOfWeek();
   Ticket=OrderSend(Symbol(),OP_BUY,Lotti,Ask,0,Ask-(SL),0,"Buy",Magic_Number,0,clrBlue);
   if(Ticket<0)
     {
      Print("OrderSend fallita con errore #",GetLastError());
     }
   else
      Print("OrderSend piazzato con successo");
      }
    BailOut(); 
    
    
    if(OrdersTotal()==0 && OrdiniApertiChiusiSuBarra()==false){
   if(Open[1]-High[2]>(X)) 
   if(Ask < High[2])
   //DAY=DayOfWeek();
   Ticket=OrderSend(Symbol(),OP_SELL,Lotti,Bid,0,Bid+(SL),0,"Sell",Magic_Number,0,clrRed);
   if(Ticket<0)
     {
      Print("OrderSend fallita con errore #",GetLastError());
     }
   else
      Print("OrderSend piazzato con successo");
      }
    BailOut(); 
    
     
  }
//+------------------------------------------------------------------+

  bool OrdiniApertiChiusiSuBarra(){

for(int i=OrdersHistoryTotal()-1;i>=0;i--){
Ticket=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number && OrderOpenTime() >= Time[0])
return true;}
return false;
}


void BailOut(){
if(SonoInProfitto() && SonoPassateAbbastanzaBarre())
  Ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Blue);

}


bool SonoInProfitto()
{
int i=OrdersTotal();
int TicketTrovato=False;

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

}



bool SonoPassateAbbastanzaBarre()
{
int i=OrdersTotal();
int TicketTrovato=False;
datetime DTAperturaPosizione=NULL;

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

if (TicketTrovato==True && DTAperturaPosizione<=Time[X_BARRE_BAILOUT])return(True); else return (False);

 }
 
 
 
 int new_del()
{
int a;
int total = OrdersTotal();
string comentario,par;

for (a=total-1; a >=0; a--)
{
Ticket=OrderSelect(a,SELECT_BY_POS,MODE_TRADES);
comentario=OrderComment();
par=StringSubstr(comentario,0,6); 
if(OrderType()==OP_SELLLIMIT)// && comentario==Symbol())
{
Ticket=OrderDelete(OrderTicket());
Print("Deleting SELL_LIMIT"," Ordertype:",OrderType());
return(1);
}
if(OrderType()==OP_BUYLIMIT)// && par==Symbol())
{
Ticket=OrderDelete(OrderTicket());
Print("Deleting BUY_LIMIT"," Ordertype:",OrderType());
return(1);
}}
return(0);}

double Troncare(double Number, unsigned int Position)
{
return floor(Number*pow(10,Position))/pow(10,Position);
} 
Allegati
strategia1+2.rar
(3.63 KiB) Scaricato 54 volte
LucaMQL4
Messaggi: 91
Iscritto il: 15/02/2016, 23:11

Re: Espongo 2 strategie semplici e efficaci

Messaggio da LucaMQL4 »

Ho notato che le foto non le ha caricate. Volevo solo aggiungere che alla strategia 2 se il pendente applicato non viene colpito nel giorno in cui è stato aperto , allora in chiusura di giornata bisogna eliminare quest’ultimo
Hannibal
Messaggi: 46
Iscritto il: 24/01/2015, 17:00

Re: Espongo 2 strategie semplici e efficaci

Messaggio da Hannibal »

ciao Luca, non so se è così, ma non potrebbe essere che devi usare su broker Ecn OrderModify successivamente per aggiungere stop loss e take profit?
Marian
Messaggi: 5
Iscritto il: 16/02/2018, 15:25

Re: Espongo 2 strategie semplici e efficaci

Messaggio da Marian »

Ciao...Hai dati sulla strategia?
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti