Pythonでトレーディング - ページ 2

 
Malik Arykov copy_rates_from は完全なデータ解析には十分ではありません。指標データ(カスタム指標を含む)の抽出が可能であれば、分析リングは終了しているはずです。

Pythonを使った取引は、MQL5のPRにもなっていますね。

インジケーターのデータを計算できないようにしているのは誰ですか? または、カスタムインジケーターのデータをmqlからpythonに渡しているのですか?

 
Sergey Deev #:

インジケータデータの計算を妨げるのは誰か? またはカスタムインジケータのデータをmqlからpythonに渡す。

少なくとも擬似コードで、例を挙げてもらえますか?pythonでスクリプトを作成します。一定期間のボリンジャーのデータ(イシモクなど)を受信したい。どうすればいいのでしょうか?

 
Sergey Zhilinskiy コードを挿入 してください。
ありがとうございました。
 
Sergey Deev #:

ニシキヘビとの取引もいいものです・・・。

...


PythonはSQLiteに相場や指標を保存します。ソケット、ファイル、データベースを介したMQL-Python通信(ソケットが良い)。


もちろん、その通りです。でも、データベースやソケットのようなものに詳しくない人がアルゴリズム取引に参入できるようにしたい...。

そこで、ファイルを通じて、シンプルに考えてみましょう。クリアで、十分な仕事量。

 

3つのファイルを作ることを提案します。

Classes.py - あらゆる種類のクラスをそこに置く。必ずしもすべてのクラスを置く必要はなく、必要なものだけを置いて、メイン ファイルに不必要に散らかったコードがないようにするためです。

Functions.py - あらゆる種類の関数を保存します。必ずしもすべての関数ではなく、メインファイルのコードを散らかさないようにする必要があるものだけを保存します。

TradeLogic.py - メインファイルです。


Classes.pyファイルにタイミング、バー、トレードのクラスを入れておきます(空白のトレードクラス)。

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


まだ解説はありません。解説は順次行っていく予定です。

 
Malik Arykov #:

少なくとも擬似コードで、例を教えてください。pythonでスクリプトを作成します。指定した時間のボリンジャー(イシモクなど)のデータを取得したいのですが、どうすればいいですか?どうすればいいのでしょうか?

つまり、任意の指標のデータをcsvファイルやSQLiteに保存し、それをpythonで読み込む方法の例を挙げてください。笑えなくなる?

 

TradeLogic.pyというファイルに、まずはこう書いておくといいと思います。

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'] 

ここでは、後で必要となるものをインポートしていますが、実際のプログラムはN=1000行目から始まります。work_catalog "というアドレスは、価格や必要に応じてその他を記載したファイルを保存する予定のディレクトリです。私は仮想マシンで メタトレーダーを使用しており、このデモのPythonのために - また、そこに、楽器 - 我々が取引を計画している楽器のリストなので、アドレスは、とても奇妙です。

 
Sergey Deev #:

例えば、インジケータのデータをcsvファイルやSQLiteに保存して、それをpythonに読み込む例を教えてください。笑えなくなる?

いや、面白くはないだろう。Pythonを使えばすぐにアルゴリズム取引を始められるが、現在Pythonを全く使いこなせていない、MQLは必要ないという思いがある、応用範囲が極めて狭いツールを時間をかけて学ぶ気になれない、という人は少なくないはずです。Cライクな構文も語らないでください。C/C++に全く慣れていない人が多すぎるのです。

このブランチの目的は、アルゴリズム取引を何から始めればいいのか分からない人に、具体的な指示を与えることです。先制キック。余計な手間をかけずに。

 

Metatrader5ライブラリは、Metatrader5端末の管理に使用されます。

ライブラリはこちら:https://pypi.org/project/MetaTrader5

ドキュメントはこちら https://www.mql5.com/ru/docs/integration/python_metatrader5

 

ライブラリに記載されている関数を用いて、端末との接続を開始する関数、端末との接続を終了する関数を実装する。5分おきに無限ループで行う予定です。


また、'202112101635'型の文字列から日付時刻のカウント date_timeクラスのオブジェクト)を作成するdt_stamp_from_M5_view関数も書いてください(M5_viewと呼ぶことにします)。


このコードをTradeLogic.pyに記述してみましょう。

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)

このコードはすでに機能しています。すなわち、起動し、5分+10秒の最も近い倍数を決定し(サーバーのバーが閉じることを保証するため、引用符を保存したい)、この瞬間まで眠り、起き、ターミナルに接続し、取引(何もしないという意味で)、ターミナルへの接続を終了して5分間眠り、この繰り返しになります。


プログラム操作。


理由: