#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Yellow
#property indicator_minimum 0
#property indicator_maximum 1
// indicator parameters
// To do: read parameters, including weights, from a description file
extern double BuyLevel = 0.54;
extern double SellLevel = 0.74;
int nNocInterval=12;
double dNocRange=0.012;
int nNocMa=5;
double dNnOutput;
int nRemoveFirst=200;
double dE=2.7182818;
// indicator buffers
double arrNocBuffer[];
double arrNnBuffer[];
double W[180];
double WT[11];
double Input[17];
int nExtCountedBars=0;
////////////////////////
int init()
{
// drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexShift(0,0);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_LINE);
SetIndexShift(1,0);
SetIndexEmptyValue(1,0.0);
IndicatorDigits(4);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
string strIndicatorShortName="forex_nn";
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
IndicatorShortName(strIndicatorShortName);
// indicator buffers mapping
SetIndexBuffer(0,arrNocBuffer);
SetIndexBuffer(1,arrNnBuffer);
SetLevelStyle(STYLE_DOT,1);
SetLevelValue(0,BuyLevel);
SetLevelValue(1,SellLevel);
//----
W[0]=1.23284662840642;
W[1]= -0.511755486703824;
W[2]=0.0964615833231131;
W[3]= -0.473951143707364;
W[4]= -0.190044512653979;
W[5]=0.385736545872854;
W[6]=0.18430042807762;
W[7]=0.250208618037659;
W[8]= -0.0690710655087922;
W[9]= -0.507242221145675;
W[10]= -0.344757112356797;
W[11]= -0.47518609293024;
W[12]= -0.419874977285144;
W[13]=0.74711393594611;
W[14]=0.439031463137719;
W[15]=0.519059847259052;
W[16]=0.164716602638519;
W[17]=1.4339376008723;
W[18]=0.115386970035529;
W[19]=0.496731065206044;
W[20]= -0.118003872499675;
W[21]=0.421064118363769;
W[22]=0.25178510963282;
W[23]= -0.293541706646167;
W[24]= -0.448743140388445;
W[25]=0.475962267396865;
W[26]=0.569791973166393;
W[27]=0.49272346954719;
W[28]= -0.0905883648668217;
W[29]= -0.0011422810692163;
W[30]= -0.109523712298978;
W[31]= -0.549473731166492;
W[32]=0.562999057730813;
W[33]= -0.6257614521639;
W[34]=1.26121467755857;
W[35]=0.932797035311227;
W[36]=1.30694528621299;
W[37]=0.481442159756628;
W[38]=0.191342196173203;
W[39]=0.307381497072444;
W[40]= -0.543891916922809;
W[41]= -0.249851880333427;
W[42]= -0.174046638335755;
W[43]=0.685804168947628;
W[44]=0.0825153375976359;
W[45]=0.583188445690559;
W[46]=1.59329962072699;
W[47]=0.780358652037702;
W[48]=0.414232400586238;
W[49]=0.405262591017787;
W[50]=0.429133467300143;
W[51]=4.5707252262589;
W[52]= -0.974193568331981;
W[53]= -0.241533739716741;
W[54]=0.120167658526732;
W[55]=0.106812446016975;
W[56]=0.0946906217296473;
W[57]= -0.973353986014926;
W[58]=0.329835213992192;
W[59]=0.354779871566284;
W[60]=0.21141292154711;
W[61]= -0.848058903044372;
W[62]=0.40087506226086;
W[63]=0.590049464056843;
W[64]= -0.884409398272446;
W[65]=0.225682751259687;
W[66]= -0.779756671959848;
W[67]=0.516217176242478;
W[68]= -0.443823132762601;
W[69]=1.15042401290238;
W[70]=0.0761295218074771;
W[71]=0.286354149734076;
W[72]= -0.246276609126355;
W[73]=0.407862236319774;
W[74]=1.35863054128392;
W[75]= -0.0899655682452336;
W[76]=0.227209033012602;
W[77]=0.48882649109837;
W[78]=0.134262469866172;
W[79]=0.520662445724424;
W[80]=0.273921183996895;
W[81]=0.797893190237165;
W[82]=0.307232020735568;
W[83]=0.66453677638372;
W[84]=0.601517797706549;
W[85]=2.41522339235385;
W[86]= -0.54734695793675;
W[87]= -0.616942416095533;
W[88]= -0.329078616352176;
W[89]=0.0343785770105571;
W[90]=0.183606667410502;
W[91]= -0.335604884494971;
W[92]= -0.473071024438756;
W[93]= -0.445323004747451;
W[94]= -0.58852224463417;
W[95]=0.200252466717469;
W[96]=1.03363268985642;
W[97]=1.07718838339749;
W[98]=0.579629620875196;
W[99]=0.563350223627848;
W[100]=0.427986370809025;
W[101]= -0.509749485567783;
W[102]=3.26893236585458;
W[103]= -1.74342337399321;
W[104]=0.715682154705979;
W[105]=0.602756337362107;
W[106]= -0.343526606342097;
W[107]= -1.17938810569175;
W[108]=0.355240071640326;
W[109]=0.35521243887383;
W[110]= -1.44427916588966;
W[111]= -0.276346018910304;
W[112]= -0.59742769634354;
W[113]= -1.10090634603251;
W[114]=0.647220265319068;
W[115]= -0.654279251957746;
W[116]= -0.208823702966868;
W[117]=0.0498559661839404;
W[118]= -0.0845632001274042;
W[119]=5.07943362953022;
W[120]= -1.15314418917092;
W[121]= -0.665833645801421;
W[122]=0.255437001700128;
W[123]=0.319124707947276;
W[124]= -0.566939757767682;
W[125]= -0.47605481843698;
W[126]=0.39488556620511;
W[127]= -0.256064309433873;
W[128]=0.197056621017084;
W[129]= -0.390050402269382;
W[130]= -0.137297237383076;
W[131]=0.545921953801981;
W[132]= -0.071961640027172;
W[133]= -0.483747658486652;
W[134]=0.0250140139153488;
W[135]=0.0652004545965496;
W[136]=1.20609868338284;
W[137]=1.29606665339007;
W[138]= -0.322563707279071;
W[139]= -0.233294561636766;
W[140]= -0.782596575301184;
W[141]= -0.513649291801566;
W[142]= -0.635867543624109;
W[143]= -1.02773789019305;
W[144]= -0.756729297801529;
W[145]= -0.235705567459231;
W[146]= -1.28156572033992;
W[147]= -0.411746401661486;
W[148]=0.799399607981531;
W[149]=0.320928188633003;
W[150]= -0.000938595231901069;
W[151]= -0.0237449790280827;
W[152]= -0.16037405098131;
W[153]= -0.551435857244773;
W[154]=0.425892720818933;
W[155]=0.522796972730267;
W[156]=0.157836040132023;
W[157]=0.415584007547781;
W[158]= -0.0168757976604174;
W[159]=0.00114783700460871;
W[160]=0.115566049648634;
W[161]= -0.211212597329733;
W[162]=0.258353387832398;
W[163]=0.337783351644855;
W[164]=0.04312149688565;
W[165]=0.149834366219619;
W[166]=0.181127999640499;
W[167]=0.744465709021414;
W[168]=0.333011286627891;
W[169]= -0.0555669565373262;
W[170]=0.532057479531659;
W[171]=0.966738538389819;
W[172]= -0.609695328091294;
W[173]=3.1940572214263;
W[174]=0.827936264074366;
W[175]=0.953122056124963;
W[176]=1.05312004796111;
W[177]=3.50187095403698;
W[178]= -0.613446281522734;
W[179]= -0.593921919074533;
WT[0]= -1.85505582973963;
WT[1]= -1.24910210484401;
WT[2]= -0.537052977943149;
WT[3]=2.61438475233761;
WT[4]= -0.839540256869364;
WT[5]=0.11721035714907;
WT[6]= -0.126760582165264;
WT[7]= -3.23470003440472;
WT[8]= -1.35856127136088;
WT[9]= -2.30050022722987;
WT[10]= -4.20071031619927;
return(0);
}
////////////////////
int start()
{
nExtCountedBars=IndicatorCounted();
if (nExtCountedBars < 0) return(-1);
// last counted bar will be recounted
if (nExtCountedBars > 0) nExtCountedBars--;
Noc();
ApplyNn();
return(0);
}
///////////////////
// For the selected period:
// CLV = ((Close - Low) - (High - Close)) / (High - Low)
void Noc()
{
int nPos=Bars - nExtCountedBars;
while (nPos > 0)
{
if (nPos > Bars - nRemoveFirst)
{
arrNocBuffer[nPos]=0.5;
nPos--;
continue;
}
double dClose=Close[nPos];
double dLow=Low[ArrayMinimum(Low,nNocInterval,nPos)];
double dHigh=High[ArrayMaximum(High,nNocInterval,nPos)];
arrNocBuffer[nPos]=0.1;
if (dHigh - dLow > dNocRange)
arrNocBuffer[nPos]=(((dClose - dLow) - (dHigh - dClose)) / (dHigh - dLow)) / 2 + 0.5;
else arrNocBuffer[nPos]=(((dClose - dLow) - (dHigh - dClose)) / dNocRange) / 2 + 0.5;
nPos--;
}
if (nNocMa > 1) Ema(arrNocBuffer);
}
///////////////////
void Ema(double &arr[])
{
double dPr=2.0 / (nNocMa + 1);
int nPos=Bars - nExtCountedBars;
while (nPos > 0)
{
if (nPos == Bars - 2) arrNocBuffer[nPos + 1]=arr[nPos + 1];
arrNocBuffer[nPos]=arr[nPos] * dPr + arrNocBuffer[nPos + 1] * (1 - dPr);
nPos--;
}
}
///////////////////
void ApplyNn()
{
int nPos=Bars - nExtCountedBars - 2;
int LayerCount=3;
int Neurons[3];
Neurons[0]=17;
Neurons[1]=10;
Neurons[2]=1;
double LayerOutput0[17];
double LayerOutput1[10];
double LayerOutput2[1];
double xSum;
while (nPos > 0)
{
for (int cnt=0; cnt <= Neurons[0] - 1; cnt++)
{
LayerOutput0[cnt]=arrNocBuffer[nPos + cnt] * 2 - 1;
//Print(LayerOutput0[cnt]) ;
}
int w_cnt=0,
wt_cnt=0;
for (int xI=0; xI <= LayerCount - 2; xI++)
{
//Print("XI=", xI);
// First Layer by Neurons
int xTmp=Neurons[xI] - 1;
//Print("Tmp=", xTmp);
//Print("Neurons =", Neurons[xI+1]-1);
for (int xK=0; xK <= Neurons[xI + 1] - 1; xK++)
{
xSum=0;
// xTmp - Inputs in First Layer
for (int xJ=0; xJ <= xTmp; xJ++)
{
//Print("XK=", xK, "-Cnt=", w_cnt, "-", wt_cnt);
if (xI == 0)
{
xSum=xSum + LayerOutput0[xJ] * W[w_cnt];
}
if (xI == 1)
{
xSum=xSum + LayerOutput1[xJ] * W[w_cnt];
}
w_cnt+=1;
}
//Print("xSum=",xSum);
xSum=xSum + WT[wt_cnt];
wt_cnt+=1;
//Print("xSum=",xSum);
if (xI == 0)
{
LayerOutput1[xK]=Sigmoid(xSum,1);
//Print("LayerOutput1-"+xK+"=", LayerOutput1[xK]);
}
if (xI == 1)
{
//Print("!!!!!!1!!!!!!");
LayerOutput2[xK]=Sigmoid(xSum,1);
}
}
}
arrNnBuffer[nPos]=LayerOutput2[0];
nPos--;
} // for all patterns
}
double Sigmoid(double inp, double parm)
{
return(1 / (1 + MathExp(-parm * inp)));
}
Comments