诚信为本
量力而为
当前位置:ea编程网 EA知识 正文

创建标准偏差通道相关函数

标准偏差通道是技术分析中的一种工具,用于显示价格和其标准偏差的关系。在MQL4中,我们可以自定义标准偏差通道的多个属性,例如其持续显示的模式或是否填充颜色。

标准偏差通道

核心属性

  1. OBJPROP_RAY_RIGHT:决定标准偏差通道是否向右继续。
  2. 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]; 
   } 
  }

未经允许不得转载:ea编程网 » 创建标准偏差通道相关函数