文章 "一个绘制支撑和阻力线的指标实例"

 

新文章 一个绘制支撑和阻力线的指标实例已发布:

本文提供了一个例子,它是关于如何实现根据指定条件绘制支撑和阻力线的指标的,另外,它也包含了一个可以使用的指标,您将看到,创建指标的过程有多么简单。您也将能学习如何通过修改指标代码来构建用于绘制任何所需线形的条件。

应当使用什么样的标准来选择第二个点呢?首先,我们可以考虑跟在第一个点后的第二个分形点: 这会画出最近的线。但是我们也可以使用其它规则,例如图表上的最高点,如果价格没有穿过这个点继续向上的话,就可以用作阻力线,对于支撑线则是相反。您可以定义您自己的第二个点的选择规则。我们将使用第二个最近的分形。  

线形构建点的选择

作者:Andrey Kisselyov

 

您能从另一侧绘制倾斜水平线吗?

即在上升时不是从下方而是相反从上方绘制支撑线和阻力线?

 
Alexandr Gavrilin:

您能从另一侧绘制倾斜水平线吗?

也就是说,在上升时不从底部画支撑线和阻力线,而是从顶部画支撑线和阻力线?

下午好。
当然可以,这并不像看起来那么难。
 

有知识的人,请告诉我如何在 MQL5 中找到设定条数的 最大高点和低点。

例如,在 mql4 中很容易做到。

_High   = NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar,0)), Digits); // 计算最后一个运河条的最高价 
_Low    = NormalizeDouble(iLow (Symb,PERIOD_CURRENT,iLowest (Symb,PERIOD_CURRENT,MODE_LOW, CanalBar,0)), Digits); // 计算最后一个 CanalBar 的最低价格
   

在这里,我们只需将找到的结果在图表上画一条线。

但在 mql5 中,如何找到条数的最高点和最低点是一个难题。iHighest 和 iLowest

我的理解是,这里没有简单的理解。

如果您能帮助我,我将不胜感激,如果有示例代码,那就再好不过了。

谢谢。

 
Konstantin Seredkin:

有知识的人,请告诉我如何在 MQL5 中找到设定条数的 最大高点和低点。

例如,在 mql4 中很容易做到。

在这里,我们只需将找到的结果在图表上画一条线。

但在 mql5 中,如何找到条数的最高点和最低点是一个难题。iHighest 和 iLowest

我的理解是,这里没有简单的理解。

如果您能帮助我,我将不胜感激,如果有代码示例,那就更好了。


_High   = NormalizeDouble(high[ArrayMaximum(high, 0, CanalBar)], Digits); // 计算最后一个运河栏的最高价 

其中 high 是高位价格的数组

如果是指标,则在 OnCalculation 中显示,
如果是智能交易系统,则通过 CopyHigh 请求。

不要忘记 ArraySetAsSeries true。


谢谢。

 

SPS

 
Konstantin Seredkin:

有知识的人,请告诉我如何在 MQL5 中找到设定条数的 最大高点和低点。

例如,在 mql4 中很容易做到。

在这里,我们只需将找到的结果在图表上画一条线。

但在 mql5 中,如何找到条数的最高点和最低点是一个难题。iHighest 和 iLowest

我的理解是,这里没有简单的理解。

如果您能帮助我,我将不胜感激,如果有示例代码,那就再好不过了。

谢谢。

首先,关于您的代码,我会让它更简单,基于您请求当前图表上的最大值这一事实,我会给您一个顶点的示例,对于谷底,一切几乎都是一样的。
,您混淆了对所有数据的一般请求命令和对当前数据的请求命令,在这种情况下,这是不必要的。
//当前数据(从任何 EA 或指标访问当前数据)将是
   _High=NormalizeDouble(High[iHighest(Symb,_Period,MODE_HIGH,CanalBar)],_Digits);

//一般数据(从任何 EA 或指标访问数据库中的任何数据)将是 
   _High=NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar)),MarketInfo(Symb,MODE_DIGITS));

现在来看看 mt5 中的代码。

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(Symb,PERIOD_CURRENT,0,CanalBar,high);
   _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(Symb,SYMBOL_DIGITS));
   ArrayFree(high);

在这种情况下,可以访问数据库中任何指标或 EA 的任何符号的任何数据。
不需要考虑索引的方向,因为我们只需要最大值,无论它位于何处。
ArrayMaximum() 命令(根据帮助)在考虑数组索引方向的情况下返回必要的值。

c/u.

附注:我不会将价格正常化,这是不必要的,除非您要建立一个能从交易中捕捉 1 个点的 pipsmith。

 
Andrey Kisselyov:
首先,关于您的代码,我会根据您请求当前图表上的最大值这一事实将其简化,我会给您一个顶部的例子,对于低谷,一切几乎都是一样的。 ,您将请求所有数据的一般命令与请求当前数据的命令混淆了,在这种情况下,这是不必要的。

现在来看看 mt5 的代码。

在这种情况下,可以通过任何指标或 EA 访问数据库中任何符号的任何数据。
,不需要考虑索引的方向,因为我们只需要最大值,无论它位于何处。
ArrayMaximum() 命令(根据帮助)在考虑数组索引方向的情况下返回必要的值。

c/u.

