标准偏差通道是技术分析中的一种工具,用于显示价格和其标准偏差的关系。在MQL4中,我们可以自定义标准偏差通道的多个属性,例如其持续显示的模式或是否填充颜色。
核心属性
OBJPROP_RAY_RIGHT
:决定标准偏差通道是否向右继续。OBJPROP_DEVIATION
:用于更改通道偏差的值。
如何创建标准偏差通道
以下脚本显示了如何在图表上创建和移动标准偏差通道:
bool StdDevChannelCreate(const long chart_ID=0, // 图表ID
const string name="Channel", // 通道名称
const int sub_window=0, // 子窗口索引
datetime time1=0, // 第一个点的时间
datetime time2=0, // 第二个点的时间
const double deviation=1.0, // 偏差值
const color clr=clrRed, // 通道颜色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 通道线样式
const int width=1, // 通道线宽度
const bool fill=false, // 是否填充通道颜色
const bool back=false, // 是否在背景显示
const bool selection=true, // 是否可移动
const bool ray_right=false, // 是否向右延续
const bool hidden=true, // 是否在对象列表中隐藏
const long z_order=0) // 鼠标点击的优先级
{
// 若锚点坐标未设置,则更改它们
ChangeChannelEmptyPoints(time1,time2);
// 重置错误值
ResetLastError();
// 根据给定的坐标创建通道
if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0))
{
Print(__FUNCTION__, ": 创建标准偏差通道失败! 错误代码 = ",GetLastError());
return(false);
}
// 设置影响通道宽度的偏差值
ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation);
// 设置通道颜色
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
// 设置通道线的样式
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
// 设置通道线的宽度
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
// 设置在前景(false)或背景(true)显示
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
// 启用或禁用移动通道的高亮模式
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
// 启用或禁用通道向右延续的显示模式
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
// 在对象列表中隐藏或显示图形对象名称
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
// 设置鼠标点击事件的优先级
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
// 成功执行返回true
return(true);
}
此函数接收多个参数,包括通道的名称、颜色、偏差、线条样式等,并在图表上创建标准偏差通道。
更改锚点位置
我们可以移动通道的锚点位置,以下是实现这一功能的函数:
bool StdDevChannelPointChange(const long chart_ID=0, // 图表ID
const string name="Channel", // 通道名称
const int point_index=0, // 锚点索引
datetime time=0) // 锚点时间坐标
{
// 如果没有设置点时间,将点移动到当前栏
if(!time)
time=TimeCurrent();
// 重置错误值
ResetLastError();
// 移动锚点
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
": 移动锚点失败! 错误代码 = ",GetLastError());
return(false);
}
// 成功执行
return(true);
}
更改通道偏差
通道的宽度可以通过更改其偏差来调整。以下函数实现了这一功能:
bool StdDevChannelDeviationChange(const long chart_ID=0, // 图表ID
const string name="Channel", // 通道名称
const double deviation=1.0) // 偏差值
{
// 重置错误值
ResetLastError();
// 改变趋势线的斜率角度
if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
{
Print(__FUNCTION__,
": 更改通道偏差失败! 错误代码 = ",GetLastError());
return(false);
}
// 成功执行
return(true);
}
删除通道
要从图表上删除通道,我们可以使用以下函数:
bool StdDevChannelDelete(const long chart_ID=0, // 图表ID
const string name="Channel") // 通道名称
{
// 重置错误值
ResetLastError();
// 删除通道
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": 删除通道失败! 错误代码 = ",GetLastError());
return(false);
}
// 成功执行
return(true);
}
在创建通道函数中的ChangeChannelEmptyPoints函数结构如下:
void ChangeChannelEmptyPoints(datetime &time1,datetime &time2)
{
// 如果第二个点的时间未设置,它将位于当前栏
if(!time2)
time2=TimeCurrent();
// 如果第一个点的时间未设置,它位于第二个点左边的9根栏
if(!time1)
{
// 用于接收最后10根栏的打开时间的数组
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
// 将第一个点设置在第二个点左边的9根栏
time1=temp[0];
}
}