Profit Trailing (al cierre) ..¿cómo convertir tick por tick?
23 respuestas
Gaudio Fx
hace 8 años #115026
mikeyc
hace 8 años #136500
//+------------------------------------------------------------------+ /** * Gestionar la operación - mover el SL al punto de equilibrio o al trailing stop */ void manageStop() { if(!sqIsBarOpen) return; ... resto del código
Si comentas el:
if(!sqIsBarOpen) return;
línea como:
// if(!sqIsBarOpen) return;
Entonces la función manageStop se ejecutará para cada tick, y todos los tipos de movimiento de stop loss ocurrirán cada tick donde se requiera. Esto hará que una carga de CPU mucho mayor en el equipo sin embargo.
geektrader
hace 8 años #136504
.... y arruinará su estrategia. Usted verá que en 99% de los casos la ejecución de una estrategia con trailing por garrapata en lugar de barra abierta (la forma en que fue creado por SQ) se traducirá en una curva de equidad negativa. Es simplemente porque la estrategia fue encontrada por SQ con un trailing en barra y fue creada así. Acelerar el trailing de esa manera cambiará toda la estrategia por completo y no le hará ningún bien, pero verá lo que quiero decir cuando haga sus pruebas en MT4 con trailing por tick en lugar de barra abierta;)
Gaudio Fx
hace 8 años #136505
//+------------------------------------------------------------------+ /** * Gestionar la operación - mover el SL al punto de equilibrio o al trailing stop */ void manageStop() { if(!sqIsBarOpen) return; ... resto del códigoSi comentas el:
if(!sqIsBarOpen) return;
línea como:
// if(!sqIsBarOpen) return;
Entonces la función manageStop se ejecutará para cada tick, y todos los tipos de movimiento de stop loss ocurrirán cada tick donde se requiera. Esto hará que una carga de CPU mucho mayor en el equipo sin embargo.
gracias por la respuesta amigo.. he comentado "if(!sqlsBarOpen) return;" con " // " y el resultado es este :
de este código estándar ...
en este :
mikeyc
hace 8 años #136510
Sólo el getProfitTrailingByTick tendrá algún efecto si se define con un número de pips como valor de retorno (éste está en blanco, por lo que no hace nada).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valor largo aquí } else if (OrderType() == OP_SELL) { // valor corto } return(0); }
El otro tipo de stop trailing (que utiliza uno o más indicadores) seguirá trailing al cierre, porque el valor del indicador sólo cambia cada barra:
double getStopTrailingByClose() { double valor = 0; if (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 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(valor); }
Gaudio Fx
hace 8 años #136513
Sólo el getProfitTrailingByTick tendrá algún efecto si se define con un número de pips como valor de retorno (éste está en blanco, por lo que no hace nada).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valor largo aquí } else if (OrderType() == OP_SELL) { // valor corto } return(0); }El otro tipo de stop trailing (que utiliza uno o más indicadores) seguirá trailing al cierre, porque el valor del indicador sólo cambia cada barra:
double getStopTrailingByClose() { double valor = 0; if (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 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(valor); }
Lo siento .. pero no se ejecuta por garrapata 🙁 i compilar de esta manera, pero no tienen un trailing por garrapata .. no es correcto ?
mikeyc
hace 8 años #136514
Vale, es un poco más complicado por el hecho de que la función manageStop utiliza Close[1] como precio actual. Por supuesto, este precio sólo cambia cada barra, por lo que el stop sólo se mueve cada barra.
//------------------------------ ¡¡¡¡¡// beneficio trailing en TICK!!!!! trailingStopValue = getProfitTrailingByTick(); if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Oferta - trailingStopValue; } else { tsLevel = Ask + trailingStopValue; }
Cambie el código como se muestra arriba, sustituyendo close por Bid y Ask.
Gaudio Fx
hace 8 años #136515
Vale, es un poco más complicado por el hecho de que la función manageStop utiliza Close[1] como precio actual. Por supuesto, este precio sólo cambia cada barra, por lo que el stop sólo se mueve cada barra.//------------------------------ ¡¡¡¡¡// beneficio trailing en TICK!!!!! trailingStopValue = getProfitTrailingByTick(); if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Oferta - trailingStopValue; } else { tsLevel = Ask + trailingStopValue; }Cambie el código como se muestra arriba, sustituyendo close por Bid y Ask.
Tengo cambio en Bid & Ask .. pero nunca cambió .. no rastro 🙁
mikeyc
hace 8 años #136516
Hice esos cambios y el trailing by tick me funcionó:
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 modificar 11 1,00 1,56723 1,54657 0,00000 0,00 9788.26
213 2015.08.24 02:50 modificar 11 1,00 1,56723 1,56723 0,00000 0,00 9788.26
214 2015.08.24 02:52 modificar 11 1,00 1,56723 1,56724 0,00000 0,00 9788.26
215 2015.08.24 02:52 modificar 11 1,00 1,56723 1,56725 0,00000 0,00 9788.26
216 2015.08.24 02:52 modificar 11 1.00 1.56723 1.56726 0.00000 0.00 9788.26
217 2015.08.24 02:52 modificar 11 1,00 1,56723 1,56727 0,00000 0,00 9788.26
218 2015.08.24 02:52 modificar 11 1.00 1.56723 1.56728 0.00000 0.00 9788.26
219 2015.08.24 02:53 modificar 11 1,00 1,56723 1,56729 0,00000 0,00 9788.26
220 2015.08.24 02:53 modificar 11 1,00 1,56723 1,56732 0,00000 0,00 9788.26
221 2015.08.24 02:53 modificar 11 1,00 1,56723 1,56734 0,00000 0,00 9788.26
222 2015.08.24 02:53 modificar 11 1,00 1,56723 1,56737 0,00000 0,00 9788.26
223 2015.08.24 02:53 modificar 11 1,00 1,56723 1,56739 0,00000 0,00 9788.26
224 2015.08.24 02:53 modificar 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
hace 8 años #136519
geektrader
hace 8 años #136530
También debe eliminar la línea "if (OrderOpenTime() >= Time[0])...", ya que, de lo contrario, saldrá de la función en este punto siempre que la orden no se haya abierto durante al menos 1 barra. Así que sólo empezará a hacer trailing (por tick en su caso) 1 barra después de que la orden haya sido abierta. Si quita esa línea, comenzará inmediatamente 1 tick después de la apertura de la orden.
Sigo diciéndote: esto no conducirá a nada más rentable que tu estrategia original, será peor, mucho peor hacer trail por tick, si la estrategia fue creada con on bar trailing. Te cargas toda la estrategia de esta manera ya que también las siguientes órdenes se verán afectadas por el cierre más temprano de las órdenes anteriores. Es la manera perfecta de deshacerse de su dinero para hacer eso, pero parece que tienes que aprender de la manera difícil:)
geektrader
hace 8 años #136532
//+------------------------------------------------------------------+ /** * Gestionar la operación - mover el SL al punto de equilibrio o al 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; // salir si la orden se acaba de abrir //------------------------------ // trailing de beneficios al cierre trailingStopValue = getProfitTrailingByTick(); if(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = close - trailingStopValue; } else { tsLevel = close + trailingStopValue; } orderSL = OrderStopLoss(); normalOrderSL = getNormalSL(orderSL); newSL = getSpecialSL(tsLevel); if(TipoOrden() == OP_BUY) { if(isSLCorrect(tsLevel) && (orderSL == 0 || normalOrderSL tsLevel) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0); } } } //-------------------------------------------------------- // gestionar stop trailing por cierre 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); } } } //-------------------------------------------------------- // gestionar SL 2 BE (por tick) moveSLValue = getMoveSLValueByTick(); if(moveSLValue > 0) { ordenSL = ordenStopLoss(); 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); } } } } } } //+------------------------------------------------------------------+
Este es el código completo para reemplazar, este será el seguimiento de su orden de garrapata por garrapata a continuación.
Gaudio Fx
hace 8 años #136542
Gaudio Fx
hace 8 años #136545
Gaudio Fx
hace 8 años #136616
geektrader
hace 8 años #136634
NO, SQ sólo creará estrategias con trailing on BAR CLOSE como se ha explicado varias veces aquí y en otros hilos. Lo único que puede hacer es exportar un EA para MT4 que se arrastra en TICK modificando el código MQL4 en la forma en que hemos publicado para usted ya un buen número de veces en este hilo. Esto no va a cambiar nada sobre el hecho de que SQ todavía sólo creará estrategias con trailing en el cierre de la barra solamente. Y por qué ese es el caso, también se explicó en el Foro (por mí y otros) un par de veces.