著者、記事をありがとう!あなたがこの特定のTCをデモンストレーションに選んだのには理由があると思います。しかし、これは非常に狭いニッチです。
記事の中で、あなたは普遍性から特殊性へと大きく舵を切った。潜在的な可能性を示すことが目的であることは明らかだ。しかし、それを自分のニーズに当てはめることはほとんどない。
異なるMQLコードをOpenCLコードに変換する例を見てみたい。おそらくこれは、記事の冒頭でリンクされている記事に含まれているはずだ。
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) //+------------------------------------------------------------------+
カスタムシンボルは、テスターの結果を比較する際にスワップやコミッションを取り除くのに役立つ。
そうだが、それは現実の世界からさらに遠ざかることになる。デバッグのためでない限り。
おめでとう!
この記事のコードは引用されるだろうし、これからトレーディングの並列コンピューティングに関する 記事を書こうとしている同僚たちのハードルを非常に高くしてくれた。
記事の中で、あなたは普遍的なものから特殊なものへと大きく舵を切った。
それは始まりに過ぎない。普遍性はその先にある。この記事の隠されたメッセージは、 すべてがそれほど単純 ではないということだ。シリアルコードをパラレルコードに変換するだけではだめだ。最初から並列で書く 必要がある。
もしコミュニティが興味を持ってくれるなら、この方向での私のさらなる開発を掲載するつもりだ。
これは始まりに過ぎない。この先には多用途性がある。この記事の隠れたメッセージは、 すべてがそれほど単純ではないという ことだ。シリアルコードをパラレルコードに変換するだけではだめだ。最初から並列 コードを書く必要がある。
もしコミュニティが興味を持ってくれるなら、この方向での私のさらなる開発を掲載するつもりだ。
コミュニティは非常に興味を持っている。
特に機械学習アルゴリズムの最適化/テストの高速化という点で非常に重要なトピックである。
とても役に立つ記事だ!
もちろん、普通のMQLコードをOpenCLコードに変換する簡単な例を、ダミーのためのコメント付きの準備できた関数の形で、もっと見たいと思います。
ビデオカード用のOpenCLは、処理のためのデータ転送に時間がかかるので、実際の取引に使うのは意味がないという意見を聞いたのですが、本当にそうなのでしょうか?
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 OpenCL を使用したローソク足パターンのテスト はパブリッシュされました:
この記事では、OpenCL ローソク足パターンテスターを "1 分 OHLC " モードで実装するアルゴリズムについて説明します。 また、高速かつ低速の最適化モードで起動したビルトインストラテジーテスターとの速度を比較します。
OpenCL のテスターの実装が正しく動作することを確認するためにあるものに頼る必要があります。 まず、MQL5のEAを開発します。 次に、テストの結果と、OpenCL テスターが取得した正規のテスターを使用して最適化を比較します。
テストオブジェクトは、次のローソク足パターンをトレードするシンプルなEAです。戦略はシンプルです。
パターンの存在は、完全に閉じられた足でチェックされます。 つまり、新しいものが出現するとすぐに、3つ前の足でパターンを詳しく見ることができます。
パターン検出条件は次のとおりです。
図1. 「弱気ピンバー」 (a) および「強気ピンバー」 (b) パターン
作者: Serhii Shevchuk