AttribInd_2d
//+------------------------------------------------------------------+
//| AttribInd_2d.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_separate_window
//#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 LightSeaGreen
#include <svm290_18_5.mqh>
#define FW_M5 5
#define ROW1_M5 100
#define ROW2_M5 50
//:::::::::::::::::::::::::::::::::::::::::::::
#include <mt4accountinfo.mqh>
#include <mt4string.mqh>
#include <mt4datetime.mqh>
#include <mt4objects_1.mqh>
#include <mt4timeseries_2.mqh>
//Etc.
//:::::::::::::::::::::::::::::::::::::::::::::::
int ROW1_M1;
int ROW2_M1;
int FW_M1;
int diff=0;//2 (5min)
string file_name;
double C=1;
double g=0;
int svm_type=NU_SVR ;//C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR
int kernel_type=RBF;//LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED
int normalize=1;//1-normalize 0-
int flag=0;//0-no file ,1-file ma,2-file ma diff
int flag2=0;//0-do nothing 1-create model 2-predict 3-create model and predict
int flag3=0;//0-no predict file 1-predict file
//double lines[ROW1_M1];
double lines_attr[][COL];
//double svm_samples_class_dyn_1[ROW1_M1];
double svm_samples_class_dyn_1[];
//double svm_samples_attrib_dyn_1[ROW1_M1][COL];
double svm_samples_attrib_dyn_1[][COL];
//double svm_test_attrib_dyn_1[ROW2_M1][COL];
double svm_test_attrib_dyn_1[][COL];
//double ptr_predict_label__1[ROW2_M1]={0,0,0};
double ptr_predict_label__1[];
string SymbolName1="EURUSD";
int PeriodMinutes1=PERIOD_M1;
int PeriodMinutes5=PERIOD_M5;
int PeriodMinutes60=PERIOD_H1;
int TrainPeriod=PERIOD_M5;
int StopLoss=30;
//70
int TakeProfit=30;
//70
double x1,x2,x3,x4,x5,x6,x7,x8,x9;
double y1,y2,y3,y4,y5,y6,y7,y8,y9;
double z1,z2,z3,z4,z5,z6,z7,z8,z9;
double at0,at1,at2,at3,at4,at5,at6,at7,at8;
double at9,at10,at11,at12,at13,at14,at15,at16,at17;
double at18,at19,at20,at21,at22,at23,at24,at25,at26;
double Buffer1[];
double Buffer2[];
double Buffer3[];
datetime t1,t2,t3;
int
nr_of_sample_lines;
int
nr_of_test_lines;
//:::::::::::::::::::::::::::::::::::::::::::::
double Ask;
double Bid;
int Bars1;
double Point1;
int MA5_1 = 0; // Declaring variable to store fast MA handle
int MA5_2 = 0; // Declaring variable to store fast MA handle
int MA5_3 = 0; // Declaring variable to store fast MA handle
int MA60_1 = 0; // Declaring variable to store slow MA handle
int MA60_2 = 0; // Declaring variable to store slow MA handle
int MA60_3 = 0; // Declaring variable to store slow MA handle
// Dynamic arrays to store indicators values
double _ma5_1[];
double _ma5_2[];
double _ma5_3[];
double _ma60_1[];
double _ma60_2[];
double _ma60_3[];
//:::::::::::::::::::::::::::::::::::::::::::::::
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//:::::::::::::::::::::::::::::::::::::::::::::
Ask=SymbolInfoDouble(SymbolName1,SYMBOL_ASK);
Bid=SymbolInfoDouble(SymbolName1,SYMBOL_BID);
Bars1=Bars(SymbolName1,PERIOD_CURRENT);
Point1=Point();
MA5_1 = iCustom(SymbolName1,TFMigrate(PeriodMinutes5),"Examples\Custom Moving Average",
5, // Period
0, // Offset
MODE_SMA, // Calculation method
PRICE_CLOSE // Calculating on Close prices
);
MA5_2 = iCustom(SymbolName1,TFMigrate(PeriodMinutes5),"Examples\Custom Moving Average",
10, // Period
0, // Offset
MODE_SMA, // Calculation method
PRICE_CLOSE // Calculating on Close prices
);
MA5_3 = iCustom(SymbolName1,TFMigrate(PeriodMinutes5),"Examples\Custom Moving Average",
15, // Period
0, // Offset
MODE_SMA, // Calculation method
PRICE_CLOSE // Calculating on Close prices
);
MA60_1 = iCustom(SymbolName1,TFMigrate(PeriodMinutes60),"Examples\Custom Moving Average",
5, // Period
0, // Offset
MODE_SMA, // Calculation method
PRICE_CLOSE // Calculating on Close prices
);
MA60_2 = iCustom(SymbolName1,TFMigrate(PeriodMinutes60),"Examples\Custom Moving Average",
10, // Period
0, // Offset
MODE_SMA, // Calculation method
PRICE_CLOSE // Calculating on Close prices
);
MA60_3 = iCustom(SymbolName1,TFMigrate(PeriodMinutes60),"Examples\Custom Moving Average",
15, // Period
0, // Offset
MODE_SMA, // Calculation method
PRICE_CLOSE // Calculating on Close prices
);
//:::::::::::::::::::::::::::::::::::::::::::::::
file_name="c:\\mt4\\"+SymbolName1+"_file_18_5.std";
//---- indicators
//SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Buffer1);
//SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,Buffer2);
//SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,Buffer3);
t1=iTime(SymbolName1,PeriodMinutes5,FW_M5);
FW_M1=iBarShift(SymbolName1,PeriodMinutes1,t1,true);
t2=iTime(SymbolName1,PeriodMinutes5,ROW2_M5);
ROW2_M1=iBarShift(SymbolName1,PeriodMinutes1,t2,true);
t3=iTime(SymbolName1,PeriodMinutes5,ROW1_M5);
ROW1_M1=iBarShift(SymbolName1,PeriodMinutes1,t3,true);
Print(" ROW2_M5=",ROW2_M5);
Print(" ROW2_M1=",ROW2_M1);
Print("ROW1_M5-FW_M5=",ROW1_M5-FW_M5," ROW1_M5=",ROW1_M5," FW1_M5=",FW_M5);
Print("ROW1_M1-FW_M1=",ROW1_M1-FW_M1," ROW1_M1=",ROW1_M1," FW1_M1=",FW_M1);
/*
|<---------------------------ROW1_M5-------------------------->|
| |
| |<--FW_M5->|
| | |
+-------------------------------------------+-------+----------+
t3 t2 t1 t0
| |
|<-----ROW2_M5---->|
| |
lines_attr ... lines_attr|lines_attr lines_attr
[ROW1_M1-1 [FW_M1]|[FW_M1-1] [0]
*/
nr_of_sample_lines=ROW1_M1-FW_M1-diff;
nr_of_test_lines=ROW2_M1;
ArrayResize(lines_attr,ROW1_M1);
ArrayResize(svm_samples_class_dyn_1,nr_of_sample_lines);
ArrayResize(svm_samples_attrib_dyn_1,nr_of_sample_lines);
ArrayResize(svm_test_attrib_dyn_1,nr_of_test_lines);
ArrayResize(ptr_predict_label__1,nr_of_test_lines);
//----
main();
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int OnDeinit()
{
//:::::::::::::::::::::::::::::::::::::::::::::
double Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
int Bars=Bars(Symbol(),PERIOD_CURRENT);
double Point=Point();
//Etc.
//:::::::::::::::::::::::::::::::::::::::::::::::
//----
//----
return(0);
}
/*
|<---------------------------ROW1_M5-------------------------->|
| |
| |<--FW_M5->|
| | |
+-------------------------------------------+-------+----------+
t3 t2 t1 t0
| |
|<-----ROW2_M5---->|
| |
lines_attr ... lines_attr|lines_attr lines_attr
[ROW1_M1-1 [FW_M1]|[FW_M1-1] [0]
*/
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int myBars1;
bool isNewBar1(int tf1)
{
//----
bool res=false;
if (myBars1!=iBars(Symbol(),tf1))
{
res=true;
myBars1=iBars(Symbol(),tf1);
}
//----
return(res);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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[])
{
//:::::::::::::::::::::::::::::::::::::::::::::
double Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
int Bars=Bars(Symbol(),PERIOD_CURRENT);
double Point=Point();
//Etc.
//:::::::::::::::::::::::::::::::::::::::::::::::
// int counted_bars=IndicatorCounted();
//----
int i,j;
if(isNewBar1(PERIOD_M1))
{
main();
}
for(i=FW_M1,j=0;j<nr_of_sample_lines;i++,j++)
{
Buffer2[i]=svm_samples_class_dyn_1[j];
}
for( i=0; i < nr_of_test_lines;i++)
{
Buffer1[i]=ptr_predict_label__1[i];
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
double CalcBuySell(string _Sym, int _TPd,int SL,int TP,int _FW_M5,int pos)
{
int i,j;
double c=EMPTY_VALUE;
datetime t1=iTime(_Sym,_TPd,_FW_M5);
int _FW_M1=iBarShift(_Sym,PERIOD_M1,t1,true);
c=0;//EMPTY_VALUE;
double Po=Point1;//MarketInfo(_Sym,MODE_POINT);
double sp=Ask-Bid;//MarketInfo(_Sym,MODE_SPREAD)*Point1;
datetime time1=iTime(_Sym,PERIOD_M1,pos);
int ii=iBarShift(_Sym,_TPd,time1,true);
//int ii = pos;//30...504
double entry_buy = iClose(_Sym,_TPd,ii)+sp;//entry_buy=bid0+sp
double entry_sell = iClose(_Sym,_TPd,ii);//entry_sell=bid0
bool longOk=true;
bool shortOk=true;
for (int fw=1; fw<_FW_M5; fw++)
{
double l=iLow(_Sym,_TPd,ii-fw);
double h=iHigh(_Sym,_TPd,ii-fw);
if (l<=entry_buy-SL*Po) longOk=false;
if (h+sp>=entry_sell+SL*Po) shortOk=false;
if (longOk && (h>=entry_buy+TP*Po)) { c=(+1)*fw; break; }
if (shortOk && (l+sp<=entry_sell-TP*Po)) { c=(-1)*fw; break; }
}
return(c);
}
//////////////////////////////////////
int main()
{
// Setting the indexing in arrays the same as in timeseries, i.e. array element with zero
// index will store the values of the last bar, with 1th index - the last but one, etc.
ArraySetAsSeries(_ma5_1, true);
ArraySetAsSeries(_ma5_2, true);
ArraySetAsSeries(_ma5_3, true);
ArraySetAsSeries(_ma60_1, true);
ArraySetAsSeries(_ma60_2, true);
ArraySetAsSeries(_ma60_3, true);
// Using indicators handles, let's copy the values of indicator
// buffers to arrays, specially prepared for this purpose
if (CopyBuffer(MA5_1,0,0,ROW1_M1,_ma5_1) < 0){Print("CopyBuffer error =",GetLastError());}
if (CopyBuffer(MA5_2,0,0,ROW1_M1,_ma5_2) < 0){Print("CopyBuffer error =",GetLastError());}
if (CopyBuffer(MA5_3,0,0,ROW1_M1,_ma5_3) < 0){Print("CopyBuffer error =",GetLastError());}
if (CopyBuffer(MA60_1,0,0,ROW1_M1,_ma60_1) < 0){Print("CopyBuffer error =",GetLastError());}
if (CopyBuffer(MA60_2,0,0,ROW1_M1,_ma60_2) < 0){Print("CopyBuffer error =",GetLastError());}
if (CopyBuffer(MA60_3,0,0,ROW1_M1,_ma60_3) < 0){Print("CopyBuffer error =",GetLastError());}
//----
int i,j,k;
for (i=ROW1_M1-1;i>=0;i--)
{
datetime time1=iTime(SymbolName1,PeriodMinutes1,i);
int b5=iBarShift(SymbolName1,PeriodMinutes5,time1,true);
int b60=iBarShift(SymbolName1,PeriodMinutes60,time1,true);
if(b5>=0)
{
x1=_ma5_1[b5];//iMA(SymbolName,PeriodMinutes5,5,0,MODE_SMA,PRICE_CLOSE,b5);
x2=_ma5_2[b5];//iMA(SymbolName,PeriodMinutes5,10,0,MODE_SMA,PRICE_CLOSE,b5);
x3=_ma5_3[b5];//iMA(SymbolName,PeriodMinutes5,15,0,MODE_SMA,PRICE_CLOSE,b5);
at0=x1-x2;
at1=x2-x3;
at2=x1-x3;
y1=_ma5_1[b5+1];//iMA(SymbolName,PeriodMinutes5,5,0,MODE_SMA,PRICE_CLOSE,b5+1);
y2=_ma5_2[b5+1];//iMA(SymbolName,PeriodMinutes5,10,0,MODE_SMA,PRICE_CLOSE,b5+1);
y3=_ma5_3[b5+1];//iMA(SymbolName,PeriodMinutes5,15,0,MODE_SMA,PRICE_CLOSE,b5+1);
at9=y1-y2;
at10=y2-y3;
at11=y1-y3;
z1=_ma5_1[b5+2];//iMA(SymbolName,PeriodMinutes5,5,0,MODE_SMA,PRICE_CLOSE,b5+2);
z2=_ma5_2[b5+2];//iMA(SymbolName,PeriodMinutes5,10,0,MODE_SMA,PRICE_CLOSE,b5+2);
z3=_ma5_3[b5+2];//iMA(SymbolName,PeriodMinutes5,15,0,MODE_SMA,PRICE_CLOSE,b5+2);
at18=z1-z2;
at19=z2-z3;
at20=z1-z3;
}
if(b60>=0)
{
x4=_ma60_1[b60];//iMA(SymbolName,PeriodMinutes60,5,0,MODE_SMA,PRICE_CLOSE,b60);
x5=_ma60_2[b60];//iMA(SymbolName,PeriodMinutes60,10,0,MODE_SMA,PRICE_CLOSE,b60);
x6=_ma60_3[b60];//iMA(SymbolName,PeriodMinutes60,15,0,MODE_SMA,PRICE_CLOSE,b60);
at3=x4-x5;
at4=x5-x6;
at5=x4-x6;
y4=_ma60_1[b60+1];//iMA(SymbolName,PeriodMinutes60,5,0,MODE_SMA,PRICE_CLOSE,b60+1);
y5=_ma60_2[b60+1];//iMA(SymbolName,PeriodMinutes60,10,0,MODE_SMA,PRICE_CLOSE,b60+1);
y6=_ma60_3[b60+1];//iMA(SymbolName,PeriodMinutes60,15,0,MODE_SMA,PRICE_CLOSE,b60+1);
at12=y4-y5;
at13=y5-y6;
at14=y4-y6;
z4=_ma60_1[b60+2];//iMA(SymbolName,PeriodMinutes60,5,0,MODE_SMA,PRICE_CLOSE,b60+2);
z5=_ma60_2[b60+2];//iMA(SymbolName,PeriodMinutes60,10,0,MODE_SMA,PRICE_CLOSE,b60+2);
z6=_ma60_3[b60+2];//iMA(SymbolName,PeriodMinutes60,15,0,MODE_SMA,PRICE_CLOSE,b60+2);
at21=z4-z5;
at22=z5-z6;
at23=z4-z6;
}
//for (j=0;j<COL;j++)
lines_attr[i][0]=at0/Point1;
lines_attr[i][1]=at1/Point1;
lines_attr[i][2]=at2/Point1;
lines_attr[i][3]=at9/Point1;
lines_attr[i][4]=at10/Point1;
lines_attr[i][5]=at11/Point1;
lines_attr[i][6]=at18/Point1;
lines_attr[i][7]=at19/Point1;
lines_attr[i][8]=at20/Point1;
lines_attr[i][9]=at3/Point1;
lines_attr[i][10]=at4/Point1;
lines_attr[i][11]=at5/Point1;
lines_attr[i][12]=at12/Point1;
lines_attr[i][13]=at13/Point1;
lines_attr[i][14]=at14/Point1;
lines_attr[i][15]=at21/Point1;
lines_attr[i][16]=at22/Point1;
lines_attr[i][17]=at23/Point1;
}
for(i=FW_M1,j=0;j<nr_of_sample_lines;i++,j++)
{
svm_samples_class_dyn_1[j]=CalcBuySell(SymbolName1, TrainPeriod,StopLoss,TakeProfit,FW_M5,i);
for( k = 0; k < COL; k++)
svm_samples_attrib_dyn_1[j][k]=lines_attr[i][k];
}
for( i=0; i < nr_of_test_lines;i++)
{
ptr_predict_label__1[i]=0.0;
for( k = 0; k < COL; k++)
svm_test_attrib_dyn_1[i][k]=lines_attr[i][k];
}
int FutureWindow=FW_M1;
int nr_of_attrib=COL;
int res1=0;
res1= svm_classify(
svm_samples_class_dyn_1,
svm_samples_attrib_dyn_1,
svm_test_attrib_dyn_1,
nr_of_sample_lines, //2200
nr_of_test_lines, //800
nr_of_attrib,
FutureWindow,
//200
file_name,
C,
g,
svm_type,//C_SVC,
kernel_type,//RBF,
ptr_predict_label__1,//predict output
flag,//0-no file ,1-file ma,2-file ma diff
normalize,//1-normalize with std, 3-normalize with rng, 0-don't normalize
flag2,//0-do nothing 1-create model 2-predict 3-create model and predict
flag3//0-no predict file 1-predict file
);
string s1="";
for( i=0; i < nr_of_test_lines;i++)
{
if(ptr_predict_label__1[i]!=0)
s1=s1+DoubleToString(ptr_predict_label__1[i],2)+" ";
}
Print(s1);
Print("->",res1);
//----
return(0);
}