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

 
Maxim Dmitrievsky:

因为模型仍然很烂^),有很大的误差,需要模型的工作时间更长

例如,2个月的学习和1周的交易

你可能是正确的,但我不认为任何这样的模型会被RDF发现,哪怕是完整的一天,直到我们可以做类似于 "ALPHA ZERO "算法的无限随机蜡烛模拟。

因为市场几乎每小时都在变化,如果突然发生新闻事件或市场因某种原因而改变其行为,一个模型将可怕地失败。但如果我们做了数百万次的蜡烛模拟,那么可能系统可以在市场变化时以最小的损失恢复,并能在之后迅速恢复损失。这似乎是可能的。

我将同时尝试你的模型选择方法和我的蜡烛模拟方法,看看一切进展如何:))。

顺便说一下,我试过1天训练,5天训练等,但第二天就失败了:))))))))))))))))。

因此,一个模型可能无法工作......尽管我可能是错的......

 

另外,我还有一个请求,马克西姆......

当你发表文章时,请尽量对代码进行注释,这样可以让别人快速、容易地理解代码,从而使我们的工作进展更快......

否则,如果我需要很长的时间来理解代码,那么就需要更多的时间来修改它。

所以我请求你尽可能多地添加代码的注释和解释。现在我将尝试快速理解,如果我有什么不明白的地方会问你:))

 
FxTrader562:

另外,我还有一个请求,马克西姆......

当你发表文章时,请尽量对代码进行注释,这样可以让别人快速、容易地理解代码,从而使我们的工作进展更快......

否则,如果我需要很长的时间来理解代码,那么就需要更多的时间来修改它。

所以我请求你尽可能多地添加代码的注释和解释。现在我将尝试快速理解,如果我有什么不明白的地方会问你:))

好了,现在我只是不断地改变许多东西,没有意义的评论。

你也可以考虑如何改变输出...也许使用不同设置的 "之 "字形,而不是奖励功能 或其他东西。
 
马克西姆-德米特里耶夫斯基

好了,现在我只是不断地改变许多东西,没有意义的评论。

你也可以考虑如何改变输出...也许使用不同设置的 "之 "字形,而不是奖励功能 或其他东西。

我只是快速浏览了一下代码。但到目前为止,我还没有弄清楚指标到底在哪里,或者它是如何决定交易入口的。所以我不确定该如何处理输出。你是说使用GDMH的输出?

我只是用各种设置进行测试,但它似乎完全是随机交易。

另外,在测试阶段,它不会创建 "Mtrees "文本文件,对吗?

我是说你提供的代码并不完整,对吗?或者说,如果直接连接到图表上而不进行优化,它是否能够进行交易。

 
FxTrader562:

我只是快速浏览了一下代码。但到目前为止,我还没有弄清楚指标到底在哪里,或者它是如何决定交易入口的。所以我不确定该如何处理输出。

我只是用各种设置进行测试,但它似乎完全是随机交易,因为它显示了一些奇怪的行为,因此,我只是重新启动了我的服务器。它是否与VPS的真实内核有任何关系?

另外,在测试阶段,它不会创建 "Mtrees "文本文件,对吗?

当第一次在测试器中运行时,选择 "true"

他将进行随机交易,然后学习并保存模型。

第2次运行选择错误。就这样吧。而且他上传模型,并将在+进行交易。

接下来,在EA中你可以添加代理,现在你有5个代理,每个代理有100个功能,50棵树

CRLAgents *ag1=new CRLAgents("RlExp1iter",5,100,50,regularize,learn);

在这个函数中,我们为每个代理人添加100个收盘价(100个预测因素)。然后将数据规范化。你可以添加不同的指标,例如前50个特征--收盘价,接下来的25个rsi,接下来的25个adx,或者在你声明代理时改变预测器的数量

void calcSignal()
  {
   sig1=0;
       
   for(int i=0;i<ArraySize(ag1.agent);i++) - the agents are stored in "ag1.agent" array. We have 5 agents, so array size is 5
     {   
      CopyClose(_Symbol,0,0,100,ag1.agent[i].inpVector); - for each agent from array (now we have 5 agents) fill predictors (100 close prices). For each feature we fill a single value
      normalizeArrays(ag1.agent[i].inpVector);
     }
   sig1=ag1.getTradeSignal(); this function return averaged signal for all agents
  }

每次交易后,他都会更新政策,当交易结束时--更新奖励(TD,时间差RL)。

void placeOrders()
  {
   if(countOrders(0)!=0 || countOrders(1)!=0)
     {
      for(int b=OrdersTotal()-1; b>=0; b--)
         if(OrderSelect(b,SELECT_BY_POS)==true)
            switch(OrderType())
              {
               case OP_BUY:
                  if(sig1>0.5)
                  if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red))
                     ag1.updateRewards();

                  break;

               case OP_SELL:
                  if(sig1<0.5)
                  if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red))
                     ag1.updateRewards();

                  break;
              }
      return;
     }

   if(sig1<0.5 && (OrderSend(Symbol(),OP_BUY,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_ASK),0,0,0,NULL,OrderMagic,INT_MIN)>0))
     {
      ag1.updatePolicies(sig1);
     }

   else if(sig1>0.5 && (OrderSend(Symbol(),OP_SELL,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0,0,NULL,OrderMagic,INT_MIN)>0))
     {
      ag1.updatePolicies(sig1);
     }

真正简单的图书馆使用

在训练模式下,他将向你展示每个迭代的错误日志

2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 40 passed with errors: 0.2422178988326848  0.5097276264591439
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 41 passed with errors: 0.2295719844357977  0.4824902723735409
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 42 passed with errors: 0.2558365758754864  0.4961089494163424
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 43 passed with errors: 0.2422178988326848  0.4863813229571984
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 44 passed with errors: 0.2422178988326848  0.4766536964980545
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 45 passed with errors: 0.245136186770428  0.5379377431906615
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 46 passed with errors: 0.2587548638132296  0.4912451361867704
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 47 passed with errors: 0.2480544747081712  0.4776264591439689
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 48 passed with errors: 0.2636186770428016  0.5009727626459144
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 49 passed with errors: 0.2616731517509728  0.490272373540856

在测试器的交易模式中,显示每个代理的训练和测试子集的最终误差

2018.09.16 01:34:18.107 2018.09.13 23:59:59   RlExp1iter TRAIN LOGLOSS
2018.09.16 01:34:18.107 2018.09.13 23:59:59   0.23249 0.22763 0.24222 0.24125 0.24416
2018.09.16 01:34:18.107 2018.09.13 23:59:59   RlExp1iter OOB LOGLOSS
2018.09.16 01:34:18.107 2018.09.13 23:59:59   0.46790 0.46887 0.46498 0.46790 0.47471

100个收盘价的结果。


 
马克西姆-德米特里耶夫斯基

当第一次在测试器中运行时,选择 "true"

他将进行随机交易,然后学习并保存模型。

第2次运行选择了虚假。就这样吧。他上传了模型,并将进行交易+。

接下来,在EA中你可以添加代理,现在你有5个代理,每个代理有100个功能,50棵树

在这个函数中,我们为每个代理人添加100个收盘价(100个预测因素)。然后将数据规范化。你可以添加不同的指标,例如前50个特征--收盘价,接下来的25个rsi,接下来的25个adx,或者在你声明代理时改变预测器的数量

每次交易后,他都会更新政策,当交易结束时--更新奖励(TD,时间差RL)。

库的真正简单用法

是的,这似乎很简单,同时也很强大......让我们实验一下,看看......伟大的工作!!!!!。

那么,GDMH的用途在哪里?

我正在考虑写我的GDMH代码。你可以向我展示RDF输入和输出的代码,或者你试图实现GDMH的具体位置,这样我就可以试着写我的那段代码,然后,我们可以比较你的代码和我的代码的结果并进行评估。

 
FxTrader562:

是的,这似乎很简单,同时也很强大。让我们实验一下,看看。伟大的工作!!!!!。

那么,GDMH的用途在哪里?

我正在考虑写我的GDMH代码。你可以向我展示RDF输入和输出的代码,或者你试图实现GDMH的具体位置,这样我就可以试着写我的那段代码,然后,我们可以比较你的代码和我的代码的结果并进行评估。

在这里,我使用了简单的内核CRLAgent::kernelizedMatrix(void)(在库中),所以需要为gdmh修改这个函数

 
马克西姆-德米特里耶夫斯基

在这里,我使用了简单的内核CRLAgent::kernelizedMatrix(void)(在库中),所以需要为gdmh修改这个函数

好吧,让我们看看我是否能写出自己的代码....

如果只是关于GDMH逻辑,那么我可以很容易地将GDMH算法翻译或转换为MQL5代码,但如果它与其他一些内核函数或库有关,那么我需要时间来研究和转换。

 
FxTrader562:

另一个特点是:你可以在委员会中配置每个代理。

CRLAgents *ag1=new CRLAgents("RlExp1iter",5,100,50,regularize,learn);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ag1.setAgentSettings(0,100,50,0.1); for each agent you can set number of features, number of trees and r setting, individually
   ag1.setAgentSettings(1,50,50,0.2);
   ag1.setAgentSettings(2,30,50,0.05);
   ag1.setAgentSettings(3,20,50,0.1);
   ag1.setAgentSettings(4,10,50,0.05);
//---
   return(INIT_SUCCEEDED);
  }

当填补预测值时,只需改变这里。

void calcSignal()
  {
   sig1=0;
       
   for(int i=0;i<ArraySize(ag1.agent);i++)
     {   
      CopyClose(_Symbol,0,0,ArraySize(ag1.agent[i].inpVector),ag1.agent[i].inpVector);
      Print(ArraySize(ag1.agent[i].inpVector));
      normalizeArrays(ag1.agent[i].inpVector);
     }
   sig1=ag1.getTradeSignal();
  }

同时,你可以添加不同的代理组

CRLAgents *ag1=new CRLAgents("RlExp1iter1",5,100,50,regularize,learn);
CRLAgents *ag2=new CRLAgents("RlExp1iter2",1,20,50,regularize,learn);
CRLAgents *ag3=new CRLAgents("RlExp1iter3",18,5,50,regularize,learn);

 
FxTrader562:

好吧,让我们看看我是否能写出自己的代码....

如果只是关于GDMH逻辑,那么我可以很容易地将GDMH算法翻译或转换为MQL5代码,但如果它与其他一些内核函数或库有关,那么我需要时间来研究和转换。

如果你能转换gmdh逻辑 - 这将是非常有帮助的,然后我可以为我的图书馆改变它。