Metatrader 4

Riesumo questa discussione per chedere se c'è qualche anima pia che puo darmi una mano con la costruzione/traduzione di un EA per MQL4. Ne parlavo nella discussione dedicata a Prorealtime e proprio da li riparto con il codice che vorrei tradurre



Grazie in anticipo

vabbhe alla fine mi sono convinto e mi ci sono messo un po' sopra a questa "meta", e qualcosa ho tirato fuori



Codice:
//---- input parameters
extern int       Periodo_media_lenta=50;
extern int       Periodo_media_veloce=25;
extern double    Lotto_base=0.1;
extern int       tipo=0;
extern double    perc=0.1;
extern int       TP=100;
extern int       SL=25;
//+------------------------------------------------------------------+
//| calcolo lotti                                                    |
//+------------------------------------------------------------------+
double lotti(int tipo)
{
   double Lotti;
   switch (tipo)
      {
      case 0: //senza controllo size
         Lotti=Lotto_base;
         break;
      case 1: //classica martingala
         Lotti=Lotto_base;
         double Net_profit;
         int pos=OrdersHistoryTotal();
         int loss=0;
         for(int i=pos;i>0;i--)
            {
            if (OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)==false) 
               {
               break;
               }
            if (OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)==true)
               {   
               Net_profit=OrderProfit();
               if (Net_profit>=0) break;
               if (Net_profit<0) loss++;
               }  
            }
         if (loss>0)
            {
            for (i=1;i<=loss;i++)
               {
               Lotti=Lotti*2;
               }
            }
         //Controllo del margine
         double Margine_Lotto=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
         double Margine_libero=AccountFreeMargin();
         Lotti=NormalizeDouble(MathMin(Lotti,(Margine_libero/Margine_Lotto)),2);
         break;
      case 2: //FIBOmartingala
         Lotti=Lotto_base;
         pos=OrdersHistoryTotal();
         loss=0;
         for(i=pos;i>0;i--)
            {
            if (OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)==false) 
               {
               break;
               }
            if (OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)==true)
               {   
               Net_profit=OrderProfit();
               if (Net_profit>=0) break;
               if (Net_profit<0) loss++;
               }  
            }
         double temp_lot[100];
         for (i=0;i<=loss;i++)
            {
            temp_lot[i]=temp_lot[i-1]+temp_lot[i-2];
            if (temp_lot[i]==0) temp_lot[i]=Lotto_base;   
            Lotti=temp_lot[i];
            }
         
         //Controllo del margine
         Margine_Lotto=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
         Margine_libero=AccountFreeMargin();
         Lotti=NormalizeDouble(MathMin(Lotti,(Margine_libero/Margine_Lotto)),2);
         break; 
      case 3: //Antimartingala
         Margine_Lotto=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
         Margine_libero=AccountFreeMargin();
         Lotti=(Margine_libero*perc)/Margine_Lotto;
         Lotti=NormalizeDouble(MathMin(Lotti,(Margine_libero/Margine_Lotto)),2);
         break;
      
      }
   return(Lotti);
} 

//+------------------------------------------------------------------+
//| condizione cross                                                 |
//+------------------------------------------------------------------+
int condizione_cross()
{
   
   double ma_lenta=iMA(NULL,0,Periodo_media_lenta,0,MODE_EMA,PRICE_CLOSE,0);
   double ma_veloce=iMA(NULL,0,Periodo_media_veloce,0,MODE_EMA,PRICE_CLOSE,0);
   double ma_lenta_prec=iMA(NULL,0,Periodo_media_lenta,0,MODE_EMA,PRICE_CLOSE,1);
   double ma_veloce_prec=iMA(NULL,0,Periodo_media_veloce,0,MODE_EMA,PRICE_CLOSE,1);
   bool cross_long=(ma_lenta_prec>ma_veloce_prec && ma_lenta<ma_veloce);
   bool cross_short=(ma_lenta_prec<ma_veloce_prec && ma_lenta>ma_veloce);
   
   
   if (cross_long==true) return(1);
   if (cross_short==true)return(-1);
   else return(0);
}

//+------------------------------------------------------------------+
//| condizione tempo                                                 |
//+------------------------------------------------------------------+

bool condizione_tempo()
{
   bool cond=false;
   if (TimeHour(Time[0])>=8 && TimeHour(Time[0])<22) cond=true;
   return(cond);
}
   
