文章 "使用 OpenCL 测试烛形形态"

 

新文章 使用 OpenCL 测试烛形形态已发布:

这篇文章描述了在"一分钟OHLC"模式下实现 OpenCL 烛形形态测试器的算法。我们还将把它的速度与内建的策略测试器在快速和慢速优化模式下做比较。

我们需要依赖一些东西来确保使用OpenCL实现的测试器是正确工作的。首先,我们需要开发一个 MQL5 EA,然后我们将会比较使用常规测试器优化和测试与使用OpenCL的测试器的结果。

测试的目标是一个根据以下烛形形态来进行交易的简单EA:
  • 看跌针杆(pin bar)
  • 看涨针杆 (pin bar)
  • 看跌吞噬
  • 看涨吞噬

策略非常简单:

  • 看跌针杆或者看跌吞噬  — 卖出
  • 看涨针杆或者看涨吞噬 — 买入
  • 同时开启的仓位数量 — 没有限制
  • 最大仓位持有时间 — 有限,由用户定义
  • 获利和止损水平 — 固定, 由用户定义

只在完全关闭的柱上检查是否有形态的出现,换句话说, 我们在新柱出现的时候就检查前面三个柱是否形成形态,

形态的侦测条件如下:

针杆

图 1. "看跌针杆" (a) 和 "看涨针杆" (b) 形态

作者:Serhii Shevchuk

 

作者,感谢您的文章!我认为你选择这个特定的 TC 进行演示是有原因的,因为它与此完全吻合。然而,这是一个非常狭窄的利基市场。

在这篇文章中,你已经从普遍性转向了特殊性。显然,目标是展示潜在的可能性。但却很少将其应用于自己的需求。

我希望看到将不同的 MQL 代码转换为 OpenCL 代码的示例。也许您在文章开头所链接的文章中就有这方面的内容。

 
在比较测试人员的结果时,自定义符号 可以帮助消除交换和佣金。
 
是否只有我缺少OCLDefines.mqh 文件?:-)
 
Denis Kirichenko:
是否只有我缺少OCLDefines.mqh 文件?:-)

感谢您的关注)我们会解决这个问题,但我知道,从周一开始就已经解决了。这是源代码:

//+------------------------------------------------------------------+
//| defines|
//+------------------------------------------------------------------+
//--- 设置运行时错误
#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:

这仅仅是个开始。多功能还在前方。这篇文章隐藏的信息是, 并非一切都那么简单。你不能只是将串行代码转换成并行代码。你需要从一开始就编写并行 代码。

如果社区感兴趣,我将发布我在这方面的进一步发展。

社区非常感兴趣,"Afftar fishi ischo!!!1111"。

在加速优化/测试方面,这是一个非常重要的话题,尤其是对于机器学习算法而言

 

这篇文章非常有用!

当然,我希望能看到更多将普通 MQL 代码转换为 OpenCL 代码的简单示例,以带注释的现成函数的形式,供傻瓜使用。

还有一个问题,显卡的数据传输/准备需要多长时间?我听说有一种观点认为,显卡的 OpenCL 在实际交易中没有意义,因为数据传输处理会损失时间,真的是这样吗?