Trading con Python - pagina 3

 
Mikhael1983 #:

Utilizzando le funzioni descritte nella libreria, implementate le funzioni per iniziare una connessione al terminale e per terminare una connessione al terminale. Abbiamo intenzione di farlo in un ciclo infinito ogni 5 minuti.

...

Programma in esecuzione:

Tutto questo è implementato con successo da mql5 significa

 
Vitaly Muzichenko #:

Tutto questo è implementato con successo con mql5

Naturalmente. Tuttavia, c'è un grande strato di persone che non hanno familiarità con mql5, e non vedono alcun senso nell'imparare uno strumento obsoleto che si applica solo a un'area estremamente ristretta di lavoro con un particolare terminale di una particolare azienda.
 

Le domande sarebbero apprezzate, posso spiegare come e cosa.

Scriviamo una funzione che salverà le citazioni su file. In linea di principio, non c'è affatto bisogno di salvare le citazioni su file. È sufficiente per tenerli nella memoria. L'ho storicamente è venuto dal fatto che il terminale è in una macchina virtuale Windows e un programma Python salva le citazioni, e tutta la logica è nel sistema host, Debian GNU/Linux, e c'è il proprio programma Python che gira, che legge questi file e scrive in altri file istruzioni commerciali, che il programma Python in Windows virtuale legge, ed esegue.

Tuttavia, scrivere le virgolette nei file è utile di per sé. È visivo. Permette di vedere cosa è successo, sentire, leggere con altri mezzi (lo stesso Matcad), ecc. Quindi, facciamo così.

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)) 

E aggiungiamo alla funzione principale una chiamata per salvare le citazioni:

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) 
        


Risultato del lavoro:


La cartella /fx/ contiene sei file:


Hanno la seguente struttura (usando EURUSD_i.txt come esempio): data-tempo di conto alla rovescia come M5_view, open, high, low, close, con il tempo di conto alla rovescia corrispondente al momento della chiusura della barra.

202112071335 1.1269 1.12697 1.12659 1.1266
202112071340 1.12669 1.12636 1.12659
202112071345 1.12661 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


Notate che l'ora del mio server è 1 ora meno dell'ora corrente sul mio computer, ed è conveniente per me pensare in quell'ora (ora di Mosca).

Ecco perché ho aggiunto un timedelta di 1 ora e 5 minuti nel codice della funzione per salvare le citazioni:

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

in esso 1 ora è la differenza di tempo tra l'ora del server e la mia, e 5 minuti nasce dal fatto che mi è comodo pensare con l'ora di chiusura del bar, e il terminale dà l'ora di apertura.

Ogni 5 minuti i file dei prezzi vengono sovrascritti, riscritti, non viene aggiunta una riga alla fine, ma l'intero file viene sovrascritto. Per gli SSD moderni, e solo 1000 linee, e solo una volta ogni 5 minuti, non c'è niente di cui parlare.
 
Sergey Deev #:

cioè dare un esempio di salvataggio dei dati di qualsiasi indicatore in un file csv o SQLite e poi leggerli in python? Non sarebbe divertente?

È ridicolo. Non ha niente a che fare con python. Con tali dati, lo script può essere scritto in qualsiasi linguaggio di programmazione

 
Malik Arykov #:

È proprio questo che è così divertente. Perché non ha niente a che fare con Python. La stessa cosa può essere fatta in qualsiasi linguaggio di programmazione

Certo che si può. Ma la soglia d'ingresso in Python è molto più bassa che in C++. Persone completamente estranee alla programmazione possono facilmente iniziare a fare ciò di cui hanno bisogno usando Python dopo 3 mesi. Se è necessario qualcosa di non complicato.

 
Malik Arykov #:

È proprio questo che è così divertente. Perché non ha niente a che fare con Python. Lo stesso può essere fatto in qualsiasi linguaggio di programmazione

È divertente usare python contro qualsiasi altro linguaggio? non c'è dubbio... se qualsiasi altro linguaggio ha un'integrazione con MT e ti permette di ottenere delle quotazioni - fai pure...

 

Non capisco cosa vuole TC, secondo i messaggi ci sono solo contraddizioni - ci sono persone che non vogliono sapere di MQL, ma queste persone visiteranno una risorsa tematica, queste persone hanno anche bisogno di installare MT5, così possono finalmente tuffarsi in Python ...... è piuttosto difficile


Se volete davvero creare qualcosa in Python per il beneficio della comunità, potete scriverlo in Python, e rimandare il compito di integrazione o scambio ad una data successiva ,

Ancheimportare citazioni in Python per scopi educativi non è un problema.

L'ho trovato io stesso, lo stavo sistemando un paio di mesi fa:

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



Non capisco affatto lo scopo dell'argomento.

 
Sergey Deev #:

Ridicolo usare python contro qualsiasi altro linguaggio? non c'è dubbio... se qualsiasi altro linguaggio ha un'integrazione con MT e ti permette di ottenere delle quotazioni - fai pure...

Il mio punto è che l'integrazione di python con MT5 non è completa. Non si possono ottenere direttamente i valori dell'indicatore

 

Igor Makanu importare citazioni in Python per scopi di formazione non è un problema.

Ho trovato questo nella mia, l'ho risolto un paio di mesi fa:

...


in generale, gli obiettivi di questo argomento non sono affatto chiari

Il problema dell'integrazione è stato risolto dalla libreria metatrader5, non ha bisogno di essere risolto o abbandonato.

L'importazione delle quotazioni è necessaria non per scopi educativi, ma per il trading reale, quindi non è dal mitico *finanse, ma direttamente dal terminale in cui si fa il trading.

Lo scopo di questo thread è semplice come cinque centesimi: permettere a tutti di iniziare il trading algoritmico in Python, semplicemente copiando pezzi di codice come l'inizializzazione della connessione con il terminale, la richiesta di quotazioni, la richiesta al server di aprire o chiudere un affare, ecc. Concentrati solo sulla logica, e in un linguaggio estremamente facile da usare.

 
Malik Arykov #:

Il mio punto è che l'integrazione di python con MT5 non è completa. Non puoi ottenere direttamente i valori dell'indicatore

Perché avete bisogno dei valori degli indicatori se avete i prezzi da cui questi indicatori sono calcolati? Vi darò un paio di funzioni semplici più tardi, come i calcoli SMA, solo come esempio. Ma tu puoi scrivere quello che vuoi, nessuno te lo impedisce.