Торговля с Python - страница 3

 
Mikhael1983 #:

Пользуясь описанными в библиотеке функциями, реализуем функции для инициации соединения с терминалом, и для завершения соединения с терминалом. Планируем делать это в бесконечном цикле каждые 5 минут.

...

Работа программы:

Это всё успешно реализуется средствами mql5

 
Vitaly Muzichenko #:

Это всё успешно реализуется средствами mql5

Естественно. Однако, есть большая прослойка людей, незнакомых с mql5, и не видящих смысла изучать устаревающий инструмент, применимый только в чрезвычайно узкой области работы с конкретным терминалом конкретной компании. 
 

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

Напишем функцию, которая будет сохранять котировки в файлы. В принципе, сохранять котировки в файлы вообще нет необходимости. Достаточно держать их в памяти. У меня это исторически пошло от того, что терминал в виртуальной машине с Windows, и программа на Python сохраняет котировки, а вся логика в системе-хосте, Debian GNU/Linux, и там своя программа на Python крутится, которая читает эти файлы и записывает в другие файлы торговые указания, которые читает программа на Python в виртуальной Windows, и исполняет.

Однако, запись котировок в файлы - это просто полезно само по себе. Наглядно. Позволяет увидеть, что произошло, пощупать, прочитать другими средствами (тем же Маткадом), и т.д. Так что сделаем так.

def pips_definer(instrument): 
    '''
    Функция возвращает величину пипса для инструмента, например для EURUSD - 0.0001, для USDJPY - 0.01 
    '''
    if instrument in ['EURUSD_i', 'GBPUSD_i', 'EURGBP_i', 'USDCHF_i', 'USDCAD_i']: 
        return 0.0001 
    elif instrument in ['USDJPY_i']: 
        return 0.01 
    else: 
        return None 


def save_prices_to_file(instrument, n=100):
    '''
    Функция принимает инструмент, количество отсчётов цены n в таймфрейме М5, 
    и сохраняет в файл (только сформировавшиеся полностью бары, время соответствует времени закрытия (!) бара)
    '''
    w = pips_definer(instrument) 
    tochn = int(abs(log10(w))+1)  
    path_file = os.path.join(work_catalog, instrument+'.txt') 
    
    bars = mt5.copy_rates_from_pos(instrument, mt5.TIMEFRAME_M5, 0, n+1) # в случае ошибки mt5.copy_rates_from_pos возвращает None 
    
    try: 
        f = open(path_file, 'w') 
        for i in range(0, n+1): 
            bar = bars[i] 
            dt_stamp = date_time.fromtimestamp(bar[0], dt.timezone.utc) + dt.timedelta(hours=1, minutes=5) 
            open_ = str(round(bar[1], tochn)) 
            high_ = str(round(bar[2], tochn))
            low_ = str(round(bar[3], tochn))
            close_ = str(round(bar[4], tochn))
            if i != n: 
                f.write(dt_stamp.M5_view + ' ' + open_ + ' ' + high_ + ' ' + low_ + ' ' + close_ + '\n')
        f.close()    
        print(date_time.now().nice_view, ' - котировки {} успешно записаны в файл'.format(instrument))
    except: 
        print(date_time.now().nice_view, ' - котировки {} записать в файл не удалось'.format(instrument)) 

А в функцию main добавим вызов функции сохранения котировок:

def main(N): 
    
    '''
    Главная функция, обеспечивающая в бесконечном цикле связь с терминалом, 
    сохранение котировок, и запуск функции, осуществляющей торговлю
    '''    
    
    dt_start = date_time.now() 
    dt_write = dt_stamp_from_M5_view(dt_start.M5_view) + dt.timedelta(minutes=5, seconds=10) 
    print('\n' + dt_start.nice_view, ' - начал работу, бездействую до ' + dt_write.nice_view + '\n') 
    timedelta_sleep = dt_write - date_time.now() 
    time.sleep(timedelta_sleep.seconds) 
    
    while True:
        
        # установка соединения с MetaTrader5 
        if terminal_init(os.path.join('C:\\', 'Program Files', 'Alpari MT5', 'terminal64.exe'), work_account): 
            
            # запись цен в файлы: для всех инструментов, N отсчётов  
            if (dt.datetime.now() - dt_write) < dt.timedelta(seconds=10): 
                print('\n' + date_time.now().nice_view + '  - начинаю запись котировок в файлы')
                for instrument in instruments: 
                    save_prices_to_file(instrument, N) 
            
            # пауза 10 секунд: временная заглушка, имитирующая анализ цен, принятие и выполнение решений 
            print('\nосуществляю торговлю: анализирую котировки, открываю и/или закрываю сделки')
            time.sleep(10)
            
            # завершение соединения с MetaTrader5 
            terminal_done() 
        
            # определение параметров ожидания до следующего выполнения тела цикла 
            dt_start = date_time.now()  
            dt_write = dt_stamp_from_M5_view(dt_start.M5_view) + dt.timedelta(minutes=5, seconds=10) 
            timedelta_sleep = dt_write - dt_start 
            print(date_time.now().nice_view + '  - засыпаю до {}\n\n\n\n\n'.format(dt_write.nice_view))  
            time.sleep(timedelta_sleep.seconds) 
        


