Profit Trailing (no fechamento) ... como converter tick by tick?
23 respostas
Gaudio Fx
8 anos atrás #115026
mikeyc
8 anos atrás #136500
//+------------------------------------------------------------------+ /** * Gerenciar a negociação - mover o SL para o ponto de equilíbrio ou trailing stop */ void manageStop() { if(!sqIsBarOpen) return; ... restante do código
Se você comentar o:
Se(!sqIsBarOpen) retornar;
linha como:
// se(!sqIsBarOpen) retornar;
Em seguida, a função manageStop será executada para cada tick, e todos os tipos de movimento de stop loss ocorrerão a cada tick, quando necessário. No entanto, isso aumentará muito a carga da CPU no computador.
geektrader
8 anos atrás #136504
.... e isso arruinará sua estratégia. Você verá que em 99% dos casos a execução de uma estratégia com trailing por tick em vez de barra aberta (como foi criada pela SQ) resultará em uma curva de patrimônio líquido negativa. Isso se deve simplesmente ao fato de a estratégia ter sido encontrada pelo SQ com um trailing na barra e ter sido criada dessa forma. Acelerar o trailing dessa forma mudará completamente toda a estratégia e não lhe trará nenhum benefício, mas você verá o que quero dizer quando fizer seus testes no MT4 com trailing por tick em vez de barra aberta;)
Gaudio Fx
8 anos atrás #136505
//+------------------------------------------------------------------+ /** * Gerenciar a negociação - mover o SL para o ponto de equilíbrio ou trailing stop */ void manageStop() { if(!sqIsBarOpen) return; ... restante do códigoSe você comentar o:
Se(!sqIsBarOpen) retornar;
linha como:
// se(!sqIsBarOpen) retornar;
Em seguida, a função manageStop será executada para cada tick, e todos os tipos de movimento de stop loss ocorrerão a cada tick, quando necessário. No entanto, isso aumentará muito a carga da CPU no computador.
Obrigado pela resposta, amigo... então, comentei "if(!sqlsBarOpen) return;" com " // " e o resultado é este:
deste código padrão ...
neste momento:
mikeyc
8 anos atrás #136510
Somente o getProfitTrailingByTick terá algum efeito se for definida com um número de pips como valor de retorno (essa função está em branco, portanto, não faz nada).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valor longo aqui } else if (OrderType() == OP_SELL) { // valor curto aqui } return(0); }
O outro tipo de stop trailing (que usa um ou mais indicadores) ainda será rastreado no fechamento, porque o valor do indicador só muda a cada barra:
double getStopTrailingByClose() { double value = 0; Se (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 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, 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(value); }
Gaudio Fx
8 anos atrás #136513
Somente o getProfitTrailingByTick terá algum efeito se for definida com um número de pips como valor de retorno (essa função está em branco, portanto, não faz nada).
double getProfitTrailingByTick() { if (OrderType() == OP_BUY) { // valor longo aqui } else if (OrderType() == OP_SELL) { // valor curto aqui } return(0); }O outro tipo de stop trailing (que usa um ou mais indicadores) ainda será rastreado no fechamento, porque o valor do indicador só muda a cada barra:
double getStopTrailingByClose() { double value = 0; Se (OrderType() == OP_BUY) { value = iCustom(NULL,0, "Pivots", 0, 0, 15, 0, 0, 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, 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(value); }
Desculpe... mas não executar por tick 🙁 eu compilo dessa forma, mas não tenho um trailing by tick... isso não está correto?
mikeyc
8 anos atrás #136514
Ok, é um pouco mais complicado pelo fato de que a função manageStop usa Close[1] como o preço atual. É claro que esse preço só muda a cada barra, portanto, o stop só é movido a cada barra.
//------------------------------ // lucro com trailing no TICK!!!!! trailingStopValue = getProfitTrailingByTick(); se (trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Bid - trailingStopValue; } else { tsLevel = Ask + trailingStopValue; }
Altere o código conforme mostrado acima, substituindo close por Bid e Ask.
Gaudio Fx
8 anos atrás #136515
Ok, é um pouco mais complicado pelo fato de que a função manageStop usa Close[1] como o preço atual. É claro que esse preço só muda a cada barra, portanto, o stop só é movido a cada barra.//------------------------------ // lucro com trailing no TICK!!!!! trailingStopValue = getProfitTrailingByTick(); se (trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = Bid - trailingStopValue; } else { tsLevel = Ask + trailingStopValue; }Altere o código conforme mostrado acima, substituindo close por Bid e Ask.
Eu mudei o Bid & Ask ... mas nunca mudei... não o rastro 🙁
mikeyc
8 anos atrás #136516
Fiz essas alterações e o trailing by tick funcionou para mim:
211 2015.08.24 02:45 buy 11 1.00 1.56723 0.00000 0.00000 0.00000 0.00 9788.26
212 2015.08.24 02:45 modify 11 1.00 1.56723 1.54657 0.00000 0.00 9788.26
213 2015.08.24 02:50 modify 11 1.00 1.56723 1.56723 0.00000 0.00 9788.26
214 2015.08.24 02:52 modify 11 1.00 1.56723 1.56724 0.00000 0.00 9788.26
215 2015.08.24 02:52 modify 11 1.00 1.56723 1.56725 0.00000 0.00 9788.26
216 2015.08.24 02:52 modify 11 1.00 1.56723 1.56726 0.00000 0.00 9788.26
217 2015.08.24 02:52 modify 11 1.00 1.56723 1.56727 0.00000 0.00 9788.26
218 2015.08.24 02:52 modify 11 1.00 1.56723 1.56728 0.00000 0.00 9788.26
219 2015.08.24 02:53 modify 11 1.00 1.56723 1.56729 0.00000 0.00 9788.26
220 2015.08.24 02:53 modify 11 1.00 1.56723 1.56732 0.00000 0.00 9788.26
221 2015.08.24 02:53 modify 11 1.00 1.56723 1.56734 0.00000 0.00 9788.26
222 2015.08.24 02:53 modify 11 1.00 1.56723 1.56737 0.00000 0.00 9788.26
223 2015.08.24 02:53 modify 11 1.00 1.56723 1.56739 0.00000 0.00 9788.26
224 2015.08.24 02:53 modify 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 anos atrás #136519
geektrader
8 anos atrás #136530
Você também precisa remover a linha "if (OrderOpenTime() >= Time[0])...", pois ela sai da função nesse ponto, desde que a ordem não tenha sido aberta por pelo menos uma barra. Portanto, ele só começará a rastrear (por tick, no seu caso) uma barra após a abertura da ordem. Se você remover essa linha, ele começará imediatamente 1 tick após a abertura da ordem.
Continuo dizendo: isso não resultará em nada mais lucrativo do que sua estratégia original; será pior, muito pior, se a estratégia for criada com trailing na barra. Dessa forma, você mata toda a estratégia, pois as próximas ordens também serão afetadas pelo fechamento antecipado das ordens anteriores. Essa é a maneira perfeita de se livrar de seu dinheiro, mas parece que você terá que aprender da maneira mais difícil:)
geektrader
8 anos atrás #136532
//+------------------------------------------------------------------+ /** * Gerenciar a negociação - mover o SL para o ponto de equilíbrio ou trailing stop */ void manageStop() { //se(!sqIsBarOpen) return; double trailingStopValue, moveSLValue; double orderSL, normalOrderSL, orderOpen; double close = Close[0]; double tsLevel, newSL; for(int i=0; i= Time[0]) continue; // saia se a ordem tiver acabado de ser aberta //------------------------------ // lucro com trailing no fechamento trailingStopValue = getProfitTrailingByTick(); se(trailingStopValue > 0) { if(OrderType() == OP_BUY) { tsLevel = close - trailingStopValue; } else { tsLevel = close + trailingStopValue; } orderSL = OrderStopLoss(); normalOrderSL = getNormalSL(orderSL); newSL = getSpecialSL(tsLevel); Se (OrderType() == OP_BUY) { if(isSLCorrect(tsLevel) && (orderSL == 0 || normalOrderSL tsLevel) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0); } } } //-------------------------------------------------------- // gerenciar o stop trailing no fechamento trailingStopValue = getStopTrailingByClose(); se (trailingStopValue > 0) { orderOpen = OrderOpenPrice(); orderSL = OrderStopLoss(); normalOrderSL = getNormalSL(orderSL); newSL = getSpecialSL(trailingStopValue); Se (OrderType() == OP_BUY) { if(isSLCorrect(trailingStopValue) && (orderSL == 0 || normalOrderSL trailingStopValue) && !doublesAreEqual(orderSL, newSL)) { rettmp = OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0); } } } //-------------------------------------------------------- // gerenciar SL 2 BE (por tick) moveSLValue = getMoveSLValueByTick(); se (moveSLValue > 0) { orderSL = OrderStopLoss(); normalOrderSL = getNormalSL(orderSL); orderOpen = OrderOpenPrice(); newSL = getSpecialSL(orderOpen); Se (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); } } } } } } //+------------------------------------------------------------------+
Esse é o código completo a ser substituído, que rastreará seu pedido tick a tick.
Gaudio Fx
8 anos atrás #136542
Muito obrigado, geektrader 😀 ... Vou tentar fazer isso uma vez e depois lhe informo
Gaudio Fx
8 anos atrás #136545
Gaudio Fx
8 anos atrás #136616
geektrader
8 anos atrás #136634
NÃO, o SQ só criará estratégias com trailing no BAR CLOSE, conforme explicado várias vezes aqui e em outros tópicos. A única coisa que você pode fazer é exportar um EA para o MT4 que faça o trailing ON TICK modificando o código MQL4 da maneira que já postamos para você várias vezes neste tópico. Isso NÃO mudará em nada o fato de que o SQ AINDA criará estratégias com trailing somente no fechamento da barra. E o motivo disso também foi explicado no fórum (por mim e por outros) algumas vezes.