请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化策略 帖子:3364794 新帖:30

文件操作. 一个重要市场时间可视化的实例

我太难了发表于:4 月 17 日 19:21回复(1)


每个交易者都知道, 单纯使用技术分析(TA)来建仓是有一定风险的. 更好的建仓方式是同时使用基本面分析和技术分析. 通常情况下, 使用技术分析的交易者会使用一个事件日程表来考虑市场波动的可能性而使他们的仓位不至于面临太大的风险. 如果所有的重要事件能够显示在价格图表上将会非常方便. 例如:


15.05.2006;9:00; 月度工业生产率 ;日本;三月;3.40%;1.00%;
15.05.2006;16:30; 纽约联储调查 ;美国;五月;15.8;15;
15.05.2006;17:00; Netto 资本流动 ;美国;三月;869亿;800亿;
16.05.2006;12:30; 年度调和消费者物价指数;英国;四月;1.80%;2.00%;
16.05.2006;13:00; ZEW 经济情绪;德国;五月;62.7;65;
16.05.2006;16:00; 沃尔玛商场报告;美国; 一季度.;-0.61;-;
16.05.2006;16:30; 月度生产者物价指数(PPI) ;美国;四月;0.50%;0.70%;
16.05.2006;16:30; 生产价格指数月度抵押与能源;美国;四月;0.10%;0.20%;
16.05.2006;16:30; 新屋开工;美国;四月;196万;196万;
16.05.2006;16:30; 建筑许可;美国;四月;209.4万;205万;
16.05.2006;17:15; 月度工业生产率;美国;四月;0.60%;0.40%;
16.05.2006;17:15; 产能利用率 ;美国;四月;81.30%;81.50%;
17.05.2006;8:30; 月度工业生产率 (调后) ;日本;March;0.20%;0.20%;
17.05.2006;12:30; 月度失业人数 ;英国.;四月;+12,600;+5,000;
17.05.2006;12:30; 4月5日 英国央行会议纪要 ;英国.;-;-;-;
17.05.2006;13:00; 月度工业生产率; 欧元区;三月;0.00%;-0.20%;
17.05.2006;13:00; 年度工业生产率 ;欧元区;三月;3.20%;2.80%;
17.05.2006;13:00; 年度调和消费者物价指数 (调后) ;欧元区;四月;2.40%;2.40%;
17.05.2006;16:30; 月度消费者物价指数(CPI);美国;四月;0.40%;0.50%;
17.05.2006;16:30; 消费者物价指数月度抵押与能源 ;美国;四月;0.30%;0.20%;
18.05.2006;12:30; 月度零售 ;英国;四月;0.70%;0.20%;
18.05.2006;12:30; 年度零售 ;英国.;四月;2.60%;2.60%;
18.05.2006;16:30; 初次申请失业 ;美国;8-14.05;324,000;320,000;
18.05.2006;17:30; 美联储主席伯南克讲话 ;美国;-;-;-;
18.05.2006;8:00; 月度先行经济指标 ;美国;四月;-0.10%;0.10%;
18.05.2006;20:00; 费城联储调查;美国;五月;13.2;12;
19.05.2006;1:30; 格林斯潘讲话;美国;-;-;-;
19.05.2006;3:50; 季度国民生产总值 (GDP) ;日本; 第一季度.;1.30%;0.20%;
19.05.2006;8:00; 日本央行会议 ;日本;-;-;-;
19.05.2006;13:00; 经常账户 ;欧元区;三月;-45亿;-30亿;


如需从上述文件读取数据, 首先需要连接它, 也就是打开它来读取. 为此MQL4中有一种操作方法:

int FileOpen( string filename, int mode, int delimiter=';')


其中的参数为: 文件名(file name), 类型(type - 一个二进制读取 FILE_BIN 或成行读取 FILE_CSV, 可使用分隔符), 访问方式 (写入是 FILE_READ 或者读取是 FILE_WRITE), 还有成行数据间的分隔符(delimiter). 如果文件被成功打开, 标识符会被赋予唯一值, 否则文件标识符会以-1赋值. 为了获取错误的信息数据, 可以使用GetLastError()函数. FileName 变量置于脚本程序开头(输入参数).

#property show_inputs
extern string FileName = "week.txt";
 
…
 
   int handle;
   handle=FileOpen(FileName,FILE_CSV|FILE_READ,';');
   if(handle<1)
    {
     Print("File was not found: ", GetLastError());
     return(false);
    }


