外汇EA自动交易系统编制方法详解

以下提供一段简易的参考代码,供初学者学习与交流。

//+------------------------------------------------------------------+ //| 设计者:示例代码 | //| 版权:仅供参考学习 | //+------------------------------------------------------------------+

#property copyright "示例代码,仅供学习" #property link "" #define MAGICMA 200610011231 //+------------------------------------------------------------------+

//| 注意:此处未包含指标文件属性 | //+------------------------------------------------------------------+ extern int whichmethod = 1; //1~4 种下单方式:1 仅开仓,2 有止损无止盈,3 有止盈无止损,4 有止盈也有止损 extern double TakeProfit = 100; //止盈点数 extern double StopLoss = 20; //止损点数 extern double MaximumRisk = 0.3; //资金控制,控制下单量 extern double TrailingStop =25;

//跟踪止盈点数设置 extern int maxOpen = 3; //最多开仓次数限制 extern int maxLots = 5; //最多单仓持仓量限制 extern int bb = 0; //非零则允许跟踪止盈 extern double MATrendPeriod=26;

//使用26均线作为开仓条件参数示例 int i, p2, xxx,p1, res; double Lots; datetime lasttime; //时间控制,仅当一个时间周期完成才检查条件 int init() //初始化 { Lots = 1; lasttime = NULL; return(0); } int deinit() { return(0); }

//反初始化 //主程序 int start() { CheckForOpen(); //开仓平仓条件检查及操作 if (bb0) CTP(); //跟踪止盈 return(0); }

//+------以下为各子程序--------------------------------------------+ double LotsOptimized() //确定下单量,开仓时调用,实现资金管理 { double lot=Lots; int orders=HistoryTotal();

// history orders total int losses=0; // 连续亏损订单数 //MarketInfo(Symbol(),MODE_MINLOT); 相关参数 //MarketInfo(Symbol(),MODE_MAXLOT);

//MarketInfo(Symbol(),MODE_LOTSTEP); lot=NormalizeDouble(MaximumRisk * AccountBalance()/AccountLeverage(),1); //开仓量计算 if(lot<0.1) lot=0.1; if(lot>maxLots) lot=maxLots; return(lot); }

//平仓持有的买单 void CloseBuy() { if (OrdersTotal( ) > 0 ) { for(i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderType()==OP_BUY)

{ OrderClose(OrderTicket(),OrderLots(),Bid,3,White); Sleep(5000); } } } } //平仓持有的卖单 void CloseSell() { if (OrdersTotal( ) > 0 ) { for(i=OrdersTotal()-1;i>=0;i--)

{ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,3,White); Sleep(5000); } } } }

//判断是否买入、卖出或平仓 int buyorsell() //在函数中计算交易信号,此处以MACD和均线为例

{ double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);

MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,KCM柯尔凯思外汇MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPreviousMaPrevious) return (1);

// 买入信号:均线上升,MACD在零线上,且两线交叉 if(MacdCurrent>0 && MacdCurrentSignalPrevious && MaCurrent

return (0); }