求高手指点一下,!!!这是什么原因造成的!!!只能实盘不能演示!!无法测试!!

 

arrays passed by reference only 

 

 

 程序中有一条提示“ double Euclidean_Metric(double&X_Data_Base[][v_dim_x], double Vector[v_dim_x],int num_v)”

 

 

   我的引用由问题。。。请高手指点一下,,!!! 

 

double Euclidean_Metric(double & X_Data_Base[][v_dim_x], double & Vector[v_dim_x],int num_v)

数组只能通过引用的方式传值到函数中,并且你需要定义v_dim_x的值。 

 
luenbo:

数组只能通过引用的方式传值到函数中,并且你需要定义v_dim_x的值。 

//+------------------------------------------------------------------+
//|                                        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 double Lots=0.1; //lots
extern bool RiskManagement=false; //money management
extern double RiskPercent=10; //risk in percentage
extern double MaxLots=5; //lots
extern bool Base=false;
extern double sell_threshold=0.6;
extern double buy_threshold=0.6;
extern bool inverse_position_open_=true;
extern double invers_sell_threshold=0.3;
extern double invers_buy_threshold=0.3;
extern int fast=12;
extern int slow=34;
extern int MAPeriod1=2;
extern int MAPeriod2=21;
extern int MAPeriod3=55;
extern int MAPeriod4=89;
extern int MAPeriod5=144;
extern int MAPeriod6=233;
extern int MAMethod=0;
extern int MAPrice=5;
extern bool HiddenSLTP=true;
extern int tp=40;
extern int sl=30;
extern bool close_orders=false;
double base_sell[][v_dim_x];
double base_buy[][v_dim_x];
int numbers_of_vectors_sell=0;
int numbers_of_vectors_buy=0;
int init()
  {
   if(!Base)
   {
      int Hadle_1=FileOpen("sell_Position.dat",FILE_BIN|FILE_READ);
      ArrayResize(base_sell,FileSize(Hadle_1)/(v_dim_x*8));
      
      int count=0;
      while(!FileIsEnding(Hadle_1))
      {
         base_sell[count][0]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][1]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][2]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][3]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][4]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][5]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         Print(base_buy[count][5]);
         count++;
      }
      numbers_of_vectors_sell=count;
      int Hadle_2=FileOpen("buy_Position.dat",FILE_BIN|FILE_READ);
      ArrayResize(base_buy,FileSize(Hadle_2)/(v_dim_x*8));
      count=0;
      while(!FileIsEnding(Hadle_2))
      {
         base_buy[count][0]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][1]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][2]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][3]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][4]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][5]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         Print(base_buy[count][5]);
         count++;
      }
      numbers_of_vectors_buy=count;
   }
   FileClose(Hadle_1);
   FileClose(Hadle_2);
   return(0);
  }

int deinit()
  {
   if(Base)
   {
      int Hadle_1=FileOpen("sell_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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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("buy_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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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()
  {
  
   bool MM=RiskManagement;
   if(MM){if(RiskPercent<0.1||RiskPercent>100){Comment("Invalid Risk Value.");return(0);}
   else{Lots=MathFloor((AccountFreeMargin()*AccountLeverage()*RiskPercent*Point*100)/(Ask*MarketInfo(Symbol(),MODE_LOTSIZE)*
   MarketInfo(Symbol(),MODE_MINLOT)))*MarketInfo(Symbol(),MODE_MINLOT);}}
   if(MM==false){Lots=Lots;}
   if(Lots>MaxLots)Lots=MaxLots;
   
   if((HiddenSLTP&&(Bid-OrderOpenPrice())/Point>=tp)||(HiddenSLTP&&(OrderOpenPrice()-Ask)/Point>=sl))Close_Orders_by_type(OP_SELL);
   if((HiddenSLTP&&(OrderOpenPrice()-Ask)/Point>=tp)||(HiddenSLTP&&(Bid-OrderOpenPrice())/Point>=sl))Close_Orders_by_type(OP_BUY);
   
   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駎or[5];
   
   if(Base)
   {
      if(MACD_3<=MACD_2 && MACD_2>MACD_1)
      {
         if(close_orders)Close_Orders_by_type(OP_SELL);
         if(HiddenSLTP)OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
         else OrderSend(Symbol(),OP_BUY,Lots,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_BUY);
         if(HiddenSLTP)OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
         else OrderSend(Symbol(),OP_SELL,Lots,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駎or[0]=iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1);
         ve駎or[1]=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,1);
         ve駎or[2]=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[3]=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[4]=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1);
         
         Prob_win=Euclidean_Metric(base_buy,ve駎or,numbers_of_vectors_buy);
         
         if(Prob_win>=buy_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
          else OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+sl*Point,Bid-tp*Point);}
         if(inverse_position_open_&& Prob_win<=invers_buy_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
         else OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-sl*Point,Ask+tp*Point);}
      }
      
      if(MACD_3>=MACD_2 && MACD_2<MACD_1)
      {
         if(close_orders)Close_All_Orders();
         ve駎or[0]=iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1);
         ve駎or[1]=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,1);
         ve駎or[2]=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[3]=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[4]=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1);
         
         Prob_win=Euclidean_Metric(base_sell,ve駎or,numbers_of_vectors_sell);
         
         if(Prob_win>=sell_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
         else OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-sl*Point,Ask+tp*Point);}
         if(inverse_position_open_&& Prob_win<=invers_sell_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
         else OrderSend(Symbol(),OP_SELL,Lots,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);
  }

 
fanzt2003:
//+------------------------------------------------------------------+
//|                                        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 double Lots=0.1; //lots
extern bool RiskManagement=false; //money management
extern double RiskPercent=10; //risk in percentage
extern double MaxLots=5; //lots
extern bool Base=false;
extern double sell_threshold=0.6;
extern double buy_threshold=0.6;
extern bool inverse_position_open_=true;
extern double invers_sell_threshold=0.3;
extern double invers_buy_threshold=0.3;
extern int fast=12;
extern int slow=34;
extern int MAPeriod1=2;
extern int MAPeriod2=21;
extern int MAPeriod3=55;
extern int MAPeriod4=89;
extern int MAPeriod5=144;
extern int MAPeriod6=233;
extern int MAMethod=0;
extern int MAPrice=5;
extern bool HiddenSLTP=true;
extern int tp=40;
extern int sl=30;
extern bool close_orders=false;
double base_sell[][v_dim_x];
double base_buy[][v_dim_x];
int numbers_of_vectors_sell=0;
int numbers_of_vectors_buy=0;
int init()
  {
   if(!Base)
   {
      int Hadle_1=FileOpen("sell_Position.dat",FILE_BIN|FILE_READ);
      ArrayResize(base_sell,FileSize(Hadle_1)/(v_dim_x*8));
      
      int count=0;
      while(!FileIsEnding(Hadle_1))
      {
         base_sell[count][0]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][1]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][2]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][3]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][4]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         base_sell[count][5]=FileReadDouble(Hadle_1,DOUBLE_VALUE);
         Print(base_buy[count][5]);
         count++;
      }
      numbers_of_vectors_sell=count;
      int Hadle_2=FileOpen("buy_Position.dat",FILE_BIN|FILE_READ);
      ArrayResize(base_buy,FileSize(Hadle_2)/(v_dim_x*8));
      count=0;
      while(!FileIsEnding(Hadle_2))
      {
         base_buy[count][0]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][1]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][2]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][3]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][4]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         base_buy[count][5]=FileReadDouble(Hadle_2,DOUBLE_VALUE);
         Print(base_buy[count][5]);
         count++;
      }
      numbers_of_vectors_buy=count;
   }
   FileClose(Hadle_1);
   FileClose(Hadle_2);
   return(0);
  }

int deinit()
  {
   if(Base)
   {
      int Hadle_1=FileOpen("sell_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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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("buy_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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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(),MAPeriod4,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count);
               ordinate_2=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,count);
               ordinate_3=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_4=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,count);
               ordinate_5=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,count)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,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()
  {
  
   bool MM=RiskManagement;
   if(MM){if(RiskPercent<0.1||RiskPercent>100){Comment("Invalid Risk Value.");return(0);}
   else{Lots=MathFloor((AccountFreeMargin()*AccountLeverage()*RiskPercent*Point*100)/(Ask*MarketInfo(Symbol(),MODE_LOTSIZE)*
   MarketInfo(Symbol(),MODE_MINLOT)))*MarketInfo(Symbol(),MODE_MINLOT);}}
   if(MM==false){Lots=Lots;}
   if(Lots>MaxLots)Lots=MaxLots;
   
   if((HiddenSLTP&&(Bid-OrderOpenPrice())/Point>=tp)||(HiddenSLTP&&(OrderOpenPrice()-Ask)/Point>=sl))Close_Orders_by_type(OP_SELL);
   if((HiddenSLTP&&(OrderOpenPrice()-Ask)/Point>=tp)||(HiddenSLTP&&(Bid-OrderOpenPrice())/Point>=sl))Close_Orders_by_type(OP_BUY);
   
   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駎or[5];
   
   if(Base)
   {
      if(MACD_3<=MACD_2 && MACD_2>MACD_1)
      {
         if(close_orders)Close_Orders_by_type(OP_SELL);
         if(HiddenSLTP)OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
         else OrderSend(Symbol(),OP_BUY,Lots,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_BUY);
         if(HiddenSLTP)OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
         else OrderSend(Symbol(),OP_SELL,Lots,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駎or[0]=iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1);
         ve駎or[1]=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,1);
         ve駎or[2]=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[3]=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[4]=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1);
         
         Prob_win=Euclidean_Metric(base_buy,ve駎or,numbers_of_vectors_buy);
         
         if(Prob_win>=buy_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
          else OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+sl*Point,Bid-tp*Point);}
         if(inverse_position_open_&& Prob_win<=invers_buy_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
         else OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-sl*Point,Ask+tp*Point);}
      }
      
      if(MACD_3>=MACD_2 && MACD_2<MACD_1)
      {
         if(close_orders)Close_All_Orders();
         ve駎or[0]=iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1);
         ve駎or[1]=iMA(Symbol(),Period(),MAPeriod5,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod6,0,MAMethod,MAPrice,1);
         ve駎or[2]=iMA(Symbol(),Period(),MAPeriod2,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[3]=iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod4,0,MAMethod,MAPrice,1);
         ve駎or[4]=iMA(Symbol(),Period(),MAPeriod1,0,MAMethod,MAPrice,1)/iMA(Symbol(),Period(),MAPeriod3,0,MAMethod,MAPrice,1);
         
         Prob_win=Euclidean_Metric(base_sell,ve駎or,numbers_of_vectors_sell);
         
         if(Prob_win>=sell_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
         else OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-sl*Point,Ask+tp*Point);}
         if(inverse_position_open_&& Prob_win<=invers_sell_threshold){
         if(HiddenSLTP)OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
         else OrderSend(Symbol(),OP_SELL,Lots,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);
  }

这个为什么只能实盘不能演示哪!!!!
 

代码请先点“SRC”再贴到里面:

//+------------------------------------------------------------------+
//|                                        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 double Lots=0.1; //lots
extern bool RiskManagement=false; //money management
extern double RiskPercent=10; //risk in percentage
extern double MaxLots=5; //lots
extern bool Base=false;
extern double sell_threshold=0.6;
extern double buy_threshold=0.6;
extern bool inverse_position_open_=true;
extern double invers_sell_threshold=0.3;
extern double invers_buy_threshold=0.3;
...
 
我也遇到类似问题。MQL4更新了以后,可以在界面上添加一个按钮用来执行操作。实盘时可以用来下单,但是复盘时,这个按钮无效。复盘无发检测点击事件。
 
dayuan000:
我也遇到类似问题。MQL4更新了以后,可以在界面上添加一个按钮用来执行操作。实盘时可以用来下单,但是复盘时,这个按钮无效。复盘无发检测点击事件。
我恰好问过官方,他们的回复是Strategy tester 不支持 对CHART EVENT 事件的响应.
 
//+------------------------------------------------------------------+
//|                                        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 
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);
            }
         }
      }
      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);
            }
         }
      }
   }
   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)// Build600后,必须传引用.
{
   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);
  }
 
MT4问题请到MQL4论坛提问,谢谢!
原因: