MetaTrader4
使用DeMarker指标的简单EA - 适用于MetaTrader 4的交易助手
大家好,今天我想和大家分享一个我自己开发的非常简单的交易助手(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
}
}
}
2020.12.17