这就是我们连接文件的方法. 下面一步是读取全部数据. 我们将按行读取, 然后把它们转换为所需的类型. 然后我们将尝试写用于显示事件的过滤器. 为此, 我们需要在脚本开头部分加入变量. 这些变量将显示来自这个国家的事件是否应当在价格图表上显示.

    while(!FileIsEnding(handle))
   {
    string sDate=FileReadString(handle); // 日期
    string sTime=FileReadString(handle); // 时间
    string sCountry=FileReadString(handle); // 国家
    string sPeriod=FileReadString(handle); // 时期
    string sDescription=FileReadString(handle); // 描述
    string sPrev=FileReadString(handle); // 前值    
    string sForecast=FileReadString(handle); // 预测值 
    string sCurrent=FileReadString(handle); // 实际值
    
    FileReadString(handle); // 空
    
    
    Print(
      sDate+" "
      ,sTime+" "
      ,sCountry+" "
      ,sPeriod+" "
      ,sDescription+" "
      ,sForecast+" "
      ,sCurrent+" ");
      
    i++;
    datetime dt = StrToTime(sDate+" "+sTime);
    
         color c = Red;
 
         if (sCountry == "日本") c = Yellow;
         if (sCountry == "美国") c = Brown;
         if (sCountry == "德国") c = Green;
         if (sCountry == "欧元区") c = Blue;
         if (sCountry == "英国") c = Orange;
         if (sCountry == "加拿大") c = Gray;
         if (sCountry == "澳大利亚") c = DarkViolet;
         if (sCountry == "瑞典") c = FireBrick;
         if (sCountry == "南非共和国")
             c = DodgerBlue;
         if (sCountry == "丹麦") c = RosyBrown;
         if (sCountry == "挪威") c = HotPink;
         
 
 
         if ((sCountry == "日本") && (!Japan)) continue;
         if ((sCountry == "美国") && (!USA)) continue;
         if ((sCountry == "德国") && (!Germany)) continue;
         if ((sCountry == "欧元区") && (!ES)) continue;
         if ((sCountry == "英国") && (!GB)) continue;
         if ((sCountry == "加拿大") && (!Canada)) continue;
         if ((sCountry == "澳大利亚") && (!Australia)) 
              continue;
         if ((sCountry == "瑞典") && (!Shweden)) continue;
         if ((sCountry == "南非共和国")&& (!UAR))
               continue;
         if ((sCountry == "丹麦") && (!Dania)) continue;
         if ((sCountry == "挪威") && (!Norvegia)) continue;
         
 
            
            
          if (DisplayText)
          {
          ObjectCreate("x"+i, OBJ_TEXT, 0, dt, Close[0]);
          ObjectSet("x"+i, OBJPROP_COLOR, c);
          ObjectSetText("x"+i, 
            sDescription + " "
            + sCountry + " "
            + sPeriod + " "
            + sCurrent + " "
            + sForecast,
            8);          
          ObjectSet("x"+i, OBJPROP_ANGLE, 90);
          }
          
                   
          ObjectCreate(sCountry+" "+i, OBJ_VLINE, 0, dt,
                       Close[0]);
          ObjectSet(sCountry+" "+i, OBJPROP_COLOR, c);
          ObjectSet(sCountry+" "+i, OBJPROP_STYLE, STYLE_DOT);
          ObjectSet(sCountry+" "+i, OBJPROP_BACK, true);
          ObjectSetText(sCountry+" "+i,
            sDescription + " · "
            + sPeriod + " · "
            + sCurrent + " · "
            + sForecast,
            8);
 
   }

现在, 你就可以一直看到将要到来的事件以及它们对市场的影响了. 写好的脚本程序代码和数据文件在本文的附件中. 请不要忘记脚本程序应当放在Experts/Scripts目录下, 而数据文件要放在Experts/Files目录下. 不要忘记日期的格式(YYYY.MM.DD HH:MM)和分隔符. 脚本的运行参见下图.









在MQL4中操作文件给了用户多重机遇: 可以连接终端及外部数据源, 也可以简化和优化终端的工作. 例如既支持记录文件, 也可以直接从互联网上读取数据并显示支撑/阻力水平等. 这表明用户可以自由选择文件操作的方法. 自动化的开放和管理仓位应该有助于减少交易员的压力, 反过来, 可以更多分析影响交易的因素。实际上, 这正是MQL4的目的.

以下就是MQL4中所有用于文件操作的函数. 可以在MQL4文档中找到更多详细信息.

FileClose 
FileDelete 
FileFlush 
FileIsEnding 
FileIsLineEnding 
FileOpen 
FileOpenHistory 
FileReadArray 
FileReadDouble 
FileReadInteger 
FileReadNumber 
FileReadString 
FileSeek 
FileSize 
FileTell 
FileWrite 
FileWriteArray 
FileWriteDouble 
FileWriteInteger 
FileWriteString

全部回复

0/140

达人推荐

量化课程

    移动端课程