Stat_Euclidean_Metric





//+------------------------------------------------------------------+
//|                                        Stat_Euclidean_Metric.mq4 |
//|                                                      StatBars TO |
//|                                      http://ridecrufter.narod.ru |
//+------------------------------------------------------------------+
#property copyright "StatBars TO"
#property link      "http://ridecrufter.narod.ru"

#define v_dim_x 6 //Êîëè÷åñòâî âåêòîðîâ ó÷àâñòâóþùèõ â ðàñïîçíîâàíèè...
#define Num_neighbour 10 //Êîëè÷åñòâî áëèæàéøèõ ñîñåäåé ïî êîòîðûì è ïðèíèìàåòñÿ ðåøåíèå î ïðåíàäëåæíîñòè âåêòîðà ê 0 èëè 1

extern bool Base=false;
extern double buy_threshold=0.6;
extern double sell_threshold=0.6;
extern bool inverse_position_open_?=true;
extern double invers_buy_threshold=0.3;
extern double invers_sell_threshold=0.3;
extern int fast=12;
extern int slow=34;
extern int tp=40;
extern int sl=30;
extern bool close_orders=false;

double base_buy[][v_dim_x];
double base_sell[][v_dim_x];

int numbers_of_vectors_buy=0;
int numbers_of_vectors_sell=0;

int init()
  {
   if(!Base)
   {
      int Hadle_1=FileOpen("Buy_Position.dat",FILE_BIN|FILE_READ);
      ArrayResize(base_buy,FileSize(Hadle_1)/(v_dim_x*8));
      
      int count=0;
      while(!FileIsEnding(Hadle_1))
      {
         base_buy[count][0]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_buy[count][1]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_buy[count][2]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_buy[count][3]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_buy[count][4]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_buy[count][5]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         Print(base_sell[count][5]);
         count++;
      }
      numbers_of_vectors_buy=count;
      int Hadle_2=FileOpen("Sell_Position.dat",FILE_BIN|FILE_READ);
      ArrayResize(base_sell,FileSize(Hadle_2)/(v_dim_x*8));
      count=0;
      while(!FileIsEnding(Hadle_2))
      {
         base_sell[count][0]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_sell[count][1]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_sell[count][2]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_sell[count][3]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_sell[count][4]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_sell[count][5]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         Print(base_sell[count][5]);
         count++;
      }
      numbers_of_vectors_sell=count;
   }
   FileClose(Hadle_1);
   FileClose(Hadle_2);
   return(0);
  }


