大家好,今天我想和大家分享一个我自己开发的非常简单的交易助手(EA),它是基于DeMarker指标的。之前我一直在考虑如何利用EA来辅助我的交易,最终我完成了这个项目,非常期待你们的反馈!
这个EA只针对单一货币对进行操作。你可以在菜单属性中设置时间框架、手数、止损和止盈等参数,非常方便。

extern ENUM_TIMEFRAMES TF = PERIOD_CURRENT;// 选择时间框架 extern int period = 8;// DeMarker周期 extern double lt = 0.01;// 手数 extern int sl = 100;// 止损 extern int tp = 100;// 止盈 extern double OB = 0.7;// 超卖 extern double OS = 0.3;// 超买 extern bool OPENBAR = false;// 在新K线开盘价交易
这里有一个小秘密,我把变量分成三部分:
1. 数据 | 时间框架
2. 订单
3. 货币对
//+------------------------------------------------------------------+ //-- 时间框架 | 指标 double dmrk[5]; int signal =-1;//-- 0.买 1.卖 int hold = 0; //-- 订单 int ticket =0; double lot =0.0; int typ =-1; //-- 货币对 datetime t1=0; bool newbar=false; bool entry =false; //+------------------------------------------------------------------+
在OnInit()函数中,我需要初始化DeMarker指标数组变量,并检查特定经纪商要求的最小交易手数。
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnInit() { ArrayInitialize(dmrk,0.0); //--- const double test_lot = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(lt<test_lot) lt = test_lot; }
在OnTick()函数中,我会计算指标并判断买卖信号。
//--------------------------------------------------------------------------- signal = -1; //--------------------------------------------------------------------------- //---计算 for(int i=0; i<ArraySize(dmrk); i++) { dmrk[i] = iDeMarker(Symbol(),TF,period,i); } //--- if(dmrk[1] > OB) { hold = 1;//设置 } else if(dmrk[1] < OS) { hold = -1;//设置 } else { hold = 0;//重置 } if(hold == 1) { if(dmrk[0]<OB && dmrk[1]>OB) { signal = OP_SELL; } } if(hold == -1) { if(dmrk[0]>OS && dmrk[1]<OS) { signal = OP_BUY; } }
要打开买卖信号...
//--------------------------------------------------------------------------- if(signal != -1) if(newbar==true) if(entry==false)//门打开 { //--- entry =true;//设置 //--- if(signal == OP_BUY) { ticket = OrderSend(Symbol(),OP_BUY,lt,Ask,(int)((Ask-Bid)/Point, sl>0?Bid-sl*Point:0.0, tp>0?Bid+tp*Point:0.0, EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold), EANumber, 0, clrBlue); signal=-1; //hold =0; }//重置 else if(signal == OP_SELL) { ticket = OrderSend(Symbol(),OP_SELL,lt,Bid,(int)((Ask-Bid)/Point, sl>0?Ask+sl*Point:0.0, tp>0?Ask-tp*Point:0.0, EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold), EANumber, 0, clrRed); signal=-1; }//重置信号 }
关于平仓的部分...
if(entry == true) // 平仓 { if(OrderSelect(ticket,SELECT_BY_TICKET)) { if(OrderCloseTime() == 0)//-- 订单仍在交易中 { /* 待处理的平仓条件 */ //entry = false; } //else if(OrderCloseTime() != 0)//-- 手动平仓 2.止损止盈 3. EA平仓 { entry = false;//重置entry } } }

