Логическое выражение Python для получения наличия открытого ордера по определенному символу

 

Добрый день.

Возможно в архивах форума этот вопрос был многократно задан, однако прямого ответа я не нашел.

Итак, есть открытая позиция, допустим по 'EURUSD' (symbol = 'EURUSD')

Есть ли какая то функция или запрос с ответом True/False, открыта ли любая позиция по данной паре в терминале Metatrader5.

 
Dmitriy Lebedev:

Добрый день.

Возможно в архивах форума этот вопрос был многократно задан, однако прямого ответа я не нашел.

Итак, есть открытая позиция, допустим по 'EURUSD' (symbol = 'EURUSD')

Есть ли какая то функция или запрос с ответом True/False, открыта ли любая позиция по данной паре в терминале Metatrader5.

Здесь
...
# получим открытые позиции на 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))
    # выведем все открытые позиции
    for position in positions:
        print(position)
Документация по MQL5: Python интеграция / positions_get
Документация по MQL5: Python интеграция / positions_get
  • www.mql5.com
Получает открытые позиции с возможностью фильтрации по символу или тикету. Существует 3 варианта вызова. Вызов без параметров. Возвращает открытые...
 
Только надо учитывать, что возможны "гонки", что иногда приводит к появлению состояний, когда ордер, открывающий позицию, отработал и его уже нет в списке активных (и, возможно, ещё нет в истории), а позиция ещё не появилась. Аналогично с закрывающим ордером.
 
JRandomTrader #:
Только надо учитывать, что возможны "гонки", что иногда приводит к появлению состояний, когда ордер, открывающий позицию, отработал и его уже нет в списке активных (и, возможно, ещё нет в истории), а позиция ещё не появилась. Аналогично с закрывающим ордером.

Вы про асинхронные операции говорите или не только?

(я не в контексте питона уточнаю - без использования питона)
 
Vladislav Boyko #:

Вы про асинхронные операции говорите или не только?

(я не в контексте питона уточнаю - без использования питона)

Нет, обычные. В том числе при использовании класса CTrade из стандартной библиотеки.

Если не принимать специальных мер (в простейшем случае -  внесение небольшой задержки), возможны эффекты в виде задвоения позиций и т.п.

 
JRandomTrader #:

Нет, обычные. В том числе при использовании класса CTrade из стандартной библиотеки.

Если не принимать специальных мер (в простейшем случае -  внесение небольшой задержки), возможны эффекты в виде задвоения позиций и т.п.

Вы не знаете, может ли это возникнуть на следующем OnTick? Или только в пределах выполнения одного и того же OnTick?

То есть, может ли быть такое, что на текущем OnTick поторговали, а на следующем OnTick ордер/позиция все еще потеряны?

 
JRandomTrader #:
Только надо учитывать, что возможны "гонки", что иногда приводит к появлению состояний, когда ордер, открывающий позицию, отработал и его уже нет в списке активных (и, возможно, ещё нет в истории), а позиция ещё не появилась. Аналогично с закрывающим ордером.

Гонки присутствуют. Соответственно следующий вопрос. Есть ли "правильный алгоритм" по отслеживанию наличия следующего бара, допустим в Python. А так же борьба с гонками в открытии позиции?

 
Vladislav Boyko #:

Вы не знаете, может ли это возникнуть на следующем OnTick? Или только в пределах выполнения одного и того же OnTick?

То есть, может ли быть такое, что на текущем OnTick поторговали, а на следующем OnTick ордер/позиция все еще потеряны?

Вроде, от тиков никак не зависит.

 
JRandomTrader #:

Вроде, от тиков никак не зависит.

Понял, спасибо

 
Dmitriy Lebedev #:

Гонки присутствуют. Соответственно следующий вопрос. Есть ли "правильный алгоритм" по отслеживанию наличия следующего бара, допустим в Python. А так же борьба с гонками в открытии позиции?

С Python не работаю, не вижу смысла привязывать к быстрому MQL5 более медленную систему, пока хватает средств самого MQL5.

"Классический" алгоритм обнаружения нового бара - сохранение времени бара (напр., в статической переменной). Если время текущего бара с ним не совпало, значит, бар новый (сохраняем его время).

С гонками каждый борется по своему, простейший вариант - задержка между отправкой рыночного ордера и проверкой позиции.

Я в своих роботах храню/отслеживаю состояние ордеров от отправки до появления в истории. Также, каждый робот отслеживает сделки по своим ордерам и хранит свою текущую позицию (торгую на бирже, там неттинг, приходится так делать, если на одном символе торгуют несколько роботов, да ещё возможна ручная торговля). После каждого изменения состояния робота и при выходе оно сохраняется в файл, а при старте загружается и синхронизируется с реальным (за время отсутствия робота какие-то ордера могли сработать или истечь).

 
JRandomTrader #:

С Python не работаю, не вижу смысла привязывать к быстрому MQL5 более медленную систему, пока хватает средств самого MQL5.

"Классический" алгоритм обнаружения нового бара - сохранение времени бара (напр., в статической переменной). Если время текущего бара с ним не совпало, значит, бар новый (сохраняем его время).

С гонками каждый борется по своему, простейший вариант - задержка между отправкой рыночного ордера и проверкой позиции.

Я в своих роботах храню/отслеживаю состояние ордеров от отправки до появления в истории. Также, каждый робот отслеживает сделки по своим ордерам и хранит свою текущую позицию (торгую на бирже, там неттинг, приходится так делать, если на одном символе торгуют несколько роботов, да ещё возможна ручная торговля). После каждого изменения состояния робота и при выходе оно сохраняется в файл, а при старте загружается и синхронизируется с реальным (за время отсутствия робота какие-то ордера могли сработать или истечь).

Python шире в возможностях по моим требованиям. Кроме "классического" вариантов оптимальных нет? У меня стоит задержка на 5 сек, но все ровно гонки не уходят.