附注:我不会将价格正常化,这是没有必要的,除非您要建立一个从交易中捕捉 1 个点的点子史密斯。


很好,都解决了

现在还有一个问题

执行情况如下

input int CanalBar  = 200; // 要计算的条数

//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(_Symbol,PERIOD_CURRENT,0,CanalBar,high);
   double _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
   ArrayFree(high);
   
   
   HLineCreate(0,"HIGH",0,_High,"",clrBlue,1,1); // 在图表上画一条线。

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 创建一条水平线|
//+------------------------------------------------------------------+
//| 基于:|
//| MQL5 参考指南 / 标准常量、枚举和结构
//| /对象常量 /对象类型 / OBJ_HLINE | //| /对象常量 /对象类型 / OBJ_HLINE |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // 图表 ID
                 const string          name="HLine",      // 行名
                 const int             sub_window=0,      // 子窗口编号
                 double                price=0,           // 线价
                 const string          toolTip="\n",      // 工具提示文本
                 const color           clr=clrRed,        // 线的颜色
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // 线条样式
                 const int             line_width=1,      // 线条粗细
                 const bool            back=false,        // 在后台
                 const bool            selection=true,    // 选择移动
                 const bool            hidden=true,       // 隐藏在对象列表中
                 const long            z_order=0,         // 鼠标点击优先
                 const int             timeFrames=OBJ_ALL_PERIODS)//显示不同时期的对象
  {
//-- 重置错误值
   ResetLastError();
//--- 创建一条水平线
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(LINE_NUMBER,__FUNCTION__,
            ": failed to create a horizontal line! Error code = ",GetLastError());
      return(false);
     }
//--- 设置工具提示文本
   ObSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- 设置线条颜色 
   ObSetIntegerColor(chart_ID,name,OBJPROP_COLOR,clr);
//--- 设置行显示样式
   ObSetIntegerLineStyle(chart_ID,name,style);
//--- 设置线条粗细
   ObSetIntegerInt(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- 在前景(false)或背景(true)中显示
   ObSetIntegerBool(chart_ID,name,OBJPROP_BACK,back);
//--- 启用(true)或禁用(false)鼠标直线移动模式
//--- 使用 ObjectCreate 函数创建图形对象时,默认情况下对象
//--- 无法选择和移动。在此方法中,选择参数
//--- 默认为 true,允许您选择和移动此对象
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTED,selection);
//--- 在对象列表中隐藏(true)或显示(false)图形对象的名称
   ObSetIntegerBool(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- 设置接收图表上鼠标点击事件的优先级
   ObSetIntegerLong(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- 设置对象在不同时间段的可见性 
   ObSetIntegerInt(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
//--- 成功执行
   return(true);
  }


开始可视化测试 时,图表上的线是画出来的,但静止不动,在测试过程中线的值不会改变,在 mql5 中是否有必要以某种方式给计算一个额外的刺激?

 
Konstantin Seredkin:

好了,问题都解决了。

现在还有一个问题

执行情况如下


开始可视化测试 时,图表上的线被绘制出来,但静止不动,其数值线在测试过程中不会改变,在 mql5 中,您是否需要以某种方式给计算来一脚?

试试这个:

void HLineCreate(const long            chart_ID=0,        // 图表 ID
                 const string          name="HLine",      // 行名
                 const int             sub_window=0,      // 子窗口编号
                 double                price=0,           // 线价
                 const string          toolTip="\n",      // 工具提示文本
                 const color           clr=clrRed,        // 线的颜色
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // 线条样式
                 const int             line_width=1,      // 线条粗细
                 const bool            back=false,        // 在后台
                 const bool            selection=true,    // 选择移动
                 const bool            hidden=true,       // 隐藏在对象列表中
                 const long            z_order=0,         // 鼠标点击优先
                 const int             timeFrames=OBJ_ALL_PERIODS)//显示不同时期的对象
  {
  if(ObjectFind(chart_ID, name)<0) {
//--- 创建一条水平线
   ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price);
//--- 设置工具提示文本
   ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- 设置线条颜色 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- 设置行显示样式
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- 设置线条粗细
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- 在前景(false)或背景(true)中显示
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- 启用(true)或禁用(false)鼠标直线移动模式
//--- 使用 ObjectCreate 函数创建图形对象时,默认情况下对象
//--- 无法选择和移动。在此方法中,选择参数
//--- 默认为 true,允许您选择和移动此对象
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- 在对象列表中隐藏(true)或显示(false)图形对象的名称
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- 设置接收图表上鼠标点击事件的优先级
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- 设置对象在不同时间段的可见性 
   ObjectSetInteger(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
     }
//--- 设置绑定方法
   ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
  }
 
Konstantin Seredkin:

好了,问题都解决了。

现在还有一个问题

执行情况如下


开始可视化测试 时,图表上的线被绘制出来,但静止不动,其数值线在测试过程中不会改变,在 mql5 中,是否需要以某种方式给计算来一脚?

命令
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))

,因为您被正确地告知,它应该由命令完成。

ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
还有一点,如果有可能使用直接访问命令编写更简单的程序,请尽量不要涉及类和其他智 能程序。
,只应用那些必要的命令,没有必要在每次访问时查看所有行参数,因为您只需 要更改该行的价格。

,敬请谅解。
 

谢谢你们,现在都解决了。