//+------------------------------------------------------------------+
//| moving average.mq4 |
//| |
//+------------------------------------------------------------------+
#define magicma 20050610 //定义本ea操作的订单的唯一标识号码
extern double lots = 0.1;//每单的交易量
extern double maximumrisk = 0.02;//作者定义的最大风险参数
extern double decreasefactor = 3;//作者定义的参数,作用要看程序中的用法
extern double movingperiod = 10;//ea中使用的均线的周期
extern double movingshift =3;//ea中使用的均线向左的k线偏移量
//+------------------------------------------------------------------+
//| calculate open positions |
//+------------------------------------------------------------------+
int calculatecurrentorders(string symbol)//函数作用,计算当前持仓订单的数量
{
int buys=0,sells=0;//定义两个临时变量,准备用于后面的多空订单的个数计算
//----
for(int i=0;i<orderstotal();i++)//循环检测当前的订单队列
{
if(orderselect(i,select_by_pos,mode_trades)==false) break;//挑出持仓单的每一个订单位置
if(ordersymbol()==symbol() && ordermagicnumber()==magicma)//根据订单位置,比较是否是当前k线商品 以及订单唯一标识号是否和本程序设置的一致(用于避免ea误操作其他程序控制的持仓单)
{
if(ordertype()==op_buy) buys++;//找到符合条件的持仓单后,如果是多单,则临时变量buys增加1
if(ordertype()==op_sell) sells++;//找到符合条件的持仓单后,如果是空单,则临时变量sells增加1
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);//本函数返回查询计算结束时的持仓单的个数。
}
//+------------------------------------------------------------------+
//| calculate optimal lot size |
//+------------------------------------------------------------------+
double lotsoptimized()//函数目的,根据要求 计算出订单交易量
{
double lot=lots;
int orders=historytotal(); // history orders total 历史出场订单的个数
int losses=0; // number of losses orders without a break
//---- select lot size
lot=normalizedouble(accountfreemargin()*maximumrisk/1000.0,1);//通过风险系数的计算获得当前入场单应该采用的交易量
//---- calcuulate number of losses orders without a break
if(decreasefactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(orderselect(i,select_by_pos,mode_history)==false) { print("error in history!"); break; }//循环查询出场单队列
if(ordersymbol()!=symbol() || ordertype()>op_sell) continue;//
//----
if(orderprofit()>0) break;
if(orderprofit()<0) losses++;//循环计算所有出场亏损单的亏损总和
}
if(losses>1) lot=normalizedouble(lot-lot*losses/decreasefactor,1);//如果亏损额大于1,则下一入场单的交易量修正为新的计算结果。
}
//---- return lot size
if(lot<0.1) lot=0.1;//如果计算出的交易量小于帐户最小手数0.1,则下一入场单的交易手数使用0.1作为交易量
return(lot);
}
//+------------------------------------------------------------------+
//| check for open order conditions |
//+------------------------------------------------------------------+
void checkforopen()//检查入场条件的情况并作处理
{
double ma;
int res;
//---- go trading only for first tiks of new bar
if(volume[0]>1) return;//如果当前k线持仓量大于1,说明不是k线的开盘时间点,则直接返回 否则是k线第一个价格,则继续下面的过程
//---- get moving average
ma=ima(null,0,movingperiod,movingshift,mode_sma,price_close,0);//获得当前的均线数值
//---- sell conditions
if(open[1]>ma && close[1]<ma) //如当前k开盘价大于均线,而前一k收盘价小于均线,则发出入场多单
{
res=ordersend(symbol(),op_sell,lotsoptimized(),bid,3,0,0,"",magicma,0,red);
return;
}
//---- buy conditions
if(open[1]<ma && close[1]>ma) //如当前k开盘价小于均线,而前一k收盘价大于均线,则发出入场空单
{
res=ordersend(symbol(),op_buy,lotsoptimized(),ask,3,0,0,"",magicma,0,blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| check for close order conditions |
//+------------------------------------------------------------------+
void checkforclose()//检查出场条件的情况并作处理
{
double ma;
//---- go trading only for first tiks of new bar
if(volume[0]>1) return;
//---- get moving average
ma=ima(null,0,movingperiod,movingshift,mode_sma,price_close,0);
//----
for(int i=0;i<orderstotal();i++)
{
if(orderselect(i,select_by_pos,mode_trades)==false) break;
if(ordermagicnumber()!=magicma || ordersymbol()!=symbol()) continue;
//---- check order type
if(ordertype()==op_buy)
{
if(open[1]>ma && close[1]<ma) orderclose(orderticket(),orderlots(),bid,3,white);//如果持仓是多单,则当当前k开盘价小于均线,而前一k收盘价大于均线,则发出平仓指令
break;
}
if(ordertype()==op_sell)
{
if(open[1]<ma && close[1]>ma) orderclose(orderticket(),orderlots(),ask,3,white););//如果持仓是空单,则当当前k开盘价大于均线,而前一k收盘价小于均线,则发出平仓指令
break;
}
}
//----
}
//+------------------------------------------------------------------+
//| start function |
//+------------------------------------------------------------------+
void start()//主循环过程
{
//---- check for history and trading
if(bars<100 || istradeallowed()==false) return;
//---- calculate open orders by current symbol
if(calculatecurrentorders(symbol())==0) checkforopen();
else checkforclose();
//----
}
//+------------------------------------------------------------------+
上一指标公式:AwesomeMT4mq4公式 指标AwesomeMT4指标源码
下一指标公式:MACD2mq4公式 MACD2mq4指标源码
☉ 好公式网发布的指标公式主要用于软件技术面分析,仅供参考,勿用于实际操作,据此操作风险自负!
☉ 解压密码:www.goodgongshi.com 就是好公式网域名,希望大家看清楚,切勿输错。
☉ tnc和tni格式指标公式,仅可以用通达信软件引入使用,例如可以用通达信软件引入使用指标公式;
☉ tne格式指标公式,仅可以用通达信软件公式编辑器5.0版导入,高版本兼容低版本;
☉ fnc格式指标公式,可以用大智慧软件新一代高速行情分析系统股票软件使用,少部分可以用分析家软件引入使用;
☉ alg格式指标公式,仅仅可以用飞狐交易师软件引入使用;exp格式指标公式,仅可以用大智慧经典版软件引入使用;
☉ hxf格式指标公式,仅可以用同花顺软件引入使用。
☉ 如果您发现下载软件链接错误,请联系管理员报告错误。
☉ 好公式网欢迎各位网友帮忙宣传转发本站网址,有您的支持,我们会做得更好!
☉ 本文MT4自带的交易系统EA::MovingAverage的详解公式 详解交易系统指标源码仅供学习研究。