交易中的机器学习:理论、模型、实践和算法交易 - 页 2333

 


....

 
 

我发现(对我来说)一个很酷的方法,可以在python上测试我的mql脚本,以及大大加快其中的一些函数,使用dll。

这里是mql5中的初始函数,我想把它放到python中。它只是利用价格的平滑形态来搜索价格的最小值和最大值。

void get_loc_extremum(double &x[],double &x2[],double &loc_max[],double &loc_min[],bool real_price)
  {
   int N = ArraySize(x);
   for(int i=1; i<N-1; i++)
     {
      if(x[i-1]<x[i]&& x[i]>x[i+1])
        {
         ArrayResize(loc_max,ArraySize(loc_max)+1);
         if(real_price)
            loc_max[ArraySize(loc_max)-1]=x2[i];
         else
            loc_max[ArraySize(loc_max)-1]=x[i];
        }

      if(x[i-1]>x[i]&& x[i]<x[i+1])
        {

         ArrayResize(loc_min,ArraySize(loc_min)+1);
         if(real_price)
            loc_min[ArraySize(loc_min)-1]=x2[i];
         else
            loc_min[ArraySize(loc_min)-1]=x[i];
        }

     }

这要分几个步骤进行

1.在某个地方,在visual studio或codeblock中编译你的dll。在.cpp文件中我们写出我们的函数,在.h文件中我们声明它。在帖子的附件中,有一个对我有用的例子。在codeblox项目文件中,有main.cpp文件, main.h 文件,在文件夹\bin\Debug文件my_lib.dll。 简而言之,这里是c++中的函数头

void DLL_EXPORT GetLocalMaxMin(double* x_sm[],double* x_rl[], double* loc_max[], double* loc_min[], int N, bool real_price)
{
...
}

2 在python中做以下工作。

from ctypes import *

my_dll = cdll.LoadLibrary("my_dll/my_lib.dll") 					#загружаем  свою DLL
my_dll.GetLocalMaxMin.argtypes = [POINTER(c_double), 
        POINTER(c_double), POINTER(c_double), POINTER(c_double), c_int, c_bool] #определяем  типы входных аргументов функции через атрибуты ctypes
my_dll.GetLocalMaxMin.restype = None                                            #определяем  типы выходных данных 

...
#  y - список цен
#  y_sm - список сглаженных цен
#  len(y)=len(y_sm) - длина списков одинаковая

x_sm = (c_double * len(y))(*y_sm)    				  #создаем  указатель на массив x_sm размером len(y_sm) предаем туда указатель на массив y_sm
x_rl = (c_double * len(y))(*y)       			       	  #создаем  указатель на массив x_rl размером len(y) предаем туда указатель на массив y
loc_max = (c_double * len(y))()      				  #создаем  указатель на массив loc_max размером len(y) заполный 0.0 
loc_min = (c_double * len(y))()     				  #создаем  указатель на массив loc_min размером len(y) заполный 0.0 
my_dll.GetLocalMaxMin(x_sm, x_rl, loc_max, loc_min, len(y), True) #вызываем  функцию и передаем туда все что насоздавали

print(list(loc_max),list(loc_min)) #смотрим  что получилось

这不是最终的真相,有任何补充,或其他选择,请写。

附加的文件:
my_lib.zip  36 kb
 
welimorn:

我发现(对我来说)一个很酷的方法,可以在python上测试我的mql脚本,以及大大加快其中的一些函数,使用dll。

这里是mql5中的初始函数,我想把它放到python中。它只是利用价格的平滑形态来搜索价格的最小值和最大值。

这要分几个步骤进行

1.在某个地方,在visual studio或codeblock中编译你的dll。在.cpp文件中我们写出我们的函数,在.h文件中我们声明它。在帖子的附件中,有一个对我有用的例子。在codeblox项目文件中,有main.cpp文件, main.h 文件,在文件夹\bin\Debug文件my_lib.dll。 简而言之,这里是c++中的函数头

2 在python中做以下工作。

这不是最终的真相,任何补充,或其他选择,写。

你想达到什么目的?
如果是速度,那么就不要用
ArrayResize(loc_max,ArraySize(loc_max)+1);

循环内,在调用函数之前,设置你想要的大小,就像你在C++和python中做的那样,或者用第三个参数保留它

ArrayResize(loc_max,ArraySize(loc_max)+1, max_size);

现在,每一次对ArrayResize的调用,都会在内存中创建一个新的区块,将旧的区块复制到其中,并删除旧的区块。这非常、非常慢。

И

ArraySize(loc_max)

你不必每次都这样做,你可以把它储存在一个变量中。


试试吧,也许你就不用把一个简单的函数翻译成3种不同的编程语言了。开发人员说,MQL的速度与C++相当,而且在某些方面更快。

如果你可以直接从MQL调用DLL,为什么还需要Python?

还是你有其他的目的?
 
elibrarius:
你想达到什么目的?
如果速度,不要使用

循环内,在调用函数前,像在C++和Python中那样,设置你想要的大小,或者用第三个参数保留它

现在,每一次对ArrayResize的调用,都会在内存中创建一个新的区块,将旧的区块复制到其中并删除旧的区块。这非常、非常慢。

И

你不必每次都这样做,你可以把它储存在一个变量中。


试试吧,也许你就不用把一个简单的函数翻译成3种不同的编程语言了。开发人员说,MQL的速度与C++相当,而且在某些方面更快。

如果你可以直接从MQL调用DLL,为什么还需要Python?

还是你有其他的目的?

消息中的极值搜索 功能只是作为一个例子来说明其背后的原理。

目的是方便在Python中寻找特征和目标的依赖关系,并挑选模型,而MQL有一个很好的测试器,如果不是为了欺骗自己,会给你一个明确的估计结果。

我对Python工作很自如,但我刚开始学习,不能用Python中的循环来写mql5中的任何函数,使用矢量计算。没有它们,写代码就是浪费时间,因为Python的速度非常慢。有些函数可能在每条上都被调用,这使得它很难找到。我到处使用algib,因为他们有python和mql5的解决方案。但是,当谈到我的疯狂想象力时,我有一些问题。

mql5 的代码可以很容易地转换为c++ 并编译成dll。因此,我在测试器和Python脚本中使用一个相同的函数。

 
welimorn:

消息中的极值搜索功能只是作为一个例子来说明其上的原理。

目的是Python对于搜索特征和目标的依赖关系以及拟合模型很有用,而MQL有一个很好的测试器,如果不是自己作弊,可以让你对你的发现有一个清晰的估计。


所以,你已经在Python中找到了依赖关系,挑选、训练和测试了模型。那么你如何在测试器中进行测试呢?Python对测试器或MKL5不友好。

 
如果一个TS的平均持仓时间是10分钟。而目前的位置 已经挂了10个小时,那么它的结果是一个赌博(完全没有系统性)?
 
fxsaber:
如果TS的平均持仓时间为10分钟。而目前的位置 已经挂了10个小时,那么它的结果是一个赌博(完全非系统性的)?

这取决于TS的逻辑/规则是如何编写的。这个 "可能 "是一个概率性的结果,不是由TC的逻辑决定的。如果该逻辑在所有10个小时内都绝对有效,那么这只是一个罕见的案例。

 
Valeriy Yastremskiy:

如果所有10个小时的逻辑都绝对有效,这只是一个罕见的案例。

仅仅因为逻辑起作用并不意味着结果是系统性的。

 
fxsaber:

仅仅因为逻辑起作用并不能使结果系统化。

这个问题并没有具体说明对什么适用对价和系统性。如果是对TC,那么就取决于TC,如果是对外部条件,那么罕见的情况本来就不是系统性的。而且可能有例外情况。欧洲美元14年5月至15年3月的情况。不是一个系统性的案例。