記事「多通貨エキスパートアドバイザーの開発(第19回):Pythonで実装されたステージの作成」についてのディスカッション

 

新しい記事「多通貨エキスパートアドバイザーの開発(第19回):Pythonで実装されたステージの作成」はパブリッシュされました:

これまでは、標準のストラテジーテスター内で最適化タスクを順に自動実行することだけを考えてきました。しかし、もしそれらの実行の合間に、別の手段で得られたデータを処理したいとしたらどうなるでしょうか。ここでは、Pythonで記述されたプログラムによって新たな最適化ステージを作成する機能の追加を試みます。

クラスタリングには、Pythonの既製ライブラリであるscikit-learnK-Meansアルゴリズムの実装を使用しました。これは唯一のクラスタリング手法ではありませんが、他のアルゴリズムを検討・比較してこの問題に最適なものを選ぶという作業は、現実的な範囲を超えていたため、手に入りやすいこのアルゴリズムを採用しました。その結果はかなり良好でした。

しかし、この実装を使うためには、小さなPythonプログラムを実行する必要がありました。操作の大部分を手動でおこなっていた当時は、これはそれほど面倒ではありませんでした。しかし今では、テストおよび戦略インスタンスのグループ選定のプロセス全体をかなり自動化しているため、連続的に実行される最適化タスクの中で、たとえ単純なものであっても手動操作が入るのは望ましくありません。

この問題を解決するには、2つの方法があります。ひとつは、MQL5で記述されたクラスタリングアルゴリズムの既製の実装を探すか、自分で実装する方法です。もうひとつは、最適化の自動化ステージの任意の段階で、MQL5で書かれたEAだけでなく、Pythonプログラムも実行できるようにすることです。


作者: Yuriy Bykov

 
こんにちは
Pythonの起動について詳しく教えてください。ありがとうございます。
 

こんにちは、

このコードでは シェルコマンドを実行して Python を起動します:

//+------------------------------------------------------------------+
//| タスクの開始|
//+------------------------------------------------------------------+
void COptimizerTask::Start() {
   PrintFormat(__FUNCTION__" | Task ID = %d\n%s", m_id, m_setting);

   // これがEA最適化タスクの場合
   if(m_type == TASK_TYPE_EX5) {
      // テスターで新しい最適化タスクを開始する
      MTTESTER::CloseNotChart();
      MTTESTER::SetSettings2(m_setting);
      MTTESTER::ClickStart();

      // データベース内のタスク・ステータスを更新する
      DB::Connect();
      string query = StringFormat(
                        "UPDATE tasks SET "
                        "    status='Processing' "
                        " WHERE id_task=%d",
                        m_id);
      DB::Execute(query);
      DB::Close();

      // Pythonプログラムの実行タスクの場合
   } else if (m_type == TASK_TYPE_PY) {
      PrintFormat(__FUNCTION__" | SHELL EXEC: %s", m_pythonPath);
      // シェルコマンド実行のためのオペレーションシステム(Windows)からの関数呼び出し
      ShellExecuteW(NULL, NULL, m_pythonPath, m_setting, NULL, 1);
   }
}

ここで

  • m_pythonPathは 、現在のコンピュータ上のPythonへのパスです;
  • m_settingは 、実行されたPythonプログラムの名前とそのコマンドライン引数を表す文字列です。
 

こんにちは

まずStage1を最適化し、完了しました。

その後、ClusteringStage1.pyとタスクとジョブをデータベースに追加し、再度最適化しましたが、このメッセージだけが表示され、うまくいきませんでした:

2024.11.10 16:35:18.952 最適化 ( GBPUSD , M15) COptimizer::Process | 現在のタスクID = 1


ファイル:
Capture.PNG  74 kb
 
Mohamadreza Zangiabady GBPUSD , M15) COptimizer::Process | 現在のタスクID = 1

こんにちは。

Python プログラムを実行しても、id_task=1 のタスクのステータスは変わらないようです。

このタスクのジョブで、[tester_inputs] カラムに正しい値があるか確認してください。以下のようになります:

--id_parent_job=1 --n_clusters=256

1が最初の段階のジョブのid_job です。あなたの場合は他の値かもしれません。

コマンドラインから実際にパラメータを指定して Python プログラムを実行してみてください。

 
Yuriy Bykov # :

こんにちは

Python プログラムを実行しても、 id_task =1 のタスクのステータスが変わらないようです。

このタスクのジョブで、[tester_inputs] カラムに正しい値があるか確認してください。以下のようなものがあります:

ここで、1は最初の段階のジョブの id_job です。あなたの場合、それは他の値かもしれません。

コマンドラインから実際にパラメータを指定して Python プログラムを実行してみてください。

powershellで実行すると以下のようになります。
ファイル:
2.PNG  69 kb
job.PNG  29 kb
pass.PNG  119 kb
stage.PNG  44 kb
task.PNG  39 kb
 
Mohamadreza Zangiabady #:
パワーシェルで実行すると、次のようになる。

このように実行してみてください:

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

db_path、id_taskの引数を設定する必要があります。そして、あなたが投稿したようなエラーメッセージが表示されました:

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

次の2つの引数も設定する必要があります: --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

どうなりますか?

 

私はこれを実行する

python -u "C:\UsersMohamadreza_NewAppDataRoamingMetaQuotesTerminal4B1CE69F577705455263BD980C39A82CMQL5ExpertsClusteringStage1.py.py" "C:\Users\Mohamadreza_New\AppData\Roaming\MetaQuotes\Terminal\CommonFiles\database911.sqlite" 4 --id_parent_job=1 --n_clusters=256

以下のエラーが発生する

ValueError: n_samples=150 should be >= n_clusters=256.


そこで、 n_clusters=150に変更して、次のように実行しました

python -u "C: \UsersMohamadreza_NewAppDataRoaming\MetaQuotesTerminalpy" "C: \Users\Mohamadreza_New\AppData\Roaming\MetaQuotes\Terminal\CommonFiles\database911.sqlite" 4 --id_parent_job=1 --n_clusters=150

で、うまくいったと思う。しかし、データベースには変化がない。

その後、 n_samples=150で 最適化を 試したが、うまくいかなかった

 
Mohamadreza Zangiabady #:

私はこれを実行する

...

うまくいったと思う。しかし、データベースには何の変化もない。

データベースにpass_clusters テーブルがない?

 
Yuriy Bykov # :

データベースに新しいテーブル passes_clustersが ありませんか?

正常に動作しました。

エラーはデータベースに関連していました。

データベースを修正した後、Pythonコードとステージ2はうまくいきました。

ありがとうございました。

 

興味深い記事だ!では、シリーズを全部読んでみよう。

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

なぜAlgLibライブラリの機能を捨てたのでしょうか?

#include <Math\Alglib\alglib.mqh>

スピードの面ではマイナスだが、パイソンがすべてのコアで計算を並列化するからだ。