파이썬으로 거래하기 - 페이지 2

 
Malik Arykov copy_rates_from 은 완전한 데이터 분석에 충분하지 않습니다. 지표 데이터(사용자 데이터 포함)를 추출할 수 있다면 분석 링이 닫힙니다.

그리고 파이썬, IMHO를 통한 거래는 MQL5의 PR 움직임입니다.

그리고 누가 지표의 데이터를 세는 것을 막습니까? 또는 mql에서 python으로 사용자 지정 지표 데이터 전송

 
Sergey Deev # :

그리고 누가 지표의 데이터를 세는 것을 막습니까? 또는 mql에서 python으로 사용자 지정 지표 데이터 전송

적어도 의사 코드에서 예를 들어 줄 수 있습니까? 우리는 파이썬으로 스크립트를 만듭니다. 주어진 시간 동안 볼린저 데이터(Ichimoku 등)를 얻고 싶습니다. 어떻게?

 
Sergey Zhilinskiy 에 코드를 붙여넣으십시오 .
덕분에
 
Sergey Deev # :

파이썬으로 거래하면 좋은데..

...


Python에서 SQLite의 따옴표 및 표시기 저장. 소켓, 파일 또는 데이터베이스를 통한 MQL-python 통신(소켓이 더 좋음).


물론 맞습니다. 그러나 데이터베이스, 일부 소켓을 다루는 방법에 익숙하지 않은 사람들을 돕고 싶습니다.

파일을 통해 간단하게 처리해 보겠습니다. 분명히, 그리고 충분히 작동합니다.

 

세 가지 파일을 만드는 것이 좋습니다.

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 # :

적어도 의사 코드에서 예를 들어 줄 수 있습니까? 우리는 파이썬으로 스크립트를 만듭니다. 주어진 시간 동안 볼린저 데이터(Ichimoku 등)를 얻고 싶습니다. 어떻게?

저것들. 표시기의 데이터를 csv 파일이나 SQLite에 저장한 다음 파이썬으로 읽는 예를 들어주시겠습니까? 재미있지 않겠습니까?

 

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" 주소는 가격이 포함된 파일을 저장하려는 디렉토리이며, 필요한 경우 다른 파일도 저장합니다. 주소가 너무 이상합니다. 저는 가상 머신 에서 Metatrader를 사용하고 이 데모를 위해 Python도 거기에 있습니다. 도구 - 우리가 거래할 도구 목록입니다.

 
Sergey Deev # :

저것들. 표시기의 데이터를 csv 파일이나 SQLite에 저장한 다음 파이썬으로 읽는 예를 들어 주시겠습니까? 재미있지 않겠습니까?

아니, 재미 없을거야. 파이썬으로 빠르게 알고리즘 트레이딩을 시작할 수 있는 사람들이 많이 있지만, 현재로서는 파이썬에 전혀 익숙하지 않고, 동시에 MQL이 필요하지 않다고 느끼면서 지출할 준비가 되어 있지 않습니다. 매우 좁은 응용 프로그램을 가진 도구를 시간 학습합니다. C와 같은 구문에 대해서도 필요하지 않습니다. 많은 사람들이 C/C++에 완전히 익숙하지 않습니다.

지점의 목적은 알고 거래를 시작해야 하는지 모르는 사람들에게 구체적인 지침을 제공하는 것입니다. 시작 킥. 불필요한 합병증 없이.

 

metatrader5 라이브러리는 Metatrader5 터미널을 관리하는 데 사용됩니다.

라이브러리는 여기: https://pypi.org/project/MetaTrader5

여기 문서: https://www.mql5.com/ru/docs/integration/python_metatrader5

 

라이브러리에 설명된 함수를 사용하여 터미널과의 연결을 시작하고 터미널과의 연결을 종료하는 함수를 구현합니다. 5분마다 무한 루프로 이 작업을 수행할 계획입니다.


또한 dt_stamp_from_M5_view 함수를 작성하여 '202112101635'(이 뷰를 M5_view라고 함)와 같은 문자열에서 날짜-시간 참조( date_time 클래스의 개체 )를 생성합니다.


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분 동안 잠들고, 사이클이 반복됩니다.


프로그램 운영:


사유: