[MT4-EA]利用 MT4 EA 作多商品价格爆发监视功能 [附 EA 代码]
对于二十四小时全天开盘的众多金融商品, 有个可以时时监控多商品价格或趋势变化的 EA 会让操作更加便利, 其实这类的通知型 EA 设计起来都相当的简单, 但实用性却很好.
原理是利用这类的 EA 放在任一图表上, 定时扫描监控多商品的价格和趋势, 通知方式可以是发出 email, 再利用一个 email app 在手机接收后发出振动或声音. 或是传送到手机版的 MT4 发出震动或声音.
在今年年初 MT4 build 600 出来前 (最新版是 build 625), MT4 的指标或 EA 一直需要靠图表上的价格有跳动后才触发, 对于监控多商品, 当个商品的图表的价格跳动触发并不一定与其他商品价格一致, 需要作其他的处理, 现在 build 600 把 MT5 一些事件触发的功能移植过来后 (如定时功能 OnTimer), 让这类 EA 的功能更加容易完成. 所以就把先前作的一版多商品价格爆发监控功能重新以 OnTimer 再改写.
这个 EA 是用来定时监控(每隔x秒)多商品爆发的通知型 EA, 详细说明请见: http://blog.sina.com.cn/s/blog_6717847d0101ehn2.html
也很容易依据这个架构来设计多商品趋势转换等通知型功能, 只是每个人都有自己不同的趋势指标或信号.
EA 默认监控间隔为六十秒, 非农或央行议息会议当日可以把监控时间缩短成五秒. 不同交易商有不同的商品名称, 这部分修改请见说明.
同时 EA 也可以用来观察有那些商品是否常在非重要经济数据或事件也会发生过大的价格跳动, 例如黄金, 这也会帮助操作这个商品该留意的地方和特定不规则时间段.
补充内容 (2014-3-27 06:07):
后来发现一个小问题, 修改后的代码在第三楼回复.SpeedAlert.zip
发表于:2014-03-26 07:11只看该作者
2楼
很好的思路哈:lol
发表于:2014-03-26 07:25只看该作者
3楼
不错!谢谢分享!
新版MT4增加了chart event 和timer event响应,方便很多了.
韬客社区www.talkfx.co
4楼
本帖最后由 boolapi 于 2014-3-27 06:44 编辑
后来发现一个新问题, 当 MT4 重新开启时, EA 会先载入后读取现存的商品价格, 但 MT4 接下来再同步的新价格可能与一开启的价格过大而产生误判, 所以多加一个判断, 在 EA 开始后五分钟暂时不动作.
修改后的代码如下: extern int IntervalSeconds = 60; extern double SP_500= 2.0; extern double Dow_Jones = 20; extern double DAX_30 = 20; extern double Nikkei_225 = 30; extern double Hang_Seng = 50; extern double EURUSD = 0.0020; extern double GBPUSD = 0.0020; extern double AUDUSD = 0.0020; extern double USDJPY = 0.200; extern double Crude_Oil = 0.25; extern double GOLD = 2.5; extern bool MobileAlert = false; extern bool EmailAlert = true; int iTotalSymbol = 11; string strSymbol[11]={"SP_500","Dow_Jones","DAX_30","Nikkei_225","Hang_Seng", "EURUSD","GBPUSD","AUDUSD","USDJPY","Crude_Oil","Gold"}; int iDigit; double dSpeedThreshold, dLastPrice; long lSkip = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- ArrayResize(dSpeedThreshold, iTotalSymbol); dSpeedThreshold[0] = SP_500; dSpeedThreshold[1] = Dow_Jones; dSpeedThreshold[2] = DAX_30; dSpeedThreshold[3] = Nikkei_225; dSpeedThreshold[4] = Hang_Seng; dSpeedThreshold[5] = EURUSD; dSpeedThreshold[6] = GBPUSD; dSpeedThreshold[7] = AUDUSD; dSpeedThreshold[8] = USDJPY; dSpeedThreshold[9] = Crude_Oil; dSpeedThreshold[10] = GOLD; EventSetTimer(IntervalSeconds); ArrayResize(iDigit,iTotalSymbol); ArrayResize(dLastPrice, iTotalSymbol); ArrayInitialize(dLastPrice, 0.0); for (int i=0; i< iTotalSymbol; i++) iDigit = MarketInfo(strSymbol, MODE_DIGITS); if (IntervalSeconds<=0) return(INIT_PARAMETERS_INCORRECT); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTimer() { lSkip++; if (lSkip<=300/IntervalSeconds) return; /// skp first five minutes double dPriceDelta = 0.0; double dLastDayClose = 0.0; double dUpDnPercent = 0.0; double dPriceCurrent = 0.0; int i; for (i=0;i= dSpeedThreshold && dLastPrice>0.0)
{
if (dPriceDelta>0)
{
OutputMessage(strSymbol, "UP", IntervalSeconds, DoubleToStr(dPriceCurrent,iDigit),
DoubleToStr(dPriceDelta, iDigit), DoubleToStr(dLastDayClose, iDigit), DoubleToStr(dUpDnPercent,2));
}
else
{
OutputMessage(strSymbol, "DOWN", IntervalSeconds, DoubleToStr(dPriceCurrent,iDigit),
DoubleToStr(dPriceDelta, iDigit), DoubleToStr(dLastDayClose, iDigit), DoubleToStr(dUpDnPercent,2));
}
}
dLastPrice = dPriceCurrent;
}
}
void OutputMessage(string strSym, string strDirection, int iInterval, string strPrice, string strPriceDelta,
string strLastDayClose, string strUpDnPercent )
{
if (MobileAlert){
SendNotification("Speed Alert - "+strSym+ " " + strDirection + " " + strPrice + " " + strPriceDelta);
}
if (EmailAlert) {
SendMail("Speed Alert - " + strSym + " " + strDirection + " " + strPrice + " " + strPriceDelta,
strSym + ": "+strDirection + " "+ strPriceDelta + " in " + IntegerToString(iInterval)+" second(s)"
+ "\nCurrent Price: " + strPrice
+ "\nServer Time: " + TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)
+ "\nLast Day Close: " + strLastDayClose
+ "\nChange: " + strUpDnPercent + "%");
}
}
补充内容 (2014-3-28 10:47):
再重新修改一版, 最新版在博客上.
修改后的代码如下: extern int IntervalSeconds = 60; extern double SP_500= 2.0; extern double Dow_Jones = 20; extern double DAX_30 = 20; extern double Nikkei_225 = 30; extern double Hang_Seng = 50; extern double EURUSD = 0.0020; extern double GBPUSD = 0.0020; extern double AUDUSD = 0.0020; extern double USDJPY = 0.200; extern double Crude_Oil = 0.25; extern double GOLD = 2.5; extern bool MobileAlert = false; extern bool EmailAlert = true; int iTotalSymbol = 11; string strSymbol[11]={"SP_500","Dow_Jones","DAX_30","Nikkei_225","Hang_Seng", "EURUSD","GBPUSD","AUDUSD","USDJPY","Crude_Oil","Gold"}; int iDigit; double dSpeedThreshold, dLastPrice; long lSkip = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- ArrayResize(dSpeedThreshold, iTotalSymbol); dSpeedThreshold[0] = SP_500; dSpeedThreshold[1] = Dow_Jones; dSpeedThreshold[2] = DAX_30; dSpeedThreshold[3] = Nikkei_225; dSpeedThreshold[4] = Hang_Seng; dSpeedThreshold[5] = EURUSD; dSpeedThreshold[6] = GBPUSD; dSpeedThreshold[7] = AUDUSD; dSpeedThreshold[8] = USDJPY; dSpeedThreshold[9] = Crude_Oil; dSpeedThreshold[10] = GOLD; EventSetTimer(IntervalSeconds); ArrayResize(iDigit,iTotalSymbol); ArrayResize(dLastPrice, iTotalSymbol); ArrayInitialize(dLastPrice, 0.0); for (int i=0; i< iTotalSymbol; i++) iDigit = MarketInfo(strSymbol, MODE_DIGITS); if (IntervalSeconds<=0) return(INIT_PARAMETERS_INCORRECT); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTimer() { lSkip++; if (lSkip<=300/IntervalSeconds) return; /// skp first five minutes double dPriceDelta = 0.0; double dLastDayClose = 0.0; double dUpDnPercent = 0.0; double dPriceCurrent = 0.0; int i; for (i=0;i
5楼
经历这周五非农的洗礼, 最后一版很稳定的监控到当日多商品的价格爆发. 附件是最新版.
SpeedAlert.zip
韬客社区www.talkfx.co
发表于:2014-07-05 23:52只看该作者
7楼
支持一下
为LZ捧个场
韬客社区www.talkfx.co
发表于:2015-01-06 13:40只看该作者
8楼
这应该很好用喔~感谢
韬客社区www.talkfx.co
发表于:2015-02-02 13:08只看该作者
9楼
很好的思路哈:lol很好的思路哈:lol很好的思路哈:lol
韬客社区www.talkfx.co
发表于:2015-03-20 02:07只看该作者
10楼
学习了。。。。。。。。。。。。。。。。。。。。。
韬客社区www.talkfx.co
发表于:2015-04-01 01:34只看该作者
11楼
谢谢分享
韬客社区www.talkfx.co
发表于:2016-05-05 10:27只看该作者
13楼
很好的思路哈:
韬客社区www.talkfx.co
发表于:2016-06-23 05:20只看该作者
14楼
思路清晰!
韬客社区www.talkfx.co
发表于:2016-06-24 10:38只看该作者
15楼
价格爆发监视
韬客社区www.talkfx.co
发表于:2016-11-16 07:56只看该作者
17楼
学习了
韬客社区www.talkfx.co
发表于:2016-11-29 21:20只看该作者
18楼
x谢谢分享,!!!
韬客社区www.talkfx.co
发表于:2017-05-10 17:40只看该作者
19楼
没有通宝,先mark一下
韬客社区www.talkfx.co
发表于:2017-05-15 13:32只看该作者
20楼
通报还是不够
韬客社区www.talkfx.co