LibreOCL/Lesson01/Part02/Prog01_02B/Prog01_02B.mq5

713 lines
63 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 15:03:43 +02:00
<EFBFBD><EFBFBD>//============================================================================================= MQL5 ===
// LibreFEI v1.006 (MQL5)
// ;02=K9 <>4C;L >1@01>B:8 A>1KB89
// Librecoin(c)2014-2017
//============================================================================================= MQL5 ===
// REVIEWS
//------------------------------------------------------------------------------------------------------
// Fourier Extrapolator Adaptive - M:AB@0?>;OB>@ DC@L5 B2>@G5A:0O ?5@5@01>B:0.
//============================================================================================= MQL5 ===
// IDEAS
//------------------------------------------------------------------------------------------------------
// 12.12.2017 45O: @0AG5B=CN G0ABL 2K?>;=8BL A 8A?>;L7>20=85< OpenCL
//============================================================================================= MQL5 ===
// PROPERTY
//------------------------------------------------------------------------------------------------------
#property strict
#define ver "1.006"
#property copyright "Librecoin(c)2014-2017, gpwr(c)2008-2010"
#property link "https://www.mql5.com/ru/users/kirillovyv"
#property description "**************************************************"
#property description " Indicator LibreFEI v"+ver+" Lite (MQL5)"
#property description " Extrapolator by trigonometric (multitone) model"
#property description " From Russia with Love! :-)"
#property description " https://www.mql5.com/ru/users/kirillovyv"
#property description " Based from: gpwr(c)2008-2010, neoclassic(c)2009"
#property description "**************************************************"
#property version ver
const string vers = "LibreFEI v"+ver; //Version
//----- indicator property
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 2
#resource "Kernels/Prog01_02B.cl" as string CL_Source//>4 :5@=5;-?@>3@0<< <>6=> ?>4:;NG0BL :0: @5AC@A
//
//============================================================================================= MQL5 ===
// INTERFACE
//------------------------------------------------------------------------------------------------------
input int Npast = 650; //Past bars, to which trigonometric series is fitted
input int Nfut = 20; //Predicted future bars
input int Nharm = 9; //Min Narmonics in model
input double FreqTOL = 0.0000001; //Tolerance of frequency calculations
input int StartBar = 15; //! :0:>3> 10@0 =0G8=05<
input int MSTimerSet = 500; //#AB0=>2:0 B09<5@0 xxx <8;;8A5:C=4
input int nTickDelay = 5; //=B5@20; ?@>?CA:0 B8:>2 4;O B5AB8@>20=8O
input ulong IterLimit = 60; //Iteration limit 4;O Freq
input bool CommentOn = false; //K2>4 :><<5=B0@852 =0 M:@0=
input bool PrintOn = false; //5G0BL :><<5=B0@852 2 6C@=0;
input bool OCLSelector = true; //A?>;L7>20BL OpenCL
//============================================================================================= MQL5 === OCLSelector
// Global variable definition
//------------------------------------------------------------------------------------------------------
bool TimeInterrupt;
int nTickSumm;
//----- indicator buffers
double pv[]; //0 B>1@0605<K9 1CD5@ 8AB>@88 PAST
double fv[]; //1 B>1@0605<K9 1CD5@ ?@>3=>70 FUTURE
double pc[]; //2 0AG5B=K9 1CD5@ 8AB>@88 PAST
double fc[]; //3 0AG5B=K9 1CD5@ ?@>3=>70 FUTURE
//----- CD5@ @0AG5B=>3> ?0@0<5B@0
double xc[]; //CD5@ @0AG5B=>3> ?0@0<5B@0 (Close())
//----- :;NG0B5;L >B;04>G=>9 ?5G0B8
bool PrintDebugSelector=true;
//----- %5=4;K 4;O >1J5:B>2 OpenCL
int h_CL_Context=INVALID_HANDLE; //%5=4; :>=B5:AB0
int h_CL_Program=INVALID_HANDLE; //%5=4; ?@>3@0<<K
int h_CL_Kernel=INVALID_HANDLE; //%5=4; :5@=5;0
int h_CL_Buffers[]; //%5=4;K 1CD5@>2
//
//============================================================================================= MQL5 ===
// OnInit() - Custom indicator initialization function
//------------------------------------------------------------------------------------------------------
int OnInit()
{
//----- initialize global variables
TimeInterrupt=true;
nTickSumm=0;
//----- indicator parametrs
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
IndicatorSetString(INDICATOR_SHORTNAME,"LibreFEI");
//----- indicator buffers mapping
//@>H;>5 - 1CD5@ >B>1@065=8O PAST
ArraySetAsSeries(pv,true);
ArrayInitialize(pv,EMPTY_VALUE);
SetIndexBuffer(0,pv,INDICATOR_DATA);
PlotIndexSetString(0,PLOT_LABEL,"Past");
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrBlue);
//C4CI55 - 1CD5@ >B>1@065=8O FUTURE
ArraySetAsSeries(fv,true);
ArrayInitialize(fv,EMPTY_VALUE);
SetIndexBuffer(1,fv,INDICATOR_DATA);
PlotIndexSetString(1,PLOT_LABEL,"Future");
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,2);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrRed);
PlotIndexSetInteger(1,PLOT_SHIFT,Nfut); //future data vector i=0..Nfut; Nfut corresponds to bar=StartBar
//@>H;>5 - 1CD5@ @0AG5B0 PAST - @07>1@0BLAO A AsSeries(), A45;0BL false
ArraySetAsSeries(pc,false);
ArrayInitialize(pc,EMPTY_VALUE);
SetIndexBuffer(2,pc,INDICATOR_CALCULATIONS);
//C4CI55 - 1CD5@ @0AG5B0 FUTURE
ArraySetAsSeries(fc,true);//false
ArrayInitialize(fc,EMPTY_VALUE);
SetIndexBuffer(3,fc,INDICATOR_CALCULATIONS);
//CD5@ @0AG5B=>3> ?0@0<5B@0
ArraySetAsSeries(xc,false);//A5340!
ArrayResize(xc,Npast+1);
//----- 0AB@>9:8 B09<5@0 8 3;>10;L=KE AG5BG8:>2
{if(!MQLInfoInteger(MQL_TESTER))//5 B5AB8@>20=85
{
int err=-1;
int count=50;
{while((err!=0)&&(count>0))
{
ResetLastError();
EventSetMillisecondTimer(MSTimerSet); //#AB0=>2:0 B09<5@0 XXX <8;;8A5:C=4
err=GetLastError();
{if(err!=0)
{
Sleep(50);
}}//if(err!=0)
count--;
}}//while((err!=0)&&(count>0))
}}//if(!MQLInfoInteger(MQL_TESTER))
//----- >43>B>28B5;L=K5 >?5@0F88 OpenCL
{if(OCLSelector)
{
//----- :;NG0B5;L >B;04>G=>9 ?5G0B8
PrintDebugSelector=true;
//----- %5=4;K 4;O >1J5:B>2 OpenCL
h_CL_Context=INVALID_HANDLE; //%5=4; :>=B5:AB0
h_CL_Program=INVALID_HANDLE; //%5=4; ?@>3@0<<K
h_CL_Kernel=INVALID_HANDLE; //%5=4; :5@=5;0
//----- ?@545;5=85 G8A;0 1CD5@>2 ?>4 ?5@5<5==K5
ArrayResize(h_CL_Buffers,5);//x,ipc,im,ic,is
ArrayFill(h_CL_Buffers,0,ArraySize(h_CL_Buffers),INVALID_HANDLE);
//----- !>740=85 :>=B5:AB0 (A@54K) 4;O ?@>3@0<<K OpenCL (2K1>@ 45209A0)
ResetLastError();
{if((h_CL_Context=CLContextCreate(CL_USE_ANY))==INVALID_HANDLE) //CL_USE_ANY - 8A?>;L7>20BL ;N1>5 4>ABC?=>5 CAB@>9AB2> A ?>445@6:>9 OpenCL
{
Print("OpenCL not found, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return(INIT_FAILED);
}else{
Print("OpenCL found, %5=4; =0 :>=B5:AB OpenCL:",h_CL_Context," Error:",GetLastError());
}}//if((h_CL_Context=CLContextCreate(CL_USE_ANY))==INVALID_HANDLE)
//----- !>740=85 2 :>=B5:AB5 ?@>3@0<<K =0 >A=>25 :>40 2 AB@>:5 CL_Source
string BuildLog=""; //>3 :><?8;OF88
ResetLastError();
{if((h_CL_Program=CLProgramCreate(h_CL_Context,CL_Source,BuildLog))==INVALID_HANDLE)// B@5BL5< ?0@0<5B@5 - ;>3 :><?8;OF88
{
Print("OpenCL program create failed, error:",GetLastError()," BuildLog=",BuildLog);
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers,BuildLog,PrintDebugSelector);
return(INIT_FAILED);
}else{
Print("OpenCL program create, %5=4; ?@>3@0<<K OpenCL:",h_CL_Program," Error:",GetLastError());
}}//if((h_CL_Program=CLProgramCreate(h_CL_Context,CL_Source,BuildLog))==INVALID_HANDLE)
//----- !>740=85 :5@=5;0 4;O @0AG5B0 7=0G5=89 DC=:F88 >B 42CE ?5@5<5==KE
string CL_Kernel_Name="TrigFit_OCL"; //040=85 8<5=8 :5@=5;0 - 7040BL 2@CG=CN
ResetLastError();
{if((h_CL_Kernel=CLKernelCreate(h_CL_Program,CL_Kernel_Name))==INVALID_HANDLE) //<O DC=:F88 4>;6=> A>>B25BAB2>20BL 8<5=8 2 ?@>3@0<<=>9 AB@>:5 CL_Source
{
Print("OpenCL kernel create failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return(INIT_FAILED);
}else{
Print("OpenCL kernel create, %5=4; :5@=5;0 OpenCL:",h_CL_Kernel," Error:",GetLastError());
}}//if((h_CL_Kernel=CLKernelCreate(h_CL_Program,"Exch"))==INVALID_HANDLE)
//----- !>740=85 1CD5@>2
//----- !>740=85 1CD5@0[0] OpenCL 4;O 7=0G5=89 x[]
ResetLastError();
{if((h_CL_Buffers[0]=CLBufferCreate(h_CL_Context,Npast*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)//__global double *x,
{
Print("OpenCL buffer create failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return(INIT_FAILED);
}else{
Print("OpenCL buffer create, %5=4; 1CD5@0 OpenCL:",h_CL_Buffers[0]," Error:",GetLastError());
}}//if((h_CL_Buffer=CLBufferCreate(h_CL_Context,ArraySize(x)*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)
//----- !>740=85 1CD5@0[1] OpenCL 4;O 7=0G5=89 ipc[] - ?5@545;0BL, B>;L:> ?@8 87<5=5=88 @07<5@=>AB8 <0AA820
ResetLastError();
{if((h_CL_Buffers[1]=CLBufferCreate(h_CL_Context,Npast*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)//__global double *ipc,
{
Print("OpenCL buffer create failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return(INIT_FAILED);
}else{
Print("OpenCL buffer create, %5=4; 1CD5@0 OpenCL:",h_CL_Buffers[1]," Error:",GetLastError());
}}//if((h_CL_Buffer=CLBufferCreate(h_CL_Context,ArraySize(x)*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)
//----- !>740=85 1CD5@0[2] OpenCL 4;O 7=0G5=89 im[]
ResetLastError();
{if((h_CL_Buffers[2]=CLBufferCreate(h_CL_Context,sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)//__global double *m,
{
Print("OpenCL buffer create failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return(INIT_FAILED);
}else{
Print("OpenCL buffer create, %5=4; 1CD5@0 OpenCL:",h_CL_Buffers[2]," Error:",GetLastError());
}}//if((h_CL_Buffer=CLBufferCreate(h_CL_Context,ArraySize(x)*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)
//----- !>740=85 1CD5@0[3] OpenCL 4;O 7=0G5=89 ic[]
ResetLastError();
{if((h_CL_Buffers[3]=CLBufferCreate(h_CL_Context,sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)//__global double *c,
{
Print("OpenCL buffer create failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return(INIT_FAILED);
}else{
Print("OpenCL buffer create, %5=4; 1CD5@0 OpenCL:",h_CL_Buffers[3]," Error:",GetLastError());
}}//if((h_CL_Buffer=CLBufferCreate(h_CL_Context,ArraySize(x)*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)
//----- !>740=85 1CD5@0[4] OpenCL 4;O 7=0G5=89 is[]
ResetLastError();
{if((h_CL_Buffers[4]=CLBufferCreate(h_CL_Context,sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)//__global double *s,
{
Print("OpenCL buffer create failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return(INIT_FAILED);
}else{
Print("OpenCL buffer create, %5=4; 1CD5@0 OpenCL:",h_CL_Buffers[4]," Error:",GetLastError());
}}//if((h_CL_Buffer=CLBufferCreate(h_CL_Context,ArraySize(x)*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)
}else{
}}//if(OCLSelector)
//----- KE>4 BCB
return(INIT_SUCCEEDED);
}//OnInit()
//
//============================================================================================= MQL5 ===
// OnDeinit() - Custom indicator iteration function |
//------------------------------------------------------------------------------------------------------
void OnDeinit(const int reason){
Comment("");
return;
}//OnDeinit()
//
//============================================================================================= MQL5 ===
// OnTimer()
//------------------------------------------------------------------------------------------------------
void OnTimer(){
TimeInterrupt=true;
nTickSumm=0;
}//OnTimer()
//
//============================================================================================= MQL5 ===
// OnCalculate() - Custom indicator iteration function
//------------------------------------------------------------------------------------------------------
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime& time[],
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{
//----- Check for insufficient data
{if(rates_total<Npast+StartBar+1)
{
{if(PrintOn)
{
Print("Error: not enough bars in history!"
+" Total="+IntegerToString(rates_total)
+" needed="+IntegerToString(Npast+StartBar+1));
}}//if(PrintOn)
return(0);
}}//if(rates_total<Npast)
//----- @>25@:0 =5>1E>48<>AB8 ?5@5AG5B0 ?> B8:0<
{if(MQLInfoInteger(MQL_TESTER))
{
nTickSumm++;
{if(MathMod(nTickSumm,nTickDelay)<1.0)
{
nTickSumm=0;
TimeInterrupt=true;
}}//if(MathMod(nTickSumm,7)<1.0)
}}//if(MQLInfoInteger(MQL_TESTER))
//----- @>25@:0 =5>1E>48<>AB8 ?5@5AG5B0 ?> B09<5@C
{if(rates_total<=prev_calculated)//@07<5@ 2E>4=KE B09<A5@89 <5=LH5 8;8 @025=, G5< @0=55 >1@01>B0=> (>1KG=> @07<5@ 2E>4=KE =0 ?@54H5AB2CNI5< B8:5)
{//7<5=5=89 =5B - ?@>25@O5< B09<5@
{if(!TimeInterrupt)//5A;8 =5B ?@5@K20=8O >B msec B09<5@0
{
return(rates_total); //!20;8205<, 81> =5B 87<5=5=89 8 ?@5@K20=8O B09<5@0
}else{//5ABL ?@5@K20=85 B09<5@0 - A1@0AK205< 8 2K?>;=O5< @0AG5B
TimeInterrupt=false;
}}//if(!TimeInterrupt)
}}//if(rates_total<=prev_calculated)
//----- ?@545;5=85 A5@89=>AB8 <0AA82>2 40==KE
ArraySetAsSeries(open,true);
ArraySetAsSeries(close,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(spread,true);
//----- 0?>;=5=85 8AE>4=>3> <0AA820 4;O @0AG5B0 ?@>3=>70
{for(int i=0;i<Npast;i++)
{
xc[i]=close[i];
}}//for(int i=0;i<Npast;i++)
//----- 0AG5B 8=48:0B>@=KE 1CD5@>2
Calc_Fourier(xc,pc,fc,Npast,Nharm);
//----- 0AG5B 8 2K2>4 8=48:0B>@=KE 1CD5@>2 8 A?@02>G=>9 8=D>@<0F88
{if(CommentOn)
{
Comment( "LibreFEI"+" "+
string(TimeCurrent())+" "+
"ST="+IntegerToString(StartBar)+" "+
"NF="+IntegerToString(Nfut)+" "+
"NP="+IntegerToString(Npast)+" "+
"NH="+IntegerToString(Nharm)+" "
);
}}//if(CommentOn)
{if(PrintOn)
{
Print( string(TimeCurrent())+" "+
"NP="+IntegerToString(Npast)+" "+
"NH="+IntegerToString(Nharm)+" "
);
}}//if(PrintOn)
//----- 0A8< 8=48:0F8N
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE); //pv Past View
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE); //fv Future View
PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE); //pc Past Calculate
PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_NONE); //fc Future Calculate
ArrayInitialize(pv,EMPTY_VALUE);
ArrayInitialize(fv,EMPTY_VALUE);
//----- 5@5:;04:0 <0AA82>2 4;O >B>1@065=8O
//ArrayCopy(pv,pc,0,0,Npast+StartBar+1); - A;8 >48= <0AA82 AsSeries, 0 2B>@>9 =5B, B> @072>@0G8205B
{for(int i=0;i<=Npast+StartBar;i++)
{
pv[i]=pc[i];
}}//for(int i=0;i<=Npast+StartBar;i++)
{for(int i=0;i<=Nfut;i++)
{
fv[Nfut-i]=fc[i];
}}//for(int i=0;i<=Nfut;i++)
//----- :;NG05< 8=48:0F8N
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); //pv
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); //fv
PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_LINE); //pc
PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_LINE); //fs
ChartRedraw(ChartID());
//-----
return(rates_total);
}//OnCalculate()
//
//============================================================================================= MQL5 ===
// Calc_Fourier() - Calc_Fourier
//------------------------------------------------------------------------------------------------------
void Calc_Fourier(double &x[],double &p[],double &f[],int iNpast,int iNharm){
//-----
//----- initialize indicator buffers to EMPTY_VALUE
ArrayInitialize(p,EMPTY_VALUE);
ArrayInitialize(f,EMPTY_VALUE);
//----- Find average of past values
double av=0.0;
//0?>;=5=85 8AE>4=>3> <0AA820 4;O @0AG5B0 8 =0:>?;5=85 AC<<K 4;O 2KG8A;5=8O A@54=53>
{for(int i=0;i<iNpast;i++)
{
av=av+x[i];
}}//for(int i=0;i<Npast;i++)
// 0AG5B A@54=53>
av=av/iNpast;
//----- initialize model outputs
{for(int i=0;i<iNpast;i++)
{
p[i]=av; //@>H;>5 70?>;=O5< A@54=8< 7=0G5=85< >B [0] =0 <0:A8<0;L=CN 3;C18=C
}}//for(int i=0;i<iNpast;i++)
{for(int i=0;i<=Nfut;i++)
{
f[i]=av; //C4CI55 70?>;=O5< A@54=8< 7=0G5=85< >B [0] =0 3;C18=C Nfut
}}//for(int i=0;i<iNpast;i++)
//----- fit trigonometric model and calculate predictions
double w,m,c,s;
{for(int harm=1;harm<=iNharm;harm++)//Nharmm - @07 ?@>3>=O5<AO 2 F8:;5
{
Freq(x,p,iNpast,w,m,c,s);
double mcc=0.0;
double ss=0.0;
{for(int i=0;i<iNpast;i++)
{
mcc=m+c*MathCos(w*i);
ss=s*MathSin(w*i);
p[i]+=mcc+ss;
{if(i<=Nfut)
{
f[i]+=mcc-ss;
}}//if(i<=Nfut)
}}//for(int i=0;i<iNpast;i++)
}}//for(int harm=1;harm<=Nharmm;harm++)
return;
}//Calc_Fourier()
//
//============================================================================================= MQL5 ===
// Freq() - Quinn and Fernandes algorithm for finding frequency
//------------------------------------------------------------------------------------------------------
void Freq(double& x[],double& ipc[],int n,double& w,double& m,double& c,double& s)
{
double z[];
ArrayResize(z,n);
double alpha=0.0;
double beta=2.0;
z[0]=x[0]-ipc[0];
ulong IterCount=0;
{while((MathAbs(alpha-beta)>FreqTOL)&&(IterCount<IterLimit))
{
alpha=beta;
z[1]=x[1]-ipc[1]+alpha*z[0];
double num=z[0]*z[1];
double den=z[0]*z[0];
{for(int i=2;i<n;i++)
{
z[i]=x[i]-ipc[i]+alpha*z[i-1]-z[i-2];
num+=z[i-1]*(z[i]+z[i-2]);
den+=z[i-1]*z[i-1];
}}//for(int i=2;i<n;i++)
beta=num/den;
IterCount++;
}}//while(MathAbs(alpha-beta)>FreqTOL)
w=MathArccos(beta/2.0);
////----- !@02=5=85 @0AG5B>2
//double m1,c1,s1;
//m1=m;c1=c;s1=s;
//TrigFitOCL(x,ipc,n,w,m,c,s);
//Print("1. m=",DoubleToString(m,8)," c=",DoubleToString(c,8)," s=",DoubleToString(s,8));
//m=m1;c=c1;s=s1;
//TrigFit(x,ipc,n,w,m,c,s);
//Print("2. m=",DoubleToString(m,8)," c=",DoubleToString(c,8)," s=",DoubleToString(s,8));
{if(OCLSelector)
{
TrigFitOCL(x,ipc,n,w,m,c,s);
}else{
TrigFit(x,ipc,n,w,m,c,s);
}}//if(OCLSelector)
}//Freq()
//
//============================================================================================= MQL5 ===
// TrigFitOCL() - Least-squares fitting of trigonometric series
//------------------------------------------------------------------------------------------------------
void TrigFitOCL(double& x[],double& ipc[],int n,double w,double& m,double& c,double& s)
{
//----- "@0=78B=K5 ?5@5<5==K5
double im[1];//2 4;O m
double ic[1];//3 4;O c
double is[1];//4 4;O s
im[0]=m;
ic[0]=c;
is[0]=s;
//----- #AB0=02;8205< 2 :0G5AB25 0-3> ?0@0<5B@0 DC=:F88 OpenCL (:5@=5;0) 1CD5@ ?> E5=4;C h_CL_Buffers[0]
ResetLastError();
{if(!CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffers[0]))
{
Print("OpenCL set buffer failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL set buffer, Error:",GetLastError());
}}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer))
//----- #AB0=02;8205< 2 :0G5AB25 1-3> ?0@0<5B@0 DC=:F88 OpenCL (:5@=5;0) 1CD5@ ?> E5=4;C h_CL_Buffers[1]
ResetLastError();
{if(!CLSetKernelArgMem(h_CL_Kernel,1,h_CL_Buffers[1]))
{
Print("OpenCL set buffer failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL set buffer, Error:",GetLastError());
}}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer_ipc))
//----- #AB0=02;8205< 2 :0G5AB25 2-3> ?0@0<5B@0 DC=:F88 OpenCL (:5@=5;0) 7=0G5=85 ?5@5<5==>9 n
ResetLastError();
{if(!CLSetKernelArg(h_CL_Kernel,2,n))
{
Print("OpenCL set buffer failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL set buffer, Error:",GetLastError());
}}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer_ipc))
//----- #AB0=02;8205< 2 :0G5AB25 3-3> ?0@0<5B@0 DC=:F88 OpenCL (:5@=5;0) 7=0G5=85 ?5@5<5==>9 w
ResetLastError();
{if(!CLSetKernelArg(h_CL_Kernel,3,w))
{
Print("OpenCL set buffer failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL set buffer, Error:",GetLastError());
}}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer_ipc))
//----- #AB0=02;8205< 2 :0G5AB25 4-3> ?0@0<5B@0 DC=:F88 OpenCL (:5@=5;0) 1CD5@ ?> E5=4;C h_CL_Buffers[2]
ResetLastError();
{if(!CLSetKernelArgMem(h_CL_Kernel,4,h_CL_Buffers[2]))
{
Print("OpenCL set buffer failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL set buffer, Error:",GetLastError());
}}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer_ipc))
//----- #AB0=02;8205< 2 :0G5AB25 5-3> ?0@0<5B@0 DC=:F88 OpenCL (:5@=5;0) 1CD5@ ?> E5=4;C h_CL_Buffers[3]
ResetLastError();
{if(!CLSetKernelArgMem(h_CL_Kernel,5,h_CL_Buffers[3]))
{
Print("OpenCL set buffer failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL set buffer, Error:",GetLastError());
}}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer_ipc))
//----- #AB0=02;8205< 2 :0G5AB25 6-3> ?0@0<5B@0 DC=:F88 OpenCL (:5@=5;0) 1CD5@ ?> E5=4;C h_CL_Buffers[4]
ResetLastError();
{if(!CLSetKernelArgMem(h_CL_Kernel,6,h_CL_Buffers[4]))
{
Print("OpenCL set buffer failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL set buffer, Error:",GetLastError());
}}//if(!CLSetKernelArgMem(h_CL_Kernel,6,h_CL_Buffers[4]))
//----- 0?8AK205< 8AE>4=K5 7=0G5=8O x[] 2 1CD5@ ?> E5=4;C h_CL_Buffers[0]
ResetLastError();
uint nElementsWrite=CLBufferWrite(h_CL_Buffers[0],x,0,0,n);
{if(nElementsWrite<(uint)n)
{
Print("OpenCL buffer x write failed, nElementsWrite=",nElementsWrite," error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL buffer write, nElementsWrite=",nElementsWrite," error:",GetLastError());
}}//if(nElementsWrite<=0)
//----- 0?8AK205< 8AE>4=K5 7=0G5=8O ipc[] 2 1CD5@ ?> E5=4;C h_CL_Buffers[1]
ResetLastError();
nElementsWrite=CLBufferWrite(h_CL_Buffers[1],ipc,0,0,n);
{if(nElementsWrite<(uint)n)
{
Print("OpenCL buffer ipc write failed, nElementsWrite=",nElementsWrite," error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL buffer write, nElementsWrite=",nElementsWrite," error:",GetLastError());
}}//if(nElementsWrite<=0)
//----- 0?8AK205< 8AE>4=>5 7=0G5=85 m 2 1CD5@ ?> E5=4;C h_CL_Buffers[2]
ResetLastError();
nElementsWrite=CLBufferWrite(h_CL_Buffers[2],im,0,0,1);
{if(nElementsWrite<1)
{
Print("OpenCL buffer write failed, nElementsWrite=",nElementsWrite," error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL buffer write, nElementsWrite=",nElementsWrite," error:",GetLastError());
}}//if(nElementsWrite<=0)
//----- 0?8AK205< 8AE>4=>5 7=0G5=85 c 2 1CD5@ ?> E5=4;C h_CL_Buffers[3]
ResetLastError();
nElementsWrite=CLBufferWrite(h_CL_Buffers[3],ic,0,0,1);
{if(nElementsWrite<1)
{
Print("OpenCL buffer write failed, nElementsWrite=",nElementsWrite," error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL buffer write, nElementsWrite=",nElementsWrite," error:",GetLastError());
}}//if(nElementsWrite<=0)
//----- 0?8AK205< 8AE>4=>5 7=0G5=85 s 2 1CD5@ ?> E5=4;C h_CL_Buffers[4]
ResetLastError();
nElementsWrite=CLBufferWrite(h_CL_Buffers[4],is,0,0,1);
{if(nElementsWrite<1)
{
Print("OpenCL buffer write failed, nElementsWrite=",nElementsWrite," error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL buffer write, nElementsWrite=",nElementsWrite," error:",GetLastError());
}}//if(nElementsWrite<=0)
//----- 0?CA:05< 2K?>;=5=85 :5@=5;0
ResetLastError();
{if(!CLExecute(h_CL_Kernel))
{
Print("OpenCL execute failed, error:",GetLastError());
ShutDown(h_CL_Context,h_CL_Program,h_CL_Kernel,h_CL_Buffers);
return;
}else{
//Print("OpenCL execute, error:",GetLastError());
}}//if(!CLExecute(h_CL_Kernel))
//----- !G8BK205< ?>;CG5==K5 7=0G5=8O 2 <0AA82K
//Print("7 1CD5@0 ?@>G8B0=> ",CLBufferRead(h_CL_Buffers[0],x,0,0,5)," M;5<5=B>2");
CLBufferRead(h_CL_Buffers[0],x,0,0,n);
//Print("7 1CD5@0 ?@>G8B0=> ",CLBufferRead(h_CL_Buffers[1],ipc,0,0,3)," M;5<5=B>2");
CLBufferRead(h_CL_Buffers[1],ipc,0,0,n);
//Print("7 1CD5@0 ?@>G8B0=> ",CLBufferRead(h_CL_Buffers[2],im,0,0,1)," M;5<5=B>2");
CLBufferRead(h_CL_Buffers[2],im,0,0,1);
m=im[0];
//Print("7 1CD5@0 ?@>G8B0=> ",CLBufferRead(h_CL_Buffers[3],ic,0,0,1)," M;5<5=B>2");
CLBufferRead(h_CL_Buffers[3],ic,0,0,1);
c=ic[0];
//Print("7 1CD5@0 ?@>G8B0=> ",CLBufferRead(h_CL_Buffers[4],is,0,0,1)," M;5<5=B>2");
CLBufferRead(h_CL_Buffers[4],is,0,0,1);
s=is[0];
return;
}//TrigFitOCL()
//
//============================================================================================= MQL5 ===
// TrigFit() - Least-squares fitting of trigonometric series
//------------------------------------------------------------------------------------------------------
void TrigFit(
double &x[],
double &ipc[],
int n,
double w,
double &m,
double &c,
double &s
)
{
//c=ipc[0];
double Sc =0.0;
double Ss =0.0;
double Scc=0.0;
double Sss=0.0;
double Scs=0.0;
double Sx =0.0;
double Sxc=0.0;
double Sxs=0.0;
{for(int i=0;i<n;i++)
{
double cos_w_i=cos(w*i);
double sin_w_i=sin(w*i);
double dx=x[i]-ipc[i];
Sc +=cos_w_i;
Ss +=sin_w_i;
Scc+=cos_w_i*cos_w_i;
Sss+=sin_w_i*sin_w_i;
Scs+=cos_w_i*sin_w_i;
Sx +=dx;
Sxc+=dx*cos_w_i;
Sxs+=dx*sin_w_i;
}}//for(int i=0;i<n;i++)
Sc /=n;
Ss /=n;
Scc/=n;
Sss/=n;
Scs/=n;
Sx /=n;
Sxc/=n;
Sxs/=n;
{if(w==0.0)
{
m=Sx;
c=0.0;
s=0.0;
}else{
// calculating a, b, and m
double den=pow(Scs-Sc*Ss,2)-(Scc-Sc*Sc)*(Sss-Ss*Ss);
c=((Sxs-Sx*Ss)*(Scs-Sc*Ss)-(Sxc-Sx*Sc)*(Sss-Ss*Ss))/den;
s=((Sxc-Sx*Sc)*(Scs-Sc*Ss)-(Sxs-Sx*Ss)*(Scc-Sc*Sc))/den;
m=Sx-c*Sc-s*Ss;
}}//if(w==0.0)
return;
}//TrigFit()
//
//============================================================================================= MQL5 ===
// ShutDown() function
//------------------------------------------------------------------------------------------------------
void ShutDown(
int &i_CL_Context,
int &i_CL_Program,
int &i_CL_Kernel,
int &i_CL_Buffers[],
const string i_BuildLog = "",
const bool i_PrintDebugSelector = false
)
{
//----- Build Log Print
{if((i_PrintDebugSelector)&&(i_BuildLog!=""))
{
string LogLines[];
StringSplit(i_BuildLog,'\n',LogLines);
int LogLinesCount=ArraySize(LogLines);
{for(int i=0; i<LogLinesCount; i++)
{
Print(LogLines[i]);
}}//for(int i=0; i<LogLinesCount; i++)
}}//if((i_PrintDebugSelector)&&(i_BuildLog!=""))
//----- Remove buffer
{for(int i=0;i<=ArraySize(i_CL_Buffers)-1;i++)
{
{if(i_CL_Buffers[i]!=INVALID_HANDLE)
{
CLBufferFree(i_CL_Buffers[i]);
i_CL_Buffers[i]=INVALID_HANDLE;
}}//if(i_CL_Buffers[i]=INVALID_HANDLE)
}}//for(i=0;i<=ArraySize(i_CL_Buffers);i++)
//----- Remove kernel
{if(i_CL_Kernel!=INVALID_HANDLE)
{
CLKernelFree(i_CL_Kernel);
i_CL_Kernel=INVALID_HANDLE;
}}//if(i_CL_Kernel!=INVALID_HANDLE)
//----- Remove program
{if(i_CL_Program!=INVALID_HANDLE)
{
CLProgramFree(i_CL_Program);
i_CL_Program=INVALID_HANDLE;
}}//if(m_program!=INVALID_HANDLE)
//----- Remove context
{if(i_CL_Context!=INVALID_HANDLE)
{
CLContextFree(i_CL_Context);
i_CL_Context=INVALID_HANDLE;
}}//if(m_context!=INVALID_HANDLE)
}//ShutDown()
//