文章 "使用 OpenCL 测试烛形形态" - 页 3

 

非常有趣的文章。主要的好处是看到了 OpenCL 代码在实际应用中的真实示例,当你自己开始使用 OpenCL 时,有这样的示例会非常有用。谢谢。

不过,虽然比较证实了使用 GPU 的预期巨大收益,但这是一个非常特殊的策略,交易之间根本没有关系。这种策略在实际交易中可能很少见。我担心,当您开始引入交易之间的关系(最大开放交易、一次只能进行 1 笔交易、赢家/输家之后手数的增加或减少等......)时,OpenCL 代码的复杂性将很快导致速度优势丧失。(我没有亲自试过,所以可能有误)。

更重要的是,为了进行适当的比较,使用 GPU 的 "虚拟 "算法也应该在不使用 GPU 的情况下使用,这样才能衡量 GPU 带来的净收益。在文章的方法中,您不仅要比较 CPU 和 GPU(串行和并行),还要比较"策略测试器"和 "虚拟"。

 
嘿,你们好、
有消息说 AMD 似乎不再支持 OpenCL 了,那么 OpenCL 还存在吗?

是否有变通办法,是否需要 Linux 系统,或者是否有其他 GPU 调度方法可用于并行计算

致敬
 

下午好。

您能告诉我一个大概的方法,如何在您的代码中实现一次只开仓买入一笔交易和只开仓卖出一笔交易吗?

 
Sergey Seriy:

下午好。

您能告诉我一个大概的方法,如何在您的代码中实现一次只开仓买入一笔交易和只开仓卖出一笔交易吗?

首先,在tester_step 内核中,您需要添加一个参数,这样就可以通过索引获得交易关闭的时间(可以是交易关闭的 M1 条的索引,也可以是持仓时间,用 M1条的数量 表示),就像在 __global double *Res result buffer 中一样。

接下来,要看您的问题是与单一测试有关还是与优化有关:

1. 测试。在汇总总利润的循环中,您需要添加一些条件,以排除使用平仓时间(将由最终确定的tester_step 返回)开仓的重叠。

2. 优化。在这里,我们需要使用 find_patterns_opt,而不是 find_patterns_opt 内核来汇总利润。考虑到不允许同时进行多笔交易的条件,我们必须在 mql5 代码中总结利润。不过,这可能需要一些时间(您应该尝试一下),因为在这种情况下,并行执行的内容将按顺序执行(优化次数乘以优化深度)。另一个可能的折中方案是添加一个内核,计算一次优化的利润(考虑到同时开仓数量的条件),但根据我自己的实践,我认为运行 "重 "内核是个坏主意。理想情况下,我们应该努力使内核代码尽可能简单,并运行尽可能多的内核。

 
Serhii Shevchuk:

首先,在tester_step 内核中,我们需要增加一个参数,这样我们就可以像在 __global double *Res 结果缓冲区中一样,通过索引获取交易平仓时间(可以是交易平仓的 M1 条的索引,也可以是以 M1 的条数 表示的持仓时间)。

此外,取决于您的问题是指单一测试还是优化:

1. 测试。在汇总总利润的循环中,您需要添加一些条件,以排除使用平仓时间(将由最终确定的tester_step 返回)开仓的重叠。

2. 优化。在这里,我们需要使用 find_patterns_opt,而不是 find_patterns_opt 内核来汇总利润。考虑到不允许同时进行多笔交易的条件,我们必须在 mql5 代码中总结利润。不过,这可能需要一些时间(您应该尝试一下),因为在这种情况下,并行执行的内容将按顺序执行(优化次数乘以优化深度)。另一个可能的折中方案是添加一个内核,计算一次优化的利润(考虑到同时开仓数量的条件),但根据我自己的实践,我认为运行 "重 "内核是个坏主意。理想情况下,我们应该努力使内核代码尽可能简单,并运行尽可能多的内核。

下午好。

感谢您的快速回复。我首先感兴趣的是关于优化的回答,因为我认为部分代码必须用 mql 写。非常感谢你的文章,因为没有类似的文章!另外,如果我们稍微修改一下 tester_step(和 tester_step_opt),在时间条件 p>open 中加入买入(即如果(j>=maxbar || (TimeM1[j]>=tclose && p>open)),卖出时如果(j>=maxbar || (TimeM1[j]>=tclose && p<open)),你就会得到一个期权交易策略。

 

......我还要对之前关于期权策略的评论补充几句。在这里,我们需要添加期权到期时间变量(同时,在优化过程中,期权不需要 StopLoss 和 TakeProfit),因此我们要修改 tester_opt_step 中的代码如下:

ulong tcloseDEATH=TimeM1[iO]+240*60*60;//添加到期时间变量, например 240 часов (т.е. 10 дней)



//......进一步评论 TP 和 SL,因为期权不需要它们

/*if(p<=sl)
 {
 Res[idx]=sl-open;
 return;
 }
 else if(p>=tp)
 {
 Res[idx]=tp-open;
 return;
 }*/
// 并添加一个到期时间检查(在 VE 到期时,由于期权不成功,应该会有很大的损失)。
              if(TimeM1[j]>=tcloseDEATH)
              {
               Res[idx]=sl*10-open; //有一只大麋鹿! (для примера в 10 раз больше установленного при оптимизации стоп-лосса)
               return;
              }

 
下午好。在根据您的文章对 USDRUB 执行 OpenCL 优化时,我遇到了这样一个问题 -优化结果 总是正数,总是盈利,也就是说,int 类型的变量似乎出现了溢出,而对于 EURUSD,优化工作正常。对 USDRUB 而言,可能也是五位数的问题。您能告诉我如何解决这个问题吗?
 
Sergey Seriy:
下午好。在根据您的文章对 USDRUB 执行 OpenCL 优化时,我遇到了这样一个问题 -优化结果 总是正数,总是盈利,也就是说,int 类型的变量似乎出现了溢出,而对于 EURUSD,优化工作正常。对 USDRUB 而言,可能也是五位数的问题。您能告诉我如何解决这个问题吗?
......另附截图
附加的文件:
 

您在文章中写道

В нашем случае функция atomic_inc()  для начала запрещает доступ другим задачам к ячейке Count[0], затем увеличивает её значение на единицу, а предыдущее возвращает в виде результата.

据我所知,这个函数只对int 类型 的数组有效,但如果我有一个不同类型的数组,例如 ushort,我该怎么办?