English Русский Deutsch 日本語
preview
价格行为分析工具包开发(第一部分):图表投影仪

价格行为分析工具包开发(第一部分):图表投影仪

MetaTrader 5示例 | 23 六月 2025, 06:59
170 2
Christian Benjamin
Christian Benjamin

引言

本文名为“图表投影仪”,专注于开发一种简化市场分析的工具,特别是针对价格行为交易者。图表投影仪以“幽灵模式”将前一天的图表叠加到当前图表上。

首先,我们说明将前一天的图表投影到当前图表上的重要性。接下来,我们将概括地介绍该工具,然后讨论代码实现。最后,我们将对成果进行总结。 

文章的内容结构如下:

  1. 采用图表投影仪的理由
  2. 工具概述
  3. 代码实现
  4. 结果
  5. 结论


采用图表投影仪的理由

将前一天的图表重新绘制到当前图表上,为交易者提供了多种优势。以下是这种技术好处的说明:

优势
说明
直接目的 将前一天的数据叠加到当前图表上,可以让交易者快速可视化价格走势和关键支撑/阻力水平,帮助他们根据历史基准评估当前市场状况。
更清晰地识别关键水平 叠加图比手动绘制的线条更清晰地突出关键价格水平(如支撑和阻力),帮助交易者通过识别过去的买卖压力来预测未来的价格走势。
趋势识别 观察当前价格与前一天走势的互动有助于识别趋势。高于前一天高点的交易表明看涨势头;低于低点的交易可能表明看跌情绪。
简化分析 这种方法无需滚动浏览历史数据,让交易者专注于实时分析,节省时间,并在快速变动的市场中更快地做出决策。
行为洞察 通过揭示当前价格走势与先前走势的一致性,叠加图帮助交易者理解市场心理,例如当价格偏离阻力水平时,看涨走势可能显示出潜在的强势。
风险管理 清晰的过往支撑和阻力位图形,能帮助交易者在已知的价格水平上设置止损订单,从而有助于降低风险。
简化的交易计划 可视化前一天的价格走势简化了入场和出场计划,使交易者能够围绕已建立的价格水平构建交易,提高策略的有效性。
关注价格行为 通过保持原始价格走势的完整性,交易者可以直接关注价格行为动态,而不会受到典型指标可能引入的扭曲形态的影响。因此,可以更加清楚地识别更精确的入场和出场点。

在下面的插图中,我们比较了2024年9月19日和20日连续两天的图表。我画了线来表示支撑和阻力水平。这比较清楚地显示了市场如何对这些前期位置进行反应的。然而,存在一个限制:识别出的支撑水平可能并不总是最重要的水平。无法仅隔离主要的支撑和阻力水平,可能会在数据中引入噪声,使交易者难以做出明智的决策。如果不筛选掉不太重要的水平,交易者可能难以识别真正的趋势或反转,这增加了遇到虚假信号的概率。它可能导致错误的入场和出场,最终影响整体交易表现。

这就是我们的工具发挥作用的地方。它可以识别并显示最有影响力的高点和低点,这大大提高了我们分析的准确性。此外,该工具允许我们将前一天的图表直接叠加到当前图表上,使分析和解释价格走势变得更加容易。                                                

 

图例 1. 比较价格行为


代码开发

在使用 MetaEditor 进行代码开发时,整个过程从启动 MetaEditor 开始。当应用程序打开后,你需要导航到“新建”选项以开始创建一个新文件。在选择“新建”之后,会出现一个窗口,你可以从中选择你想要创建的文件或项目的类型。在这种情况下,你会选择“脚本”作为项目的类别,因为你打算开发的正是这种类型的程序。

图 2 展示了你可以选择创建脚本的窗口。该窗口提供了定义你即将开展的项目类型所需的选项。通过选择“脚本”选项,指定了你希望在 MetaTrader 中创建一个自定义的自动化程序。这一步至关重要,因为它为你的开发环境奠定了基础,确保 MetaEditor 生成适合编写你的 MQL5 脚本的适当模板。这个清晰、用户友好的窗口界面,简化了你开启编码项目的过程。

脚本

图例 2. 开始新脚本

接下来,我将为你提供一份指南,介绍如何使用 MQL5 创建“幽灵”效果,以及如何将前一天的图表投影到当前图表上。

1. 属性:

我想强调的一个重要方面是脚本属性和版权的重要性。在你的 MQL5 脚本中添加版权声明对于保护你的代码至关重要。它确立了你的所有权,并明确表明你是原始创作者,有助于防止未经授权的使用或对你代码的虚假声明。如果发生任何纠纷,这一声明可以作为所有权的证据。如果没有版权,其他人可能会认为你的脚本是可以自由使用或分发的。通过包含版权声明,你可以控制你的代码如何被分享、出售或修改。

//+------------------------------------------------------------------+
//|                                              Chart Projector.mq5 |
//|                                               Christian Benjamin |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Christian Benjamin"
#property link        "http://www.mql5.com"
#property description "Script to overlay yesterday's price action with ghost effect. Projected onto current day's chart and beyond"
#property indicator_chart_window
#property strict
#property script_show_inputs
#property version "1.0"

此外,版权还能够带来变现机会。你可以出售该脚本,根据特定的许可条款提供它,或者定义使用条件。这通过表明其价值来提升你工作的专业性,同时也确保如果其他人使用或在此基础上进行开发,你能够获得应有的认可。

2. 输入参数部分:

我们创建输入变量,以便用户自定义“幽灵”蜡烛图效果。这些输入变量定义了“幽灵”效果的颜色、线型和宽度。用户还可以调整是否显示前一天的最高价和最低价,将“幽灵”图案向前或向后移动,以及将其进一步投影到未来。

input color GhostColor = clrGray;        // Color for ghost effect (can be transparent)
input int LineStyle = STYLE_DOT;         // Line style for ghost candlesticks
input int LineWidth = 2;                 // Line width for ghost candlesticks
input bool ShowHighLow = true;           // Show high/low lines of yesterday
input int ShiftBars = 0;                 // Number of bars to shift ghost forward/backward
input int ProjectForwardBars = 100;      // Number of bars to project ghost pattern forward

这一部分非常重要,因为它为用户提供了灵活性,使他们可以根据自己的偏好调整“幽灵”蜡烛图的样式。

脚本的输入参数

图例 3. 脚本的输入参数

上图展示了输入参数在 MetaTrader 5 中的呈现方式,用户可以在打开图表时方便地查看、修改和个性化这些参数。这些参数允许交易者调整工具的关键方面,例如线型、颜色以及蜡烛图投影设置,确保图表符合他们特定的交易偏好和策略。这种灵活性有助于提升用户体验,让用户能够更有效地控制过去和当前价格走势的视觉效果。

3. OnStart 函数:

OnStart() 函数是脚本的入口。当脚本运行时,该函数会调用主函数 DrawGhostCandles()。

void OnStart()
{
    DrawGhostCandles(); // Call the function to draw ghost candles
}

这种方法保持了代码结构的清晰性,确保脚本在启动时立即进入核心功能。通过调用一个专门的函数,我们确保绘制“幽灵”蜡烛图的任务能够独立且更高效地完成。

4. DrawGhostCandles 函数:

该函数包含了将昨天的“幽灵”蜡烛图模式叠加到今天图表上的逻辑。我们首先获取当前的时间框架,然后计算昨天和今天的起始点和终点。我们还通过使用 iBarShift() 函数来确定昨天和今天的柱状图数量。

void DrawGhostCandles()
{
    ENUM_TIMEFRAMES timeFrame = Period(); // Get the current timeframe
    
    datetime yesterdayStart = iTime(_Symbol, PERIOD_D1, 1); // Start of yesterday
    datetime todayStart = iTime(_Symbol, PERIOD_D1, 0); // Start of today
    datetime todayEnd = todayStart + PeriodSeconds(PERIOD_D1); // Expected end of today (24 hours)

    int startBarYesterday = iBarShift(_Symbol, timeFrame, yesterdayStart); // Yesterday's first bar
    int endBarYesterday = iBarShift(_Symbol, timeFrame, todayStart) - 1; // Yesterday's last bar

    if (startBarYesterday == -1 || endBarYesterday == -1)
    {
        Print("No data for yesterday.");
        return;
    }

    int barsToday = Bars(_Symbol, timeFrame, todayStart, todayEnd); // Total number of bars today

    for (int i = 0; i < barsToday; i++) // Loop through yesterday's bars
    {
        int yesterdayIndex = startBarYesterday - i % (endBarYesterday - startBarYesterday + 1);

        datetime timeYesterday = iTime(_Symbol, timeFrame, yesterdayIndex); 
        double openYesterday = iOpen(_Symbol, timeFrame, yesterdayIndex);
        double highYesterday = iHigh(_Symbol, timeFrame, yesterdayIndex);
        double lowYesterday = iLow(_Symbol, timeFrame, yesterdayIndex);
        double closeYesterday = iClose(_Symbol, timeFrame, yesterdayIndex);

        datetime projectedTime = todayStart + i * PeriodSeconds() + ShiftBars * PeriodSeconds(); 

        if (projectedTime >= todayEnd) break; // Stop projection if today's end is reached

        DrawGhostBar(projectedTime, openYesterday, highYesterday, lowYesterday, closeYesterday); // Draw ghost bar
    }

    if (ShowHighLow)
    {
        double yesterdayHigh = iHigh(_Symbol, PERIOD_D1, 1); // Yesterday's high
        double yesterdayLow = iLow(_Symbol, PERIOD_D1, 1);   // Yesterday's low

        DrawHorizontalLine("YesterdayHigh", yesterdayHigh);  // Draw high
        DrawHorizontalLine("YesterdayLow", yesterdayLow);    // Draw low
    }
}

该函数会遍历昨天的每一根柱状图,获取其开盘价、最高价、最低价和收盘价,并将这些价格投影到今天的图表上。循环确保昨天的每一根蜡烛图都在今天的图表上以“幽灵”的形式呈现。这有助于直观地比较前一天的价格走势与今天的价格走势。

5. DrawGhostBar 函数:

这个函数负责在图表上绘制每一个单独的“幽灵”蜡烛图。它会创建一条线来表示每个蜡烛图的最高价-最低价范围,并绘制一个矩形来表示每个蜡烛图的开盘价-收盘价范围。

void DrawGhostBar(datetime time, double open, double high, double low, double close)
{
    string lineName = "GhostLine" + IntegerToString(time);  // Line name for high-low
    ObjectCreate(0, lineName, OBJ_TREND, 0, time, low, time, high); // Create the line
    ObjectSetInteger(0, lineName, OBJPROP_COLOR, GhostColor); // Set color
    ObjectSetInteger(0, lineName, OBJPROP_STYLE, LineStyle);  // Set style
    ObjectSetInteger(0, lineName, OBJPROP_WIDTH, LineWidth);  // Set width

    string ocName = "GhostOC" + IntegerToString(time);  // Rectangle name for open-close
    ObjectCreate(0, ocName, OBJ_RECTANGLE, 0, time, open, time + PeriodSeconds(), close); // Create rectangle
    ObjectSetInteger(0, ocName, OBJPROP_COLOR, GhostColor); // Set color
    ObjectSetInteger(0, ocName, OBJPROP_STYLE, LineStyle);  // Set style
    ObjectSetInteger(0, ocName, OBJPROP_WIDTH, LineWidth);  // Set width
}

通过将这一功能分离到一个独立的函数中,我们简化了绘制每一根“幽灵”蜡烛图的过程。这种模块化的方法使得管理、更新以及自定义这些蜡烛图的外观变得更加容易。

6. DrawHorizontalLine 函数:

这个函数负责在图表上绘制水平线,标记前一天的最高价和最低价。这些线条作为视觉标记,帮助交易者关注那些重要的价格水平。

void DrawHorizontalLine(string name, double price)
{
    if (!ObjectCreate(0, name, OBJ_HLINE, 0, TimeCurrent(), price))
    {
        Print("Failed to create horizontal line."); // Error handling
    }
    ObjectSetInteger(0, name, OBJPROP_COLOR, GhostColor); // Set color
    ObjectSetInteger(0, name, OBJPROP_STYLE, LineStyle);  // Set style
    ObjectSetInteger(0, name, OBJPROP_WIDTH, LineWidth);  // Set width
}

包含此功能后可通过添加重要的参考点增强脚本的能力,帮助交易者轻松识别前一天的支撑和阻力水平。该功能确保这些水平线与“幽灵”蜡烛图具有相同的自定义选项。


结果

图表投影仪脚本是将前一天的价格走势以视觉化的方式叠加到当前图表上,为交易者提供对市场行为的宝贵洞见。这是通过生成前一天的“幽灵”蜡烛图并将其投影到当前图表上实现的,使交易者能够观察市场相对于前一天表现的走势变化。通过可视化前一天的最高价、最低价、开盘价和收盘价,交易者可以更好地理解市场情绪和价格趋势。

此外,脚本还可以选择性地绘制前一天最高价和最低价的水平线,这些线作为当天潜在的支撑和阻力水平。交易者可以利用这些水平线,根据市场相对于这些历史基准的行为,做出关于入场和出场点的明智决策。脚本还提供了多种可自定义的输入选项,例如颜色、线型、线宽以及将“幽灵”叠加向前或向后移动的能力,使交易者能够根据自己的特定策略和偏好调整可视化效果。这增强了用户体验,并允许构建个性化的分析工具。

