在本文中,可以选择 EA 的信号计算是否激活多时间帧,亦或激活单一时间帧。
三角移动平均线是由作者 Mladen Rakic 自定义的一款 MT5 指标,我已获得作者的许可,可以使用他的指标作为多币种智能交易系统 TriangularMA_MTF_MCEA 的信号。
向作者 Mladen Rakic 致敬并感谢。
我们都知道,在交易终端和策略测试器上进行多币种交易,都可以借助 MQL5 提供的强大能力和设施。
因此,我们的目标是满足交易者的基本需求,即有效的高性能交易机器人,故此,依据高可靠 MQL5 提供的能力和设施,我们就能创建一款简单的多币种 EA,在本文中,且所用指标信号:三角移动平均线指标。
尾随止损和尾随止盈
选项:“使用尾随止损/止盈(是)或(否)”
如果”使用尾随止损/止盈(否)“选项,则智能系统不会执行尾随止损和尾随止盈。
如果选项“使用尾随 SL/TP(是)”:
再次给出选项:“使用自动尾随(是)或(否)”
如果选项“使用自动尾随(是)”,则尾随止损将由智能系统使用
自动选择的时间帧计算三角形移动平均缓冲区 0(指标数据),同时
基于变量值 TPmin(最小尾随盈利值)执行尾随止盈。
如果选项”使用自动尾随(否)“,则智能系统将采用输入属性中的值执行尾随止损。
注意:智能系统将同时执行尾随止盈和尾随止损。
尾随止损价格函数:
double MCEA::TSPrice(const string xsymb,ENUM_POSITION_TYPE ptype,int TS_type)
{
//---
int br=2;
double pval=0.0;
int x=PairsIdxArray(xsymb);
Pips(xsymb);
//--
switch(TS_type)
{
case 0:
{
RefreshTick(xsymb);
if(ptype==POSITION_TYPE_BUY) pval=mc_symbol.NormalizePrice(mc_symbol.Bid()-TSval*pip);
if(ptype==POSITION_TYPE_SELL) pval=mc_symbol.NormalizePrice(mc_symbol.Ask()+TSval*pip);
break;
}
case 1:
{
double TriMAID[];
//--
ArrayResize(TriMAID,br,br);
ArraySetAsSeries(TriMAID,true);
CopyBuffer(hTriMAt[x],0,0,br,TriMAID); // Copy buffer 0 from the hTriMAt indicator handle
//--
RefreshTick(xsymb);
if(ptype==POSITION_TYPE_BUY && (mc_symbol.Bid()>mc_symbol.NormalizePrice(TriMAID[0]+TSval*pip))) pval=TriMAID[0];
if(ptype==POSITION_TYPE_SELL && (mc_symbol.Ask()<mc_symbol.NormalizePrice(TriMAID[0]-TSval*pip))) pval=TriMAID[0];
break;
}
}
//--
return(pval);
//---
} //-end TSPrice()
//---------//
修改 SL/TP 函数:
bool MCEA::ModifySLTP(const string symbx,int TS_type)
{
//---
ResetLastError();
MqlTradeRequest req={};
MqlTradeResult res={};
MqlTradeCheckResult check={};
//--
int TRSP=TS_type;
bool modist=false;
int x=PairsIdxArray(symbx);
Pips(symbx);
//--
int total=PositionsTotal();
//--
for(int i=total-1; i>=0; i--)
{
string symbol=PositionGetSymbol(i);
if(symbol==symbx && mc_position.Magic()==magicEA)
{
ENUM_POSITION_TYPE opstype = mc_position.PositionType();
if(opstype==POSITION_TYPE_BUY)
{
RefreshTick(symbol);
double price = mc_position.PriceCurrent();
double vtrsb = mc_symbol.NormalizePrice(TSPrice(symbx,opstype,TRSP));
double pos_open = mc_position.PriceOpen();
double pos_stop = mc_position.StopLoss();
double pos_profit = mc_position.Profit();
double pos_swap = mc_position.Swap();
double pos_comm = mc_position.Commission();
double netp=pos_profit+pos_swap+pos_comm;
double modstart=mc_symbol.NormalizePrice(pos_open+TSmin*pip);
double modminsl=mc_symbol.NormalizePrice(vtrsb+TSmin*pip);
double modbuysl=vtrsb;
double modbuytp=mc_symbol.NormalizePrice(price+TPmin*pip);
bool modbuy = (price>modminsl && modbuysl>modstart && (pos_stop==0.0||modbuysl>pos_stop));
//--
if(modbuy && netp>0.05)
{
modist=mc_trade.PositionModify(symbol,modbuysl,modbuytp);
}
}
if(opstype==POSITION_TYPE_SELL)
{
RefreshTick(symbol);
double price = mc_position.PriceCurrent();
double vtrss = mc_symbol.NormalizePrice(TSPrice(symbx,opstype,TRSP));
double pos_open = mc_position.PriceOpen();
double pos_stop = mc_position.StopLoss();
double pos_profit = mc_position.Profit();
double pos_swap = mc_position.Swap();
double pos_comm = mc_position.Commission();
double netp=pos_profit+pos_swap+pos_comm;
double modstart=mc_symbol.NormalizePrice(pos_open-TSmin*pip);
double modminsl=mc_symbol.NormalizePrice(vtrss-TSmin*pip);
double modselsl=vtrss;
double modseltp=mc_symbol.NormalizePrice(price-TPmin*pip);
bool modsel = (price<modminsl && modselsl<modstart && (pos_stop==0.0||modselsl<pos_stop));
//--
if(modsel && netp>0.05)
{
modist=mc_trade.PositionModify(symbol,modselsl,modseltp);
}
}
}
}
//--
return(modist);
//---
} //-end ModifySLTP()
//---------//