很多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; }
发表评论