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