order_send() Python order_send failed, retcode=10016

 

Olá Pessoal, tudo bem?


Estou testando a integração com Python utilizando Mini de WDO. Porém estou com erro e infelizmente não acho nada na documentação.

request_sell = {
    "action": mt5.TRADE_ACTION_PENDING,
    "symbol": symbol,
    "volume": lot,
    "type": mt5.ORDER_TYPE_SELL,
    "price": price_sell,
    "sl": sl_sell ,
    "tp": tp_sell ,
    "deviation": deviation,
    "magic": 234000,
    "comment": "python script open",
    "type_time": mt5.ORDER_TIME_DAY,
    "type_filling": mt5.ORDER_FILLING_RETURN,
}
request_sell

{'action': 5,
 'symbol': 'WDOU21',
 'volume': 1.0,
 'type': 1,
 'price': 5309.0,
 'sl': 5310.0,
 'tp': 5307.0,
 'deviation': 0,
 'magic': 234000,
 'comment': 'python script open',
 'type_time': 1,
 'type_filling': 2}

result = mt5.order_send(request_sell)

 order_send failed, retcode=10016
   retcode=10016
   deal=0
   order=0
   volume=0.0
   price=0.0
   bid=0.0
   ask=0.0
   comment=Invalid stops
   request_id=0
   retcode_external=0
   request=TradeRequest(action=5, magic=234000, order=0, symbol='WDOU21', volume=1.0, price=5309.0, stoplimit=0.0, sl=5310.0, tp=5307.0, deviation=0, type=1, type_filling=2, type_time=1, expiration=0, comment='python script open', position=0, position_by=0)
       traderequest: action=5
       traderequest: magic=234000
       traderequest: order=0
       traderequest: symbol=WDOU21
       traderequest: volume=1.0
       traderequest: price=5309.0
       traderequest: stoplimit=0.0
       traderequest: sl=5310.0
       traderequest: tp=5307.0
       traderequest: deviation=0
       traderequest: type=1
       traderequest: type_filling=2
       traderequest: type_time=1
       traderequest: expiration=0
       traderequest: comment=python script open
       traderequest: position=0
       traderequest: position_by=0
 
Danilo Sousa:

Olá Pessoal, tudo bem?


Estou testando a integração com Python utilizando Mini de WDO. Porém estou com erro e infelizmente não acho nada na documentação.

Códigos de Retorno do Servidor de Negociação - Códigos de Erros e Avisos - Constantes, Enumeradores e Estruturas - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5



Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Códigos de Erros e Avisos / Códigos de Retorno do Servidor de Negociação
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Códigos de Erros e Avisos / Códigos de Retorno do Servidor de Negociação
  • www.mql5.com
Códigos de Retorno do Servidor de Negociação - Códigos de Erros e Avisos - Constantes, Enumeradores e Estruturas - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

Obrigado pela resposta.


Até achei esse erro, mas não estou consguindo fazer o troubleshooting no Python.


Eu peguei montei o request na mão utilizando o próprio bid e ask e da o mesmo erro.


Montei o request deixando os Stops com 0.0


Alguém sabe uma melhor maneira de debugar?


Obrigado pela resposta.

 
Danilo Sousa #:

Obrigado pela resposta.


Até achei esse erro, mas não estou consguindo fazer o troubleshooting no Python.


Eu peguei montei o request na mão utilizando o próprio bid e ask e da o mesmo erro.


Montei o request deixando os Stops com 0.0


Alguém sabe uma melhor maneira de debugar?


Obrigado pela resposta.

Como parece certo o SL/TP, muda o action para trade action deal, voce esta usando ordem a mercado nao tem sentido mandar um pending. Voce poderia tambem trocar a venda por uma venda limitada ja que no pior caso a mesma ficaria pendurada e no melhor seria executada a mercado...

Nao sei como se comportaria na parte de integracao, mas dependendo tu pode colocar uma linha escrita "import pdb; pdb.set_trace()" dai quando o python bate aqui ele te abre uma linha de comando pra debug.

 
Ricardo Rodrigues Lucca #:

Como parece certo o SL/TP, muda o action para trade action deal, voce esta usando ordem a mercado nao tem sentido mandar um pending. Voce poderia tambem trocar a venda por uma venda limitada ja que no pior caso a mesma ficaria pendurada e no melhor seria executada a mercado...

Nao sei como se comportaria na parte de integracao, mas dependendo tu pode colocar uma linha escrita "import pdb; pdb.set_trace()" dai quando o python bate aqui ele te abre uma linha de comando pra debug.

Obrigado pela resposta, nem cheguei a usar o trace, mas acredito que será útil no Futuro.


Acabei alterando de ORDER_TYPE_SELL para ORDER_TYPE_SELL_LIMIT e funcionou. Até estava escrito na documentação, acho que no dia fiquei "cego" de tanto codar e ler a documentação e não me atentei.


Obrigao, abs.

 

Tive esse problema com esse mesmo código e o erro que encontrei é que no calculo de limites geravam um numero decimal que não era valido (ex.: 5326.143543647523) e por aceitar apenas xxxx.0 ou xxxx.5 

então criei uma função para arredondar e foi sucesso

def myround(x, base=0.5):
    return base * round(x/base)
 
thiagorodrigoas #:

Tive esse problema com esse mesmo código e o erro que encontrei é que no calculo de limites geravam um numero decimal que não era valido (ex.: 5326.143543647523) e por aceitar apenas xxxx.0 ou xxxx.5 

então criei uma função para arredondar e foi sucesso

Cada caso eh um caso. Inclusive ele pode dar se o stop estiver muito colado em algumas corretoras que tem o stop level setado para diferente de zero. Apenas pra conhecimento, o python tem divisao inteira "x//base" se nao me falha a memoria. Dai so eliminaria a chamada do round().