//+------------------------------------------------------------------+
//|controllo posizione sul mercato                                   |
//+------------------------------------------------------------------+
int Check_Position(string symbol)
{
   int buy=0;
   int sell=0;
   for (int i=0;i<OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=123456) continue;
      if (OrderType()==OP_BUY) buy++;
      if (OrderType()==OP_SELL) sell++;
      }
   if (buy>0 || sell>0) return(1);
   else return(0);
}     
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;   
//----
   if (Check_Position(Symbol())>0) 
      {
      for (int i=0;i<OrdersTotal();i++)
         {
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=123456) continue;
         if (condizione_tempo()==false) 
            {
            if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,2,Red);
            if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,2,Red);
            }
         if (OrderType()==OP_BUY && condizione_cross()==-1)  OrderClose(OrderTicket(),OrderLots(),Bid,2,Red);
         if (OrderType()==OP_SELL && condizione_cross()==1)  OrderClose(OrderTicket(),OrderLots(),Ask,2,Red);
         }   
      }
   if (Check_Position(Symbol())==0) 
      {
      int pdn;
      double Lotti;
      if (condizione_cross()==1 && condizione_tempo()==true)
         {
         Lotti=lotti(tipo);
         pdn=OrderSend(Symbol(),OP_BUY,Lotti,Ask,3,Bid-SL*Point,Ask+TP*Point,"",123456,0,Blue);
         }
      if (condizione_cross()==-1 && condizione_tempo()==true)
         {
         Lotti=lotti(tipo);
         pdn=OrderSend(Symbol(),OP_SELL,Lotti,Bid,3,Ask+SL*Point,Bid-TP*Point,"",123456,0,Yellow);
         }
      }
         
            
   return(0);
  }
//+------------------------------------------------------------------+
Il codice ricalca il precedente il solito motore composto da due EMA che generano il segnale al loro cross, si opera solo in determinati orari (8-22), di nuovo ho aggiunto solo SL e TP che si possono modificare a piacere (sono espressi in tick) ma rimangono fissi durante l'esecuzione.


Si sceglie il "tipo" di gestione size che si vuole testare sullo strumento:


  • 0= lotto fisso di base
  • 1= martingala
  • 2= FIBOmartingala
  • 3= percentuale fissa o antimartingala

L'ultimo (il 3) è una new entry ma neanche tanto, in pratica si sceglie una percentuale fissa (la variabile "perc") del proprio capitale da puntare ogni volta. Se si vince aumenta il capiale e quindi anche la size che verrà successivamente giocata se si perde al contrario la size diminuisce...

Purtroppo il motore che abbiamo scelto fa un po' pena :D poche operazioni e la maggiorparte in loss... se riesco a trovare, o mi postate, un motore più performante con più operazioni per lo più positive (l'ho scritto ma mi ci viene da ridere :lol:) magari mettiamo in codice altri tipi di gestione size, sicuramente più interessanti e logici di questi che abbiamo fin ora visto.


Lasciatemi qualche commento/critica altrimenti penso che non mi si caga nessuno e mi passa la voglia di scrivere :-o

Se qualcuno addirittura si legge il codice e mi dice se ci sono errori, migliorie o altro sarebbe una cosa splendida.

N.B. Ovviamente non sono nato imparato le nozioni che qui stò riportando non sono farina del mio sacco ma le stò riprendendo pari pari dal testo di un italiano più famoso e ricco di me :D


ciao
 
vabbhe alla fine mi sono convinto e mi ci sono messo un po' sopra a questa "meta", e qualcosa ho tirato fuori


Il codice ricalca il precedente il solito motore composto da due EMA che generano il segnale al loro cross, si opera solo in determinati orari (8-22), di nuovo ho aggiunto solo SL e TP che si possono modificare a piacere (sono espressi in tick) ma rimangono fissi durante l'esecuzione.


Si sceglie il "tipo" di gestione size che si vuole testare sullo strumento:




  • 0= lotto fisso di base
  • 1= martingala
  • 2= FIBOmartingala
  • 3= percentuale fissa o antimartingala
L'ultimo (il 3) è una new entry ma neanche tanto, in pratica si sceglie una percentuale fissa (la variabile "perc") del proprio capitale da puntare ogni volta. Se si vince aumenta il capiale e quindi anche la size che verrà successivamente giocata se si perde al contrario la size diminuisce...