Результат работы:


В папке /fx/ появилось шесть файлов:


структура у них такая (на примере EURUSD_i.txt):отсчёт даты-времени в виде M5_view, open, high, low, close, при этом отсчёт времени соответствует моменту закрытия бара.

202112071335 1.1269 1.12697 1.12659 1.1266
202112071340 1.1266 1.12669 1.12636 1.12659
202112071345 1.1266 1.12664 1.12627 1.12627
202112071350 1.12628 1.12633 1.12595 1.12595
202112071355 1.12598 1.126 1.12564 1.12586

...

202112110040 1.13173 1.13181 1.13164 1.13167
202112110045 1.13167 1.1317 1.13157 1.13163
202112110050 1.13163 1.13167 1.13155 1.13157


Обращаю внимание, что у меня время сервера на 1 час меньше, чем текущее время моего компьютера, а мне удобно мыслить в нём (московское время).

Поэтому я в коде функции сохранения котировок добавил таймдельту в 1 час 5 минут:

dt.timedelta(hours=1, minutes=5)

в ней 1 час - это разница во времени между временем сервера и моим, а 5 минут возникают от того, что мне удобно мыслить временем закрытия бара, а терминал отдаёт время открытия.

Каждые 5 минут файлы с ценами переписываются, заново, не добавляется строчка в конец, а перезапись целиком. Для современных SSD, и всего 1000 строк, и всего 1 раз в 5 минут - говорить не о чем.
 
Sergey Deev #:

т.е. привести пример сохранения данных любых индикаторов  в csv- файл или SQLite с последующим чтением их на питон? Это не смешно будет?

Это как раз и смешно. Поскольку причем здесь питон. С такими данными, скрипт можно написать на любом языке программирования

 
Malik Arykov #:

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

Конечно, можно. Но порог входа в Python много ниже, чем в С++ какой. Люди, совсем незнакомые с программированием, через месяца 3 могут легко начать делать то, что им нужно, средствами Python. Если нужно что-то несложное.

 
Malik Arykov #:

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

Смешно использовать питон против любого другого языка? не спорю.. если любой другой язык имеет интеграцию с МТ и позволяет получить котировки - вперед..

 

не понял что хочет ТС, по сообщениям одни противоречия - есть люди которые не хотят знать про MQL, но эти люди посетят тематический ресурс, эти люди еще и должны установить МТ5, чтобы вот наконец то окунуться в Python ......сложно как то


если у ТС уж есть желание что-нибудь сотворить на  Python на благо общественности, имхо, все на  Python и писать, а задачу интеграции или обмена отбросить на потом,

импорт котировок на  Python для учебных целей тоже не проблема

вот у себя нашел, разбирался пару месяцев назад:

import finplot as fplt
import yfinance
df = yfinance.download('AAPL')
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])
fplt.show()



в общем цели топика совсем не понятны

 
Sergey Deev #:

Смешно использовать питон против любого другого языка? не спорю.. если любой другой язык имеет интеграцию с МТ и позволяет получить котировки - вперед..

Я о том что интеграция питон с МТ5 не полная. Нельзя НАПРЯМУЮ получить значения индикаторов

 

Igor Makanu #:

... а задачу интеграции или обмена отбросить на потом,

импорт котировок тоже на  Python для учебных целей тож не проблема

вот у себя нашел, разбирался пару месяцев назад:

...


в общем цели топика совсем не понятны

Задача интеграции решена, библиотекой metatrader5, её не нужно ни решать, ни отбрасывать на потом.

Импрот котировок нужен не для учебных целей, а для реальной торговли, поэтому не с мифического *финансе, а непосредственно из терминала, в котором торговля ведётся.

Цели топика просты как пять копеек: позволить всем желающим начать алгоритмическую торговлю на Python, просто скопировав кусочки кода типа инициализации связи с терминалом, запроса котировок, запроса на сервер об открытии или закрытии сделки, и т.д. и т.п. Сосредоточиться на логике только, притом на чрезвычайно удобном для этого языке.

 
Malik Arykov #:

Я о том что интеграция питон с МТ5 не полная. Нельзя НАПРЯМУЮ получить значения индикаторов

Зачем Вам значения индикаторов, если у Вас есть цены, из которых эти индикаторы вычисляются? Я чуть позже приведу пару простых функций, типа вычислений SMA, для примера просто. А так-то пишите что хотите, никто не мешает.
Причина обращения: