Programmare un EA aiuto!

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico

Moderatore: Dainesi

Rispondi
themillionaire
Messaggi: 2
Iscritto il: 19/03/2017, 9:55

Programmare un EA aiuto!

Messaggio da themillionaire » 19/03/2017, 10:35

:help: Buongiorno a tutti ragazzi, sono nuovo del forum e avrei bisogno di aiuto nella compilazione di un EA. Premetto che sono alle prime armi con la programmazione e come tanti mi sono incartato nei famosi "Errori". In pratica l'EA è quasi completato, manca solo di sistemare questi errori (5). Cerco un anima gentile che importi il codice nel proprio IDE e lo sistemi per poi spiegarmi gli errori (Per un esperto dovrebbe essere un lavoro da pochi minuti). Questo EA non nasce come metodo rivoluzionario per fare milioni di dollari ma è solo una bozza per capire meglio le meccaniche degli EA e le sue funzioni (impostare trailing stop, step, aprire ordini in determinate condizioni) quindi è un concetto basilare che racchiude più punti. Vi spiego cosa ho cercato di riprodurre. :help:

1) L' EA dovrà aprire un solo ordine alla volta per ogni cross in cui viene posizionato.

2) Time frame dell'operatività è 15 minuti

3) L' EA si dovrà attivare dopo 3 candele di seguito di almeno 10 pips ciascuna rialziste o ribassiste con un operazione inversa (Per sfruttare i ritracciamenti).

4) Non appena aprirà l'ordine si imposterà automaticamente il TP a 30 pips e lo SL a 60 pips

5) Non appena il prezzo raggiunge 20 pips di "profitto" lo SL si porta a breakeven per proteggere l'operazione. (Trailing Stop) (Questo passaggio non l'ho scritto perchè non ho idea di come si compili)

6) Ogni volta che il prezzo sale di 5 pips in automatico il TP sale di 5 pips e lo SL di altre 5 pips (Trailing Step)

7) Numero di lotti per operazione 0.1


Eccovi il codice che ho scritto!!!! Grazie a chiunque dicida di aiutarmi :)


void OnTick()
{

if(OrdersTotal () == 0) EACandle(); (questo dovrebbe essere per aprire un solo ordine alla volta ma non capisco se vale per ogni cross o se ne apre uno solo in totale)

}

void EACandle()
{

}

double distanzaCandela=iClose(Symbol(),15,1)-iOpen(Symbol(),15,1);
double OrdineSL,OrdineTP;
int ticket;

if(distanzaCandela>=100*Point){ (questo vale per una sola candela ma le condizioni devono essere le medesime ma per 3 candele di seguito)

OrdineSL = Bid - (Bid - 600*Point()); (qui mi da il primo errore di compilazione)
OrdineTP = Bid + (Bid + 300*Point());

ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,OrdineSL,OrdineTP,"Buy EA La Bomba",0,0,clrBeige);

if(ticket<0) Print("ERRORE INSERIMENTO ORDINE");
}

if(distanzaCandela<=-90*Point)
{

OrdineSL = Bid - (Bid - 600*Point());
OrdineTP = Bid + (Bid + 150*Point());

ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,OrdineSL,OrdineTP,"Sell EA La Bomba",0,0,clrAquamarine);

if(ticket<0) Print("ERRORE INSERIMENTO ORDINE");

}

extern double e_TrailingStop = 5;
extern double e_TrailingStep = 5;
...
...
void TrailingStop(){
if (OrderType() == OP_BUY)
if ((Bid - OrderOpenPrice()) > (e_TrailingStop * Point))
if (OrderStopLoss() < Bid - (e_TrailingStop + e_TrailingStep - 1) * Point) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask - e_TrailingStop * Point, OrderTakeProfit(), 0, Green);
return;
}
if (OrderType()==OP_SELL)
if ((OrderOpenPrice() - Ask) > (e_TrailingStop * Point))
if (OrderStopLoss() > Ask + (e_TrailingStop + e_TrailingStep - 1) * Point || OrderStopLoss()==0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + e_TrailingStop * Point, OrderTakeProfit(), 0, Red);
return;
}
}
int v_total=OrdersTotal();
if(v_total<1) {
// no opened orders identified
if(AccountFreeMargin()<(1000*e_Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
}
else{
int v_i = 0;
while (v_i < v_total){
//posizioni aperte della linea del cuore? (ricerca per MagicID)
if((OrderSelect(v_i, SELECT_BY_POS, MODE_TRADES)==true) && (OrderMagicNumber() == e_MagicID)){
if (e_TrailingStop > 0){
//gestione trailing stop
TrailingStop();
return(0);
}
}
v_i++;
}
}

Sponsor

Sponsor
 

simitch
Messaggi: 121
Iscritto il: 18/12/2014, 0:06

Re: Programmare un EA aiuto!

Messaggio da simitch » 19/03/2017, 14:16

Ciao,
Premettendo che non sono assolutamente un esperto, provo a darti una mano solo a parole, perchè ora come ora non ho tempo di scrivere codice.
1- Per fare questa cosa devi implementare un controllo che guarda tramite orderTotal se ci sono operazioni di tipo OP_BUY e OP_SELL(posizioni aperte) anche tramite magic number perchè senno controlli/chiudi posizioni che non centrano con l'ea.
2- Per il timeframe basta usare nelle varie funzioni che prendano in input il timeframe PERIOD_M15 o _PERIOD e poi mettere l'ea in una chart a m15
3- non ti posso rispondere bene perchè non ho visto com'è il codice ma controllare la grandezza delle candele è un attimo open-close>=10pips
4- La funzione orderSend ha il tp e sl come parametri, ma attento che vuole un livello di prezzo e non il numero di pips, quindi devi sommare il numero di pips che vuoi(0,0001) al prezzo di entrata.
5- Per la gestione del trailing stop ci sono moltissimi esempi online, basta cercarli
6- come per la risposta prima
7- Il numero di lotti è anche questo un parametro della funzione ordersend, basta che ce lo scrivi dentro o usi una variabile specifica. Se vuoi usare size fissa problemi non ce ne sono.

Questi sono consigli generali e basici. Per cose più specifiche e corrette ti lascio ai più esperti o ti risponderò tra qualche giorno un pò meglio :)

themillionaire
Messaggi: 2
Iscritto il: 19/03/2017, 9:55

Re: Programmare un EA aiuto!

Messaggio da themillionaire » 19/03/2017, 22:44

Grazie mille della risposta e dell'aiuto fornitomi. Come puoi vedere io l'EA l ho già scritto (quasi) tutto, ma non può funzionare per via di errori nella.compilazione che non riesco a sistemare. Il tuo aiuto è molto utile ma purtroppo non "risponde" al mio problema di errore compilazione. Magari se avrai tempo e voglia importa il codice nel tuo IDE così potrai indicarmi nello specifico cosa sistemare per non dare errore. Grazie mille ancora del tuo tempo :)

Rispondi