按时间标记位置脚本

无论是进行策略分析,还是进行交易系统设计,时间是一个非常重要的参照因素,特别是在进行历史数据回溯验证的时候,如果想快速定位到某个时间点,就需要找到一个办法在行情图表上进行明显的标记,比如在什么时间点出现了亏损、什么时间点出现了盈利,使用按时间标记功能,就可以快速标记所有位置,便于统计、分析。在这个例子中,我们运用的是画竖线的方式,并区分不同颜色的线,来实现需求。

画线对象

需要用到画对象函数ObjectCreate(),指定对象类型为OBJ_VLINE,创建画线对象便可以设置颜色、宽度、风格等相关属性。

 int chart_id = 0;
 string line_name = TimeToString(D'2021.04.01 00:00:00');
 if(!ObjectCreate(chart_id,line_name,OBJ_VLINE,0,D'2021.04.01 00:00:00',0))
     {
        printf(": failed to create a line! Error code = ",GetLastError());
     }
 //设置属性
 ObjectSetInteger(chart_id,line_name,OBJPROP_COLOR,line_color); 	//设置颜色
 ObjectSetInteger(chart_id,line_name,OBJPROP_STYLE,line_style); 	//设置风格
 ObjectSetInteger(chart_id,line_name,OBJPROP_WIDTH,line_width); 	//设置宽度

时间位置

这个例子实现画出2021年4月份所有00:00:00开市的位置时间线,首先需要取到所有符合条件的时间数据,再用for循环画出所有对象。取时间数据可以用CopyTime()函数,通过指定起始时间、结束时间,将这段时间周期内的所有时间数据取到。通过判断时间是否是00:00:00就是满足需求的时间位置。

 datetime time_lines[];
 ENUM_TIMEFRAMES time_period = PERIOD_H1;
 datetime time_start = D'2021.01.01 00:00:00';
 datetime time_end = D'2021.04.21 00:00:00';
 CopyTime(Symbol(),time_period,time_start,time_end,time_lines);

这里用time_lines数组将所有数据进行了存储,是datetime时间格式,怎么判断是否为开市时间呢,用TimeToStruct()函数将格式进行转换为MqlDateTime时间结构体,就可以得到时、分、秒,进行条件判断。

MqlDateTime time_struct ;
TimeToStruct(time_lines[i],time_struct);
if(time_struct.hour == 0 && time_struct.min == 0 && time_struct.sec == 0)
      {
//画线对象
      }

针对其实时间、终止时间、时间周期,可以将这些参数放到脚本头部作为输入参数进行更加灵活的控制,当然也可以将线条的颜色、宽度、样式等也作为输入参数,就有一个功能更加丰富灵活的按时间标记位置脚本了,需要特别注意的是添加#property script_show_inputs,才能显示脚本输入参数。

input datetime time_start = D'2021.01.01 00:00:00';
input datetime time_end = D'2021.04.21 00:00:00';
input ENUM_TIMEFRAMES time_period = PERIOD_H1;
input color line_color = clrRed;
input ENUM_LINE_STYLE line_style = STYLE_SOLID;
input int line_width = 2;

实现源码

#property copyright "公众号 Luyuanmw 微信 wentxiong"
#property link      源码讲解   "https://study.163.com/course/introduction/1213774825.htm?inLoc=ss_ssjg_qblb_MT5&share=2&shareId=480000002309742"
#property version   "1.00"

#property script_show_inputs

input datetime time_start = D'2021.01.01 00:00:00';
input datetime time_end = D'2021.04.21 00:00:00';
input ENUM_TIMEFRAMES time_period = PERIOD_H1;
input color line_color = clrRed;
input ENUM_LINE_STYLE line_style = STYLE_SOLID;
input int line_width = 2;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//画出2021年4月所有00:00开市时间位置
   datetime time_lines[];
   CopyTime(Symbol(),time_period,time_start,time_end,time_lines);

   for(int i = 0; i < ArraySize(time_lines); i++)
     {
      //时间位置
      MqlDateTime time_struct ;
      TimeToStruct(time_lines[i],time_struct);
      if(time_struct.hour == 0 && time_struct.min == 0 && time_struct.sec == 0)
        {
         //画线对象
         int chart_id = 0;
         string line_name = TimeToString(time_lines[i]);
         if(!ObjectCreate(chart_id,line_name,OBJ_VLINE,0,time_lines[i],0))
           {
            printf(": failed to create a line! Error code = ",GetLastError());
           }
         //设置属性
         ObjectSetInteger(chart_id,line_name,OBJPROP_COLOR,line_color); //设置颜色
         ObjectSetInteger(chart_id,line_name,OBJPROP_STYLE,line_style); //设置风格
         ObjectSetInteger(chart_id,line_name,OBJPROP_WIDTH,line_width); //设置宽度
        }
     }
  }
//+------------------------------------------------------------------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路远马亡Trade

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值