Erro enviar ordem de compra - Python MT5

 

Saudações, 


Solicito ajuda para resolver este erro, não consigo enviar ordem por meio de código python, o código é retirado da própria biblioteca MT5, correta Clear corretora do grupo XP. consigo comprar e vender normalmente pela plataforma MT5 porém, com o algotrading habilitado, não consigo de modo algum enviar ordem. segue abaixo código, link e print do erro.



https://www.mql5.com/pt/docs/integration/python_metatrader5/mt5ordersend_py

symbol = 'WINZ21'

lot = 0.1
point = mt5.symbol_info(symbol).point
price = mt5.symbol_info_tick(symbol).ask
deviation = 20
request = {
    "action"mt5.TRADE_ACTION_DEAL,
    "symbol"symbol,
    "volume"lot,
    "type"mt5.ORDER_TYPE_BUY,
    "price"price,
    "sl"price - 100 * point,
    "tp"price + 100 * point,
    "deviation"deviation,
    "magic"234000,
    "comment""python script open",
    "type_time"mt5.ORDER_TIME_GTC,
    "type_filling"mt5.ORDER_FILLING_RETURN,
}
 
# enviamos a solicitação de negociação
result = mt5.order_send(request)
# verificamos o resultado da execução
print("1. order_send(): by {} {} lots at {} with deviation={} points".format(symbol,lot,price,deviation));
if result.retcode != mt5.TRADE_RETCODE_DONE:
    print("2. order_send failed, retcode={}".format(result.retcode))
   # solicitamos o resultado na forma de dicionário e exibimos elemento por elemento
    result_dict=result._asdict()
    for field in result_dict.keys():
        print("   {}={}".format(field,result_dict[field]))
        #se esta for uma estrutura de uma solicitação de negociação, também a exibiremos elemento a elemento
        if field=="request":
            traderequest_dict=result_dict[field]._asdict()
            for tradereq_filed in traderequest_dict:
                print("       traderequest: {}={}".format(tradereq_filed,traderequest_dict[tradereq_filed]))
    print("shutdown() and quit")
    mt5.shutdown()
    quit()


1. order_send(): by WINZ21 1 lots at 108915.0 with deviation=20 points

----------------------------------------------------------------------------------------------

AtrributeError Traceback (most recent call last)

<ipython-input-4-296f93314b1d>  in <module>

3 # verificamos o resultado da execuçãi

4 print("1. order_send(): by {} {} lots at {} with deviation={} points".formar(symbol,lot,price,deviation));

----->5 if result.retcode != mt5.TRADE_RETCODE_DONE:

6 print("2. order_send failed, retcode={}".format(result.retcode))

7 #solicitamos o resultado na forma de dicionário e exibimos elemento por elemento

AttributeErros:  'NoneType' object has no attribute 'retcode'

Documentação sobre MQL5: Integração / MetaTrader para Python / order_send
Documentação sobre MQL5: Integração / MetaTrader para Python / order_send
  • www.mql5.com
order_send - MetaTrader para Python - Integração - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
Arquivos anexados:
3rr0r.png  452 kb
 
wagnerarins:

symbol = 'WINZ21'

lot = 0.1

....

O índice tem como lote minimo 1 e não frações, e outra precisa de tratamento de erro nisso ai eim.

Desculpe a franqueza, mas se quer usar a linguagem python para envio de ordem, tenha em mente que vc precisa no mínimo saber usar o modo debug do python para capturar erros como esses e saber trata-los. 

 

Jonathan Pereira #:

O índice tem como lote minimo 1 e não frações, e outra precisa de tratamento de erro nisso ai eim.

Desculpe a franqueza, mas se quer usar a linguagem python para envio de ordem, tenha em mente que vc precisa no mínimo saber usar o modo debug do python para capturar erros como esses e saber trata-los. 


Jonathan, agradeço responder, mesmo corrigido a questão de lotes ele retorna um erro cujo não consigo identificar, é possível que tenha a ver com a corretora? já tentei resolver de diversas formas mas sem exito.. 

symbol = 'WINZ21'
lot = 1
point = mt5.symbol_info(symbol).point
price = mt5.symbol_info_tick(symbol).ask
deviation = 20
request = {
    "action": mt5.TRADE_ACTION_DEAL,
    "symbol": symbol,
    "volume": lot,
    "type": mt5.ORDER_TYPE_BUY,
    "price": price,
    "sl": price - 100 * point,
    "tp": price + 100 * point,
    "deviation": deviation,
    "magic": 234000,
    "comment": "python script open",
    "type_time": mt5.ORDER_TIME_GTC,
    "type_filling": mt5.ORDER_FILLING_RETURN,
}

# enviamos a solicitação de negociação
result = mt5.order_send(request)
# verificamos o resultado da execução
print("1. order_send(): by {} {} lots at {} with deviation={} points".format(symbol,lot,price,deviation));
if result.retcode != mt5.TRADE_RETCODE_DONE:
    print("2. order_send failed, retcode={}".format(result.retcode))
   # solicitamos o resultado na forma de dicionário e exibimos elemento por elemento
    result_dict=result._asdict()
    for field in result_dict.keys():
        print("   {}={}".format(field,result_dict[field]))
        #se esta for uma estrutura de uma solicitação de negociação, também a exibiremos elemento a elemento
        if field=="request":
            traderequest_dict=result_dict[field]._asdict()
            for tradereq_filed in traderequest_dict:
                print("       traderequest: {}={}".format(tradereq_filed,traderequest_dict[tradereq_filed]))
    print("shutdown() and quit")
    mt5.shutdown()
    quit()


1. order_send(): by WINZ21 1 lots at 106980.0 with deviation=20 points
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-0ba8ed629e5e> in <module>
     22 # verificamos o resultado da execução
     23 print("1. order_send(): by {} {} lots at {} with deviation={} points".format(symbol,lot,price,deviation));
---> 24 if result.retcode != mt5.TRADE_RETCODE_DONE:
     25     print("2. order_send failed, retcode={}".format(result.retcode))
     26    # solicitamos o resultado na forma de dicionário e exibimos elemento por elemento

AttributeError: 'NoneType' object has no attribute 'retcode'
 
Comentários que não dizem respeito a este tema, foram transferidos para "Assuntos aleatórios".
 
Comentários que não dizem respeito a este tema, foram transferidos para "Assuntos aleatórios".
 
wagnerarins #:

... 

Bom a documentação é bem clara e explicativa, diz que precisamos primeiro estabelecer uma conexão para so ai conseguirmos usar as funções, no inicio eu achei que vc havia postado um trecho de código, mas, agora vejo que vc esta tentando usar esse script.

Fora a documentação como disse, recentemente escrevi algo que explica justamente isso.


 

Ter a lib atualizada é sempre a melhor opção.

Use !pip install --upgrade MetaTrader5 pra fazer isso.

Tente adicionar o trecho de codigo abaixo para capturar o motivo do erro e assim poder corrigi-lo,  esse post(' Método mt5.order_send() não executa, sempre retornando "Nome" usando python - Geral - Fórum de negociação algorítmica MQL5 ') fala onde por certinho.

if result_sell_market is None:

            print("order_send() failed, error code =",mt5.last_error()) 


Em seu código inicial você tinha um erro e após tentar ajustar produziu outro, mas executanto acima encontrará a raiz do problema e terá a oportunidade de corrigi-lo.



wagnerarins #:

Jonathan, agradeço responder, mesmo corrigido a questão de lotes ele retorna um erro cujo não consigo identificar, é possível que tenha a ver com a corretora? já tentei resolver de diversas formas mas sem exito.. 

 
wagnerarins #:

Jonathan, agradeço responder, mesmo corrigido a questão de lotes ele retorna um erro cujo não consigo identificar, é possível que tenha a ver com a corretora? já tentei resolver de diversas formas mas sem exito.. 

Eu estou com o mesmo problema. Eu copiei o codigo da documentação do MT5 , usei uma corretora de Forex para testar o codigo. 
Ele vincula o mt5 no python, funciona pra importar dados, mas o caminho de volta não executa. 

Meu Output para a documentação :

https://www.mql5.com/pt/docs/integration/python_metatrader5/mt5ordersend_py


MetaTrader5 package author:  MetaQuotes Ltd.

MetaTrader5 package version:  5.0.37

1. order_send(): by USDJPY 0.1 lots at 134.847 with deviation=20 points

2. order_send failed, retcode=10030

   retcode=10030

   deal=0

   order=0

   volume=0.0

   price=0.0

   bid=0.0

   ask=0.0

   comment=Unsupported filling mode

   request_id=0

   retcode_external=0

   request=TradeRequest(action=1, magic=234000, order=0, symbol='USDJPY', volume=0.1, price=134.847, stoplimit=0.0, sl=134.747, tp=134.947, deviation=20, type=0, type_filling=2, type_time=0, expiration=0, comment='python script open', position=0, position_by=0)

       traderequest: action=1

       traderequest: magic=234000

       traderequest: order=0

       traderequest: symbol=USDJPY

       traderequest: volume=0.1

       traderequest: price=134.847

       traderequest: stoplimit=0.0

       traderequest: sl=134.747

       traderequest: tp=134.947

       traderequest: deviation=20

       traderequest: type=0

       traderequest: type_filling=2

       traderequest: type_time=0

       traderequest: expiration=0

       traderequest: comment=python script open

       traderequest: position=0

       traderequest: position_by=0

shutdown() and quit



Documentação sobre MQL5: Integração / MetaTrader para Python / order_send
Documentação sobre MQL5: Integração / MetaTrader para Python / order_send
  • www.mql5.com
order_send - MetaTrader para Python - Integração - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
wagnerarins #:

Jonathan, agradeço responder, mesmo corrigido a questão de lotes ele retorna um erro cujo não consigo identificar, é possível que tenha a ver com a corretora? já tentei resolver de diversas formas mas sem exito.. 

Achei uma possivel solução em um Post bem antigo. 
Altera o : 
type_filling=ORDER_FILLING_IOC;
Razão: