tetsuo
Guest
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);
}
//+------------------------------------------------------------------+
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


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

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

ciao