//+------------------------------------------------------------------+
//|                                                   Tester_v02.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include <Train_04.mqh>
#define NR_OF_SAMPLE_LINES   2000
#define NR_OF_TEST_LINES     800
#define NR_OF_TEST_BARS      10
#define FUTURE_WINDOW        200
#include <stdlib.mqh>
extern datetime BeginDate= D'2008.11.01 00:00';
int CurrBar1;
int      MagicNumber1 = 1001;
extern double  Lots=0.1;
int     MaxOrdersTotal1=1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int myBars1;
bool isNewBar1(int tf1)
  {
//----
   bool res=false;
   if (myBars1!=iBars(Symbol(),tf1))
   {
      res=true;
      myBars1=iBars(Symbol(),tf1);
   }  
  
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  CurrBar1=iBarShift(Symbol(),PERIOD_M1,BeginDate,false); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
double t[NR_OF_SAMPLE_LINES];
double c[NR_OF_SAMPLE_LINES];
double l[NR_OF_SAMPLE_LINES];
double h[NR_OF_SAMPLE_LINES];       
double ma5_M5[NR_OF_SAMPLE_LINES];
double ma10_M5[NR_OF_SAMPLE_LINES];
double ma15_M5[NR_OF_SAMPLE_LINES];
double ma5_H1[NR_OF_SAMPLE_LINES];
double ma10_H1[NR_OF_SAMPLE_LINES];
double ma15_H1[NR_OF_SAMPLE_LINES];
double ma5_H4[NR_OF_SAMPLE_LINES];
double ma10_H4[NR_OF_SAMPLE_LINES];
double ma15_H4[NR_OF_SAMPLE_LINES];
double ptr_predict_label_1[NR_OF_TEST_LINES];
int start()
  {
  int i;
  string s1="";
//----
   if (Time[0]<BeginDate) 
   {
    return(0);
   }
if(NrOrders(MagicNumber1 )<MaxOrdersTotal1)    
if(isNewBar1(PERIOD_M1))
{
   /*
     s1=""+TimeToStr(Time[0],TIME_DATE|TIME_SECONDS);
     for(i=0;i<NR_OF_SAMPLE_LINES;i++)
     {   
       s1=s1+","+       
       iClose(NULL,PERIOD_M1,i)+","+
       iClose(NULL,PERIOD_M5,i)+","+
       iClose(NULL,PERIOD_H1,i);//+","+
       //iMA(NULL,PERIOD_M1, 5,0,MODE_SMA,PRICE_CLOSE,i)+","+
       //iMA(NULL,PERIOD_M5, 5,0,MODE_SMA,PRICE_CLOSE,i)+","+
       //iMA(NULL,PERIOD_H1, 5,0,MODE_SMA,PRICE_CLOSE,i);
       //TimeToStr(Time[1],TIME_DATE|TIME_SECONDS)+","+
       //TimeToStr(Time[2],TIME_DATE|TIME_SECONDS);
     }  
     //Write2("Tester.csv",s1);
   */
   for(i=0;i<NR_OF_SAMPLE_LINES;i++)
   {
      t[i]=iTime(NULL,PERIOD_M5,i);
      c[i]=iClose(NULL,PERIOD_M5,i);
      l[i]=iLow(NULL,PERIOD_M5,i);
      h[i]=iHigh(NULL,PERIOD_M5,i);
      
      ma5_M5[i]=iMA(NULL,PERIOD_M5,5,0,MODE_SMA,PRICE_CLOSE,i);
      ma10_M5[i]=iMA(NULL,PERIOD_M5,10,0,MODE_SMA,PRICE_CLOSE,i);
      ma15_M5[i]=iMA(NULL,PERIOD_M5,15,0,MODE_SMA,PRICE_CLOSE,i);  
      ma5_H1[i]=iMA(NULL,PERIOD_H1,5,0,MODE_SMA,PRICE_CLOSE,i);
      ma10_H1[i]=iMA(NULL,PERIOD_H1,10,0,MODE_SMA,PRICE_CLOSE,i);
      ma15_H1[i]=iMA(NULL,PERIOD_H1,15,0,MODE_SMA,PRICE_CLOSE,i);  
      ma5_H4[i]=iMA(NULL,PERIOD_H4,5,0,MODE_SMA,PRICE_CLOSE,i);
      ma10_H4[i]=iMA(NULL,PERIOD_H4,10,0,MODE_SMA,PRICE_CLOSE,i);
      ma15_H4[i]=iMA(NULL,PERIOD_H4,15,0,MODE_SMA,PRICE_CLOSE,i);
      
   }
   for(i=0;i<NR_OF_TEST_LINES;i++)
   {
      ptr_predict_label_1[i]=0; 
   }    
   //Print(t[0]);
   int NrTrainBars=NR_OF_SAMPLE_LINES;
   int NrTestBars=NR_OF_TEST_LINES;
   int FutureWindow=FUTURE_WINDOW;
	int StopLoss=70;		//70
	int TakeProfit=70;	//70								
   int spread=MarketInfo(Symbol(),MODE_SPREAD);
   double Point1=MarketInfo(Symbol(),MODE_POINT);
   //string filename1="c:\\mt4\\t4\\test04_1_"+(myBars1-CurrBar1)+".libsvm";
   string filename1="c:\\test04_1_"+Symbol()+".libsvm";
   double C=32.0;
   double gamma=2.0;
   Example5(  
                        t,
                        c,
                        l,
                        h,
                        ma5_M5,
                        ma10_M5,
                        ma15_M5,
                        ma5_H1,
                        ma10_H1,
                        ma15_H1,
                        ma5_H4,
                        ma10_H4,
                        ma15_H4,      
						      NrTrainBars, //2200
						      NrTestBars, //800
					         FutureWindow,	//200
					         StopLoss,		//70
					         TakeProfit,	//70								
					         Point1,
					         spread,
		                  filename1,
								C,
								gamma,
								ptr_predict_label_1, //output label 		                  
		                  0,  //0-no file ,1-file ma,2-file ma diff,3-file libsvm
		                  1,  //0-don't normalize, 1-normalize with std, 2-normalize with train mean, 3-normalize with range, 4-normalize with train range
		                  3,  //0-do nothing 1-create model 2-predict only 3-create model and predict
		                  0   //0-no predict file, 1-predict file, 2-predict and range file
		                  
		       );  
		       
   int buy=0;
   int sell=0; 
   string ss1=""; 
   int res1=0;		         
   //for(i=FUTURE_WINDOW/2;i>=0;i--)   
   //for(i=0;i<NR_OF_TEST_LINES/2;i++)
   
   for(i=0;i<NR_OF_TEST_BARS;i++)
   {
         if (ptr_predict_label_1[i]==1)
         {
           buy++;   
           ss1=ss1+"0";
         }  
         if (ptr_predict_label_1[i]==-1)
         {
           sell++;              
           ss1=ss1+"1";
         }     
   }
   
       if(buy>sell)
         res1=1;
       else if(buy<sell)
         res1=-1;
       Print("class=",res1,"->",ss1); 
       if (res1==-1) 
       {
           Sell(MagicNumber1,Lots,TakeProfit,StopLoss );
       }  
       else if (res1==1) 
       {
           Buy(MagicNumber1,Lots,TakeProfit,StopLoss );
       }  
           		       
} 
   
//----
   return(0);
}
//+------------------------------------------------------------------+
int Write2(string filename,string str)
{
//Write log file
   
   int handle; 
   handle = FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV,"/t");
   FileSeek(handle, 0, SEEK_END);      
   //FileWrite(handle,"" + TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS) + ": " + str);
   FileWrite(handle,str);
   FileClose(handle);
	//Print(str);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Buy(int Magic,double Lots,int TakeProfit, int StopLoss )
{
    //if(NrOrders(MagicNumber1 )<MaxOrdersTotal1)    
    {
      int ticket=OrdSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"SVM_EA",Magic,0,Green);
      if(ticket>0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
      }
      else 
        Print("Error opening BUY order : ",GetLastError()); 
    }    
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Sell(int Magic,double Lots,int TakeProfit, int StopLoss )
{
    //if(NrOrders(MagicNumber1 )<MaxOrdersTotal1)    
    {
      int ticket=OrdSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"SVM_EA",Magic,0,Red);
      if(ticket>0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
      }
      else 
        Print("Error opening SELL order : ",GetLastError()); 
     }
} 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int NrOrders(int Magic ) 
{
   int total = OrdersTotal();
   int nrLongs = 0;
   int nrShorts = 0;
   for(int cnt=0; cnt<total; cnt++) {
      OrderSelect(cnt, SELECT_BY_POS);
      if( OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic )
         continue;
      if (OrderType()==OP_BUY) nrLongs++;
      if (OrderType()==OP_SELL) nrShorts++;
   }
   return(nrLongs+nrShorts);
}   
int Write(string str)
{
//Write log file
   string filename="SVM_EA.log";
   int handle; 
   handle = FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV,"/t");
   FileSeek(handle, 0, SEEK_END);      
   FileWrite(handle," Time " + TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS) + ": " + str);
   FileClose(handle);
	Print(str);
}
int OrdSend(string _symbol, int _cmd, double _volume, double _price, int _slippage, double _stoploss, double _takeprofit, string _comment="", int _magic=0, datetime _expiration=0, color _arrow_color=CLR_NONE) 
{
int NumberOfTries=10;
int RetryTime=2;
//Send order with retry capabilities and log
int _stoplevel=MarketInfo(_symbol,MODE_STOPLEVEL);
double _priceop=0;
int ticket,err,tries;
tries = 0;
switch (_cmd) {
    case OP_BUY:
        if (!IsTradeContextBusy() && IsTradeAllowed()) {
        while (tries < NumberOfTries) {
            RefreshRates();
            ticket = OrderSend(_symbol,OP_BUY,_volume,Ask,_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);
            if(ticket<=0) {
                Write("Error Occured : "+ErrorDescription(GetLastError()));
                Write(Symbol()+" Buy @ "+Ask+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
                tries++;
            } else {
                tries = NumberOfTries;
                Write("Order opened : "+Symbol()+" Buy @ "+Ask+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
            }
            Sleep(RetryTime*1000);
        }
        }
        err=ticket;
        break;
 
    case OP_SELL:
        if (!IsTradeContextBusy() && IsTradeAllowed()) {
        while (tries < NumberOfTries) {
            RefreshRates();
            ticket = OrderSend(_symbol,OP_SELL,_volume,Bid,_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);
            if(ticket<=0) {
                Write("Error Occured : "+ErrorDescription(GetLastError()));
                Write(Symbol()+" Sell @ "+Bid+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
                tries++;
            } else {
                tries = NumberOfTries;
                Write("Order opened : "+Symbol()+" Sell @ "+Bid+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
            }
            Sleep(RetryTime*1000);    
        }
        }
        err=ticket;
        break;
 
    case OP_BUYSTOP:
        while (tries < NumberOfTries) {
            RefreshRates();
            if ((_price-Ask)<_stoplevel*Point) _priceop=Ask+_stoplevel*Point; else _priceop=_price;            
            ticket = OrderSend(_symbol,OP_BUYSTOP,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);
            if(ticket<=0) {
                Write("Error Occured : "+ErrorDescription(GetLastError()));
                Write(Symbol()+" Buy Stop @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
                tries++;
            } else {
                tries = NumberOfTries;
                Write("Order opened : "+Symbol()+" Buy Stop@ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
            }
            Sleep(RetryTime*1000);
        }
        err=ticket;
        break;
 
 
    case OP_SELLSTOP:
        if (!IsTradeContextBusy() && IsTradeAllowed()) {
        while (tries < NumberOfTries) {
            RefreshRates();
            if ((Bid-_price)<_stoplevel*Point) _priceop=Bid-_stoplevel*Point; else _priceop=_price;            
            ticket = OrderSend(_symbol,OP_SELLSTOP,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);
            if(ticket<=0) {
                Write("Error Occured : "+ErrorDescription(GetLastError()));
                Write(Symbol()+" Sell Stop @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
                tries++;
            } else {
                tries = NumberOfTries;
                Write("Order opened : "+Symbol()+" Sell Stop @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
            }
            Sleep(RetryTime*1000);
        }
        }
        err=ticket;
        break;
 
 
    case OP_BUYLIMIT:
        if (!IsTradeContextBusy() && IsTradeAllowed()) {
        while (tries < NumberOfTries) {
            RefreshRates();
            if ((Ask-_price)<_stoplevel*Point) _priceop=Ask-_stoplevel*Point; else _priceop=_price;            
            ticket = OrderSend(_symbol,OP_BUYLIMIT,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);
            if(ticket<=0) {
                Write("Error Occured : "+ErrorDescription(GetLastError()));
                Write(Symbol()+" Buy Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
                tries++;
            } else {
                tries = NumberOfTries;
                Write("Order opened : "+Symbol()+" Buy Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
            }
            Sleep(RetryTime*1000);
        }
        }
        err=ticket;
        break;
 
    case OP_SELLLIMIT:
        if (!IsTradeContextBusy() && IsTradeAllowed()) {
        while (tries < NumberOfTries) {
            RefreshRates();
            if ((_price-Bid)<_stoplevel*Point) _priceop=Bid+_stoplevel*Point; else _priceop=_price;            
            ticket = OrderSend(_symbol,OP_BUYLIMIT,_volume,NormalizeDouble(_priceop,Digits),_slippage,NormalizeDouble(_stoploss,Digits),NormalizeDouble(_takeprofit,Digits),_comment,_magic,_expiration,_arrow_color);
            if(ticket<=0) {
                Write("Error Occured : "+ErrorDescription(GetLastError()));
                Write(Symbol()+" Sell Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
                tries++;
            } else {
                tries = NumberOfTries;
                Write("Order opened : "+Symbol()+" Sell Limit @ "+_priceop+" SL @ "+_stoploss+" TP @"+_takeprofit+" ticket ="+ticket);
            }
            Sleep(RetryTime*1000);
        }
        err=ticket;
        }
        break;
 
    default:
        Write("No valid type of order found");
        err=-1;
        break;
}
return(err);
}
     
             
            
            
            
Comments