int deinit()
  {
   if(Base)
   {
      int Hadle_1=FileOpen("Buy_Position.dat",FILE_BIN|FILE_WRITE);
      
   
      int count;
   
      double ordinate_1,ordinate_2,ordinate_3,ordinate_4,ordinate_5;
   
      for(int i=OrdersHistoryTotal()-1;i>=0;i--)
      {
         OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
         if(OrderType()==0)
         {
            if(OrderProfit()>=0)//Çäåñü çàïèñûâàåòñÿ áàçà âåêòîðîâ äëÿ ïîëîæèòåëüíî çàêðûâøèõñÿ îðäåðîâ
            {
               count=iBarShift(Symbol(),Period(),OrderOpenTime());
               count++;//Ìû áóäåì ðàññìàòðèâàòü ïðåäûäóùèé áàð(ïåðåä îòêðûòèåì îðäåðà) ÷òîáû ïðîãíîçèðîâàòü óáûòî÷íîñòü/ïðèáûëüíîñòü ïîçèöèè
               ordinate_1=iMA(Symbol(),Period(),89,0,0,5,count)/iMA(Symbol(),Period(),144,0,0,5,count);
               ordinate_2=iMA(Symbol(),Period(),144,0,0,5,count)/iMA(Symbol(),Period(),233,0,0,5,count);
               ordinate_3=iMA(Symbol(),Period(),21,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_4=iMA(Symbol(),Period(),55,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_5=iMA(Symbol(),Period(),2,0,0,5,count)/iMA(Symbol(),Period(),55,0,0,5,count);
            
               FileWriteDouble(Hadle_1,ordinate_1,DOUBLE_VALUE);//Çàïèñûâàåì âåêòîð â áàçó...
               FileWriteDouble(Hadle_1,ordinate_2,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,ordinate_3,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,ordinate_4,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,ordinate_5,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,1,DOUBLE_VALUE);
            }
            if(OrderProfit()<0)//Çäåñü çàïèñûâàåòñÿ áàçà âåêòîðîâ äëÿ çàêðûâøèõñÿ îðäåðîâ ñ îòðèöàòåëüíûì ïðîôèòîì(ïðîùå ãîâîðÿ ñ ëîñîì)
            {
               count=iBarShift(Symbol(),Period(),OrderOpenTime());
               count++;//Ìû áóäåì ðàññìàòðèâàòü ïðåäûäóùèé áàð(ïåðåä îòêðûòèåì îðäåðà) ÷òîáû ïðîãíîçèðîâàòü óáûòî÷íîñòü/ïðèáûëüíîñòü ïîçèöèè
               ordinate_1=iMA(Symbol(),Period(),89,0,0,5,count)/iMA(Symbol(),Period(),144,0,0,5,count);
               ordinate_2=iMA(Symbol(),Period(),144,0,0,5,count)/iMA(Symbol(),Period(),233,0,0,5,count);
               ordinate_3=iMA(Symbol(),Period(),21,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_4=iMA(Symbol(),Period(),55,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_5=iMA(Symbol(),Period(),2,0,0,5,count)/iMA(Symbol(),Period(),55,0,0,5,count);
            
               FileWriteDouble(Hadle_1,ordinate_1,DOUBLE_VALUE);//Çàïèñûâàåì âåêòîð â áàçó...
               FileWriteDouble(Hadle_1,ordinate_2,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,ordinate_3,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,ordinate_4,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,ordinate_5,DOUBLE_VALUE);
               FileWriteDouble(Hadle_1,0,DOUBLE_VALUE);//Îáðàòèòü âíèìàíèå ÷òî çäåñü âåêòîð ïîìå÷åí êàê 0, à âûøå êàê 1
            }
         }
      }
      int Hadle_2=FileOpen("Sell_Position.dat",FILE_BIN|FILE_WRITE);
      for(i=OrdersHistoryTotal()-1;i>=0;i--)
      {
         OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
         if(OrderType()==1)//Òåïåðü çàïèñûâàåì áàçó äëÿ êîðîòêèõ ïîçèöèé
         {
            if(OrderProfit()>=0)//Çäåñü çàïèñûâàåòñÿ áàçà âåêòîðîâ äëÿ ïîëîæèòåëüíî çàêðûâøèõñÿ îðäåðîâ
            {
               count=iBarShift(Symbol(),Period(),OrderOpenTime());
               count++;//Ìû áóäåì ðàññìàòðèâàòü ïðåäûäóùèé áàð(ïåðåä îòêðûòèåì îðäåðà) ÷òîáû ïðîãíîçèðîâàòü óáûòî÷íîñòü/ïðèáûëüíîñòü ïîçèöèè
               ordinate_1=iMA(Symbol(),Period(),89,0,0,5,count)/iMA(Symbol(),Period(),144,0,0,5,count);
               ordinate_2=iMA(Symbol(),Period(),144,0,0,5,count)/iMA(Symbol(),Period(),233,0,0,5,count);
               ordinate_3=iMA(Symbol(),Period(),21,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_4=iMA(Symbol(),Period(),55,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_5=iMA(Symbol(),Period(),2,0,0,5,count)/iMA(Symbol(),Period(),55,0,0,5,count);
            
               FileWriteDouble(Hadle_2,ordinate_1,DOUBLE_VALUE);//Çàïèñûâàåì âåêòîð â áàçó...
               FileWriteDouble(Hadle_2,ordinate_2,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,ordinate_3,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,ordinate_4,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,ordinate_5,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,1,DOUBLE_VALUE);
            }
            if(OrderProfit()<0)//Çäåñü çàïèñûâàåòñÿ áàçà âåêòîðîâ äëÿ çàêðûâøèõñÿ îðäåðîâ ñ îòðèöàòåëüíûì ïðîôèòîì(ïðîùå ãîâîðÿ ñ ëîñîì)
            {
               count=iBarShift(Symbol(),Period(),OrderOpenTime());
               count++;//Ìû áóäåì ðàññìàòðèâàòü ïðåäûäóùèé áàð(ïåðåä îòêðûòèåì îðäåðà) ÷òîáû ïðîãíîçèðîâàòü óáûòî÷íîñòü/ïðèáûëüíîñòü ïîçèöèè
               ordinate_1=iMA(Symbol(),Period(),89,0,0,5,count)/iMA(Symbol(),Period(),144,0,0,5,count);
               ordinate_2=iMA(Symbol(),Period(),144,0,0,5,count)/iMA(Symbol(),Period(),233,0,0,5,count);
               ordinate_3=iMA(Symbol(),Period(),21,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_4=iMA(Symbol(),Period(),55,0,0,5,count)/iMA(Symbol(),Period(),89,0,0,5,count);
               ordinate_5=iMA(Symbol(),Period(),2,0,0,5,count)/iMA(Symbol(),Period(),55,0,0,5,count);
            
               FileWriteDouble(Hadle_2,ordinate_1,DOUBLE_VALUE);//Çàïèñûâàåì âåêòîð â áàçó...
               FileWriteDouble(Hadle_2,ordinate_2,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,ordinate_3,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,ordinate_4,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,ordinate_5,DOUBLE_VALUE);
               FileWriteDouble(Hadle_2,0,DOUBLE_VALUE);//Îáðàòèòü âíèìàíèå ÷òî çäåñü âåêòîð ïîìå÷åí êàê 0, à âûøå êàê 1
            }
         }
      }
   }
   return(0);
  }


int start()
  {
   
   if(!isNewBar())return(0);
   
   double MACD_1=iMACD(Symbol(),Period(),fast,slow,9,PRICE_TYPICAL,0,1);
   double MACD_2=iMACD(Symbol(),Period(),fast,slow,9,PRICE_TYPICAL,0,2);
   double MACD_3=iMACD(Symbol(),Period(),fast,slow,9,PRICE_TYPICAL,0,3);
   double Prob_win;
   double veñtor[5];
   
   if(Base)
   {
      if(MACD_3<=MACD_2 && MACD_2>MACD_1)
      {
         if(close_orders)Close_Orders_by_type(OP_BUY);
         OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask+sl*Point,Bid-tp*Point);
      }
      
      if(MACD_3>=MACD_2 && MACD_2<MACD_1)
      {
         if(close_orders)Close_Orders_by_type(OP_SELL);
         OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-sl*Point,Ask+tp*Point);
      }
   }
   if(!Base)
   {
      if(MACD_3<=MACD_2 && MACD_2>MACD_1)
      {
         if(close_orders)Close_All_Orders();
         veñtor[0]=iMA(Symbol(),Period(),89,0,0,5,1)/iMA(Symbol(),Period(),144,0,0,5,1);
         veñtor[1]=iMA(Symbol(),Period(),144,0,0,5,1)/iMA(Symbol(),Period(),233,0,0,5,1);
         veñtor[2]=iMA(Symbol(),Period(),21,0,0,5,1)/iMA(Symbol(),Period(),89,0,0,5,1);
         veñtor[3]=iMA(Symbol(),Period(),55,0,0,5,1)/iMA(Symbol(),Period(),89,0,0,5,1);
         veñtor[4]=iMA(Symbol(),Period(),2,0,0,5,1)/iMA(Symbol(),Period(),55,0,0,5,1);
         
         Prob_win=Euclidean_Metric(base_sell,veñtor,numbers_of_vectors_sell);
         
         if(Prob_win>=sell_threshold)OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask+sl*Point,Bid-tp*Point);
         if(inverse_position_open_? && Prob_win<=invers_sell_threshold)OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-sl*Point,Ask+tp*Point);
      }
      
      if(MACD_3>=MACD_2 && MACD_2<MACD_1)
      {
         if(close_orders)Close_All_Orders();
         veñtor[0]=iMA(Symbol(),Period(),89,0,0,5,1)/iMA(Symbol(),Period(),144,0,0,5,1);
         veñtor[1]=iMA(Symbol(),Period(),144,0,0,5,1)/iMA(Symbol(),Period(),233,0,0,5,1);
         veñtor[2]=iMA(Symbol(),Period(),21,0,0,5,1)/iMA(Symbol(),Period(),89,0,0,5,1);
         veñtor[3]=iMA(Symbol(),Period(),55,0,0,5,1)/iMA(Symbol(),Period(),89,0,0,5,1);
         veñtor[4]=iMA(Symbol(),Period(),2,0,0,5,1)/iMA(Symbol(),Period(),55,0,0,5,1);
         
         Prob_win=Euclidean_Metric(base_buy,veñtor,numbers_of_vectors_buy);
         
         if(Prob_win>=buy_threshold)OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-sl*Point,Ask+tp*Point);
         if(inverse_position_open_? && Prob_win<=invers_buy_threshold)OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask+sl*Point,Bid-tp*Point);
         
         
      }
   }

   return(0);
  }


void Close_Orders_by_type(int type)
{
   for(int num=OrdersTotal()-1;num>=0;num--)       
   {
      OrderSelect(num,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()==type)
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Gold);
   }
}
void Close_All_Orders()
{
   for(int num=OrdersTotal()-1;num>=0;num--)       
   {
      OrderSelect(num,SELECT_BY_POS,MODE_TRADES);
      if(OrderProfit()>0)
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Gold);
   }
}

