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

 
Sergey Deev #:

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

результат

Выполните тогда

request= {'action': 10, 'type': 8, 'position': 14999198, 'position_by': 15003375} 

result=mt5.order_send(request)

print("CLOSE_BY  ",request,"=",result);

Я думаю - все будет ок.

А вот в одном запуске - даже со sleep пока не удается...

 

то-то не правильно. должно быть одной командой. вот вырезка из журнала

верхняя строка - закрытие buy вручную, затем 3 строки - результат

пятая строка - отправка buy из скрипта.

 
Sergey Deev #:

то-то не правильно. должно быть одной командой. вот вырезка из журнала

верхняя строка - закрытие buy вручную, затем 3 строки - результат

пятая строка - отправка buy из скрипта.

Угу.

Печально...

 
Mikhail Dovbakh #:

Выполните тогда

request= {'action': 10, 'type': 8, 'position': 14999198, 'position_by': 15003375} 

result=mt5.order_send(request)

print("CLOSE_BY  ",request,"=",result);

Я думаю - все будет ок.

А вот в одном запуске - даже со sleep пока не удается...

Да, отработало..

 

Возьмите за основу скрипт из order_send и сделайте как надо.

Там будут и логи, и данные о терминале/пакете.

Документация по MQL5: Интеграция / MetaTrader для Python / order_send
Документация по MQL5: Интеграция / MetaTrader для Python / order_send
  • www.mql5.com
order_send - MetaTrader для Python - Интеграция - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
from typing import NewType
import MetaTrader5 as mt5
import time
from   datetime import datetime
import numpy as np
import pandas as pd
min_profit = 0.05
if not mt5.initialize():
    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'], axis=1, inplace=True)
    df = df.sort_values("profit",ascending=False)
    print(df)
    df["new_Ticket"] = 0
    c=0;
    for i in range(df.shape[0]):
        if df.profit[i] >= min_profit:
            x = mt5.ORDER_TYPE_BUY
            c+=1
            price = mt5.symbol_info_tick(df.symbol[i]).bid 
            if df.type[i] == mt5.ORDER_TYPE_BUY:
                x = mt5.ORDER_TYPE_SELL
                price = mt5.symbol_info_tick(df.symbol[i]).ask
            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": 'oppozite order by python',
                    }
            OldTicket=df.ticket[i]
            result=mt5.order_send(request)
            print(i,df.type[i],request,"=",result);
            NewTicket=result.order
            # add new key
            df.at[i, "new_Ticket"]= NewTicket
            #------------
            if (c>2): break
    #--------------------------
    time.sleep(20) #20 sec wait
    # получим открытые позиции
    positionsNew=mt5.positions_get()
    print("Total New positions =",len(positionsNew))
    #------------------------------------
    c=0
    for i in range(df.shape[0]):
        if df.new_Ticket[i] >0:
            c+=1
            request={
                "action": mt5.TRADE_ACTION_CLOSE_BY,
                "symbol": df.symbol[i],
                #"volume": df.volume[i],
                "type":mt5.ORDER_TYPE_CLOSE_BY,
                "position": df.ticket[i],
                "position_by":df.new_Ticket[i],
                }
            result=mt5.order_send(request)
            print ("CloseBY => ",i,request,"=",result)
            #========================================
            if (c>2): break

CloseBY =>  0 {'action': 10, 'symbol': 'USDJPY', 'type': 8, 'position': 113845516, 'position_by': 114653039} = None

CloseBY =>  1 {'action': 10, 'symbol': 'EURUSD', 'type': 8, 'position': 113845526, 'position_by': 114653040} = None

CloseBY =>  2 {'action': 10, 'symbol': 'EURUSD', 'type': 8, 'position': 113845527, 'position_by': 114653041} = None

MetaTrader5 package author:  MetaQuotes Software Corp.

MetaTrader5 package version:  5.0.35


MT version= (500, 3134, '17 Dec 2021')

(
 

Возьмите за основу скрипт из order_send и сделайте как надо.

Там будут и логи, и данные о терминале/пакете.

Документация по MQL5: Интеграция / MetaTrader для Python / order_send
Документация по MQL5: Интеграция / MetaTrader для Python / order_send
  • www.mql5.com
order_send - MetaTrader для Python - Интеграция - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rashid Umarov #:

Возьмите за основу скрипт из order_send и сделайте как надо.

Там будут и логи, и данные о терминале/пакете.

MetaTrader5 package author:  MetaQuotes Software Corp.

MetaTrader5 package version:  5.0.35


MT version= (500, 3134, '17 Dec 2021')

 

К сожалению, вы так и не смогли сделать то, что я просил. Это печально.

Так и не добавили обработку результатов запроса и зачем то окольными путями начали городить встречное закрытие.

Вот я переделал ваш вариант на прямое закрытие

from typing import NewType
import MetaTrader5 as mt5
import time
from   datetime import datetime
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', 500) # сколько столбцов показываем
pd.set_option('display.width', 1500)      # макс. ширина таблицы для показа

min_profit = 0.05
if not mt5.initialize():
    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'], axis=1, inplace=True)
    df = df.sort_values("profit",ascending=False)
    print(df.head())
    print(df.dtypes)
    #print(df)
    for index, pos in df.iterrows():
        print(pos)
        # создадим запрос на закрытие
        position_id = pos['ticket']
        symbol = pos['symbol']
        price = mt5.symbol_info_tick(symbol).ask
        lot = pos['volume']
        order_type =  mt5.ORDER_TYPE_BUY
        if pos['type']==mt5.POSITION_TYPE_BUY:
            order_type = mt5.ORDER_TYPE_SELL
            price = mt5.symbol_info_tick(symbol).bid
        deviation = 20
        request = {
            "action": mt5.TRADE_ACTION_DEAL,
            "symbol": symbol,
            "volume": lot,
            "type": order_type,
            "position": position_id,
            "price": price,
            "deviation": deviation,
            "comment": "python script close",
            "type_time": mt5.ORDER_TIME_GTC,
            "type_filling": mt5.ORDER_FILLING_RETURN,
        }
        result = mt5.order_send(request)
        # проверим результат выполнения
        print("close position #{}: sell {} {} lots at {} with deviation={} points".format(position_id, symbol, lot, price,
                                                                                           deviation));
        if result.retcode != mt5.TRADE_RETCODE_DONE:
            print("4. order_send failed, retcode={}".format(result.retcode))
            print("   result", result)
        else:
            print("4. position #{} closed, {}".format(position_id, result))
            # запросим результат в виде словаря и выведем поэлементно
            result_dict = result._asdict()
            for field in result_dict.keys():
                print("   {}={}".format(field, result_dict[field]))
                # если это структура торгового запроса, то выведем её тоже поэлементно
                if field == "request":
                    traderequest_dict = result_dict[field]._asdict()
                    for tradereq_filed in traderequest_dict:
                        print("       traderequest: {}={}".format(tradereq_filed, traderequest_dict[tradereq_filed]))

mt5.shutdown()

Запускаю и получаю результат

Total positions = 1
       ticket                time  type  magic  volume  price_current  profit  symbol
0  1237124924 2022-01-14 12:07:45     0      0     0.1        1.14597     1.7  EURUSD

close position #1237124924: sell EURUSD 0.1 lots at 1.14597 with deviation=20 points
4. order_send failed, retcode=10027
   result OrderSendResult(retcode=10027, deal=0, order=0, volume=0.0, price=0.0, bid=0.0, ask=0.0, comment='AutoTrading disabled by client', request_id=0, retcode_external=0, request=TradeRequest(action=1, magic=0, order=0, symbol='EURUSD', volume=0.1, price=1.14597, stoplimit=0.0, sl=0.0, tp=0.0, deviation=20, type=1, type_filling=2, type_time=0, expiration=0, comment='python script close', position=1237124924, position_by=0))

Process finished with exit code 0


Затем разрешаю торговлю


Запускаю заново, результат

Total positions = 1
       ticket                time  type  magic  volume  price_current  profit  symbol
0  1237124924 2022-01-14 12:07:45     0      0     0.1        1.14594     1.4  EURUSD

close position #1237124924: sell EURUSD 0.1 lots at 1.14594 with deviation=20 points
4. position #1237124924 closed, OrderSendResult(retcode=10009, deal=1219731980, order=1237140780, volume=0.1, price=1.14594, bid=1.14594, ask=1.14594, comment='Request executed', request_id=8, retcode_external=0, request=TradeRequest(action=1, magic=0, order=0, symbol='EURUSD', volume=0.1, price=1.14594, stoplimit=0.0, sl=0.0, tp=0.0, deviation=20, type=1, type_filling=2, type_time=0, expiration=0, comment='python script close', position=1237124924, position_by=0))
   retcode=10009
   deal=1219731980
   order=1237140780
   volume=0.1
   price=1.14594
   bid=1.14594
   ask=1.14594
   comment=Request executed
   request_id=8
   retcode_external=0
   request=TradeRequest(action=1, magic=0, order=0, symbol='EURUSD', volume=0.1, price=1.14594, stoplimit=0.0, sl=0.0, tp=0.0, deviation=20, type=1, type_filling=2, type_time=0, expiration=0, comment='python script close', position=1237124924, position_by=0)
       traderequest: action=1
       traderequest: magic=0
       traderequest: order=0
       traderequest: symbol=EURUSD
       traderequest: volume=0.1
       traderequest: price=1.14594
       traderequest: stoplimit=0.0
       traderequest: sl=0.0
       traderequest: tp=0.0
       traderequest: deviation=20
       traderequest: type=1
       traderequest: type_filling=2
       traderequest: type_time=0
       traderequest: expiration=0
       traderequest: comment=python script close
       traderequest: position=1237124924
       traderequest: position_by=0

Process finished with exit code 0
 
Sergey Deev #:

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

Команда для закрытия позиции Рыночной выглядит так       mt5.Close(symbol)    точнее всех рыночных поз, вы можете это проверить, если в редакторе кода ометите любую часть кода из библиотеки мт5 и перейдете к определениию.

там есть три встроеных рыночных функции,

mt5.Close(symbol)

mt5.Sell(symbol)

mt5.Buy(symbol)