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);

  }