python не закрывает сделки

 

Господа программисты, подскажите.. Не работает простой код, собранный из примеров mql5..

Идея в том, что скрипт должен закрыть сделки с профитом больше 0.05. Результат: None

Код ниже. Алготрейдинг в терминале включен.

import MetaTrader5 as mt5
from datetime import datetime
import numpy as np
import pandas as pd
min_profit = 0.05
if not mt5.initialize("C:\\Program Files\\InstaTrader 5\\terminal64.exe"):
    print("initialize error code =",mt5.last_error())
    quit()
# получим открытые позиции
positions=mt5.positions_get()
# print(positions)
if positions==None:
    print("No positions, error code={}".format(mt5.last_error()))
    quit()
elif len(positions)>0:
    print("Total positions =",len(positions))
    # выведем все открытые позиции
    df=pd.DataFrame(list(positions),columns=positions[0]._asdict().keys())
    df['time'] = pd.to_datetime(df['time'], unit='s')
    df.drop(['time_update', 'time_msc', 'time_update_msc', 'external_id', 'swap', 'comment', 'identifier', 'reason', 'external_id', 'price_open', 'sl', 'tp', 'magic'], axis=1, inplace=True)
    df = df.sort_values("profit",ascending=False)
    print(df)
    for i in range(df.shape[0]):
        if df.profit[i] >= min_profit:
            x = mt5.ORDER_TYPE_BUY
            price = mt5.symbol_info_tick(df.symbol[i]).ask 
            if df.type[i] == mt5.ORDER_TYPE_BUY:
                x = mt5.ORDER_TYPE_SELL
                price = mt5.symbol_info_tick(df.symbol[i]).bid
            deviation=50
            request={
                "action": mt5.TRADE_ACTION_DEAL,
                "symbol": df.symbol[i],
                "volume": df.volume[i],
                "type": x,
                "position": df.ticket[i],
                "price": price,
                "deviation": deviation,
                "magic": df.magic[i],
                "comment": 'close by python',
                "type_time": mt5.ORDER_TIME_GTC,
                "type_filling": mt5.ORDER_FILLING_RETURN,
            }
            result=mt5.order_send(request)
            print(i,request,result);
 

а тому кто поможет, вы поделитесь той оплатой, которую должны получить за эту работу во фрилансе? 

 
Nikolay Ivanov #:

а тому кто поможет, вы поделитесь той оплатой, которую должны получить за эту работу во фрилансе? 

запросто..

 
Sergey Deev #:

запросто..

Скажите пожалуйста, а предпоследняя строчка кода result=mt5.order_send(request) - это приказ об открытии ордера? Если вышенаписанный код правильный, и если текущий выбранный ордер действительно уехал на 0,05 в профит, то в конце Вы посылаете не команду закрытия ордера, а команду установки ордера. Я правильно Вас понял?

 
Vitaly Murlenko #:

Скажите пожалуйста, а предпоследняя строчка кода result=mt5.order_send(request) - это приказ об открытии ордера? Если вышенаписанный код правильный, и если текущий выбранный ордер действительно уехал на 0,05 в профит, то в конце Вы посылаете не команду закрытия ордера, а команду установки ордера. Я правильно Вас понял?

в mt5 нет команд закрытия - только открытия встречной, с указанием ее тикета.

 

Попробуйте вначале открыть встречную позицию. т.е. закоментируйте в своем коде 

 "position": df.ticket[i],

получите новый код встречной и уже в новом запросе используйте

 "action": mt5.TRADE_ACTION_CLOSE_BY,

"position_by": newTicket,
"position": df.ticket[i],

На хеджевом счете, я думаю, иначе никак.

и я бы убрал вовсе 

 "magic": df.magic[i],
 
Mikhail Dovbakh #:

Попробуйте вначале открыть встречную позицию. т.е. закоментируйте в своем коде 

получите новый код встречной и уже в новом запросе используйте

На хеджевом счете, я думаю, иначе никак.

и я бы убрал вовсе 

Встречная открывается без вопросов. Но на попытку trade_action_close_by результат снова None

 
Sergey Deev #:

Встречная открывается без вопросов. Но на попытку trade_action_close_by результат снова None

"type":mt5.ORDER_TYPE_CLOSE_BY

?

 
Mikhail Dovbakh #:

"type":mt5.ORDER_TYPE_CLOSE_BY

?

            x = mt5.ORDER_TYPE_BUY
            price = mt5.symbol_info_tick(df.symbol[i]).ask
            if df.type[i] == mt5.ORDER_TYPE_BUY:
                x = mt5.ORDER_TYPE_SELL
                price = mt5.symbol_info_tick(df.symbol[i]).bid
            deviation=20
            request={
                "action": mt5.TRADE_ACTION_DEAL,
                "symbol": df.symbol[i],
                "volume": df.volume[i],
                "type": x,
#                "position": df.ticket[i],
                "price": price,
                "deviation": deviation,
                "comment": 'close by python',
                "type_time": mt5.ORDER_TIME_GTC,
                "type_filling": mt5.ORDER_FILLING_RETURN,
            }
            result=mt5.order_send(request)
            print(i,result);
            request={
                "action": mt5.TRADE_ACTION_CLOSE_BY,
                "symbol": df.symbol[i],
                "volume": df.volume[i],
                "type": mt5.ORDER_TYPE_CLOSE_BY,
                "position_by": result.order,
                "position": df.ticket[i],
                "price": price,
                "deviation": deviation,
                "comment": 'close by python',
                "type_time": mt5.ORDER_TIME_GTC,
                "type_filling": mt5.ORDER_FILLING_RETURN,
            }
            result=mt5.order_send(request)
            print(i,result);
 
Sergey Deev #:
    NewTicket=114652226
    OldTicket=114651006
    if (NewTicket>0):
                request={
                "action": mt5.TRADE_ACTION_CLOSE_BY,
                "type":mt5.ORDER_TYPE_CLOSE_BY,
                "position": OldTicket,
                "position_by":NewTicket,
                }
                result=mt5.order_send(request)
                print ("CloseBY ",request,"=",result)     


CloseBY  {'action': 10, 'type': 8, 'position': 114651006, 'position_by': 114652226} = OrderSendResult(retcode=10009, deal=1906125, order=114652320, 

volume=0.25, price=113.688, bid=113.771, ask=113.783, comment='Request executed', request_id=1265, retcode_external=0, request=TradeRequest(action=10, magic=0, order=0, symbol='', volume=0.0, price=0.0, stoplimit=0.0, sl=0.0, tp=0.0, deviation=0, type=8, type_filling=0, type_time=0, expiration=0, comment='', position=114651006, position_by=114652226))


 
Mikhail Dovbakh #:

у меня все не так:

            request={
                "action": mt5.TRADE_ACTION_DEAL,
                "symbol": df.symbol[i],
                "volume": df.volume[i],
                "type": x,
#                "position": df.ticket[i],
                "price": price,
                "deviation": deviation,
                "comment": 'open by python',
                "type_time": mt5.ORDER_TIME_GTC,
                "type_filling": mt5.ORDER_FILLING_RETURN,
            }
            result=mt5.order_send(request)
            print("DEAL  ",request,"=",result,"\n");
            request={
                "action": mt5.TRADE_ACTION_CLOSE_BY,
                "type": mt5.ORDER_TYPE_CLOSE_BY,
                "position": df.ticket[i],
                "position_by": result.order,
                "comment": 'close by python',
            }
            result=mt5.order_send(request)
            print("CLOSE_BY  ",request,"=",result);

результат

DEAL   {'action': 1, 'symbol': 'EURJPY', 'volume': 0.5, 'type': 0, 'price': 130.51, 'deviation': 20, 'comment': 'open by python', 'type_time': 0, 'type_filling': 2} = OrderSendResult(retcode=10009, deal=12176498, order=15003375, volume=0.5, price=130.51, bid=130.48, ask=130.51, comment='Request executed', request_id=283, retcode_external=0, request=TradeRequest(action=1, magic=0, order=0, symbol='EURJPY', volume=0.5, price=130.51, stoplimit=0.0, sl=0.0, tp=0.0, deviation=20, type=0, type_filling=2, type_time=0, expiration=0, comment='open by python', position=0, position_by=0)) 

CLOSE_BY   {'action': 10, 'type': 8, 'position': 14999198, 'position_by': 15003375, 'comment': 'close by python'} = None