Purtroppo il motore che abbiamo scelto fa un po' pena :D poche operazioni e la maggiorparte in loss... se riesco a trovare, o mi postate, un motore più performante con più operazioni per lo più positive (l'ho scritto ma mi ci viene da ridere :lol:) magari mettiamo in codice altri tipi di gestione size, sicuramente più interessanti e logici di questi che abbiamo fin ora visto.


Lasciatemi qualche commento/critica altrimenti penso che non mi si caga nessuno e mi passa la voglia di scrivere :-o

Se qualcuno addirittura si legge il codice e mi dice se ci sono errori, migliorie o altro sarebbe una cosa splendida.

N.B. Ovviamente non sono nato imparato le nozioni che qui stò riportando non sono farina del mio sacco ma le stò riprendendo pari pari dal testo di un italiano più famoso e ricco di me :D


ciao

Non ho più parole :bow::bow::bow:
Non ti ferma neanche la neve!
Domani provo con calma il codice e ti faccio sapere se va. Tu nel frattempo non farti passare la voglia di scrivere, se ti va potresti esercitarti con un'aggiunta sempre a questo codice (che essendo facile e banale possiamo capirlo un po' tutti) di un interruttore on-off legato alla equity del sistema del tipo:
- equity sopra la propria media mobile a x = sistema in funzione
- equity sotto la propria media mobile a x = sistema sospeso
Grazie.

P.S. chi è costui "più famoso e ricco di me"
 
Lasciatemi qualche commento/critica altrimenti penso che non mi si caga nessuno e mi passa la voglia di scrivere :-o

Se qualcuno addirittura si legge il codice e mi dice se ci sono errori, migliorie o altro sarebbe una cosa splendida.

Da un primo test sembra che la selezione "tipo" non produca nessun effetto. Sbaglio?
 
Da un primo test sembra che la selezione "tipo" non produca nessun effetto. Sbaglio?

Non so dirti :mmmm: a me ha lavorato bene nei ntest che ho fatto. Ti allego i report di un mio backtest, un report per tipo di gestione.

Puoi provare a salvare ed allegare anche tu i report (magari anche i log) delle tue prove, così magari cerchiamo di capire che succede da te :up:


Vedi l'allegato GS_eurodol.rar.txt

il file è un'archivio rar rinomina togliendo l'estensione .txt

ciao

P.S. la neve non mi ferma anzi so' veramente contento ....:V ...per voi sulla costa è stata una bella carrambata :D
 
- equity sopra la propria media mobile a x = sistema in funzione
- equity sotto la propria media mobile a x = sistema sospeso
Grazie.

Sistemi del genere ti salvano se il tuo sistema si schianta.
Se il tuo sistema è robusto e lateralizza per molto tempo: questo approccio ti uccide, provare per credere.
 
Non so dirti :mmmm: a me ha lavorato bene nei ntest che ho fatto. Ti allego i report di un mio backtest, un report per tipo di gestione.

Puoi provare a salvare ed allegare anche tu i report (magari anche i log) delle tue prove, così magari cerchiamo di capire che succede da te :up:


[
Te ne allego solo due giusto per farti vedere (i log dove sono:-?)
 

Allegati

Non so dirti :mmmm: a me ha lavorato bene nei ntest che ho fatto. Ti allego i report di un mio backtest, un report per tipo di gestione.

Puoi provare a salvare ed allegare anche tu i report (magari anche i log) delle tue prove, così magari cerchiamo di capire che succede da te :up:

Rettifico, funziona.
Non avevo cambiato le impostazioni su "proprietà esperte":wall:
 
Rettifico, funziona.
Non avevo cambiato le impostazioni su "proprietà esperte":wall:



:D stavo già preparando il post con il cazziatone :D



comunque per i log basta che vai nella tab "diario" del tester e selezioni/copi le righe di interesse oppure trovi il log giornaliero in ..../metatrader4/tester/logs/


Ciao
 
:D stavo già preparando il post con il cazziatone :D



comunque per i log basta che vai nella tab "diario" del tester e selezioni/copi le righe di interesse oppure trovi il log giornaliero in ..../metatrader4/tester/logs/


Ciao

Appena in tempo allora!:lol::lol::lol:

Ma devi avere pazienza con me, conosci il detto "braccia rubate all'agricoltura" ecco io ne sono un caso.

Ciao e grazie di nuovo.
 

Users who are viewing this thread

Back
Alto