Obtener el número y la lista de posiciones abiertas

La función positions_total devuelve el número de posiciones abiertas.

int positions_total()

La función es un análogo de PositionsTotal.

Para obtener información detallada sobre cada posición, utilice la función positions_get, que dispone de múltiples opciones. Todas las variantes devuelven un array de tuplas de nombre TradePosition con las claves correspondientes a las propiedades de posición (véanse los elementos de ENUM_POSITION_PROPERTY_enumerations, sin el prefijo «POSITION_», en minúsculas). En caso de error, el resultado es None.

namedtuple[] positions_get()

namedtuple[] positions_get(symbol = <"SYMBOL">)

namedtuple[] positions_get(group = <"PATTERN">)

namedtuple[] positions_get(ticket = <TICKET>)

La función sin parámetros devuelve todas las posiciones abiertas.

La función con el parámetro symbol permite la selección de posiciones para el símbolo especificado.

La función con el parámetro group proporciona filtrado por máscara de búsqueda con comodines '*' (se sustituye cualquier carácter) y negación lógica de la condición '!'. Para obtener más detalles, consulte la sección Obtener información sobre instrumentos financieros.

Una versión con los parámetros ticket selecciona una posición con un ticket específico (propiedad POSITION_TICKET).

La función positions_get se puede utilizar para obtener todas las posiciones y sus propiedades en una sola llamada, lo que lo hace similar a un montón de funciones PositionsTotal, PositionSelect y PositionGet.

En el script MQL5/Scripts/MQL5Book/Python/positionsget.py, solicitamos posiciones para un símbolo específico y una máscara de búsqueda.

import MetaTrader5 as mt5
import pandas as pd
pd.set_option('display.max_columns'500# how many columns to show
pd.set_option('display.width'1500)      # max. table width to display
   
# let's establish a connection to the MetaTrader 5 terminal
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# get open positions on USDCHF
positions = mt5.positions_get(symbol = "USDCHF")
if positions == None
   print("No positions on USDCHF, error code={}".format(mt5.last_error()))
elif len(positions) > 0:
   print("Total positions on USDCHF ="len(positions))
 # display all open positions
   for position in positions:
      print(position)
   
# get a list of positions on symbols whose names contain "*USD*"
usd_positions = mt5.positions_get(group = "*USD*"
if usd_positions == None:
    print("No positions with group=\"*USD*\", error code={}".format(mt5.last_error())) 
elif len(usd_positions) > 0
   print("positions_get(group=\"*USD*\") = {}".format(len(usd_positions)))
   # display the positions as a table using pandas.DataFrame
   df=pd.DataFrame(list(usd_positions), columns = usd_positions[0]._asdict().keys())
   df['time'] = pd.to_datetime(df['time'], unit='s')
   df.drop(['time_update''time_msc''time_update_msc''external_id'],
   axis=1, inplace=True)
   print(df)
   
# complete the connection to the MetaTrader 5 terminal
mt5.shutdown()

He aquí cuál podría ser el resultado:

Total positions on USDCHF = 1

TradePosition(ticket=1468454363, time=1664217233, time_msc=1664217233239, time_update=1664217233,

time_update_msc=1664217233239, type=1, magic=0, identifier=1468454363, reason=0, volume=0.01, price_open=0.99145,

sl=0.0, tp=0.0, price_current=0.9853, swap=-0.01, profit=6.24, symbol='USDCHF', comment='', external_id='')

positions_get(group="*USD*") = 2

ticket time type ... identifier volume price_open ... _current swap profit symbol comment

0 1468454363 2022-09-26 18:33:53 1 ... 1468454363 0.01 0.99145 ... 0.98530 -0.01 6.24 USDCHF

1 1468475849 2022-09-26 18:44:00 0 ... 1468475849 0.01 1.06740 ... 1.08113 0.00 13.73 GBPUSD