Handel mit Python - Seite 3

 
Mikhael1983 #:

Implementieren Sie mit Hilfe der in der Bibliothek beschriebenen Funktionen die Funktionen zum Initiieren einer Verbindung zum Terminal und zum Beenden einer Verbindung zum Terminal. Wir planen, dies in einer Endlosschleife alle 5 Minuten zu tun.

...

Programm läuft:

Dies alles wird durch mql5 erfolgreich umgesetzt, d.h.

 
Vitaly Muzichenko #:

All dies wird mit mql5 erfolgreich umgesetzt

Natürlich. Es gibt jedoch eine große Schicht von Menschen, die mit mql5 nicht vertraut sind und keinen Sinn darin sehen, ein veraltetes Tool zu erlernen, das nur für einen sehr engen Arbeitsbereich mit einem bestimmten Terminal eines bestimmten Unternehmens gilt.
 

Fragen sind erwünscht, ich kann erklären, wie und was.

Lassen Sie uns eine Funktion schreiben, die Zitate in Dateien speichert. Im Prinzip ist es gar nicht nötig, Zitate in Dateien zu speichern. Das reicht, um sie im Gedächtnis zu behalten. Ich habe es historisch kam aus der Tatsache, dass das Terminal in einem virtuellen Windows-Maschine und ein Python-Programm speichert Anführungszeichen, und die ganze Logik ist in der Host-System, Debian GNU/Linux, und es gibt eine eigene Python-Programm spinnt, die diese Dateien liest und schreibt in anderen Dateien Handel Anweisungen, die die Python-Programm in virtuellen Windows liest, und führt.

Das Schreiben der Anführungszeichen in die Dateien ist jedoch an sich schon nützlich. Es ist visuell. Sie können sehen, was passiert ist, fühlen, mit anderen Mitteln (demselben Matcad) lesen usw. Gehen wir also folgendermaßen vor.

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

Und fügen wir der Hauptfunktion einen Aufruf zum Speichern von Zitaten hinzu:

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) 
        


Ergebnis der Arbeit:


Der Ordner /fx/ enthält sechs Dateien:


Sie haben die folgende Struktur (am Beispiel von EURUSD_i.txt): Datum-Zeit-Countdown als M5_view, open, high, low, close, wobei der Zeit-Countdown dem Zeitpunkt des Bar-Closings entspricht.

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


Beachten Sie, dass meine Serverzeit 1 Stunde unter der aktuellen Zeit auf meinem Computer liegt, und es für mich bequem ist, in dieser Zeit zu denken (Moskauer Zeit).

Deshalb habe ich ein Zeitdelta von 1 Stunde und 5 Minuten in den Code der Funktion eingefügt, um die Zitate zu speichern:

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

Darin ist 1 Stunde der Zeitunterschied zwischen der Serverzeit und meiner Zeit, und 5 Minuten ergeben sich aus der Tatsache, dass ich bequemerweise an den Ladenschluss denke, während das Terminal die Öffnungszeit angibt.

Alle 5 Minuten werden die Preisdateien überschrieben, neu geschrieben, es wird nicht eine Zeile am Ende hinzugefügt, sondern die gesamte Datei wird überschrieben. Bei modernen SSDs und nur 1000 Zeilen, und das nur alle 5 Minuten, gibt es nichts zu besprechen.
 
Sergey Deev #:

Geben Sie ein Beispiel für das Speichern von Indikatordaten in einer csv-Datei oder in SQLite und das anschließende Einlesen in Python? Wäre das nicht lustig?

Das ist lächerlich. Das hat nichts mit Python zu tun. Mit diesen Daten kann das Skript in einer beliebigen Programmiersprache geschrieben werden

 
Malik Arykov #:

Das ist genau das, was so lustig ist. Weil es nichts mit Python zu tun hat. Das Gleiche kann in jeder Programmiersprache gemacht werden

Natürlich können Sie das. Aber die Einstiegsschwelle in Python ist viel niedriger als die in C++. Menschen, die mit dem Programmieren völlig unvertraut sind, können nach 3 Monaten problemlos mit Python anfangen, das zu tun, was sie brauchen. Wenn etwas Unkompliziertes gebraucht wird.

 
Malik Arykov #:

Das ist genau das, was so lustig ist. Weil es nichts mit Python zu tun hat. Das Gleiche kann in jeder Programmiersprache gemacht werden

Ist es witzig, Python gegen eine andere Sprache zu verwenden? kein Argument... wenn irgendeine andere Sprache eine Integration mit MT hat und Ihnen erlaubt, Zitate zu erhalten - go for it...

 

Ich verstehe nicht, was TC will, nach den Nachrichten gibt es nur Widersprüche - es gibt Leute, die nicht über MQL wissen wollen, aber diese Leute werden eine thematische Ressource besuchen, diese Leute müssen auch MT5 installieren, damit sie endlich in Python eintauchen können ...... es ist irgendwie schwer


Wenn Sie wirklich etwas in Python zum Nutzen der Gemeinschaft erstellen wollen , können Sie es in Python schreiben und die Integration oder den Austausch auf einen späteren Zeitpunkt verschieben ,

Auchder Import von Zitaten in Python zu Ausbildungszwecken ist kein Problem.

Ich habe es selbst gefunden, ich habe es vor ein paar Monaten aussortiert:

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



Ich verstehe den Sinn des Themas überhaupt nicht.

 
Sergey Deev #:

Lächerlich, Python gegen irgendeine andere Sprache zu verwenden? kein Argument... wenn irgendeine andere Sprache eine Integration mit MT hat und Ihnen erlaubt, Zitate zu bekommen - nur zu...

Mein Punkt ist, dass Python Integration mit MT5 nicht vollständig ist. Sie können die Indikatorwerte nicht direkt abrufen

 

Igor Makanu Der Import von Anführungszeichen in Python zu Schulungszwecken ist ebenfalls kein Problem.

Ich habe das bei mir gefunden und vor ein paar Monaten behoben:

...


Die Ziele dieses Themas sind im Allgemeinen nicht klar.

Das Integrationsproblem wurde durch die metatrader5 Bibliothek gelöst, es muss nicht gelöst oder aufgegeben werden.

Der Import von Kursen ist nicht für Ausbildungszwecke notwendig, sondern für den realen Handel, also nicht aus der mythischen *Finanse, sondern direkt aus dem Terminal, in dem der Handel stattfindet.

Das Ziel dieses Threads ist so einfach wie fünf Pennys: Jedem soll es ermöglicht werden, mit dem algorithmischen Handel in Python zu beginnen, indem man einfach Codestücke kopiert, wie z.B. die Initialisierung der Verbindung zum Terminal, die Anfrage nach Kursen, die Anfrage an den Server, ein Geschäft zu eröffnen oder zu schließen, usw. usw. Konzentrieren Sie sich ausschließlich auf die Logik, und zwar in einer äußerst benutzerfreundlichen Sprache.

 
Malik Arykov #:

Mein Punkt ist, dass die Integration von Python mit MT5 nicht vollständig ist. Sie können die Indikatorwerte nicht direkt abrufen

Wozu brauchen Sie Indikatorwerte, wenn Sie Preise haben, aus denen diese Indikatoren berechnet werden? Ich werde Ihnen später ein paar einfache Funktionen, wie z.B. SMA-Berechnungen, als Beispiel geben. Aber Sie können schreiben, was Sie wollen, niemand hält Sie davon ab.
Grund der Beschwerde: