Operar con Python - página 3

 
Mikhael1983 #:

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 hacer esto en un bucle sin fin cada 5 minutos.

...

Programa en marcha:

Todo esto es implementado con éxito por mql5 significa

 
Vitaly Muzichenko #:

Todo esto se implementa con éxito con mql5

Naturalmente. Sin embargo, hay una gran capa de personas que no están familiarizadas con mql5, y no ven ningún sentido en aprender una herramienta obsoleta que sólo se aplica a un área de trabajo extremadamente estrecha con un terminal particular de una empresa concreta.
 

Se agradecerán las preguntas, puedo explicar cómo y qué.

Escribamos una función que guarde las citas en archivos. En principio, no es necesario guardar las cotizaciones en archivos. Es suficiente para mantenerlos en la memoria. Tengo que históricamente vino del hecho de que el terminal está en una máquina virtual de Windows y un programa de Python guarda citas, y toda la lógica está en el sistema anfitrión, Debian GNU/Linux, y hay su propio programa de Python corriendo, que lee estos archivos y escribe en otros archivos las instrucciones de comercio, que el programa de Python en Windows virtual lee, y ejecuta.

Sin embargo, escribir las comillas en los archivos es útil en sí mismo. Es visual. Permite ver lo que pasó, sentir, leer por otros medios (el mismo Matcad), etc. Entonces, hagámoslo así.

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

Y añadamos a la función principal una llamada para guardar las cotizaciones:

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) 
        


Resultado del trabajo:


La carpeta /fx/ contiene seis archivos:


Tienen la siguiente estructura (usando EURUSD_i.txt como ejemplo): cuenta atrás fecha-tiempo como M5_view, apertura, alta, baja, cierre, con la cuenta atrás de tiempo correspondiente al momento de cierre de la barra.

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


Tenga en cuenta que la hora de mi servidor es 1 hora menos que la hora actual de mi ordenador, y me conviene pensar en esa hora (hora de Moscú).

Por eso he añadido un timedelta de 1 hora y 5 minutos en el código de la función para guardar las comillas:

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

en ella 1 hora es la diferencia de tiempo entre la hora del servidor y la mía, y 5 minutos surgen del hecho de que me siento cómodo pensando en la hora de cierre del bar, y el terminal da la hora de apertura.

Cada 5 minutos se sobrescriben los archivos de precios, se reescriben, no se añade una línea al final, sino que se sobrescribe todo el archivo. En el caso de los SSD modernos, y con sólo 1000 líneas, y sólo una vez cada 5 minutos, no hay nada que hablar.
 
Sergey Deev #:

es decir, ¿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ía divertido?

Es ridículo. No tiene nada que ver con python. Con estos datos, el guión puede escribirse en cualquier lenguaje de programación

 
Malik Arykov #:

Eso es exactamente lo que es tan divertido. Porque no tiene nada que ver con python. Lo mismo se puede hacer en cualquier lenguaje de programación

Por supuesto que sí. Pero el umbral de entrada en Python es mucho más bajo que en C++ que uno. Las personas que no están familiarizadas con la programación pueden empezar fácilmente a hacer lo que necesitan utilizando Python después de 3 meses. Si se necesita algo sin complicaciones.

 
Malik Arykov #:

Eso es exactamente lo que es tan divertido. Porque no tiene nada que ver con python. Lo mismo puede hacerse en cualquier lenguaje de programación

¿Es divertido usar python contra cualquier otro lenguaje? no hay discusión... si cualquier otro lenguaje tiene integración con MT y te permite obtener cotizaciones - ve por él...

 

No entiendo lo que quiere TC, según los mensajes sólo hay contradicciones - hay personas que no quieren saber sobre MQL, pero estas personas visitarán un recurso temático, estas personas también necesitan instalar MT5, para que finalmente puedan sumergirse en Python ...... es un poco difícil


Si realmente quieres crear algo en Python en beneficio de la comunidad, puedes escribirlo en Python y posponer la tarea de integración o intercambio para más adelante,

Laimportación de citas en Python con fines educativos tampoco es un problema.

Yo mismo lo he encontrado, lo estuve ordenando hace un par de meses:

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



No entiendo en absoluto el objetivo del tema.

 
Sergey Deev #:

¿Ridículo usar python contra cualquier otro lenguaje? no hay discusión... si cualquier otro lenguaje tiene integración con MT y te permite obtener cotizaciones - ve por él...

Lo que quiero decir es que la integración de python con MT5 no es completa. No se pueden obtener los valores de los indicadores directamente

 

Igor Makanu importación de comillas en Python para la formación tampoco es un problema.

Encontré esto en el mío, lo solucioné hace un par de meses:

...


en general, los objetivos de este tema no están nada claros

El problema de la integración ha sido resuelto por la biblioteca de metatrader5, no necesita ser resuelto o pospuesto.

La importación de cotizaciones es necesaria no para fines educativos, sino para el comercio real, por lo que no es desde el mítico *finanse, sino directamente desde el terminal, en el que se realiza el comercio.

El objetivo de este hilo es tan simple como cinco centavos: permitir que todo el mundo empiece a hacer trading algorítmico en Python, simplemente copiando trozos de código como la inicialización de la conexión al terminal, la petición de cotizaciones, la petición al servidor para abrir o cerrar una operación, etc., etc. Centrarse sólo en la lógica, y en un lenguaje extremadamente fácil de usar.

 
Malik Arykov #:

Lo que quiero decir es que la integración de python con MT5 no es completa. No se pueden obtener directamente los valores de los indicadores

¿Para qué se necesitan los valores de los indicadores si se tienen los precios a partir de los cuales se calculan estos indicadores? Más adelante te daré un par de funciones sencillas, como los cálculos de SMA, sólo como ejemplo. Pero puedes escribir lo que quieras, nadie te lo impide.
Razón de la queja: