Neo traderBot

Neo traderBot

Você sabia?

Confira os nossos eBooks, Snippets e Fóruns produzidos para cada plataforma!

leaf leftleaf right
Notifications
Clear all

[Solucionado] Dúvida com Ordens

5 Posts
2 Usuários
1 Reactions
187 Visualizações
(@colacino)
Membro ativo
Registrou: 2 anos atrás
Posts: 3
Iniciador do tópico  

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!

 


   
Citar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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!

 


   
Colacino reacted
ReplyCitar
(@colacino)
Membro ativo
Registrou: 2 anos atrás
Posts: 3
Iniciador do tópico  

@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;

   
ReplyCitar
(@colacino)
Membro ativo
Registrou: 2 anos atrás
Posts: 3
Iniciador do tópico  

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. 

This post was modified 2 anos atrás by Colacino

   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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;

   
ReplyCitar