martedì 22 febbraio 2011

Strategia giornaliera set and forget

E' da un pò di tempo che ho voglia di ricominciare a fare trading ma gli impegni di lavoro mi impediscono di monitorare il forex durante il giorno.
Ho pensato quindi di utilizzare un approccio di tipo set and forget ovvero inserire degli ordini in base a dei criteri definiti e di non guardarli più fino al giorno successivo.

Visto che l'orario migliore per me è dalle 19 alle 20 ho pensato di partire con una strategia molto semplice che subirà dei cambiamenti nel corso del tempo man mano che mi vengono delle idee.

Applicherò la strategia su di un conto demo piattaforma metatrader.


Per il momento le regole sono le seguenti:
- apertura degli ordini di lunedì, martedì, mercoledì e giovedì possibilmente dalle 19 alle 20, una sola posizione al giorno;
- il giorno successivo, allo stesso orario si chiude la posizione aperta il giorno prima indipendentemente dal profitto o dal loss;
- il venerdì si chiude l'ordine del giovedì ma non si aprono nuovi ordini per non rimanere il weekend con ordini aperti.

Aprirò una posizione long se la candela giornaliera è positiva uno short in caso contrario, il cross prescelto è EUR/USD, timeframe daily.

Con il tempo deciderò cosa modificare e cosa aggiungere alla strategia ed aggiornerò nel blog i risultati totali e giornalieri. Credo che postare i risultati mi aiuterà ad essere più disciplinato e ad osservare in modo più oggettivo la strategia ed il mercato.

Primo ordine aperto: SHORT EUR/USD a 1.3650, attualmente a -25 pips.

A domani.
 

9 commenti:

Ale L ha detto...

Ciao, anch'io a causa del lavoro ho poco tempo da dedicare al trading, perciò da poco tempo sto cercando di studiare un pò metatrader e le potenzialità che offre.

Ho provato a creare il mio primo EA, cercando di impostarlo in modo tale che si apra una posizione alla volta. Vorrei però aggiungere una funzione che faccia chiudere l'ordine poco prima che inizi una nuova candela daily, e cioè alle 23:59.

Girando un pò su internet ho trovato questa funzione:


RefreshRates();
if(Hour()==23 && Minute()==59 && Seconds()>49)
{
OrderClose(ticket, lotti, Bid, 0, White);
return(0);
}

Facendo il backtest sembra funzionare ma mi sono accorto che andando a ritroso di qualche mese ci sono dei casi in cui l'ordine non si chiude, o meglio si chiude dopo qualche candela. Hai qualche consiglio da darmi?

Grazie, Ciao

carlo10 ha detto...

Ciao, sono felice di rileggerti.

Premesso che si tratta di scelte di programmazione il controllo che hai impostato non mi piace molto principalmente per il fatto che, soprattutto in real, ci potrebbero essere degli errori che non ti permettono di chiudere la posizione in quei 10 secondi (requotes in primis).

Anche se con il metodo da me proposto non aggiri del tutto il problema (dovrai comunque testare che la chiusura sei anadata a buon fine) ti consiglio di verificare invece se si è formata una nuova candela:

http://metatrader-forex-trading.blogspot.com/2010/11/individuare-una-nuova-candela-in.html

In questo modo dovresti inoltre aggirare la differnza di fuso orario dei vari broker.

Ale L ha detto...

Quindi mi consigli di impostare un controllo del tipo:

if (isNewcandle()..
OrderClose(...

corretto?

Si buona idea! Provo a metterla in pratica...chissà se riuscirò mai a concludere questo EA :-)

Cmq volevo ringraziarti perchè questo blog è molto utile e trovo molte risposte a miei dubbi.

carlo10 ha detto...

Si il consiglio è di utilizzare quella funzione.

Ti ringrazio per i feedback, mi fa molto piacere se la lettura di qualche articolo ti è utile, vedrò di pubblicarne degli altri anche se ultimamente ho un pò rallentato l'attività.

Ale L ha detto...

Carlo
per chiudere gli ordini ho provato a implementare la funzione isNewCandle esattamente con la stessa logica del trailing stop che mi avevi consigliato tempo fa, solo che al posto della funzione OrderModify ho sostituito la funzione OrderClose(...):


//chiusura ordini aperti

for (int i = 0; i < OrdersTotal(); i++)
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (isNewCandle())
{
if (OrderType() == OP_BUY)
{
OrderClose(OrderTicket(), OrderLots(), Bid, 3, Yellow);
}
if (OrderType() == OP_SELL)
{
OrderClose(OrderTicket(), OrderLots(), Ask, 3, Yellow);
}
}
return(0);
}


Il risultato nel backtest è pessimo: in pratica appena si apre un ordine lo chiude immediatamente. Sembra strano perchè il codice con il trailing stop invece funziona correttamente.

carlo10 ha detto...

Ci deve essere qualche problemino, l'avevo utilizzata correttamente in un ea e funzionava bene.

Intanto prova a verificare se hai inserito anche la variabile globale e il pezzo di codice all'interno dell'init:


//variabile globale
static datetime g_lastCandleOpenTime;
...
...
int init(){
g_lastCandleOpenTime = Time[0];
...
}

In caso prendi spunto da questo ea che è quello che utilzza la funzione:

http://forex.altervista.org/metatrader/expert-advisor/Alternate_Buy_and_Sell_EA/Alternate_Buy_and_Sell_EA.mq4

Ale L ha detto...

Carlo in effetti guardando il tuo ea ho notato che è impostato in modo leggermente diverso dal mio. In particolare ho visto che la funzione isNewCandle la utilizzi subito dopo lo start, mentre io l'avevo inserita all'interno del ciclo for per chiudere le posizioni.

Ho visto inoltre che hai inserito una variabile e_debug, non ho capito a cosa serve.

Ho provato a impostare il mio ea sulla base del tuo ma adesso non apre neanche più gli ordini...

Posso inviarti l'ea così ci dai un'occhiata?

Ale L ha detto...

dopo aver trascorso una splendida domenica di sole davanti al monitor sono riuscito a risolvere! :-)

Adesso funziona, si chiude esattamente alle 0:00 del giorno successivo. Era solo un problema di posizione dell'istruzione "if isNewCandle"

-_-''

carlo10 ha detto...

Ottimo mi fa piacere!

Posta un commento