Le trading avec Python - page 3

 
Mikhael1983 #:

A l'aide des fonctions décrites dans la bibliothèque, implémentez les fonctions d'initiation de connexion au terminal et de terminaison de connexion au terminal. Nous prévoyons de faire cela dans une boucle sans fin toutes les 5 minutes.

...

Programme en cours :

Tout ceci est mis en œuvre avec succès par mql5 signifie

 
Vitaly Muzichenko #:

Tout ceci est mis en œuvre avec succès avec mql5.

Naturellement. Cependant, il y a une grande couche de personnes qui ne connaissent pas mql5, et ne voient aucun intérêt à apprendre un outil obsolète qui ne s'applique qu'à un domaine de travail extrêmement étroit avec un terminal particulier d'une société particulière.
 

Les questions seraient appréciées, je peux expliquer comment et quoi.

Écrivons une fonction qui enregistrera les citations dans des fichiers. En principe, il n'est pas du tout nécessaire d'enregistrer les citations dans des fichiers. C'est suffisant pour les garder en mémoire. J'ai historiquement cela vient du fait que le terminal est dans une machine virtuelle Windows et un programme Python enregistre les guillemets, et toute la logique est dans le système hôte, Debian GNU/Linux, et il y a son propre programme Python qui tourne, qui lit ces fichiers et écrit dans d'autres fichiers des instructions commerciales, que le programme Python dans le Windows virtuel lit, et exécute.

Cependant, l'écriture des citations dans les fichiers est utile en soi. C'est visuel. Permet de voir ce qui s'est passé, de sentir, de lire par d'autres moyens (le même Matcad), etc. Alors, faisons comme ça.

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

Et ajoutons à la fonction principale un appel à la sauvegarde des devis :

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) 
        


Résultat des travaux :


Le dossier /fx/ contient six fichiers :


Ils ont la structure suivante (en utilisant EURUSD_i.txt comme exemple) : compte à rebours date-temps comme M5_view, open, high, low, close, avec le compte à rebours temps correspondant au moment de la fermeture de la barre.

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


Notez que l'heure de mon serveur est inférieure d'une heure à l'heure actuelle sur mon ordinateur, et qu'il est pratique pour moi de penser à cette heure (heure de Moscou).

C'est pourquoi j'ai ajouté un timedelta de 1 heure et 5 minutes dans le code de la fonction pour sauvegarder les citations :

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

dans celle-ci, 1 heure est la différence de temps entre l'heure du serveur et la mienne, et 5 minutes proviennent du fait que je suis à l'aise avec l'heure de fermeture du bar, et que le terminal donne l'heure d'ouverture.

Toutes les 5 minutes, les fichiers de prix sont écrasés, réécrits, pas une ligne n'est ajoutée à la fin, mais le fichier entier est écrasé. Pour les SSD modernes, et seulement 1000 lignes, et seulement une fois toutes les 5 minutes, il n'y a rien à dire.
 
Sergey Deev #:

c.-à-d. donnez un exemple de sauvegarde des données d'un indicateur dans un fichier csv ou SQLite, puis de leur lecture dans python ? Ce serait drôle, non ?

C'est ridicule. Cela n'a rien à voir avec python. Avec ces données, le script peut être écrit dans n'importe quel langage de programmation.

 
Malik Arykov #:

C'est exactement ce qui est si drôle. Parce que cela n'a rien à voir avec python. La même chose peut être faite dans n'importe quel langage de programmation.

Bien sûr que vous pouvez. Mais le seuil d'entrée en Python est beaucoup plus bas qu'en C++ lequel. Les personnes qui ne sont pas du tout familiarisées avec la programmation peuvent facilement commencer à faire ce dont elles ont besoin en utilisant Python après 3 mois. Si on a besoin de quelque chose de simple.

 
Malik Arykov #:

C'est exactement ce qui est si drôle. Parce que cela n'a rien à voir avec python. La même chose peut être faite dans n'importe quel langage de programmation

Est-ce que c'est drôle d'utiliser python contre un autre langage ? Pas d'argument... si un autre langage a une intégration avec MT et vous permet d'obtenir des cotations - allez-y...

 

Je ne comprends pas ce que veut TC, d'après les messages il n'y a que des contradictions - il y a des gens qui ne veulent pas connaître MQL, mais ces gens vont visiter une ressource thématique, ces gens ont aussi besoin d'installer MT5, pour pouvoir enfin se plonger dans Python ...... c'est un peu dur


Si vous voulez vraiment créer quelque chose en Python au profit de la communauté, vous pouvez l'écrire en Python et reporter la tâche d'intégration ou d'échange à une date ultérieure ,

L'importation de citations dans Python à des fins éducatives ne pose pas non plus de problème.

Je l'ai trouvé moi-même, j'étais en train de le trier il y a quelques mois :

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



Je ne comprends pas du tout le but de ce sujet.

 
Sergey Deev #:

Ridicule d'utiliser python contre tout autre langage ? aucun argument... si un autre langage a une intégration avec MT et vous permet d'obtenir des cotations - allez-y...

Ce que je veux dire, c'est que l'intégration de python avec MT5 n'est pas complète. Vous ne pouvez pas obtenir les valeurs des indicateurs directement

 

Igor Makanu importation de citations en Python à des fins de formation n'est pas non plus un problème.

J'ai trouvé ça dans le mien, j'ai réglé le problème il y a quelques mois :

...


en général, les objectifs de ce sujet ne sont pas clairs du tout

Le problème d'intégration a été résolu par la bibliothèque metatrader5, il n'a pas besoin d'être résolu ou abandonné.

L'importation des cotations est nécessaire non pas à des fins éducatives, mais pour le trading réel, donc pas à partir de la mythique *finanse, mais directement à partir du terminal, dans lequel le trading est effectué.

Le but de ce fil de discussion est simple comme bonjour : permettre à tout le monde de commencer le trading algorithmique en Python, juste en copiant des morceaux de code comme l'initialisation de la connexion avec le terminal, la demande de cotations, la demande au serveur d'ouvrir ou de fermer une transaction, etc. etc. Concentrez-vous uniquement sur la logique, et ce dans un langage extrêmement convivial.

 
Malik Arykov #:

Ce que je veux dire, c'est que l'intégration de python avec MT5 n'est pas complète. Vous ne pouvez pas obtenir directement les valeurs des indicateurs

Pourquoi avez-vous besoin des valeurs des indicateurs si vous avez des prix à partir desquels ces indicateurs sont calculés ? Je vous présenterai plus tard quelques fonctions simples, comme le calcul des SMA, à titre d'exemple. Mais vous pouvez écrire ce que vous voulez, personne ne vous en empêche.
Raison: