Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 19): Criando etapas implementadas em Python"

 

Novo artigo Desenvolvendo um EA multimoeda (Parte 19): Criando etapas implementadas em Python foi publicado:

Até agora, analisamos a automação da execução de procedimentos sequenciais de otimização de EAs exclusivamente no testador de estratégias padrão. Mas o que fazer se, entre essas execuções, quisermos processar alguns dados já obtidos por outros meios? Vamos tentar adicionar a possibilidade de criar novas etapas de otimização, executadas por programas escritos em Python.

Para realizar a clusterização, usamos a biblioteca scikit-learn para Python, mais precisamente a implementação do algoritmo K-Means. Embora esse não seja o único algoritmo de clusterização, analisar outras opções, compará-las e escolher a melhor para essa tarefa fugiria ao escopo aceitável. Por isso, escolhemos o primeiro algoritmo disponível, e os resultados obtidos com ele foram suficientemente bons.

No entanto, a execução de um pequeno programa em Python era exigida para usar essa implementação específica. Quando a maior parte das operações ainda era feita manualmente, isso não causava problema. Mas agora que avançamos bastante na automação de todo o processo de teste e seleção de bons grupos de instâncias individuais de estratégias de negociação, mesmo uma operação simples acionada manualmente no meio do pipeline de tarefas sequenciais de otimização parece fora de lugar.

Para corrigir esse inconveniente, podemos seguir dois caminhos. O primeiro consiste em encontrar uma implementação pronta do algoritmo de clusterização escrita em MQL5 ou escrevê-la nós mesmos, caso a busca não seja bem-sucedida. O segundo caminho envolve adicionar a possibilidade de executar, nas etapas necessárias do processo de otimização automática, não apenas EAs escritos em MQL5, mas também programas em Python.


Autor: Yuriy Bykov

 
Olá
Por favor, explique mais sobre como iniciar o Python. Obrigado, senhor
 

Olá,

iniciamos o Python executando o comando shell neste código:

//+------------------------------------------------------------------+
//| Iniciar uma tarefa|
//+------------------------------------------------------------------+
void COptimizerTask::Start() {
   PrintFormat(__FUNCTION__" | Task ID = %d\n%s", m_id, m_setting);

   // Se essa for uma tarefa de otimização do EA
   if(m_type == TASK_TYPE_EX5) {
      // Iniciar uma nova tarefa de otimização no testador
      MTTESTER::CloseNotChart();
      MTTESTER::SetSettings2(m_setting);
      MTTESTER::ClickStart();

      // Atualizar o status da tarefa no banco de dados
      DB::Connect();
      string query = StringFormat(
                        "UPDATE tasks SET "
                        "    status='Processing' "
                        " WHERE id_task=%d",
                        m_id);
      DB::Execute(query);
      DB::Close();

      // Se for uma tarefa para executar o programa Python
   } else if (m_type == TASK_TYPE_PY) {
      PrintFormat(__FUNCTION__" | SHELL EXEC: %s", m_pythonPath);
      // Chamar a função do sistema operacional (Windows) para executar o comando do shell
      ShellExecuteW(NULL, NULL, m_pythonPath, m_setting, NULL, 1);
   }
}

Onde:

  • m_pythonPath é um caminho para o Python no computador atual;
  • m_setting é uma string com o nome do programa Python executado e seus argumentos de linha de comando
 

Olá

primeiro otimizei o estágio 1 e concluí

depois adicionei o ClusteringStage1.py e a tarefa e o trabalho ao banco de dados e otimizei novamente, mas não funcionou, apenas esta mensagem:

2024.11.10 16:35:18.952 Otimização ( GBPUSD , M15) COptimizer::Process | Current Task ID = 1


Arquivos anexados:
Capture.PNG  74 kb
 
Mohamadreza Zangiabady GBPUSD , M15) COptimizer::Process | Current Task ID = 1

Olá

Parece que a execução do programa Python não altera o status da tarefa com id_task=1.

Verifique se no trabalho para essa tarefa você tem os valores corretos na coluna [tester_inputs]. São eles:

--id_parent_job=1 --n_clusters=256

onde 1 é id_job para o trabalho do primeiro estágio. No seu caso, pode ser outro valor numérico.

Você também pode tentar executar o programa Python com parâmetros reais manualmente na linha de comando e, assim, poderá ver as possíveis mensagens de erro

 
Yuriy Bykov # :

Olá

Parece que a execução do programa Python não altera o status da tarefa com id_task =1.

Verifique se no trabalho para essa tarefa você tem os valores corretos na coluna [tester_inputs]. São eles:

onde 1 é id_job para o trabalho do primeiro estágio. No seu caso, pode ser outro valor numérico.

Você também pode tentar executar o programa Python com parâmetros reais manualmente na linha de comando e, assim, poderá ver as possíveis mensagens de erro

Executei no powershell e vi o seguinte
Arquivos anexados:
2.PNG  69 kb
job.PNG  29 kb
pass.PNG  119 kb
stage.PNG  44 kb
task.PNG  39 kb
 
Mohamadreza Zangiabady #:
Executo no powershell e vejo o seguinte

Tente executá-lo desta forma:

C:\Program Files\MetaTrader 5\MQL5\Experts\Articles\2024-09-18.15911>python -u "c:\Program Files\MetaTrader 5\MQL5\Experts\Articles\2024-09-18.15911\ClusteringStage1.py"
usage: ClusteringStage1.py [-h] [--id_parent_job ID_PARENT_JOB] [--n_clusters N_CLUSTERS] [--min_custom_ontester MIN_CUSTOM_ONTESTER]
                           [--min_trades MIN_TRADES] [--min_sharpe_ratio MIN_SHARPE_RATIO]
                           db_path id_task
ClusteringStage1.py: error: the following arguments are required: db_path, id_task

Precisamos definir os argumentos: db_path, id_task. Em seguida, recebemos a mensagem de erro que você postou:

C:\Program Files\MetaTrader 5\MQL5\Experts\Articles\2024-09-18.15911>python -u "c:\Program Files\MetaTrader 5\MQL5\Experts\Articles\2024-09-18.15911\ClusteringStage1.py" "C:\Users\Antekov\AppData\Roaming\MetaQuotes\Terminal\Common\Files\database911.sqlite" 4
Traceback (most recent call last):
  File "C:\Python\Python312\Lib\site-packages\pandas\io\sql.py", line 2674, in execute
    cur.execute(sql, *args)
sqlite3.OperationalError: no such column: None

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 ...

  File "C:\Python\Python312\Lib\site-packages\pandas\io\sql.py", line 2686, in execute
    raise ex from exc
pandas.errors.DatabaseError: Execution failed on sql 'SELECT p.*
FROM passes p
    JOIN
    tasks t ON t.id_task = p.id_task
    JOIN
    jobs j ON j.id_job = t.id_job
WHERE p.profit > 0 AND
      j.id_job IN (None) AND
      p.custom_ontester >= 0 AND
      p.trades >= 40 AND
      p.sharpe_ratio >= 0.7;': no such column: None

Precisamos também definir dois argumentos: --id_parent_job=1 --n_clusters=256

C:\Program Files\MetaTrader 5\MQL5\Experts\Articles\2024-09-18.15911>python -u "c:\Program Files\MetaTrader 5\MQL5\Experts\Articles\2024-09-18.15911\ClusteringStage1.py" "C:\Users\Antekov\AppData\Roaming\MetaQuotes\Terminal\Common\Files\database911.sqlite" 4 --id_parent_job=1 --n_clusters=256

O que você obterá?

 

Executo o seguinte

python -u "C:\Users\Mohamadreza_New\AppData\Roaming\MetaQuotes\Terminal\4B1CE69F577705455263BD980C39A82C\MQL5\Experts\ClusteringStage1. py.py" "C:\Users\Mohamadreza_New\AppData\Roaming\MetaQuotes\Terminal\Common\Files\database911.sqlite" 4 --id_parent_job=1 --n_clusters=256

e recebo este erro

ValueError: n_samples=150 deveria ser >= n_clusters=256.


Em seguida, altero n_clusters=150 e executo

python -u "C:\Users\Mohamadreza_New\AppData\Roaming\MetaQuotes\Terminal\4B1CE69F577705455263BD980C39A82C\MQL5\Experts\ClusteringStage1.py" "C:\Users\Mohamadreza_New\AppData\Roaming\MetaQuotes\Terminal\Common\Files\database911.sqlite" 4 --id_parent_job=1 --n_clusters=150

e acho que funcionou. mas no banco de dados não houve nenhuma alteração

Depois disso, tentei otimizar com n_samples=150, mas não funcionou

 
Mohamadreza Zangiabady #:

Eu executo isso

...

e acho que funcionou. mas no banco de dados não houve nenhuma alteração

Não há uma nova tabela passes_clusters no banco de dados?

 
Yuriy Bykov # :

Não há uma nova tabela passes_clusters no banco de dados?

Ela funcionou corretamente.

O erro estava relacionado ao banco de dados.

Depois de corrigir o banco de dados, o código Python e o Estágio 2 funcionaram bem.

Obrigado por sua ajuda.

 

Artigo interessante! Vou ler a série inteira, então.

Для исправления этой досадной нелепости мы можем пойти двумя путями. Первый состоит в том, чтобы найти готовую реализацию алгоритма кластеризации, написанную на MQL5 или написать её самостоятельно, если поиск не даст хороших результатов. Второй путь подразумевает добавление возможности запускать на нужных стадиях процесса автоматической оптимизации не только советники, написанные на MQL5, но и программы на Python.

Por que eles abandonaram a funcionalidade da biblioteca AlgLib?

#include <Math\Alglib\alglib.mqh>

Menos apenas em velocidade, mas principalmente porque o python paraleliza os cálculos em todos os núcleos.