Python ile Ticaret - sayfa 2

 
Malik Arykov copy_rates_from , eksiksiz bir veri analizi için yeterli değildir. Gösterge verilerini (kullanıcı verileri dahil) çıkarmak mümkün olsaydı, analiz halkası kapatılırdı.

Ve bir piton aracılığıyla ticaret yapmak, IMHO, MQL5'te bir PR hareketidir.

Ve göstergelerin verilerini saymayı kim engelliyor? veya özel gösterge verilerini mql'den python'a aktarın

 
Sergey Deev # :

Ve göstergelerin verilerini saymayı kim engelliyor? veya özel gösterge verilerini mql'den python'a aktarın

En azından sözde kodda bir örnek verebilir misiniz? Python'da bir script oluşturuyoruz. Belirli bir süre için Bollinger verilerini (Ichimoku, vb.) almak istiyorum. Nasıl?

 
Sergey Zhilinskiy kodu açılır pencereye yapıştırın .
Sayesinde
 
Sergey Deev # :

Python ile ticaret iyidir..

...


Python'da, SQLite'da tırnak ve göstergelerin depolanması. Soket, dosyalar veya veritabanı aracılığıyla MQL-python iletişimi (soket daha iyidir).


Haklısın tabi ki. Ama veritabanları, bazı soketler ile nasıl başa çıkacağını bilmeyenlere yardımcı olmak isterim...

bu yüzden basitçe yapalım - dosyalar aracılığıyla. Açıkça ve çalışmak için yeterli.

 

Üç dosya oluşturmanızı öneririm:

Classes.py - ana dosyada fazladan karışıklık kodu olmaması için her türlü farklı sınıfı oraya koymak için, hepsini değil, sadece sorulanları koymak için;

Functions.py - oraya her türlü farklı işlevi eklemek için, hepsini değil, sadece sorulanları, böylece ana dosyada fazladan karışıklık kodu olmamasını sağlamak için;

TradeLogic.py ana dosyadır.


Classes.py dosyasına zaman, bar ve anlaşma (anlaşma sınıfının hazırlanması) için sınıfları koyacağım:

import datetime as dt 


