2.9.1 简单EA程序源代码
//int function int init ()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage( Symbol( ) tSlippage);
}// Start function int start()
{
// Moving averages
double FastMA = iMA(NULL,0,FastMAPeriod,0,0,0,0); double SlowMA = iMA(NULL,0,SlowMAPeriod,0,0,0,0);
// Buy order
if (FastMA > SlowMA && BuyTicket ==0){
0niei5elect( SellTicket, SELECT一BYJTICKET);
// Close order
if( OrderClose,nme( ) ==0 && SellTicket > 0)
{
double CloseLots = OrderLots(); double ClosePric e = Ask ;
boot Closed = OrderClose( SellTicket 9 CloseLotsClosePrice, UseSlippage 9 Red);
}
double OpenPrice = Ask;
// Calculate stop loss and take profit
if (StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint) ; if (Takeprofit >0) double BuyTakeProfit =OpenPrice + (TakeProfit * Use Point);
// Open buy order
BuyTicket = OrderSend ( Symbol ( ) , OPJBUY, LotSize, OpenPrice, UseSlippage, BuyStopLoss,BuyTakeProfit,"Buy Order" ,MagicNumber,0,Green);
SellTicket 0 ;
//Sell Order
if(FastMA < SlowMA && SellTicket = = 0)
{
OrderSelect (BuyTicket, SELECT_BY_TICKET); if(OrderCloseTime( ) ==0 && BuyTicket >0)
{
CloseLots = OrderLots();
ClosePrice bid;
Closed = OrderClose ( BuyTicket, CloseLots, ClosePrice, UseSlippage, Red );
OpenPrice = Bid;
it(StopLoss >0) double SellStopLoss = OpenPrice + (StopLoss * UsePoint); it(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * UsePoint);
SellTicket = OrderSend( Symbol( ) ,OP_SELL, LotSize9OpenPrice,UseSlippage9 SellStopLoss,SellTakeProfitf "Sell Order" ,MagicNumber,0,Red);
BuyTicket = 0;
}
retum(O);
}
// Pip Point Function
double PipPoint(string Currency)
{
int CalcDigits = MarketInfo(Currency,MODE.DIGITS);
if( CalcDigits == 2 II CalcDigits = 3) double CalcPoint = 0.01;
else if( CalcDigits 4 II CalcDigi ts == 5) CalcPoint 0.0001 ; return( CalcPoint);
}
// GetSlippage Function
int GetSlippage( string Currency, int SlippagePips)
{
int CalcDigits = Marketinfo(Currency,MODE_DIGITS); if(CalcDigits ==211 CalcDigits == 4) double CalcSlippage = SlippagePips; else if(CalcDigits ==311 CalcDigits == 5) CalcSlippage = SlippagePips * 10; return( CalcSlippage);
在订单编号储存在执行程序之前,可以将BuyTicket和SellTicket设为总体变量Start()函数内的静态变量。添加UsepointUseSlippage为全局变量——计算这些数值。init()函数首先运行,而PipPoint()和GetSliPpage()函数将运算返回值到全局变量。使用该函数时,必须参考点位或滑点,在其他EA程序中也是一样的。
接下来的start()函数为主要程序执行函数。iMA()函数用于计算移动平均FastMA变量,并保存10期移动平均线,前面为使用FastMAPeriod。SlowMA20期移动平均线则使用了SlowMAPeriod。一切设置为默认值(无移位,按简单移动平均线收盘价计算)。
我们使用IF运算符来定义开单情况。如果目前10期的移动平均(FastMA)大于20期的移动平均(在SlowMA),并且BuyTicket等于“0”,将会开启新仓。
在开新多单时,我们会平仓目前的空单。使用OrderSelect()确认当前的Sell-Ticket。如果该订单的平仓时间为“0”(这表示命令尚未执行),SellTicket大于“0”(SellTicket可能为有效),我们会继续给予空单指示。检索多笔空单和目前平仓的Ask价格,然后再使用OrderClose()平仓空单。
接下来运算当前Ask价格,并给予OpenPrice变量,这也是我们的买单开仓价格。先检查开盘价和计算止损、停利的关系,用以确保止损值或停利值。然后,使用OrderSend()函数将交易单编号储存在BuyTicket中。最后,清除SellTicket值确保另一个卖单状态为有效。
空单命令块和多单命令块视为相同逻辑。我们先平仓多单,并用Bid价作为ClosePrice。止损和利润计算则是相反的。start()函数结束与回报。定制PipPoint()和GetSlippage()函数被定义在start()函数之后。
