Profit Trailing (on close) ..come convertire tick by tick?!
23 risposte
Gaudio Fx
8 anni fa #115026
mikeyc
8 anni fa #136500
//+------------------------------------------------------------------+ /** * Gestire il trade - spostare lo SL al pareggio o al trailing stop */ void manageStop() { if(!sqIsBarOpen) return; ... il resto del codice
Se si commenta il:
if(!sqIsBarOpen) return;
linea come:
// if(!sqIsBarOpen) return;
Quindi la funzione manageStop verrà eseguita per ogni tick e tutti i tipi di spostamento dello stop loss avverranno ogni tick, se necessario. In questo modo, però, il carico di CPU sul computer sarà molto più elevato.
geektrader
8 anni fa #136504
.... e rovinerà la vostra strategia. Vedrete che nel 99% dei casi l'esecuzione di una strategia con trailing per tick invece che per barra aperta (come è stata creata da SQ) risulterà in una curva di equity negativa. Questo semplicemente perché la strategia è stata trovata da SQ con un trailing su barra ed è stata creata in questo modo. Accelerare il trailing in questo modo cambierà completamente l'intera strategia e non porterà a nulla di buono, ma vedrete cosa intendo quando farete i vostri test in MT4 con il trailing per tick invece che per barra aperta;)
Gaudio Fx
8 anni fa #136505
//+------------------------------------------------------------------+ /** * Gestire il trade - spostare lo SL al pareggio o al trailing stop */ void manageStop() { if(!sqIsBarOpen) return; ... il resto del codiceSe si commenta il:
if(!sqIsBarOpen) return;
linea come:
// if(!sqIsBarOpen) return;
Quindi la funzione manageStop verrà eseguita per ogni tick e tutti i tipi di spostamento dello stop loss avverranno ogni tick, se necessario. In questo modo, però, il carico di CPU sul computer sarà molto più elevato.
Grazie per la risposta amico mio... quindi ho commentato "if(!sqlsBarOpen) return;" con " // " e il risultato è questo :
da questo codice standard ...
a questo :
mikeyc
8 anni fa #136510
Solo il getProfitTrailingByTick avrà qualche effetto se viene definita con un numero di pip come valore di ritorno (questo è vuoto, quindi non fa nulla).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valore lungo qui } else if (OrderType() == OP_SELL) { // valore breve qui } return(0); }
L'altro tipo di stop trailing (che utilizza uno o più indicatori) continuerà ad essere tracciato alla chiusura, perché il valore dell'indicatore cambia solo ad ogni barra:
double getStopTrailingByClose() { double value = 0; if (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 1) + (0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1)) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1)); } else if (OrderType() == OP_SELL) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 1) + (-0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1)) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1)); } return(valore); }
Gaudio Fx
8 anni fa #136513
Solo il getProfitTrailingByTick avrà qualche effetto se viene definita con un numero di pip come valore di ritorno (questo è vuoto, quindi non fa nulla).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valore lungo qui } else if (OrderType() == OP_SELL) { // valore breve qui } return(0); }L'altro tipo di stop trailing (che utilizza uno o più indicatori) continuerà ad essere tracciato alla chiusura, perché il valore dell'indicatore cambia solo ad ogni barra:
double getStopTrailingByClose() { double value = 0; if (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 1) + (0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1)) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1)); } else if (OrderType() == OP_SELL) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 0, 0, 0, 1) + (-0.8) * (MathAbs(iIchimoku(NULL, 0, 9, 26, 52, MODE_KIJUNSEN, 1)) - iMA(NULL, 0, 1872, 0, MODE_LWMA, PRICE_CLOSE, 1)); } return(valore); }
Scusate... ma non è un'esecuzione per tick 🙁 Ho compilato in questo modo ma non ho un trailing per tick... non è corretto?
mikeyc
8 anni fa #136514
Ok, la situazione è un po' più complicata dal fatto che la funzione manageStop utilizza Close[1] come prezzo corrente. Ovviamente questo prezzo cambia solo ad ogni barra, quindi lo stop viene spostato solo ad ogni barra.
//------------------------------ // profitto trailing su TICK!!!!! trailingStopValue = getProfitTrailingByTick(); if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Bid - trailingStopValue; } else { tsLevel = Ask + trailingStopValue; }
Modificare il codice come mostrato sopra, sostituendo close con Bid e Ask.
Gaudio Fx
8 anni fa #136515
Ok, la situazione è un po' più complicata dal fatto che la funzione manageStop utilizza Close[1] come prezzo corrente. Ovviamente questo prezzo cambia solo ad ogni barra, quindi lo stop viene spostato solo ad ogni barra.//------------------------------ // profitto trailing su TICK!!!!! trailingStopValue = getProfitTrailingByTick(); if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Bid - trailingStopValue; } else { tsLevel = Ask + trailingStopValue; }Modificare il codice come mostrato sopra, sostituendo close con Bid e Ask.
Ho cambiato Bid & Ask ... ma non è mai cambiato ... non è una traccia 🙁
mikeyc
8 anni fa #136516
Ho apportato queste modifiche e il trailing by tick ha funzionato:
211 2015.08.24 02:45 buy 11 1.00 1.56723 0.00000 0.00000 0.00 9788.26
212 2015.08.24 02:45 modifica 11 1.00 1.56723 1.54657 0.00000 0.00 9788.26
213 2015.08.24 02:50 modifica 11 1.00 1.56723 1.56723 0.00000 0.00 9788.26
214 2015.08.24 02:52 modifica 11 1.00 1.56723 1.56724 0.00000 0.00 9788.26
215 2015.08.24 02:52 modifica 11 1.00 1.56723 1.56725 0.00000 0.00 9788.26
216 2015.08.24 02:52 modifica 11 1.00 1.56723 1.56726 0.00000 0.00 9788.26
217 2015.08.24 02:52 modifica 11 1.00 1.56723 1.56727 0.00000 0.00 9788.26
218 2015.08.24 02:52 modifica 11 1.00 1.56723 1.56728 0.00000 0.00 9788.26
219 2015.08.24 02:53 modifica 11 1.00 1.56723 1.56729 0.00000 0.00 9788.26
220 2015.08.24 02:53 modifica 11 1.00 1.56723 1.56732 0.00000 0.00 9788.26
221 2015.08.24 02:53 modifica 11 1.00 1.56723 1.56734 0.00000 0.00 9788.26
222 2015.08.24 02:53 modifica 11 1.00 1.56723 1.56737 0.00000 0.00 9788.26
223 2015.08.24 02:53 modifica 11 1.00 1.56723 1.56739 0.00000 0.00 9788.26
224 2015.08.24 02:53 modifica 11 1.00 1.56723 1.56740 0.00000 0.00 9788.26
225 2015.08.24 02:56 s/l 11 1.00 1.56740 1.56740 0.00000 10.73 9798.99
Gaudio Fx
8 anni fa #136519
geektrader
8 anni fa #136530
È necessario rimuovere anche la riga "if (OrderOpenTime() >= Time[0])...", poiché altrimenti la funzione esce a questo punto finché l'ordine non è stato aperto per almeno 1 barra. Quindi inizierà a tracciare (per tick nel vostro caso) solo 1 barra dopo l'apertura dell'ordine. Se si rimuove quella riga, inizierà subito 1 tick dopo l'apertura dell'ordine.
Continuo a ripeterlo: questo non porterà a nulla di più redditizio della vostra strategia originale, anzi sarà peggio, molto peggio di un trail by tick, se la strategia è stata creata con il trailing su barra. In questo modo si uccide l'intera strategia, poiché anche gli ordini successivi saranno influenzati dalla chiusura anticipata degli ordini precedenti. È il modo perfetto per sbarazzarsi del proprio denaro, ma sembra che si debba imparare nel modo più duro:)
geektrader
8 anni fa #136532
//+------------------------------------------------------------------+ /** * Gestire l'operazione - spostare lo SL per raggiungere il pareggio o il trailing stop. */ void manageStop() { //if(!sqIsBarOpen) return; double trailingStopValue, moveSLValue; double orderSL, normalOrderSL, orderOpen; double close = Close[0]; double tsLevel, newSL; for(int i=0; i= Time[0]) continue; // uscire se l'ordine è stato appena aperto //------------------------------ // profit trailing sulla chiusura trailingStopValue = getProfitTrailingByTick(); if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = close - trailingStopValue; } altrimenti { tsLevel = close + trailingStopValue; } orderSL = OrderStopLoss(); normalOrderSL = getNormalSL(orderSL); newSL = getSpecialSL(tsLevel); if(OrderType() == OP_BUY) { if(isSLCorrect(tsLevel) && (orderSL == 0 || normalOrderSL tsLevel) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0); } } } //-------------------------------------------------------- // gestire lo stop trailing sulla chiusura trailingStopValue = getStopTrailingByClose(); if(trailingStopValue > 0) { orderOpen = OrderOpenPrice(); orderSL = OrderStopLoss(); normalOrderSL = getNormalSL(orderSL); newSL = getSpecialSL(trailingStopValue); if(OrderType() == OP_BUY) { if(isSLCorrect(trailingStopValue) && (orderSL == 0 || normalOrderSL trailingStopValue) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0); } } } //-------------------------------------------------------- // gestire SL 2 BE (per tick) moveSLValue = getMoveSLValueByTick(); se(moveSLValue > 0) { orderSL = OrderStopLoss(); normalOrderSL = getNormalSL(orderSL); orderOpen = OrderOpenPrice(); newSL = getSpecialSL(orderOpen); if(OrderType() == OP_BUY) { if(isSLCorrect(orderOpen) && (close - orderOpen >= moveSLValue) && (orderSL == 0 || normalOrderSL = moveSLValue) && (orderSL == 0 || normalOrderSL > orderOpen) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), orderOpen, newSL, OrderTakeProfit(), 0); } } } } } } //+------------------------------------------------------------------+
Questo è il codice completo da sostituire, che consentirà di tracciare l'ordine, spunta per spunta.
Gaudio Fx
8 anni fa #136542
Gaudio Fx
8 anni fa #136545
Gaudio Fx
8 anni fa #136616
geektrader
8 anni fa #136634
NO, SQ creerà solo strategie con trailing su BAR CLOSE come spiegato più volte qui e in altri thread. L'unica cosa che si può fare è esportare un EA per MT4 che faccia trailing sul TICK modificando il codice MQL4 nel modo in cui lo abbiamo postato per voi già diverse volte in questo thread. Questo non cambierà nulla del fatto che SQ continuerà a creare strategie con trailing solo sulla chiusura della barra. Il perché di questa situazione è stato spiegato nel forum (da me e da altri) alcune volte.