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