Operar con Python - página 2

 
Malik Arykov copy_rates_from no es suficiente para un análisis completo de los datos. Si fuera posible extraer los datos de los indicadores (incluidos los indicadores personalizados), se cerraría el anillo de análisis.

En mi opinión, el comercio a través de Python es un movimiento de relaciones públicas de MQL5.

¿Quién le impide calcular los datos del indicador? ¿O pasar los datos de los indicadores personalizados a python desde mql?

 
Sergey Deev #:

¿Quién le impide calcular los datos de los indicadores? O pasar los datos de los indicadores personalizados a python desde mql

¿Puedes dar un ejemplo, al menos en pseudocódigo? Creamos un script en python. Quiero recibir los datos de Bollinger (Ishimoku, etc.) para un determinado periodo de tiempo. ¿Cómo lo hago?

 
Sergey Zhilinskiy inserte el código en la ventana emergente.
Gracias
 
Sergey Deev #:

Comerciar con un pitón es bueno...

...


Python almacena las cotizaciones y los indicadores en SQLite. Comunicación MQL-python vía socket, archivos o base de datos (socket es mejor).


Tienes razón, por supuesto. Pero quiero ayudar a la gente que no está familiarizada con las bases de datos, los enchufes de algún tipo para entrar en el comercio algorítmico...

Así que vamos a simplificarlo: a través de archivos. Claramente, y suficiente para trabajar.

 

Propongo hacer tres archivos:

Classes.py - para poner todo tipo de clases allí, no necesariamente todas, sólo las que lo necesitan, para que no haya código innecesario en el archivo principal;

Functions.py - para almacenar allí todo tipo de funciones, no necesariamente todas, sólo las que no necesitan ser código desordenado en el archivo principal;

TradeLogic.py - archivo principal.


Pondré clases de tiempo, barra y comercio en el archivo Classes.py (una clase de comercio en blanco):

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


Todavía no hay explicaciones, se darán a medida que avancemos.

 
Malik Arykov #:

¿Puedes darme un ejemplo, al menos en pseudocódigo? Crear un script en python. Quiero obtener los datos de Bolinger (Ishimoku, etc.) para un tiempo determinado. ¿Cómo lo hago?

Es decir, dar un ejemplo de cómo guardar los datos de cualquier indicador en un archivo csv o SQLite y luego leerlo en python? ¿No será divertido?

 

En el archivo TradeLogic.py sugiero escribir esto para empezar:

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

Aquí hay algunas importaciones de lo que se necesitará más tarde, y el programa en sí comienza con la línea N=1000. La dirección "work_catalog" es el directorio en el que pienso guardar los archivos con los precios y, si es necesario, otros. La dirección es tan extraño, porque yo uso Metatrader en la máquina virtual y para esta demostración Python - también allí, los instrumentos - la lista de instrumentos en los que se planea el comercio.

 
Sergey Deev #:

Por ejemplo, ¿dar un ejemplo de cómo guardar los datos de cualquier indicador en un archivo csv o SQLite y luego leerlos en python? ¿No será divertido?

No, no será divertido. Hay mucha gente que puede empezar rápidamente a hacer trading algorítmico con Python, pero actualmente no está familiarizada con Python en absoluto, y tiene la sensación de que no necesita MQL, no está dispuesta a dedicar tiempo a aprender una herramienta que tiene una aplicación extremadamente estrecha. Tampoco hables de sintaxis tipo C, hay demasiada gente que no está familiarizada con C/C++ en absoluto.

El propósito de esta rama es dar instrucciones específicas a las personas que no saben por dónde deben empezar con el trading algorítmico. Una patada inicial. Sin complicaciones innecesarias.

 

La biblioteca metatrader5 se utilizará para gestionar el terminal Metatrader5.

Biblioteca aquí:https://pypi.org/project/MetaTrader5

Documentación aquí: https: //www.mql5.com/ru/docs/integration/python_metatrader5

 

Utilizando las funciones descritas en la biblioteca, implemente las funciones para iniciar una conexión con el terminal y para terminar una conexión con el terminal. Planeamos hacerlo en bucle infinito cada 5 minutos.


También escriba la función dt_stamp_from_M5_view que creará una cuenta de fecha-hora(objeto de clase date_time) a partir de la cadena de tipo '202112101635' (la llamo M5_view).


Pongamos este código en el archivo 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)

Este código ya es funcional. Es decir, se pone en marcha, determina el múltiplo igual más cercano de 5 minutos, + 10 segundos (para asegurar que las barras del servidor se cierren, queremos guardar las cotizaciones), duerme hasta este momento, se despierta, se conecta a la terminal, negocia (en el sentido de que no hace nada), termina la conexión con la terminal, duerme durante 5 minutos - y el ciclo se repite.


Funcionamiento del programa:


Razón de la queja: