Группа пользователей MetaTrader 5 Python - краткое содержание - страница 14

 

Функции copy_tick теперь не работают. last_error() возвращает (1, "success"), однако функции возвращают только пустые массивы.

Версия терминала: 2375

Версия пакета Python: 5.0.31

Тест для воспроизведения:

def test_copy_ticks_range():
    from datetime import datetime, timedelta
    time_to = datetime.utcnow()
    time_from = time_to - timedelta(minutes=3)
    ticks = mt5.copy_ticks_range("EPM20", time_from, time_to, mt5.COPY_TICKS_ALL)
    assert mt5.last_error()[0] == mt5.RES_S_OK   #PASS
     assert len(ticks) > 0                        #FAIL
 

Вы видели CopyTicksRange?

Note

Функция CopyTicks() позволяет запрашивать и анализировать все полученные тики. Первый вызов CopyTicks() инициирует синхронизацию базы данных тиков символа, хранящейся на жестком диске. Если локальная база данных не содержит всех запрошенных тиков, то недостающие тики будут автоматически загружены с торгового сервера. Будут синхронизированытики, начиная с даты, указанной в CopyTicks(), до текущего момента. После этого все тики, поступающие для данного символа, будут добавляться в базу данных тиков, поддерживая ее в синхронизированном состоянии.


Попробуйте вызвать еще один раз позже

Documentation on MQL5: Timeseries and Indicators Access / CopyTicksRange
Documentation on MQL5: Timeseries and Indicators Access / CopyTicksRange
  • www.mql5.com
[out] MqlTick static or dynamic array for receiving ticks. If the static array cannot hold all the ticks from the requested time interval, the maximum possible amount of ticks is received. In this case, the function generates the error ERR_HISTORY_SMALL_BUFFER (4407) . ERR_NOT_ENOUGH_MEMORY – insufficient memory for receiving a history from...
 
nicholi shen:

Сообщение об ошибке - версия пакета 5.0.30


1. Функции[history_deals_get, history_deals_total, history_orders_get, history_orders_total, ... все copy_funcs] имеют фундаментальный недостаток, и это параметр "from". From является зарезервированным ключевым словом в python и не может быть использован в качестве имени параметра. Это препятствует созданию питоновских функций-адаптеров из-за конфликта имен. Следующий вариант даже не скомпилируется:


5. history_deals_get (и, возможно, другие функции) не соответствуют своему типу возврата. Некоторые функции возвращают None , когда нет данных для возврата, а другие возвращают пустой кортеж. Все эти функции должны быть последовательными. Все они должны возвращать один и тот же объект в случае отсутствия данных - вместо того, чтобы одни возвращали None , а другие - пустой кортеж.

1. У нас нет именованного параметра"from" в этих функциях, все параметры диапазона неименованные.

5. history_deals_get, history_orders_get отличаются от orders_get, positions_get тем, что у них нет параметров по умолчанию и они не могут быть вызваны с пустыми параметрами. В такой ситуации они терпят неудачу и возвращают Null.

 
Rashid Umarov:

Вы видели CopyTicksRange?


Попробуйте вызвать еще раз позже

Это все еще не работает для меня. Есть другие предложения?

Проверено с:

def test_copy_ticks_range(connected):
    from datetime import datetime, timedelta
    import time
    time_to = datetime.utcnow()
    time_from = time_to - timedelta(minutes=3)
    with connected:
        for i in range(20):
            ticks = mt5.copy_ticks_range("EPM20", time_from, time_to, mt5.COPY_TICKS_ALL)
            if ticks:
                break
            time.sleep(1)
        assert mt5.last_error()[0] == mt5.RES_S_OK
        assert len(ticks) > 0
 
nicholi shen:

Это все еще не работает для меня. Есть другие предложения?

Проверено с:

Какой символ "EPM20"? Есть ли у него тики в 3мин?

Мы проверяли на стандартных символах, все работает нормально:

import MetaTrader5 as mt5