借助“幽灵”蜡烛图叠加,交易者可以快速评估当前价格走势是否与前一天的价格走势相呼应、背离或反应,从而为他们的交易策略提供信息支持。“幽灵”效果通过消除过多指标带来的杂乱,专注于前一天的走势,为价格动态提供更清晰的视觉效果,从而简化了市场分析。这有助于识别潜在的趋势和反转,从而做出更具策略性的交易决策。请看下面的图4。

图表投影结果

图例 4. 图表投影结果

从上图 4 可以清楚地看到,根据在 MetaTrader 5 上对代码的测试,结果呈现得非常清晰。该系统看起来非常出色,因为当前图表似乎遵循了支撑和阻力水平。很明显,价格跌破了前一天的最低价,正如水平线所显示的那样,随后反弹并继续其看跌趋势。

图表投影结果

Fig 5. 图表投影结果

图 5 展示了我们图表投影仪的结果,突出了当前市场动态如何尊重前一天的最高价和最低价。


结论

总之,对价格行为进行分析开发,并实施图表投影是交易者提升其市场解读技能的重要进步。通过将前一天的价格走势叠加到当前图表上,我们提供了一个强大的可视化工具,无需传统指标的杂乱,即可促进对市场动态的理解。这种方法使交易者能够快速识别关键的支撑和阻力水平,显著助力决策过程。此方法得到的结果,不仅反映了价格走势的行为,还反映了市场参与者的集体情绪,提供了对未来趋势更深入的视角。

我建议大家仅将此工具用于学习目的。请不要用真实资金进行实验!

我提议将我们的工具包命名为“Lynnchris 工具箱”,并且我会记录开发的每一个工具,并在发布新版本时更新记录。请参见下表。
日期 工具名称 说明 版本 更新 提示
01/10/24 图表投影仪 用于叠加前一天价格走势(带“幽灵”效果)的脚本。
1.0 首次发布 “Lynnchris 工具箱”中的第一个工具

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/16014

附加的文件 |
最近评论 | 前往讨论 (2)
Pat Patel
Pat Patel | 12 11月 2024 在 04:10

祝贺您迎来人生中最重要的事件之一。指标做得很好,不过我们可以通过创建周期 1 的均线来实现这一目标,该均线按一天中时间框架的周期数移位,对于 1H tF,移位 24,对于 m15,移位 1440/15=96。期待您对图表研究的探索。

Christian Benjamin
Christian Benjamin | 20 11月 2024 在 12:43
Pat Patel #:

祝贺您迎来人生中最重要的事件之一。指标做得很好,不过我们可以通过创建周期 1 的均线来实现这一目标,该均线按一天中时间框架的周期数移动。对于 1H tF,移动量为 24,对于 m15,移动量为 1440/15=96。期待您对 chaert 研究的探索。

非常感谢

交易中的神经网络:免掩码注意力方式预测价格走势 交易中的神经网络:免掩码注意力方式预测价格走势
在本文中,我们将讨论免掩码注意力变换器(MAFT)方法,及其在交易领域的应用。不同于传统的变换器,即处理序列时需要数据掩码,MAFT 通过消除掩码需求来优化注意力过程,显著改进了计算效率。
从基础到中级:按值传递还是按引用传递 从基础到中级:按值传递还是按引用传递
在本文中,我们将实际了解按值传递和按引用传递之间的区别。虽然这看起来很简单,很常见,不会造成任何问题,但许多经验丰富的程序员经常因为这个小细节而在处理代码时遇到真正的失败。知道何时、如何以及为什么使用按值传递或按引用传递将对我们作为程序员的生活产生巨大的影响。此处提供的内容仅用于教育目的。在任何情况下,除了学习和掌握所提出的概念外,都不应出于任何目的使用此应用程序。
从基础到中级:FOR 语句 从基础到中级:FOR 语句
在本文中,我们将了解 FOR 语句最基本的概念。了解这里将显示的所有内容非常重要。与我们迄今为止讨论的其他语句不同,FOR 语句有一些怪癖,很快就会变得非常复杂。所以不要让这样的事情堆积起来,尽快开始学习和练习。
交易中的神经网络:超点变换器(SPFormer) 交易中的神经网络:超点变换器(SPFormer)
在本文中,我们概述一种基于“超点变换器”(SPFormer) 的三维物体分段方法,其剔除了对中间数据聚合的需求。这加快了分段过程,并提高了模型的性能。