非农指标介绍
非农数据是期货汇市交易员每月必关注大事件。从事交易生涯5年有余,从前期懵懂的小白到逐渐形成自己的一套理论,非农曾经是小白时期的噩梦之一,波动剧烈,数据值的飘忽不定,订单被频繁扫损,相信非农来临的那一晚很多人都选择熬夜,非农数据即将发布的前10几分钟那种激动的心情,金十数据独特的滴声音像赛场上裁判员的信号枪枪声!废话不多了,进入正题:
非农指标是基于mt4的一个数据分析指标,基本构成:
小非农区间,大非农区间,日期显示,星期显示,适用周期是天图周期,针对黄金币种,适合中线,不适合短线和长线。
如图所示,第一个灰色区间是小非农发布时间和影响时间,图形显示为3天,第二个图形区间是大非农影响时间和结束时间。每个天图的柱子上面都显示了时间和周几,方便专业交易员一直沉寂在K线时间不用关注电脑日期。
使用方法:
两个灰色区间的结束点都有可能是中线行情的反转点,从历史统计来看,小非农的反转概率不是很高,主要行情反转周期发生在大非农结束后,有图有真相,请看下图:
这是一种中线思路的波段交易思路,如果行情给力,我们可以抓到100个整数点的大行情,时间周期是当前非农结束到下次非农结束或者开始。
理论解析:
根据量价时空的原则,非农数据发布的时刻,市场上面是有50%的概率做多,50%的概率做多,没有市场阴谋论,所谓的主力也是不知道方向的,顶多,他们知道数据,因为金融方面的数据泄露事件发生并非一次两次,但是,数据真的能决定行情吗?非也,无论数据是利空还是利多,它连发生时小时图,天图的阴阳柱子都不能决定,我当时的思路是,不要把思路重心放在非农数据上面,而是把重心放在数据发生后的走势,于是,建模,统计,写指标,墨迹半年左右,指标完成!光有指标不过瘾,我又花费3个月时间来补充程序化的构建,授之以鱼不如授之以渔,自由的东西很可贵,免费奉献的精神够高!指标在附件里面,独家发布,禁止用于商业用途,侵权必究!
文章来源:EA源码 http://www.fxeasource.com
源码如下:
- //| 非农指标.mq4 |
- //| Copyright 2019, MetaQuotes Software Corp.EA源码 |
- //| https://www.fxeasource.com |
- //+------------------------------------------------------------------+
- #property copyright "Copyright 2019, MetaQuotes Software Corp.EA源码"
- #property link "https://www.fxeasource.com"
- #property version "1.00"
- #property strict
- #property indicator_chart_window
- //保存所有周五的数组索引
- int WeekFriDays[];
- //保存第一个周五的数组索引
- int WeekFirstDays[];
- //错误的时间是
- //2017.03.10
- //2016.07.08
- //2015.05.08
- //2015.04.03
- //要修复的时间值参数开始
- datetime repairtime1=D'2017.03.10';
- datetime repairtime2=D'2016.07.08';
- datetime repairtime3=D'2015.05.08';
- datetime repairtime4=D'2015.04.03';
- //要修复的时间值参数结束
- //保存object对象的数组
- string AllDrawrectangle[10000];
- int OnInit()
- {
- return(INIT_SUCCEEDED);
- }
- int deinit(){
- for(int f=0;f<ArraySize(AllDrawrectangle);f++){
- ObjectDelete(0,AllDrawrectangle[f]);
- }
- //删除所有文字和rectangle开始
- ObjectsDeleteAll(0,0,OBJ_TEXT);
- ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
- ObjectsDeleteAll(0,0,OBJ_TREND);
- ObjectsDeleteAll(0,0,OBJ_TRENDBYANGLE);
- //删除所有文字和rectrangle结束
- return (0);
- }
- int OnCalculate(const int rates_total,
- const int prev_calculated,
- const datetime &time[],
- const double &open[],
- const double &high[],
- const double &low[],
- const double &close[],
- const long &tick_volume[],
- const long &volume[],
- const int &spread[])
- {
- int limit=Bars-IndicatorCounted();
- datetime testtime=D'2014.01.01 00:00';
- int b=0;
- for(int i=0;i<limit;i++){
- RefreshRates(); //刷新速率
- if(TimeYear(Time)<TimeYear(testtime)){
- break;
- }
- if(TimeDayOfWeek(Time)==5){
- b++;
- //初始化数组
- ArrayResize(WeekFriDays,b);
- WeekFriDays[b-1]=i;
- }
- //写入周一到周五开始
- //double windowPriceMax = WindowPriceMax() +0.01 * Point; //当前窗口中最小价格+20*小数点精度
- double WindowPrice;
- if(Close>=Open){
- WindowPrice=High+8;
- }else{
- WindowPrice=Low-3;
- }
- //如果当前图表周期为天图
- if (ChartPeriod(0)==PERIOD_D1)
- {
- drawt(TimeToStr(Time, TIME_DATE), IntegerToString(week(Time)) , Time, WindowPrice);
- }
- //写入周一到周五结束
- }
- //输出数组的大小
- //Print(IntegerToString(ArraySize(WeekFriDays)));
- //Print(WeekFriDays[0]);
- //输出WeekFriDays来进行测试
- int c=0;
- for(int i=0;i<ArraySize(WeekFriDays)-1;i++){
- //Print(IntegerToString(WeekFriDays));
- //Print(TimeToString(Time[(WeekFriDays)]));
- //取第一个周五
- if( TimeMonth(Time[(WeekFriDays)])!=TimeMonth(Time[(WeekFriDays[i+1])])){
- //Print(IntegerToString(i));
- //输出第一个周五
- //Print(TimeToString(Time[(WeekFriDays)]));
- c++;
- ArrayResize(WeekFirstDays,c);
- WeekFirstDays[c-1]=WeekFriDays;
- }
- }
- //运行修复时间函数进行时间值修复
- RepairTimes(repairtime1,repairtime2,repairtime3,repairtime4);
- RefreshRates();//刷新数组
- //表现层开始
- for(int i=0;i<ArraySize(WeekFirstDays);i++){
- //开始画第一个矩形通道
- drawx(IntegerToString(WeekFirstDays)+"open",Time[(WeekFirstDays)],Time[(WeekFirstDays)+2],DarkGray,i);
- //开始画第二个矩形通道
- drawx(IntegerToString(WeekFirstDays)+"close",Time[(WeekFirstDays)+3],Time[(WeekFirstDays)+5],DarkSlateGray,i);
- //画日期
- drawt(TimeToString(Time[WeekFirstDays])+"high",GetYearMonthByIndex(WeekFirstDays),Time[WeekFirstDays+3],WindowPriceMax(),clrYellow);
- //画趋势线
- //drawl(TimeToString(Time[WeekFirstDays])+"low",Time[WeekFirstDays],Open[WeekFirstDays],Time[WeekFirstDays[i+1]],Open[WeekFirstDays[i+1]],clrAliceBlue);
- }
- //表现层结束
- return(rates_total);
- }
- //开始画矩形通道
- void drawx(string drawrectangle, datetime startTime, datetime endTime, color rectangeColor,int AllDrawrectangleSize) {
- RefreshRates();
- if (ObjectFind(drawrectangle) == -1) {
- // Print(" 起始时间:"+TimeToString(startTime)+"结束时间是:"+TimeToString(endTime));
- ObjectCreate(drawrectangle, OBJ_RECTANGLE, 0, startTime, 0, endTime, 3000); //画矩形
- ObjectSet(drawrectangle, OBJPROP_COLOR, rectangeColor);
- ObjectSet(drawrectangle, OBJPROP_STYLE, STYLE_SOLID);
- ObjectSet(drawrectangle, OBJPROP_BACK, TRUE);
- ObjectSet(drawrectangle, OBJPROP_RAY, FALSE);
- ObjectSet(drawrectangle, OBJPROP_WIDTH, 2);
- // Print("画图成功");
- return;
- }
- //Print("画图不成功");
- AllDrawrectangle[AllDrawrectangleSize]=drawrectangle;
- ObjectMove(drawrectangle, 0, startTime, 0);
- ObjectMove(drawrectangle, 1, endTime, 3000);
- }
- //结束画矩形通道
- //得到最高价最低价
- //写入周一到周五时间开始
- void drawt(string drawrectangleText, string weekDay, int TimeOne, double priceOne, color colorDay = clrDeepPink
- ) {
- RefreshRates();
- if (ObjectFind(drawrectangleText) == -1) {
- //bool ObjectCreate( string name, int type, int window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0)
- ObjectCreate(drawrectangleText, OBJ_TEXT, 0, TimeOne, priceOne, TimeOne, priceOne);
- ObjectSetText(drawrectangleText, weekDay, 9, "Arial", colorDay);
- ObjectSet(drawrectangleText, OBJPROP_WIDTH, 1);
- return;
- }
- ObjectMove(drawrectangleText, 0, TimeOne, priceOne);
- // AllDrawrectangleText[AllDrawrectangleSizeText]=drawrectangleText;
- }
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //画趋势线函数开始
- void drawl(string drawrectangleText,int time1,double price1,int time2,double price2,color mycolor){
- RefreshRates();
- if(ObjectFind(drawrectangleText)==-1){
- ObjectCreate(0,drawrectangleText,OBJ_TREND,0,time1,price1,time2,price2,mycolor);
- ObjectSetInteger(0,drawrectangleText,OBJPROP_STYLE,STYLE_DOT);//设置成实线样式
- ObjectSetInteger(0,drawrectangleText,OBJPROP_WIDTH,1);
- return ;
- }
- ObjectMove(drawrectangleText,0,time2,price2);
- }
- //画趋势线函数结束
- //返回周string
- string week(int i) {
- if (TimeDayOfWeek(i) == 1) return ("1");
- if (TimeDayOfWeek(i) == 2) return ("2");
- if (TimeDayOfWeek(i) == 3) return ("3");
- if (TimeDayOfWeek(i) == 4) return ("4");
- if (TimeDayOfWeek(i) == 5) return ("5");
- //if (TimeDayOfWeek(i) == 6) return ("6");
- //if (TimeDayOfWeek(i) == 7) return ("7");
- return ("");
- }
- //+------------------------------------------------------------------+
- //修正错误的时间值函数开始
- //参数列表,要修复的数组,对应的时间值1,对应的时间值2............
- void RepairTimes(datetime time1,datetime time2,datetime time3,datetime time4){
- //Print("test");
- int TempYear;
- int TempMonth;
- for(int i=0;i<ArraySize(WeekFirstDays);i++){
- //比较年和月,如果相等,就把索引值重新赋值
- TempYear=TimeYear(Time[(WeekFirstDays)]);
- TempMonth=TimeMonth(Time[(WeekFirstDays)]);
- //Print("TempYear:"+TempYear);
- if(TempYear==TimeYear(time1) && TempMonth==TimeMonth(time1)){
- if(iBarShift(Symbol(),NULL,time1,True)!=-1){
- WeekFirstDays=iBarShift(Symbol(),NULL,time1,True);
- //Print("修复成功的日期是:"+TimeToString(time1));
- }
- }
- if(TempYear==TimeYear(time2) && TempMonth==TimeMonth(time2)){
- if(iBarShift(Symbol(),NULL,time2,True)!=-1){
- WeekFirstDays=iBarShift(Symbol(),NULL,time2,True);
- //Print("修复成功的日期是:"+TimeToString(time2));
- }
- }
- if(TempYear==TimeYear(time3) && TempMonth==TimeMonth(time3)){
- if(iBarShift(Symbol(),NULL,time3,True)!=-1){
- WeekFirstDays=iBarShift(Symbol(),NULL,time3,True);
- //Print("修复成功的日期是:"+TimeToString(time3));
- }
- }
- if(TempYear==TimeYear(time4) && TempMonth==TimeMonth(time4)){
- //Print("test");
- if(iBarShift(Symbol(),NULL,time4,True)!=-1){
- WeekFirstDays=iBarShift(Symbol(),NULL,time4,True);
- //Print("修复成功的日期是:"+TimeToString(time4));
- }
- }
- }
- }
- //修正错误的时间值函数结束
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //根据索引得到年月日开始
- string GetYearMonthByIndex(int i){
- int year=TimeYear(Time);
- int month=TimeMonth(Time);
- int day=TimeDay(Time);
- string syear=IntegerToString(year);
- string smonth=IntegerToString(month);
- string sday=IntegerToString(day);
- if(i>=0){
- return syear+"."+smonth+"."+sday;
- }else{
- return "";
- }
- }
- //根据索引值得到年月日结束