EA造假范例:读取历史交易记录

很多EA造假,是读取了历史数据,本文将给出一个完整范例,帮助大家提高鉴别能力。

#property strict

#property copyright "ATOM"
#property link      ""

#include <stderror.mqh>
#include <stdlib.mqh>

int    currentTicket=0;

double g_Point = 0.0001;
string orderstr;
int   previousBar=0;

#import "kernel32.dll"
   int CreateFileW(string, uint, int, int, int, int, int);
   int GetFileSize(int, int);
   int SetFilePointer(int, int, int&[], int);
   int ReadFile(int, uchar&[], int, int&[], int);
   int CloseHandle(int);
#import

int BytesToRead=0;

union Price
{
uchar buffer[8];
double close;
};

Price price;

double data[][2]; 

string ReadFileHst(string Filename)
{

int j=0;

string strFileContents = "";
int Handle = CreateFileW(Filename, 0x80000000, 3, 0, 3, 0, 0);
   
if (Handle == -1)
   {
     Print("Error open history!"); 
     return ("");
   }  
      
else 
   {
   int LogFileSize = GetFileSize(Handle, 0);
   
   if(LogFileSize<=0)
      {
      return ("");
      }
   
   else
      {
      
      int movehigh[1];
      
      SetFilePointer(Handle, 148, movehigh, 0);
      
      uchar buffer[];
      BytesToRead=(LogFileSize-148)/60;
      
      ArrayResize(data, BytesToRead);
      
      int nNumberOfBytesToRead=60;
      
      ArrayResize(buffer, nNumberOfBytesToRead);
      int read[1];
      
      
      for(int i=0;i<BytesToRead;i++)
      {
      ReadFile(Handle, buffer, nNumberOfBytesToRead, read, 0);
         if (read[0] == nNumberOfBytesToRead) 
            {
            string result="";
            result=StringFormat("0x%02x%02x%02x%02x%02x%02x%02x%02x",buffer[7],buffer[6],buffer[5],buffer[4],buffer[3],buffer[2],buffer[1],buffer[0]);            
            
            price.buffer[0]=buffer[32];
            price.buffer[1]=buffer[33];
            price.buffer[2]=buffer[34];
            price.buffer[3]=buffer[35];
            price.buffer[4]=buffer[36];
            price.buffer[5]=buffer[37];
            price.buffer[6]=buffer[38];
            price.buffer[7]=buffer[39];
            
            double mm=price.close;
            
            data[j][0]=StrToDouble(result);
            data[j][1]=mm;
            j++;
            
            strFileContents = TimeToStr((datetime)StrToDouble(result),TIME_DATE|TIME_MINUTES)+" "+DoubleToStr(mm,8);
            } else 
                 {
                 CloseHandle(Handle);
                 return ("");
                 }
      }
      }
      
CloseHandle(Handle);
}

strFileContents = TimeToStr((datetime)(data[j-1][0]),TIME_DATE|TIME_MINUTES)+" "+DoubleToStr(data[j-1][1],8)+" "+
TimeToStr((datetime)(data[j-2][0]),TIME_DATE|TIME_MINUTES)+" "+DoubleToStr(data[j-2][1],8);
            
return strFileContents;
}

int fnGetLotDigit()
  {
   double l_LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);
   if(l_LotStep == 1)      return(0);
   if(l_LotStep == 0.1)    return(1);
   if(l_LotStep == 0.01)   return(2);
   if(l_LotStep == 0.001)  return(3);
   if(l_LotStep == 0.0001) return(4);
   return(1);
  }


string Message(int ai_0) {
   string ls_ret_4;
   switch (ai_0) {
   case 0:
   case 1:
      ls_ret_4 = "no error";
      break;
   case 2:
      ls_ret_4 = "common error";
      break;
   case 3:
      ls_ret_4 = "invalid trade parameters";
      break;
   case 4:
      ls_ret_4 = "trade server is busy";
      break;
   case 5:
      ls_ret_4 = "old version of the client terminal";
      break;
   case 6:
      ls_ret_4 = "no connection with trade server";
      break;
   case 7:
      ls_ret_4 = "not enough rights";
      break;
   case 8:
      ls_ret_4 = "too frequent requests";
      break;
   case 9:
      ls_ret_4 = "malfunctional trade operation";
      break;
   case 64:
      ls_ret_4 = "account disabled";
      break;
   case 65:
      ls_ret_4 = "invalid account";
      break;
   case 128:
      ls_ret_4 = "trade timeout";
      break;
   case 129:
      ls_ret_4 = "invalid price";
      break;
   case 130:
      ls_ret_4 = "invalid stops";
      break;
   case 131:
      ls_ret_4 = "invalid trade volume";
      break;
   case 132:
      ls_ret_4 = "market is closed";
      break;
   case 133:
      ls_ret_4 = "trade is disabled";
      break;
   case 134:
      ls_ret_4 = "not enough money";
      break;
   case 135:
      ls_ret_4 = "price changed";
      break;
   case 136:
      ls_ret_4 = "off quotes";
      break;
   case 137:
      ls_ret_4 = "broker is busy";
      break;
   case 138:
      ls_ret_4 = "requote";
      break;
   case 139:
      ls_ret_4 = "order is locked";
      break;
   case 140:
      ls_ret_4 = "long positions only allowed";
      break;
   case 141:
      ls_ret_4 = "too many requests";
      break;
   case 145:
      ls_ret_4 = "modification denied because order too close to market";
      break;
   case 146:
      ls_ret_4 = "trade context is busy";
      break;
   case 4000:
      ls_ret_4 = "no error";
      break;
   case 4001:
      ls_ret_4 = "wrong function pointer";
      break;
   case 4002:
      ls_ret_4 = "array index is out of range";
      break;
   case 4003:
      ls_ret_4 = "no memory for function call stack";
      break;
   case 4004:
      ls_ret_4 = "recursive stack overflow";
      break;
   case 4005:
      ls_ret_4 = "not enough stack for parameter";
      break;
   case 4006:
      ls_ret_4 = "no memory for parameter string";
      break;
   case 4007:
      ls_ret_4 = "no memory for temp string";
      break;
   case 4008:
      ls_ret_4 = "not initialized string";
      break;
   case 4009:
      ls_ret_4 = "not initialized string in array";
      break;
   case 4010:
      ls_ret_4 = "no memory for array\' string";
      break;
   case 4011:
      ls_ret_4 = "too long string";
      break;
   case 4012:
      ls_ret_4 = "remainder from zero divide";
      break;
   case 4013:
      ls_ret_4 = "zero divide";
      break;
   case 4014:
      ls_ret_4 = "unknown command";
      break;
   case 4015:
      ls_ret_4 = "wrong jump (never generated error)";
      break;
   case 4016:
      ls_ret_4 = "not initialized array";
      break;
   case 4017:
      ls_ret_4 = "dll calls are not allowed";
      break;
   case 4018:
      ls_ret_4 = "cannot load library";
      break;
   case 4019:
      ls_ret_4 = "cannot call function";
      break;
   case 4020:
      ls_ret_4 = "expert function calls are not allowed";
      break;
   case 4021:
      ls_ret_4 = "not enough memory for temp string returned from function";
      break;
   case 4022:
      ls_ret_4 = "system is busy (never generated error)";
      break;
   case 4050:
      ls_ret_4 = "invalid function parameters count";
      break;
   case 4051:
      ls_ret_4 = "invalid function parameter value";
      break;
   case 4052:
      ls_ret_4 = "string function internal error";
      break;
   case 4053:
      ls_ret_4 = "some array error";
      break;
   case 4054:
      ls_ret_4 = "incorrect series array using";
      break;
   case 4055:
      ls_ret_4 = "custom indicator error";
      break;
   case 4056:
      ls_ret_4 = "arrays are incompatible";
      break;
   case 4057:
      ls_ret_4 = "global variables processing error";
      break;
   case 4058:
      ls_ret_4 = "global variable not found";
      break;
   case 4059:
      ls_ret_4 = "function is not allowed in testing mode";
      break;
   case 4060:
      ls_ret_4 = "function is not confirmed";
      break;
   case 4061:
      ls_ret_4 = "send mail error";
      break;
   case 4062:
      ls_ret_4 = "string parameter expected";
      break;
   case 4063:
      ls_ret_4 = "integer parameter expected";
      break;
   case 4064:
      ls_ret_4 = "double parameter expected";
      break;
   case 4065:
      ls_ret_4 = "array as parameter expected";
      break;
   case 4066:
      ls_ret_4 = "requested history data in update state";
      break;
   case 4099:
      ls_ret_4 = "end of file";
      break;
   case 4100:
      ls_ret_4 = "some file error";
      break;
   case 4101:
      ls_ret_4 = "wrong file name";
      break;
   case 4102:
      ls_ret_4 = "too many opened files";
      break;
   case 4103:
      ls_ret_4 = "cannot open file";
      break;
   case 4104:
      ls_ret_4 = "incompatible access to a file";
      break;
   case 4105:
      ls_ret_4 = "no order selected";
      break;
   case 4106:
      ls_ret_4 = "unknown symbol";
      break;
   case 4107:
      ls_ret_4 = "invalid price parameter for trade function";
      break;
   case 4108:
      ls_ret_4 = "invalid ticket";
      break;
   case 4109:
      ls_ret_4 = "trade is not allowed";
      break;
   case 4110:
      ls_ret_4 = "longs are not allowed";
      break;
   case 4111:
      ls_ret_4 = "shorts are not allowed";
      break;
   case 4200:
      ls_ret_4 = "object is already exist";
      break;
   case 4201:
      ls_ret_4 = "unknown object property";
      break;
   case 4202:
      ls_ret_4 = "object is not exist";
      break;
   case 4203:
      ls_ret_4 = "unknown object type";
      break;
   case 4204:
      ls_ret_4 = "no object name";
      break;
   case 4205:
      ls_ret_4 = "object coordinates error";
      break;
   case 4206:
      ls_ret_4 = "no specified subwindow";
      break;
   default:
      ls_ret_4 = "unknown error";
   }
   return (ls_ret_4);
}


int hst_handle;

int OnInit() 
{   
      
   if (Digits == 3) 
   {
      g_Point = 0.01;
   } else 
   {
      if (Digits == 5) 
      {
         g_Point = 0.0001;
      } else 
      {
         g_Point = Point;
      }
   }
   
string account_server=AccountInfoString(ACCOUNT_SERVER);
if(account_server=="") account_server="default";

string datapath=TerminalInfoString(TERMINAL_DATA_PATH)+"\\history\\"+
                account_server+"\\"+Symbol()+"240"+".hst";

string result=ReadFileHst(datapath);

previousBar=Bars;

return (0);
}


int deinit() 
{  
    Comment("");
    ChartRedraw(0);

   return (0);
}



int CheckBuyOrders(int magic)
  {  
     int op=0;
               
     for(int i=OrdersTotal()-1;i>=0;i--) 
      {
        int status=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != magic) continue;
        if ( OrderSymbol()==Symbol() )
         {  
         if (OrderType() == OP_BUY ) 
         {
          op++;
          break;
         } 
         }
      } 
   return(op);
}

int CheckSellOrders(int magic)
  {  
     int op=0;
               
     for(int i=OrdersTotal()-1;i>=0;i--) 
      {
        int status=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != magic) continue;
        if ( OrderSymbol()==Symbol() )
         {  
         if (OrderType() == OP_SELL ) 
         {
         op++;
         break;
         } 
         }
      } 
   return(op);
}

int CheckTotalBuyOrders(int magic)
  {  
     int op=0;
               
     for(int i=OrdersTotal()-1;i>=0;i--) 
      {
        int status=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != magic) continue;
        if ( OrderSymbol()==Symbol() )
         {  
         if (OrderType() == OP_BUY ) 
         {
          op++;
         } 
         }
      } 
   return(op);
}

int CheckTotalSellOrders(int magic)
  {  
     int op=0;
               
     for(int i=OrdersTotal()-1;i>=0;i--) 
      {
        int status=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != magic) continue;
        if ( OrderSymbol()==Symbol() )
         {  
         if (OrderType() == OP_SELL ) 
         {
         op++;
         } 
         }
      } 
   return(op);
}

int CheckMarketSellOrders()
{  
     int op=0;
               
     for(int i=OrdersTotal()-1;i>=0;i--) 
      {
        int status=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != MagicID) continue;
        if ( OrderSymbol()==Symbol() )
         {  
         if (OrderType() == OP_SELL ) 
         {
         op++;
         } 
         }
      } 
   return(op);
}

int CheckMarketBuyOrders()
{  
     int op=0;
               
     for(int i=OrdersTotal()-1;i>=0;i--) 
      {
        int status=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);
        if (OrderMagicNumber() != MagicID) continue;
        if ( OrderSymbol()==Symbol() )
         {  
         if (OrderType() == OP_BUY ) 
         {
         op++;
         } 
         }
      } 
   return(op);
}

bool MainOrders(int a_cmd_0, double price_24, double price_TP, double price_SL) 
{
   color color_8=Black;
   int bClosed;
   int nAttemptsLeft = Retries;
   int cmd=0;
   
   if(a_cmd_0 ==OP_BUY||a_cmd_0 ==OP_BUYSTOP)   cmd=0;
   if(a_cmd_0 ==OP_SELL||a_cmd_0 ==OP_SELLSTOP) cmd=1;
       
   if (a_cmd_0 == OP_BUYLIMIT||a_cmd_0 == OP_BUY) {
      color_8 = Blue;
   } else {
      if (a_cmd_0 == OP_SELLLIMIT||a_cmd_0 == OP_SELL) {
         color_8 = Red;
      }
   }
  
   double lots_32 = NormalizeDouble(LOTS,fnGetLotDigit());

   if(lots_32==0.0) return(0);
   
   double gd_532 = MarketInfo(Symbol(), MODE_MAXLOT);
   double gd_540 = MarketInfo(Symbol(), MODE_MINLOT);
   
   if (lots_32 > gd_532) lots_32 = gd_532;
   if (lots_32 < gd_540) lots_32 = gd_540;
      
         bClosed = false;

         while ((bClosed == false) && (nAttemptsLeft >= 0) )
         {  
             nAttemptsLeft--;
             RefreshRates();      
         
         if(!ecnBroker)   
         bClosed = OrderSend(Symbol(), a_cmd_0, lots_32, price_24, Slippage, price_SL, price_TP, Ordercomment, MagicID, 0, color_8);
         else
         bClosed = OrderSend(Symbol(), a_cmd_0, lots_32, price_24, Slippage, 0, 0, Ordercomment, MagicID, 0, color_8);
                  
         if( bClosed<=0 )
         {
               int nErrResult = GetLastError();
               
               if(a_cmd_0==0)
               {
               Print("FX EA Open New Buy FAILED : Error " + IntegerToString(nErrResult) + " [" + ErrorDescription(nErrResult) + ".]");
               Print(IntegerToString(a_cmd_0)+" "+ DoubleToString(lots_32,2)+" "+ DoubleToString(price_24,Digits));
               }
               else
               {
               if(a_cmd_0==1)
               {
               Print("FX EA Open New Sell FAILED : Error " + IntegerToString(nErrResult) + " [" + ErrorDescription(nErrResult) + ".]");
               Print(IntegerToString(a_cmd_0)+" "+ DoubleToString(lots_32,2)+" "+ DoubleToString(price_24,Digits));
               }
               }
               
               if( nErrResult == ERR_TRADE_CONTEXT_BUSY || 
                   nErrResult == ERR_NO_CONNECTION)
               {
                  Sleep(50);
                  continue;
               }
          }
          
          currentTicket = bClosed;
          
          bClosed = true;

         }
           
 
   return(true);
}


string Ordercomment = "FX_EA";
int Slippage    = 100;   

int    Retries     = 10;    

bool   AutoTrade=true;

bool   ecnBroker = false;    

int MagicID=12345678;

input double SL=50;
input double TP=11;
input double LOTS=0.01;

 


void OnTick()
{

if(previousBar!=Bars)
{
previousBar=Bars;
}
else
{
return;
}

if(BytesToRead>0)
{
int pos=-1;
for(int i=0;i<BytesToRead;i++)
{
if(data[i][0]>=Time[0])
{
pos=i;
break;
}

}

if(pos>0)
{

if(CheckMarketBuyOrders()==0&&CheckMarketSellOrders()==0)
 {
   if(data[pos][1]>Open[0])
   {
   double BuySL=NormalizeDouble(Ask - SL*g_Point,Digits); 
   double BuyTP=NormalizeDouble(Ask + TP*g_Point,Digits); 
   MainOrders(0, Ask, BuyTP, BuySL);
   }
   
   if(data[pos][1]<Open[0])
   {
   double SellSL=NormalizeDouble(Bid + SL*g_Point,Digits); 
   double SellTP=NormalizeDouble(Bid - TP*g_Point,Digits); 
   MainOrders(1, Bid, SellTP, SellSL);
   }
 }


}

}

return;
}

本博客所有文章如无特别注明均为原创。作者:天泓评测
分享到:更多

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)