Confira os nossos eBooks, Snippets e Fóruns produzidos para cada plataforma!
Primeiramente gostaria de parabenizar o criador deste site e canal do Youtube. Excelente material!
Segundo. Tenho um robo que opera faixas de preços. Exemplo. Dólar oscila de 5100 até 5110. Ele fica comprando em 5100 e vendendo em 5110. No Metatrader eu tenho tanto um algoritmo para conta Netting como para conta Hedge. No caso do Profit o comportamento seria de conta do tipo netting onde eu tenho sempre uma única operação em execução.
O que eu preciso então? Eu preciso "pendurar ordens". Exemplo se eu estou operando faixas de 10 pontos, no preço 5100 eu penduro uma venda em 5110. E em 5110 eu penduro uma compra em 5100.
Fato é que tentei fazer isso no Automatizador de todas as formas e tipos de ordem sem sucesso.
Uma coisa básica. Eu queria por exemplo abrir uma compra em 5100 e vender dobrado em 5110. Chegando em 5100 novamente eu faço o mesmo e então ele fica fazendo exatamente o que eu preciso: compra na base, vende no topo desta faixa. Porém quando mando via SendOrder quantidade 1 na compra a ordem de venda ele não deixa fazer com 2. Ele só deixa matar a operação anterior e não "matar + virar a mão".
Enfim. Se alguém puder me dar uma luz.
Eu gostaria de automatizar no Profit pois o Metatrader tem me gerado de 1-2 ticks por operação de slippage. Operando "na mão" no profit eu nunca tive Slippage na saída por lucro (take profit) e no stop a frequência é bem baixa. No Metatrader o slippage ocorre toda hora tanto no Takeprofit como no Stoploss que são ordens à mercado e a corretora com seu esquema de RLP aproveita para rapelar todo mundo.
Porém até o momento não tive sucesso. Mesmo pendurar n-ordens em preços diferentes eu não consegui. Pode ser que sejam ainda "bugs" ou limitações da própria ferramenta que precisam ser resolvidas. Ou pode ser que esteja me faltando mais conhecimento de como utilizá-la.
Desde já agradeço à todos! Grande abraço e VIDA LONGA para essa comunidade!
Olá @Colacino!
Seja bem vindo à comunidade! Também estou torcendo pela vida longa da comunidade!
À primeira vista, acho que é possível fazer isso...Entendo que você tería que trabalhar com ordens limitadas e de stop (no caso da primeira abertura de posição) e depois nas reversões só ordens limitadas.
Você tem algum trecho de código para elaborar encima dele? Seria interessante para entender melhor quando e qual é a faixa de consolidação que você identifica.
Abs!
@admin Jon
Vou te mandar uma versão simplificada com a mesma lógica de abertura de ordens.
Testei hoje e deu uma boa melhorada. Tinha mais bugs (do lado do Profit) que foram possivelmente corrigidos.
Dá uma testada ai. Gráfico 20P, Data = 24/11/2022 (consolidou bastante fica mais fácil de testar).
Teste no dia 25/11 e ele abriu a ordem de reversão (2 lotes). No dia 24/11 não abre a reversão. Fica com lote = 1.
Veja se sua mente mágica encontra o erro 🙂
obrigado desde já
input pts(10); var stop_compra,stop_venda : float; begin se (Time > 903) and (Time < 1640) então begin // definição do tamanho do stop if (close[1] < close[2]) and (open[1] < open[2]) então stop_compra := pts / 2 senão stop_compra := pts; if (close[1] > close[2]) and (open[1] > open[2]) então stop_venda := pts / 2 senão stop_venda := pts; // checa se há posição comprada; arma stop; arma inversão if buyposition > 0 então begin //stop SendOrder(osSell,otStopLimit,1,BuyPrice - stop_compra,BuyPrice - stop_compra); //inversão SendOrder(osSell,otLimit,2,BuyPrice + pts,BuyPrice + pts); end; // checa se há posição vendida; arma stop; arma inversão if (sellposition > 0) então begin // stop SendOrder(osBuy,otStopLimit,1,SellPrice + stop_venda,SellPrice + stop_venda); // inversão SendOrder(osBuy,otLimit,2,SellPrice - pts,SellPrice - pts); end; // checa se há posições em aberto; abre ordens pendentes if (SellPosition = 0) and (BuyPosition = 0) então begin // ordens pendentes de compra e venda SendOrder(osBuy,otLimit,1,close - pts,close - pts); SendOrder(osSell,otLimit,1,close + pts,close + pts); end; end; end;
Detalhe. Funcionou uma única vez o lance de inverter a mão. Depois nunca mais consegui ver isso funcionar 😀 mesmo no dia 25.11 Use o gráfico de 20P pra você entender a lógica.
Olá @colacino!
"Brinquei" com o seu código bastante aqui e realmente não consegui fazer a ordem limitada causar a reversão da posição.
No manual da NTSL, na página 43 acrescentaram recentemente uma explicação sobre como é o comportamento do módulo de automação. Lá deixam bem claro que quando você estiver vendido, as ordens servirão apenas para cobrir posição, e o mesmo quando estiver comprado.
Ou seja, na tentativa de tentar "proteger' contra erros, impediram as pessoas de criarem estratégias com reversão de posição que não seja a mercado...
Minha sugestão seria você abrir um chamado para que quando houver uma quantidade superior à posição nas ordens limites, que a linguagem NTSL respeite a vontade dos programadores.
A Nelogica está fazendo um excelente trabalho de quebrar os paradigmas da programação...ao invés do código executar o que a gente programa, ele executa o que ele acha melhor...kkk!
Boa sorte...precisando estamos por ai!
input pts(3); var stop_compra,stop_venda : float; begin se (Time > 903) and (Time < 1640) então begin // definição do tamanho do stop if (close[1] < close[2]) and (open[1] < open[2]) então stop_compra := pts / 2 senão stop_compra := pts; if (close[1] > close[2]) and (open[1] > open[2]) então stop_venda := pts / 2 senão stop_venda := pts; // checa se há posição comprada; arma stop; arma inversão if buyposition > 0 então begin CancelPendingOrders; //stop SellShortStop(BuyPrice - stop_compra,BuyPrice - stop_compra); //inversão SellShortLimit(BuyPrice + pts,buyPosition); SellShortLimit(BuyPrice + pts +0.5,buyPosition); end; // checa se há posição vendida; arma stop; arma inversão if (sellposition > 0) então begin CancelPendingOrders; // stop BuyStop(SellPrice + stop_venda,SellPrice + stop_venda); // inversão BuyLimit(SellPrice - pts,sellPosition); BuyLimit(SellPrice - pts-0.5,sellPosition); end; // checa se há posições em aberto; abre ordens pendentes if (SellPosition = 0) and (BuyPosition = 0) então begin // ordens pendentes de compra e venda BuyLimit(close - pts); SellShortLimit(close + pts); end; end; if Time >= 2000 then ClosePosition; end;