double Euclidean_Metric(double&X_Data_Base[][v_dim_x], double Vector[v_dim_x],int num_v)
{
   int i=0,i1=0,i3,i2,i4;
   double Metric[1];
   double t,sum;
   ArrayResize(Metric,num_v);
   ArrayInitialize(Metric,0.0);
   
   for(i=0;i<num_v;i++)
   {
      for(i1=0;i1<v_dim_x-1;i1++)Metric[i]+=MathPow(X_Data_Base[i][i1]-Vector[i1],2);
      Metric[i]=MathSqrt(Metric[i]);
   }
   
   //sort by ASCEND Metric
   for(i3=0;i3<num_v-1;i3++)
      for(i2=i3+1;i2<num_v;i2++)     
         if(Metric[i3]>Metric[i2])
         {
            t=Metric[i3];
            Metric[i3]=Metric[i2];
            Metric[i2]=t;
            for(i4=0;i4<v_dim_x;i4++)
            {
               t=X_Data_Base[i3][i4];
               X_Data_Base[i3][i4]=X_Data_Base[i2][i4];
               X_Data_Base[i2][i4]=t;
            }
         }
   sum=0;
   for(i=0;i<Num_neighbour;i++)
   {
      sum+=X_Data_Base[i][5];//ñóììèðóåì 0 è 1 áëèæàéøèõ ñîñåäåé ÷òîáû âûâåñòè èòîãîâóþ âåðîÿòíîñòü âûèãðûøà â ýòîé ñäåëêå
      //Print(X_Data_Base[i][5]);
   }
   return(sum/Num_neighbour);
}

bool isNewBar()
  {
  static datetime BarTime;  
   bool res=false;
    
   if (BarTime!=Time[0]) 
      {
         BarTime=Time[0];  
         res=true;
      } 
   return(res);
  }



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:

Moving average indicator
MACD Histogram


Custom Indicators Used:

Order Management characteristics:
Checks for the total of closed orders
It automatically opens orders when conditions are reached
Checks for the total of open orders
It Closes Orders by itself

Other Features:

Uses files from the file system

It reads information from a file
It writes information to file

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.49 Total Net Profit:-258.20

BackTest : EURUSD on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.35 Total Net Profit:-119.36

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.71 Total Net Profit:-71.60

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.82 Total Net Profit:-28.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.62 Total Net Profit:-170.00

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.57 Total Net Profit:-85.41

Request Backtest for Stat_Euclidean_Metric


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: