恳请版主或各位前辈帮忙使这个 EA能实际应用
#define MAINSEEK 148
#define BARSIZE 44 // LONG_VALUE + 5 * DOUBLE_VALUE
extern int Pips = 5; // BEST: (Pips = Spread + 1)
extern double Lots = 0.001;
extern int MAGIC = 112344;
extern int slip = 3;
extern double MaximumRisk=0.001;
int handle;
bool MainError;
int GetTime( int Pos )
{
int PosTime;
FileSeek(handle, MAINSEEK + Pos, SEEK_SET);
PosTime = FileReadInteger(handle);
return(PosTime);
}
bool FindTimePlace( int SearchTime )
{
int LeftTime, RightTime, PosTime;
int Left, Right, Pos;
Left = 0;
Right = FileSize(handle) - MAINSEEK - BARSIZE;
LeftTime = GetTime(Left);
RightTime = GetTime(Right);
while ((LeftTime < SearchTime) && (SearchTime < RightTime))
{
Pos = (Left + Right) / 2;
Pos -= Pos % BARSIZE;
if (Pos == Left)
break;
PosTime = GetTime(Pos);
if (SearchTime >= PosTime)
{
Left = Pos;
LeftTime = GetTime(Left);
}
else // if (SearchTime < PosTime)
{
Right = Pos;
RightTime = GetTime(Right);
}
}
if (SearchTime <= RightTime)
{
FileSeek(handle, Left + MAINSEEK, SEEK_SET);
return(TRUE);
}
else
return(FALSE);
}
double LotSize()
{
double lot_min = MarketInfo( Symbol(), MODE_MINLOT );
double lot_max = MarketInfo( Symbol(), MODE_MAXLOT );
double lot_step = MarketInfo( Symbol(), MODE_LOTSTEP );
double freemargin = AccountFreeMargin();
int leverage = AccountLeverage();
int lotsize = MarketInfo( Symbol(), MODE_LOTSIZE );
if( lot_min < 0 || lot_max <= 0.0 || lot_step <= 0.0 || lotsize <= 0 )
{
Print( "LotSize: invalid MarketInfo() results [", lot_min, ",", lot_max, ",", lot_step, ",", lotsize, "]" );
return(-1);
}
if( leverage <= 0 )
{
Print( "LotSize: invalid AccountLeverage() [", leverage, "]" );
return(-1);
}
double lot = NormalizeDouble( freemargin * MaximumRisk / leverage / 10.0, 2 );
lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
if ( lot < lot_min ) lot = lot_min;
if ( lot > lot_max ) lot = lot_max;
double needmargin = NormalizeDouble( lotsize / leverage * Ask * lot, 2 );
if ( freemargin < needmargin )
{
Print( "LotSize: We have no money. Free Margin = ", freemargin );
return(-1);
}
return(lot);
}
void init()
{
handle = FileOpenHistory(Symbol() + Period() + ".hst", FILE_BIN|FILE_READ);
if (handle > 0)
MainError = TRUE;
else
{
MainError = FALSE;
return;
}
MainError = FindTimePlace(Time[0]);
if (!MainError)
FileClose(handle);
return;
}
void deinit()
{
if (MainError)
FileClose(handle);
return;
}
bool GetPrices( int& PriceTime, int& PriceLow, int& PriceHigh)
{
PriceTime = FileReadInteger(handle);
FileSeek(handle, DOUBLE_VALUE, SEEK_CUR);
PriceLow = FileReadDouble(handle) / Point + 0.1;
PriceHigh = FileReadDouble(handle) / Point + 0.1;
FileSeek(handle, 2 * DOUBLE_VALUE, SEEK_CUR);
if (FileTell(handle) + BARSIZE <= FileSize(handle))
return(TRUE);
else
return(FALSE);
}
int GetTimeTrade( double& Price )
{
static bool FlagUP = FALSE;
static int Min = 999999;
static int Max = 0;
static int NTime;
int ResTime;
int PriceTime, PriceLow, PriceHigh;
while (TRUE)
{
if (!GetPrices(PriceTime, PriceLow, PriceHigh))
return(-1);
if (FlagUP)
{
if (PriceHigh > Max)
{
Max = PriceHigh;
NTime = PriceTime;
}
else if (Max - PriceLow >= Pips)
{
FlagUP = FALSE;
Min = PriceLow;
Price = Max * Point;
break;
}
}
else // (FlagUP == FALSE)
{
if (PriceLow < Min)
{
Min = PriceLow;
NTime = PriceTime;
}
else if (PriceHigh - Min >= Pips)
{
FlagUP = TRUE;
Max = PriceHigh;
Price = Min * Point;
break;
}
}
}
ResTime = NTime;
NTime = PriceTime;
return(ResTime);
}
void CloseOrder( int Ticket )
{
OrderSelect(Ticket, SELECT_BY_TICKET);
if (OrderType() == OP_BUY)
OrderClose(Ticket, OrderLots(), Bid, 0);
else // (OrderType() == OP_SELL)
OrderClose(Ticket, OrderLots(), Ask, 0);
return;
}
int ReverseOrder( int Ticket)
{
if (Ticket == 0)
Ticket = OrderSend(Symbol(), OP_BUY, LotSize(), Ask, slip, 0, 0,0,MAGIC,0,CLR_NONE); // static bool FlagUP = FALSE;
else
{
OrderSelect(Ticket, SELECT_BY_TICKET);
if (OrderType() == OP_BUY && OrderMagicNumber() == MAGIC)
{
OrderClose(Ticket, OrderLots(), Bid, 0);
Ticket = OrderSend(Symbol(), OP_SELL, LotSize(), Bid, slip, 0, 0,0,MAGIC,0,CLR_NONE);
}
else // (OrderType() == OP_SELL)
{
OrderClose(Ticket, OrderLots(), Ask, 0);
Ticket = OrderSend(Symbol(), OP_BUY, LotSize(), Ask, slip, 0, 0,0,MAGIC,0,CLR_NONE);
}
}
return(Ticket);
}
void System()
{
static int Ticket = 0;
static int NewTime = 0;
static double PriceOpen;
if (NewTime == 0)
NewTime = GetTimeTrade(PriceOpen);
else if (NewTime < 0)
return;
if (Time[0] == NewTime)
{
if (NormalizeDouble(Bid - PriceOpen, Digits) == 0)
{
NewTime = GetTimeTrade(PriceOpen);
if (NewTime < 0)
CloseOrder(Ticket);
else
Ticket = ReverseOrder(Ticket);
}
}
return;
}
void start()
{
if (!MainError)
return;
System();
return;
}
发表于:2011-10-17 07:36只看该作者
2楼
能实际应用什么意思啊, 这个ea能跑阿
[ 本帖最后由 boji 于 2011-10-17 15:54 编辑 ]
韬客社区www.talkfx.co