Negociando com Python - página 3

 
Mikhael1983 #:

Usando as funções descritas na biblioteca, implementar as funções para iniciar uma conexão com o terminal e para terminar uma conexão com o terminal. Planejamos fazer isto em um loop interminável a cada 5 minutos.

...

Programa em execução:

Tudo isso é implementado com sucesso por meio de mql5

 
Vitaly Muzichenko #:

Tudo isso é implementado com sucesso com mql5

Naturalmente. Entretanto, há uma grande camada de pessoas que não estão familiarizadas com o mql5, e não vêem sentido em aprender uma ferramenta obsoleta que só se aplica a uma área de trabalho extremamente estreita com um terminal particular de uma empresa em particular.
 

Agradeceria que me fizessem perguntas, posso explicar como e o quê.

Vamos escrever uma função que salvará as citações em arquivos. Em princípio, não há necessidade de salvar as citações nos arquivos. É o suficiente para mantê-los na memória. Historicamente, eu tenho isso como resultado do fato de o terminal estar em uma máquina virtual Windows e um programa Python salvar citações, e toda a lógica está no sistema host, Debian GNU/Linux, e há seu próprio programa Python girando, que lê esses arquivos e escreve em outros arquivos instruções de comércio, que o programa Python no Windows virtual lê, e executa.

Entretanto, escrever as citações nos arquivos é apenas útil em si mesmo. É visual. Permite que você veja o que aconteceu, sinta, leia por outros meios (o mesmo Matcad), etc. Então, vamos fazer desta maneira.

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

E vamos adicionar à função principal uma chamada para salvar citações:

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 do trabalho:


A pasta /fx/ contém seis arquivos:


Eles têm a seguinte estrutura (usando EURUSD_i.txt como exemplo): contagem regressiva de data e hora como M5_view, aberta, alta, baixa, fechada, com a contagem regressiva de tempo correspondente ao momento de fechamento do bar.

202112071335 1.1269 1.12697 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


Note que meu tempo de servidor é 1 hora a menos do que o tempo atual em meu computador, e é conveniente para mim pensar nesse tempo (tempo de Moscou).

É por isso que acrescentei uma timedelta de 1 hora e 5 minutos no código da função para salvar as citações:

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

nela 1 hora é a diferença de tempo entre o tempo do servidor e o meu, e 5 minutos surge do fato de que me sinto confortável pensando com o tempo de fechamento do bar, e o terminal dá tempo de abertura.

A cada 5 minutos os arquivos de preços são sobrescritos, reescritos, não é acrescentada uma linha ao final, mas o arquivo inteiro é sobrescrito. Para SSDs modernos, e apenas 1000 linhas, e apenas uma vez a cada 5 minutos, não há nada para se falar.
 
Sergey Deev #:

ou seja, dar um exemplo de como salvar qualquer dado indicador em um arquivo csv ou SQLite e depois lê-lo em python? Isso não seria engraçado?

É ridículo. Não tem nada a ver com píton. Com tais dados, o roteiro pode ser escrito em qualquer linguagem de programação

 
Malik Arykov #:

É exatamente isso que é tão engraçado. Porque não tem nada a ver com píton. A mesma coisa pode ser feita em qualquer linguagem de programação

É claro que você pode. Mas o limiar de entrada em Python é muito mais baixo do que em C++, qual deles. As pessoas completamente não familiarizadas com programação podem facilmente começar a fazer o que precisam usando Python após 3 meses. Se algo sem complicações for necessário.

 
Malik Arykov #:

É exatamente isso que é tão engraçado. Porque não tem nada a ver com píton. O mesmo pode ser feito em qualquer linguagem de programação

É engraçado usar píton contra qualquer outra língua? nenhum argumento... se qualquer outra língua tem integração com MT e permite que você obtenha citações - vá em frente...

 

Não entendo o que a TC quer, de acordo com as mensagens só há contradições - há pessoas que não querem saber sobre MQL, mas essas pessoas vão visitar um recurso temático, essas pessoas também precisam instalar o MT5, para que finalmente possam mergulhar em Python ...... é meio difícil


Se você realmente quiser criar algo em Python em benefício da comunidade, você pode escrevê-lo em Python e adiar a tarefa de integração ou troca para uma data posterior ,

importar citações em Python para fins educacionais também não é um problema.

Eu mesmo o encontrei, estava resolvendo-o há alguns meses:

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



Não entendo de todo a finalidade do tópico.

 
Sergey Deev #:

Ridículo usar píton contra qualquer outra língua... nenhum argumento... se qualquer outra língua tem integração com MT e permite que você receba citações - vá em frente...

Meu ponto é que a integração da pitão com o MT5 não está completa. Você não pode obter valores indicadores diretamente

 

Igor Makanu importação de citações em Python para fins de treinamento também não é um problema.

encontrou isto na minha, resolveu-o há alguns meses:

...


em geral, os objetivos deste tópico não são nada claros

O problema de integração foi resolvido pela biblioteca metatrader5, não precisa ser resolvido ou abandonado.

A importação das cotações é necessária não para fins educacionais, mas para uma comercialização real, portanto não é do mítico *finanse, mas diretamente do terminal, no qual a comercialização é feita.

O objetivo deste tópico é simples como cinco centavos: permitir que todos iniciem a comercialização algorítmica em Python, apenas copiando peças de código como inicialização de conexão ao terminal, solicitação de cotações, solicitação ao servidor para abrir ou fechar um negócio, etc., etc. Foco apenas na lógica e em uma linguagem extremamente amigável para o usuário.

 
Malik Arykov #:

Meu argumento é que a integração da pitão com o MT5 não está completa. Você não pode obter diretamente valores indicadores

Por que você precisa de valores indicadores se você tem preços a partir dos quais esses indicadores são calculados? Darei mais tarde algumas funções simples, como cálculos de SMA, apenas como exemplo. Mas você pode escrever o que quiser, ninguém está lhe impedindo.
Razão: