Fazendo um sistema comercial Python para MT. - página 3

 
Yuriy Asaulenko:

Esse é um assunto diferente).

Eu não monto uma equipe. Caminho sozinho, faço o que acho certo e interessante, e não assumo nenhum compromisso.

Se alguém quiser sair comigo, também não há nenhuma objeção nem nenhum compromisso.

Não estou falando da equipe, mas do motor na forma de uma aplicação EXE para ligar Python e R com MQL, o que sugeri nessa linha.
 
Ivan Negreshniy:
Não estou falando da equipe, mas do motor na forma de aplicação EXE para ligar Python e R com MQL, o que sugeri nessa linha.

Você terá um EXE - sem problemas em Python. R, desculpe, eu não o uso - imho, uma grande lixeira de tudo e de nada. Se há diamantes nesta lixeira, sua busca é problemática. A menos que SanSanych me diga).

Eu lido principalmente com redes neurais, e há o suficiente delas sem R.

Mas, na verdade, a metodologia de interação está planejada para ser universal, e provavelmente você pode usá-la também para R.

 
Agora que temos uma aplicação pré-construída, é hora de trocar dados entre o terminal e Python.
Para começar, vamos escolher o tipo mais simples de intercâmbio - intercâmbio de dados via arquivos.
Agora muitas pessoas rirão em seus tinteiros, e em vão. Então, deixe-os).
1. Durante a construção e depuração do aplicativo, o compartilhamento de arquivos é mais eficiente, pois não requer nenhum esforço de atualização. E uma vez construída a aplicação, ela pode ser substituída por outra coisa.
2. Na maioria dos TCs prontos, a velocidade de troca de arquivos é mais do que suficiente. 50-100 ms. Não é suficiente para você?
3. Na troca de arquivos via RAM-Disk a taxa de câmbio atinge 1,5 GByte/s. É impossível medir a latência de forma alguma.
Em suma, cuspir e esquecer os adversários).
Bem, na verdade, outra troca está planejada para a última fase, se nós ou o tópico estivermos à altura disso).

Trocaremos com o terminal via arquivos CSV. Até agora um caminho - do terminal para a aplicação.
Para evitar conflitos de interesse, utilizaremos arquivos semáforos.
Portanto, que DataTS.csv seja o arquivo de dados, e STS.s seja o arquivo semáforo.
O terminal grava os dados no DataTS.csv e, após a escrita, cria um arquivo semáforo STS.s. vazio.
O aplicativo verifica a presença do arquivo do semáforo STS.s, depois lê o arquivo DataTS.csv, depois apaga o arquivo do semáforo STS.s.
Em seguida, o terminal detecta o desaparecimento do arquivo semafórico STS.s e só então grava os novos dados no arquivo DataTS.csv.
Possíveis variações, dependendo das funções dos arquivos Phyton e MT - ainda não foram vistas.
Entretanto, não de uma só vez, primeiro precisamos trabalhar com Python, e determinar suas capacidades.
Isso é o que vamos fazer.
 
Houve algumas mudanças desde minha última visita. O aplicativo agora está totalmente funcional - tudo descrito no post anterior foi implementado. Todos os botões agora funcionam e a troca de arquivos é implementada.
- O botão Limpar limpa a janela de saída,
- O botão Enviar envia a linha da janela de entrada para a janela de saída,
- o botão Start liga a troca de arquivos,
- O botão Stop interrompe a troca de arquivos.
Isto é fácil de verificar. Criamos a pasta C:\PyTS, colocar arquivo de dados - DFile.csv, colocar arquivo semáforo - SFile.tx. Nosso programa Python detecta o arquivo semáforo, lê o arquivo de dados, exibe-o na janela de saída e apaga o arquivo semáforo.
Agora você pode alterar os dados no DFile.csv e criar um novo arquivo semáforo, então o programa lerá e emitirá os novos dados.
Você pode escrever um simples programa MQL, mudar a pasta de leitura em nosso programa para a pasta onde a MT escreve, e então você pode avaliar a velocidade de troca, possíveis lacunas de dados e muitas outras coisas.
A única função responsável pela troca de arquivos é FileExchange(). Ele é implementado em uma rosca adicional - a rosca temporizada. Podemos ter dezenas de tais linhas e funções e elas não afetarão a aplicação de forma alguma - ou seja, podemos ter dezenas de canais paralelos e independentes de intercâmbio de dados à nossa disposição.
Neste momento o timer está ajustado para 10,0s - você pode ajustá-lo para 0,001s, veja a documentação.
Bem, se você realmente quer medir velocidade e outras características - remover funções de debug print() no caminho de troca - elas reduzem significativamente a velocidade.
O código do programa Python está no anexo. Como de costume, renomeá-lo para .py
Arquivos anexados:
PyTS_1.0.txt  3 kb
 

Falamos sobre a troca de arquivos CSV, mas a versão 1.0 (ver post anterior) apenas abre e lê os arquivos. A próxima versão - 1.01, após algumas modificações, lê arquivos CSV e os armazena na variável InData.

Na verdade, todas as modificações:

def FileExchange():
    global Change
    if Change==True:
        if os.path.exists(SFile):
            print("SFile.txt is")
            if os.path.exists(DFile):
                print("DFile.csv is")
                InData = csv.reader(open(DFile, 'r'))
                data_read = [row for row in InData]
                print(data_read)
                os.remove(SFile)
            else:
                print("DFile.csv no")
        else:
            print("SFile.txt no")
        print('Вывод таймера')
        timer =threading.Timer(10.0,FileExchange)
        timer.start()

Apenas 3 linhas trocadas + conexão de biblioteca csv.

E também controla a saída do conteúdo CSV a partir da variável InData:

In [18]: [['04.08.2018 14:00', ' 1300', ' 1295', '1310', '1305', '100'], ['04.08.2018 14:10', ' 1307', ' 1297', '1320', '1315', '150']]

Agora os valores das linhas estão disponíveis por índices, tipo - linha, coluna.

Bem, e o próprio código - ver anexo.

Arquivos anexados:
PyTS_1.01.txt  3 kb
 
Yuriy Asaulenko:

Falamos sobre a troca de arquivos CSV, mas a versão 1.0 (ver post anterior) apenas abre e lê os arquivos. A próxima versão - 1.01, após algumas modificações, lê arquivos CSV e os armazena na variável InData.

Na verdade, todas as modificações:

Apenas 3 linhas trocadas + conexão de biblioteca csv.

E também controla a saída do conteúdo CSV a partir da variável InData:

Agora os valores das linhas estão disponíveis por índices, tipo - linha, coluna.

Bem, e o próprio código - ver anexo.

O uso do compartilhamento de arquivos não é a melhor solução. As operações de arquivo são muito lentas. Você tem que conectar um disco RAM para tal troca.
 
Grigoriy Chaunin:
O uso de arquivos para troca não é a melhor solução. As operações de arquivo são muito lentas. Você tem que conectar um disco RAM para tal troca.
Você pode dar as características de desempenho da troca de arquivos (o que existe) e as tarefas necessárias (o que é necessário)?


E eu, por exemplo, direi que eles são extremamente rápidos, não lentos. Sem características numéricas, tanto suas como minhas declarações não se baseiam em nada e, portanto, não fazem sentido na tarefa em questão. Você precisa das características tanto da troca de arquivos quanto das necessidades do problema, e somente depois de compará-las é que você pode chegar a conclusões válidas. Como Yuri Asaulenko decidiu que os arquivos são adequados, eu acho que ele conhece melhor o volume planejado de transferência e tempo de processamento de dados.

Em geral, os arquivos em disco têm uma grande vantagem sobre a memória volátil - eles são armazenados no disco de desligamento e podem ser acessados após uma semana ou um ano. Para controlar, analisar, verificar, apenas observar.

 
Grigoriy Chaunin:
O uso de arquivos para troca não é a melhor solução. As operações de arquivo são muito lentas. Você tem que conectar um disco RAM para tal troca.

Esta questão já foi discutida neste tópico, em posts anteriores, incluindo o possível uso do RAM-Disk, se necessário:

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Como fazer um sistema comercial para MT usando Python.

Yuriy Asaulenko, 2018.08.01 19:33

Agora que temos o projeto do aplicativo, é hora de nos envolvermos na troca de dados do terminal com Python.
Primeiramente escolheremos o tipo mais simples de intercâmbio - intercâmbio de dados via arquivos.
Agora, muitas pessoas se rirão em seus tinteiros, e em vão. Então, deixe-os).
1. Durante a construção e depuração do aplicativo, o compartilhamento de arquivos é mais eficiente, pois não requer nenhum esforço de atualização. E uma vez construída a aplicação, ela pode ser substituída por outra coisa.
2. Na maioria dos TCs prontos, a velocidade de troca de arquivos é mais do que suficiente. 50-100 ms. Não é suficiente para você?
3. Na troca de arquivos via RAM-Disk a taxa de câmbio atinge 1,5 GByte/s. É impossível medir a latência de forma alguma.
Em suma, cuspir e esquecer os adversários).
Bem, na verdade, outra troca está planejada para a última fase, se nós ou o tópico estivermos à altura disso).
Também em um dos primeiros postes da linha.
 

Eu apresento uma nova versão do PyTS 1.02. Esta versão é funcionalmente equivalente à versão 1.01, mas os controles de impressão() desnecessários foram removidos do código e a abordagem de classe começou a ser implementada (Lenin escreveu - a abordagem deve ser baseada em classe) - o processamento do arquivo CSV é totalmente atribuído à classe - cCSVJob.

Zip-file no anexo, onde você também encontrará todas as versões anteriores do programa, bem como, na pasta PyTS, os arquivos necessários com os dados da fonte para testes.

Arquivos anexados:
PyTS.zip  6 kb
Razão: