如同使用经验,就是个典型的单向马丁,不过有设置均价+50point的止盈,或48小时超时关闭,以及净值控制,最高值跌落20%全损出局。
EA应该是2014年的,那是1pip = 1 point,现在1 pip在五位平台等于10point,因此本EA成了一个小间距的马丁,有助于快速反弹回来,碰到连续单边还是够呛,加码可是1.667倍。
EA使用当前周期的收盘价,因此占用系统资源较少,值得提倡。
本站得到的orginal源码,跟decompile源码不同,但参数里有时间过滤开关,orginal源码里并没有对应代码,可能是被原作者删除了。
以下是有特色的功能段,供赏析。
净值控制代码
double CurrentPairProfit=CalculateProfit();
if(UseEquityStop)//false
{
// 20%
if(CurrentPairProfit<0 && MathAbs(CurrentPairProfit)>(TotalEquityRisk/100)*AccountEquityHigh())
{
CloseThisSymbolAll();
Print("Closed All due to Stop Out");
NewOrdersPlaced=false;
}
}
函数部分代码
double AccountEquityHigh()
{
static double AccountEquityHighAmt,PrevEquity;
if(CountTrades()==0) AccountEquityHighAmt=AccountEquity();//记录净值
// 现值 < 前净值 现值 = 前净值
if(AccountEquityHighAmt<PrevEquity) AccountEquityHighAmt=PrevEquity;
else AccountEquityHighAmt=AccountEquity();
PrevEquity=AccountEquity();
return(AccountEquityHighAmt);
}
自动手数代码
double fGetLots(int aTradeType)
{
double tLots=0.;
datetime LastClosedTime=0;
switch(MMType)
{
case 0:
tLots=Lots;
break;
case 1:
tLots=NormalizeDouble(Lots*MathPow(LotExponent,NumOfTrades),LotsDigits);
break;
case 2:
tLots=Lots;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(LastClosedTime<OrderCloseTime())
{
LastClosedTime=OrderCloseTime();
if(OrderProfit()<0)
{
tLots=NormalizeDouble(OrderLots()*LotExponent,LotsDigits);
}
else
{
tLots=Lots;
}
}
}
}
else
{
return(-3);
}
}
break;
}
if(AccountFreeMarginCheck(Symbol(),aTradeType,tLots)<=0)
{
return(-1);
}
if(GetLastError()==134)
{
return(-2);
}
return(tLots);
}
开单函数代码
int OpenPendingOrder(int pType,double pLots,double pLevel,int sp,double pr,int sl,int tp,string pComment,int pMagic,datetime pExpiration,color pColor)
{
int tt=0;
int err=0;
int c=0;
int NumberOfTries=100;
switch(pType)
{
case OP_BUYLIMIT:
for(c=0; c<NumberOfTries; c++)
{
tt=OrderSend(Symbol(),OP_BUYLIMIT,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 || err==146 || err==136) //Busy errors
{
Sleep(1000);
continue;
}
else //normal error
{
break;
}
}
}
break;
case OP_BUYSTOP:
for(c=0; c<NumberOfTries; c++)
{
tt=OrderSend(Symbol(),OP_BUYSTOP,pLots,pLevel,sp,StopLong(pr,sl),TakeLong(pLevel,tp),pComment,pMagic,pExpiration,pColor);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 || err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
break;
case OP_BUY:
for(c=0; c<NumberOfTries; c++)
{
RefreshRates();
tt=OrderSend(Symbol(),OP_BUY,pLots,Ask,sp,StopLong(Bid,sl),TakeLong(Ask,tp),pComment,pMagic,pExpiration,pColor);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 || err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
break;
case OP_SELLLIMIT:
for(c=0; c<NumberOfTries; c++)
{
tt=OrderSend(Symbol(),OP_SELLLIMIT,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 || err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
break;
case OP_SELLSTOP:
for(c=0; c<NumberOfTries; c++)
{
tt=OrderSend(Symbol(),OP_SELLSTOP,pLots,pLevel,sp,StopShort(pr,sl),TakeShort(pLevel,tp),pComment,pMagic,pExpiration,pColor);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 || err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
break;
case OP_SELL:
for(c=0; c<NumberOfTries; c++)
{
tt=OrderSend(Symbol(),OP_SELL,pLots,Bid,sp,StopShort(Ask,sl),TakeShort(Bid,tp),pComment,pMagic,pExpiration,pColor);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 || err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
break;
}
return(tt);
}
其它没特色了。
发表评论