class date_time(dt. datetime ): 
    
    '''
    Класс описывает отсчёт даты и времени. 
    Представляет собой расширение класса datetime библиотеки datetime .  
    '''
    
    @property 
    def M5_view(self): 
        minute = (self.minute// 5 )* 5 
         if minute < 10 : 
            _minute = ' 0 '+str(minute) 
         else : 
            _minute = str(minute) 
         return self.strftime('%Y%m%d%H')+_minute
    
    @property 
    def nice_view(self): 
         return self.strftime('%Y.%m.%d %H:%M:%S')
    
    def __str__(self): 
         return self.M5_view
    
    def __repr__(self): 
         return self.__str__() 



class Bar: 
    
    '''
    Класс описывает бар, то есть структуру данных, 
    удобную для описания изменения цен финансовых инструментов на интервалах времени.  
    '''
    
    def __init__(self, instrument, time_frame, time_close, price_open, price_low, price_high, price_close, pips_value): 
        self.instrument = instrument 
        self.time_frame = time_frame   
        self.time_close = time_close 
        self.time_open = self.time_close - dt.timedelta(minutes=self.time_frame) 
        self.price_open = price_open 
        self.price_low = price_low 
        self.price_high = price_high 
        self.price_close = price_close 
        self.w = pips_value 
    
    def __str__(self): 
        str1 = '(Bar: instrument={} time_frame={} time_open={} time_close={}\n'
        str2 = 'open={} low={} high={} close={} pips_value={})'
         return (str1+str2).format(self.instrument, self.time_frame, self.time_open.M5_view, self.time_close.M5_view, 
                                  self.price_open, self.price_low, self.price_high, self.price_close, self.w) 
    
    def __repr__(self): 
         return self.__str__()



class Sdelka: 
    
    '''
    Класс описывает сделку. 
    Используется для описания cделок по финансовым инструментам. 
    '''
    
    def __init__(self, instrument, buysell, dt_stamp, price_in, price_SL, price_TP, pips_value): 
        self.instrument = instrument 
        self.buysell = buysell 
        self.dt_stamp = dt_stamp 
        self.price_in = price_in 
        self.price_SL = price_SL 
        self.price_TP = price_TP
        self.w = pips_value 
    
    @property 
    def bs(self): 
         if self.buysell == 'buy': 
             return 1 
        elif self.buysell == 'sell': 
             return - 1 
    
    @property 
    def SL(self): 
         return abs( round ((self.price_SL - self.price_in)/self.w, 1 )) 
    
    @property 
    def TP(self): 
         return abs( round ((self.price_TP - self.price_in)/self.w, 1 )) 
        
    def __str__(self): 
        str1 = '(Sdelka: instrument={} buysell={} dt_stamp={} price_in={} SL={} TP={} price_SL={} price_TP={} w={})'
         return str1.format(self.instrument, self.buysell, self.dt_stamp.M5_view, self.price_in, self.SL, self.TP, 
                           self.price_SL, self.price_TP, self.w) 
    
    def __repr__(self): 
         return self.__str__() 
        


Henüz açıklama yapmıyorum, açıklamalar yol boyunca gelecektir.

 
Malik Arykov # :

En azından sözde kodda bir örnek verebilir misiniz? Python'da bir script oluşturuyoruz. Belirli bir süre için Bollinger verilerini (Ichimoku, vb.) almak istiyorum. Nasıl?

onlar. herhangi bir göstergenin verilerini bir csv dosyasına veya SQLite'a kaydetme ve ardından bunları python'a okuma örneği verir misiniz? Bu komik olmaz mıydı?

 

TradeLogic.py dosyasında, başlamak için aşağıdakileri yazmanızı öneririm:

import os, time 
import datetime as dt 
from json import loads, dump 
from random import randint   
from numpy import log10 
import Classes 
import Functions  
import MetaTrader5 as mt5


N = 1000 # количество отсчётов, сохраняемых в файлах котировок 
N_sd_sell_max = 3 # максимальное количество сделок типа sell по одному инструменту 
N_sd_buy_max = 3 # максимальное количество сделок типа buy по одному инструменту 
volume = 0.01 # объём сделок  
account_demo = [ 'Alpari-MT5-Demo' , 12345678 , 'password' ] 
work_account = account_demo  
work_catalog = 'Z:\\fx_for_forum\\fx\\'
instruments = [ 'EURUSD_i' , 'GBPUSD_i' , 'EURGBP_i' , 'USDCHF_i' , 'USDCAD_i' , 'USDJPY_i' ] 

İşte daha sonra ihtiyaç duyulacak bazı ithalatlar ve programın kendisi N=1000 satırıyla başlıyor. "work_catalog" adresi, fiyatları ve gerekirse diğerlerini içeren dosyaları kaydetmeyi düşündüğüm dizindir. Adres çok garip, çünkü Metatrader'ı sanal bir makinede kullanıyorum ve bu gösteri için Python da orada, araçlar - ticaret yapmayı planladığımız araçların bir listesi.

 
Sergey Deev # :

onlar. herhangi bir göstergenin verilerini bir csv dosyasına veya SQLite'a kaydetme ve ardından bunları python'a okuma örneği verir misiniz? Bu komik olmaz mıydı?

Hayır, komik olmayacak. Python ile hızlı bir şekilde algoritmik ticarete başlayabilen birçok insan var, ancak şu anda Python'a hiç aşina değiller ve aynı zamanda MQL'ye ihtiyaçları olmadığını düşünüyorlar, harcamaya hazır değiller. son derece dar bir uygulamaya sahip bir aracı öğrenme zamanı. C benzeri sözdizimi hakkında da gerekli değildir, birçok insan C / C ++ ile tamamen yabancıdır.

Şubenin amacı, algo ticaretine hangi taraftan başlaması gerektiğini bilmeyen kişilere özel talimatlar vermektir. Başlangıç vuruşu. Gereksiz komplikasyonlar olmadan.

 

Metatrader5 kitaplığı, Metatrader5 terminalini yönetmek için kullanılacaktır.

Kütüphane burada: https://pypi.org/project/MetaTrader5

Buradaki belgeler: https://www.mql5.com/ru/docs/integration/python_metatrader5

 

Kütüphanede açıklanan fonksiyonları kullanarak, terminal ile bağlantı başlatma ve terminal ile bağlantıyı sonlandırma fonksiyonlarını uygularız. Bunu her 5 dakikada bir sonsuz döngüde yapmayı planlıyoruz.


Ayrıca, '202112101635' gibi bir dizgeden bir tarih-zaman referansı ( date_time sınıfının bir nesnesi ) oluşturacak olan dt_stamp_from_M5_view işlevini de yazacağız (bu görünüme M5_view adını veriyorum).


Aşağıdaki kodu TradeLogic.py dosyasına yerleştirelim:

import os, time 
import datetime as dt 
from json import loads, dump 
from random import randint   
from numpy import log10 
from Classes import date_time  
import Functions  
import MetaTrader5 as mt5


N = 1000 # количество отсчётов, сохраняемых в файлах котировок 
N_sd_sell_max = 3 # максимальное количество сделок типа sell по одному инструменту 
N_sd_buy_max = 3 # максимальное количество сделок типа buy по одному инструменту 
volume = 0.01 # объём сделок  
account_demo = ['Alpari-MT5-Demo', 12345678 , ' password '] 
work_account = account_demo  
work_catalog = 'Z:\\fx_for_forum\\fx\\'
instruments = ['EURUSD_i', 'GBPUSD_i', 'EURGBP_i', 'USDCHF_i', 'USDCAD_i', 'USDJPY_i'] 



def terminal_init(path_to_terminal, account):
    '''
    Функция осуществляет соединение с терминалом MT5
    '''
     if mt5.initialize(path_to_terminal, server=account[ 0 ], login=account[ 1 ], password=account[ 2 ]): 
        str1 = ' - соединение с терминалом {} билд {} установлено' 
        print(date_time.now().nice_view, str1.format(mt5.terminal_info().name, mt5. version ()[ 1 ])) 
         return True 
     else : 
        print(date_time.now().nice_view, ' - соединение с терминалом установить не удалось') 
         return False 


def terminal_done():
    '''
    Функция завершает соединение с терминалом MT5
    '''     
    try: 
        mt5.shutdown() 
        print('\n' + date_time.now().nice_view, ' - соединение с терминалом успешно завершено') 
    except: 
        print('\n' + date_time.now().nice_view, ' - соединение с терминалом завершить не удалось') 


def dt_stamp_from_M5_view(M5_view): 
     return date_time( int (M5_view[ 0 : 4 ]), int (M5_view[ 4 : 6 ]), int (M5_view[ 6 : 8 ]), int (M5_view[ 8 : 10 ]), int (M5_view[ 10 : 12 ]))  





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): 
        
            # пауза 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) 
        


if __name__ == '__main__':
    main(N)

Bu kod zaten işlevseldir. Başladığı anlamda, en yakın "pürüzsüz", 5 dakikanın katlarını, ona + 10 saniyeyi belirler (böylece sunucudaki çubukların kapanması garanti edilir, alıntıları kaydetmemiz gerekir), buna kadar uyur an, uyanır, terminale bağlanır, ticaret yapar (hiçbir şey yapmaması anlamında), terminal ile bağlantıyı keser, 5 dakika uykuya dalar ve döngü tekrar eder.


Programın çalışması:


Neden: