在本文中,我们将更详尽地探讨在神经网络中传递有意义的数据(即所谓的时间序列)的重要性。特别是,我们将传递最喜欢的指标。为了达成这一点,我将介绍一些我在操控神经网络时所用的新概念。虽然,我认为这不是极限,随着时间的推移,我对于理解到底需要传递什么、以及如何传递,会有一个新的视界。
背景和观察
阅读大量这个主题的文章,我持续观察到一个悲伤的场面,那就是基于神经网络的交易系统的直接结果。许多好的思路和算法却并未带来期待的结果。
在传递输入参数时,始终会观察到相同的画面。例如,振荡器值的直接传递,以我的观点,这与资产价格没有任何共通之处。振荡器有一个众所周知的问题 — 所谓的背离。这些是开盘价、收盘价、最高价和最低价的值,当直接传递时,它们不携带任何意义,但会给系统带来难以理解的噪音。这些值与任何事物无关,并且随时间推移会有明显的散离。例如,打开任何货币对的日线图,查看收盘价的波动范围。
使用距离的示例:
传递当前零号蜡烛的距离。MA 1 指标相对于 MA 100。MACD 指标当前值相对于其零值。CCI 指标当前值相对于其零值。
#property copyright "2023, Roman Poshtar"
#property link "https://www.mql5.com/ru/users/romanuch"
#property strict
#property version "1.0"
input int x1 = 1;
input int x2 = 1;
input int x3 = 1;
int handle_In1S1;
int handle_In2S1;
int handle_In3S1;
int handle_In4S1;
double ind_In1S1[];
double ind_In2S1[];
double ind_In3S1[];
double ind_In4S1[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
handle_In1S1=iMA(Symbol(),PERIOD_CURRENT,1,0,MODE_SMA,PRICE_CLOSE);
//--- if the handle is not created
if(handle_In1S1==INVALID_HANDLE)
{
return(INIT_FAILED);
}
//---
handle_In2S1=iMA(Symbol(),PERIOD_CURRENT,100,0,MODE_SMA,PRICE_CLOSE);
//--- if the handle is not created
if(handle_In2S1==INVALID_HANDLE)
{
return(INIT_FAILED);
}
//---
handle_In3S1=iMACD(Symbol(),PERIOD_CURRENT,12,26,9,PRICE_CLOSE);
//--- if the handle is not created
if(handle_In3S1==INVALID_HANDLE)
{
return(INIT_FAILED);
}
//---
handle_In4S1=iCCI(Symbol(),PERIOD_CURRENT,14,PRICE_CLOSE);
//--- if the handle is not created
if(handle_In4S1==INVALID_HANDLE)
{
return(INIT_FAILED);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- get data from the three buffers of the i-Regr indicator
ArraySetAsSeries(ind_In1S1,true);
if(!iGetArray(handle_In1S1,0,0,1010,ind_In1S1))
{
return;
}
//---
//--- get data from the three buffers of the i-Regr indicator
ArraySetAsSeries(ind_In2S1,true);
if(!iGetArray(handle_In2S1,0,0,1010,ind_In2S1))
{
return;
}
//---
//--- get data from the three buffers of the i-Regr indicator
ArraySetAsSeries(ind_In3S1,true);
if(!iGetArray(handle_In3S1,0,0,1010,ind_In3S1))
{
return;
}
//---
//--- get data from the three buffers of the i-Regr indicator
ArraySetAsSeries(ind_In4S1,true);
if(!iGetArray(handle_In4S1,0,0,1010,ind_In4S1))
{
return;
}
//---
perceptron1();
}
//+------------------------------------------------------------------+
//| The PERCEPRRON - a perceiving and recognizing function |
//+------------------------------------------------------------------+
double perceptron1()
{
double w1 = x1 - 10.0;
double w2 = x2 - 10.0;
double w3 = x3 - 10.0;
double a1 = ((ind_In1S1[0]-ind_In2S1[0])/Point());
double a2 = ind_In3S1[0];
double a3 = ind_In4S1[0];
Print("a1 = ", a1);
Print("a2 = ", a2);
Print("a3 = ", a3);
Print("Perceptron = ", (w1 * a1 + w2 * a2 + w3 * a3));
Print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
return (w1 * a1 + w2 * a2 + w3 * a3);
}