記事"OpenCL を使用したローソク足パターンのテスト"についてのディスカッション

 

新しい記事 OpenCL を使用したローソク足パターンのテスト はパブリッシュされました:

この記事では、OpenCL ローソク足パターンテスターを "1 分 OHLC " モードで実装するアルゴリズムについて説明します。 また、高速かつ低速の最適化モードで起動したビルトインストラテジーテスターとの速度を比較します。

OpenCL のテスターの実装が正しく動作することを確認するためにあるものに頼る必要があります。 まず、MQL5のEAを開発します。 次に、テストの結果と、OpenCL テスターが取得した正規のテスターを使用して最適化を比較します。

テストオブジェクトは、次のローソク足パターンをトレードするシンプルなEAです。
  • 弱気ピンバー
  • 強気ピンバー
  • 弱気反転
  • 強気反転

戦略はシンプルです。

  • 弱気ピンバーまたは弱気反転—売る
  • 強気ピンバーまたは強気反転-買い
  • 同時に開かれたポジションの数-無制限
  • 最大ポジション保持時間-制限付き、ユーザ定義
  • テイクプロフィットおよび ストップロス レベル-固定、ユーザ定義

パターンの存在は、完全に閉じられた足でチェックされます。 つまり、新しいものが出現するとすぐに、3つ前の足でパターンを詳しく見ることができます。

パターン検出条件は次のとおりです。

ピンバー

図1. 「弱気ピンバー」 (a) および「強気ピンバー」 (b) パターン

作者: Serhii Shevchuk

 

著者、記事をありがとう!あなたがこの特定のTCをデモンストレーションに選んだのには理由があると思います。しかし、これは非常に狭いニッチです。

記事の中で、あなたは普遍性から特殊性へと大きく舵を切った。潜在的な可能性を示すことが目的であることは明らかだ。しかし、それを自分のニーズに当てはめることはほとんどない。

異なるMQLコードをOpenCLコードに変換する例を見てみたい。おそらくこれは、記事の冒頭でリンクされている記事に含まれているはずだ。

 
カスタムシンボルは、テスターの結果を比較する際に、スワップやコミッションを取り除くのに役立つ。
 
OCLDefines.mqh ファイルがないのは私だけでしょうか?:-)
 
Denis Kirichenko:
OCLDefines.mqh ファイルがないのは私だけでしょうか?:-)

ご清聴ありがとうございます。ソースはこちらです:

//+------------------------------------------------------------------+
//| 定義|
//+------------------------------------------------------------------+
//--- 実行時エラーの設定
#define  SET_ERR(c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- 関数名と行番号をパラメータに渡して、実行時エラーを設定する。
#define  SET_ERRx(c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- ユーザーエラーの設定
#define  SET_UERR(err,c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- 関数名と行番号をパラメータに渡して、ユーザーエラーを設定する。
#define  SET_UERRx(err,c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- OpenCL を扱うための関数呼び出し
#define _BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags) \
      if(BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferCreate(buffer_index,size_in_bytes,flags) \
      if(BufferCreate(buffer_index,size_in_bytes,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _Execute(kernel_index,work_dim,work_offset,work_size) \
      if(Execute(kernel_index,work_dim,work_offset,work_size,__FUNCTION__,__LINE__)==false) return false
#define _SetArgument(kernel_index,arg_index,value) \
      if(SetArgument(kernel_index,arg_index,value,__FUNCTION__,__LINE__)==false) return false
#define _SetArgumentBuffer(kernel_index,arg_index,buffer_index) \
      if(SetArgumentBuffer(kernel_index,arg_index,buffer_index,__FUNCTION__,__LINE__)==false) return false
#define _KernelCreate(k,src) \
      if(KernelCreate(k,src,__FUNCTION__,__LINE__)==false) break

//--- ユーザーエラー 
#define  UERR_NONE                0     // エラーなし
#define  UERR_NO_OCL              1     // COpenCL オブジェクトが存在しない
#define  UERR_GET_MEMORY_SIZE     2     // メモリサイズの取得エラー
#define  UERR_KERNEL_CREATE       3     // カーネル作成エラー
#define  UERR_SET_BUF_COUNT       4     // バッファ数の設定エラー
#define  UERR_DOUBLE_NOT_SUPP     5     // ダブルではサポートされていません。
#define  UERR_BUFFER_CREATE       6     // バッファ作成エラー
#define  UERR_BUFFER_FROM_ARRAY   7     // 配列からのバッファ作成エラー
#define  UERR_BUFFER_READ         8     // バッファ読み込みエラー
#define  UERR_BUFFER_WRITE        9     // バッファ書き込みエラー
#define  UERR_SET_ARGUMENT        10    // 引数設定エラー
#define  UERR_SET_ARGUMENT_BUFFER 11    // 引数としてバッファを設定する際のエラー
#define  UERR_EXECUTE             12    // カーネル実行エラー
#define  UERR_NO_ENOUGH_MEM       13    // 空きメモリなし

//--- テスターのエラー
#define  UERR_TESTER_ERROR_FIRST  256
#define  SET_UERRt(err,c)         SET_UERR(UERR_TESTER_ERROR_FIRST+err,c)
//+------------------------------------------------------------------+
 
fxsaber:
カスタムシンボルは、テスターの結果を比較する際にスワップやコミッションを取り除くのに役立つ。

そうだが、それは現実の世界からさらに遠ざかることになる。デバッグのためでない限り。

 
この記事は実に印象的だ。精神的な消費量と有用な生産量を比較したくない場合、このようなケースになるのは残念である。
 

おめでとう!

この記事のコードは引用されるだろうし、これからトレーディングの並列コンピューティングに関する 記事を書こうとしている同僚たちのハードルを非常に高くしてくれた。

 
fxsaber:

記事の中で、あなたは普遍的なものから特殊なものへと大きく舵を切った。

それは始まりに過ぎない。普遍性はその先にある。この記事の隠されたメッセージは、 すべてがそれほど単純 ではないということだ。シリアルコードをパラレルコードに変換するだけではだめだ。最初から並列で書く 必要がある。

もしコミュニティが興味を持ってくれるなら、この方向での私のさらなる開発を掲載するつもりだ。

削除済み  
Serhii Shevchuk:

これは始まりに過ぎない。この先には多用途性がある。この記事の隠れたメッセージは、 すべてがそれほど単純ではないという ことだ。シリアルコードをパラレルコードに変換するだけではだめだ。最初から並列 コードを書く必要がある。

もしコミュニティが興味を持ってくれるなら、この方向での私のさらなる開発を掲載するつもりだ。

コミュニティは非常に興味を持っている。

特に機械学習アルゴリズムの最適化/テストの高速化という点で非常に重要なトピックである。

 

とても役に立つ記事だ!

もちろん、普通のMQLコードをOpenCLコードに変換する簡単な例を、ダミーのためのコメント付きの準備できた関数の形で、もっと見たいと思います。

ビデオカード用のOpenCLは、処理のためのデータ転送に時間がかかるので、実際の取引に使うのは意味がないという意見を聞いたのですが、本当にそうなのでしょうか?