def test_copy_ticks_range():
    from datetime import datetime, timedelta
    import time
    time_to = datetime.utcnow()
    time_from = time_to - timedelta(minutes=3)
    for i in range(20):
        ticks = mt5.copy_ticks_range("USDJPY", time_from, time_to, mt5.COPY_TICKS_ALL)
        if ticks is not None:
            break
        time.sleep(1)
    print(mt5.last_error())
    print(len(ticks))
    assert mt5.last_error()[0] == mt5.RES_S_OK
    assert len(ticks) > 0


mt5.initialize()
test_copy_ticks_range()
 

Хорошо. Я нашел причину, по которой это не работает, и мне интересно узнать, почему.....

На самом деле проблема была в этой строке кода.

time_to = datetime.utcnow()

Где мой брокер работает по времени UTC, а я по EST. Исправление заключалось в использовании

time_to = datetime.now()

...но я действительно не уверен, как или почему это работает. Есть идеи?


1. We don't have "from" named parameter in this functions, all range parameters are unnamed.

5. history_deals_get, history_orders_get отличаются от orders_get, positions_get тем, что у них нет параметров по умолчанию и они не могут быть вызваны с пустыми параметрами. В такой ситуации они терпят неудачу и возвращают Null.


Я понял это, посмотрев на пакет и осознав, что это ограничение C-функций. Я создаю пакет адаптера, чтобы все основные функции API могли работать с ключевыми словами args. Вы не думали о том, чтобы включить в пакет файл-заглушку с подсказкой типов?

Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...
 

Я создал питоновую обертку для замены пакета MetaTrader5. Она запускает python поверх пакета MetaTrader5 и делает интерфейс API немного более питоническим.

Особенности включают:

  • Подсказка типа для всего! Интеллисенс будет работать независимо от вложенности объектов.
  • Докстринги добавляются к самим функциям, так что вы можете ссылаться на документацию на лету в IDE
  • Тестирование
  • Новый менеджер контекста для управления контекстом API и изменения поведения API.
pymt5adapter
pymt5adapter
  • 2020.04.02
  • pypi.org
is a wrapper and drop-in replacement for the python package by MetaQuotes. The API functions return the same values from the functions, but adds the following functionality: Typing hinting has been added to all functions and return objects for linting and IDE integration. Intellisense will now work now matter how nested the objects are...
 

Еще не поздно попросить изменить API, чтобы он возвращал объекты dict вместо объектов namedtuple? Все объекты namedtuple, которые в настоящее время возвращаются из API, не могут быть pickled, что нарушает многопроцессорность. Поэтому все данные, возвращаемые из API, необходимо прогонять через рекурсивную функцию, которая затрагивает каждую точку данных, чтобы убедиться, что все вложенные namedtuple преобразуются обратно в словари, что крайне неэффективно.

def as_dict_all(data: Any):
    """Convert all nested data returns to native python (pickleable) data structures. 
    Example: List[OrderSendResult] -> List[dict]

    :param data: Any API returned result from the MetaTrader5 API
    :return:
    """
    try:
        return as_dict_all(data._asdict())
    except AttributeError:
        T = type(data)
        if T is tuple or T is list:
            return T(as_dict_all(i) for i in data)
        if T is dict:
            return {k: as_dict_all(v) for k, v in data.items()}
        return data
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...
 
Можно ли также передать имя символа в качестве аргумента командной строки при вызове скрипта python, бросив его на график? Таким образом, вы можете получить символ графика из sys.argv[1]
 

Здравствуйте,


Я не смог установить MetaTrader5 с помощью:

pip install MetaTrader5


Я получил следующую ошибку:

ERROR: Не удалось найти версию, удовлетворяющую требованию MetaTrader5 (из версий: нет)

ERROR: Не найдено подходящего дистрибутива для MetaTrader5


Учитывая, что я работаю на ноутбуке MAC и у меня Python 3.7.6.


Заранее спасибо за решение

Причина обращения: