
价格行为分析工具箱开发(第三部分):分析大师 —EA
内容
引言
在先前的文章中开发了分析评论脚本后,我发现它在脚本属性方面存在一些局限性,我将在下面概述这些局限。尽管我承认分析评论脚本在交易社区中产生了相当大的影响,但我还是开发了一款名为“分析大师”的EA。这款EA不仅提供相同的分析功能,还提供了额外的指标,以便获得更深入的交易信息。这款新工具具有多项优势,包括能够每两小时持续更新指标,而脚本只能写入一次指标信息。该EA增强了分析能力,并让用户保持信息更新。
在某些情况下,EA可以集成类似脚本的功能,以增强其功能性。这意味着你可以在EA的代码中实现一些特定任务,这些任务类似于独立脚本通常执行的操作。EA有效地结合了编码、可自定义设置、交易逻辑和风险管理,从而高效地自动化交易策略。下面,我用表格对比了脚本与EA之间的区别。
脚本 | EA |
---|---|
它们旨在执行特定任务,并几乎瞬间完成执行。任务完成后即终止,无法持续运行。 | 它们在后台持续运行,监控市场状况并根据预设条件执行交易。 |
它们无法处理像报价或计时器这样的事件。脚本只能在手动启动时执行其代码。 | 它们可以响应市场事件和变化(例如 OnTick、OnTimer、OnTrade),使交易策略更具响应性。 |
通常,脚本可以执行交易(开仓、修改或平仓),但不管理正在进行的交易。一旦执行完毕,它便无法监控或响应交易状态。 | EA可以动态管理未平仓位,跟踪交易条件,应用移动止损,并根据市场情况动态调整策略。 |
通常设计为一次性执行,每次用户手动运行时可能需要特定配置(如输入参数)。 | 它们可以在会话之间保留用户定义的参数,一旦启动便无需用户交互即可运行。 |
最适合用于简单的、基于操作的任务(例如批量平仓或应用指标)。 | 它们可以整合复杂的逻辑、算法和系统,这些系统需要持续决策和适应市场条件。 |
虽然脚本可以分析历史数据,但如果没有重新运行,就无法持续适应或学习新传入的数据。 | 它们可以分析历史数据并根据实时传入的数据做出决策,从而实现自适应策略。 |
由于它们执行并终止得很快,与持续运行的EA相比,运行时对性能的影响也较小。 | 由于EA持续运行,可能会导致CPU和内存消耗增加,尤其是在管理大量交易或使用复杂算法时。 |
对上一工具(分析评论工具)的回顾
我们之前的工具——分析评论脚本,旨在分析前一交易日的关键指标,包括:
- 前一日开盘价
- 前一日收盘价
- 前一日成交量
- 当日成交量
- 支撑位与阻力位
这些信息以垂直排列的表格形式呈现。此外,还根据前几日的开盘价、收盘价以及交易量计算了潜在的市场走势预测,如下图1所示。
图例 1. 数据展示
我们的脚本成功地在图表上绘制了趋势线,并标出了关键的支撑和阻力位。市场方向预测也呈现为积极态势。在图2中,我们总结了分析评论工具的结果。
图例 2. 分析评论工具的效果
要了解更多关于分析评论脚本的信息,请点击以下链接:https://www.mql5.com/zh/articles/15927
分析大师(EA)概述
当我们从脚本过渡到EA时,之前脚本提供的部分信息仍将通过EA继续提供,如前面对上一工具的回顾中所述。然而,EA还将提供额外的信息,并执行超出原始脚本能力的任务。
此外,我们的EA现在可以计算市场波动率、点差、账户净值、余额,以及基于账户余额的最小和最大可能手数。我将进一步解释为什么了解这些信息至关重要。
- 市场波动率
波动率是衡量数据在特定时期内围绕其均值离散程度的统计指标。计算市场波动率对于金融市场中的有效风险管理、交易执行和战略规划至关重要。这款EA自动化了市场波动率的计算,使流程更加精简和用户友好。虽然市场波动率通常使用以下公式计算,但我们为便于使用该EA,简化了该功能。
图例 3. 波动率公式
要计算波动率,我们首先按上述方法确定标准差。要获得年化波动率,可以将标准差乘以一年中交易总天数的平方根,约为252天。了解更多:https://quantra.quantinsti.com/glossary/Volatility
- 市场点差
市场点差,通常简称为“点差”,是金融市场中特定资产的买价与卖价之间的差额。了解市场点差值的一个重要原因是评估交易成本。理解点差有助于交易者和投资者评估进出仓位的成本。
较窄的点差通常意味着较低的交易成本和更好的交易执行,这对高频交易者或每日执行大量交易的交易者尤为重要。相反,较宽的点差可能意味着更高的成本,并可能提示交易者重新考虑其策略或选择其他资产进行交易以降低费用。因此,了解市场点差值直接影响交易的盈利能力和整体投资表现。
图例 4. 市场点差公式
- 交易量
为提升交易者的体验,我们的EA将简化市场信息的计算,并每两小时更新一次这些数据。这确保交易者能够掌握最新的市场洞察,从而做出更明智的决策。
分析EA代码(关键功能与特性)
该代码包含多项功能:
- 检索并显示前一日和当日的交易数据。
- 基于价格变动分析市场方向。
- 在图表上绘制趋势线。
- 基于风险管理原则计算仓位大小。
以下是我们EA的代码。
//+------------------------------------------------------------------+ //| Analytics Master EA.mq5| //| Copyright 2024, Christian Benjamin| //| https://www.mql5,com| //+------------------------------------------------------------------+ #property copyright "2024, MetaQuotes Software Corp." #property link "https://www.mql5.com/en/users/lynnchris" #property description "EA for market analysis and commenting" #property version "1.0" #property strict // Inputs for risk management input double RiskPercentage = 1.0; // Percentage of account balance to risk per trade input double StopLossMultiplier = 1.0; // Multiplier for determining the stop loss distance input int ATR_Period = 14; // Period for ATR calculation // Global variables for storing values datetime lastUpdateTime = 0; double previousDayOpen, previousDayClose, previousDayHigh, previousDayLow; double previousDayVolume; double currentDayVolume; double support, resistance; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { lastUpdateTime = 0; // Set the initial update time return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectsDeleteAll(0); // Clean up any drawn objects on the current chart } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { UpdateMetrics(); // Call to the function that fetches and displays the metrics } //+------------------------------------------------------------------+ //| Update metrics and display them | //+------------------------------------------------------------------+ void UpdateMetrics() { // Check if 2 hours have passed since the last update if(TimeCurrent() - lastUpdateTime >= 2 * 3600) { // Fetch previous day's data datetime prevDay = iTime(NULL, PERIOD_D1, 1); previousDayOpen = iOpen(NULL, PERIOD_D1, 1); previousDayClose = iClose(NULL, PERIOD_D1, 1); previousDayHigh = iHigh(NULL, PERIOD_D1, 1); previousDayLow = iLow(NULL, PERIOD_D1, 1); previousDayVolume = iVolume(NULL, PERIOD_D1, 1); // Fetch current day's volume currentDayVolume = iVolume(NULL, PERIOD_D1, 0); // Volume for today // Calculate support and resistance support = previousDayLow - (previousDayHigh - previousDayLow) * 0.382; // Fibonacci level resistance = previousDayHigh + (previousDayHigh - previousDayLow) * 0.382; // Fibonacci level // Determine market direction string marketDirection = AnalyzeMarketDirection(previousDayOpen, previousDayClose, previousDayHigh, previousDayLow); // Calculate possible lot size based on risk management double lotSize = CalculateLotSize(support, resistance); // Retrieve account metrics double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE); double accountEquity = AccountInfoDouble(ACCOUNT_EQUITY); // Calculate market spread manually double marketBid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double marketAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double marketSpread = marketAsk - marketBid; // Calculate spread double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); double maxLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); // Calculate market volatility using ATR int atrHandle = iATR(NULL, PERIOD_H1, ATR_Period); // Get the ATR handle double atrValue = 0.0; if(atrHandle != INVALID_HANDLE) // Check if the handle is valid { double atrBuffer[]; // Array to hold the ATR values if(CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0) // Copy the latest ATR value { atrValue = atrBuffer[0]; // Retrieve the ATR value from the buffer } IndicatorRelease(atrHandle); // Release the indicator handle } // Create the output string including the last update time string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES); string infoStr = StringFormat("Prev Day Open: %.2f\nPrev Day Close: %.2f\nPrev Day High: %.2f\nPrev Day Low: %.2f\n" "Prev Day Volume: %.0f\nCurrent Day Volume: %.0f\nMarket Direction: %s\n" "Support: %.2f\nResistance: %.2f\nAccount Balance: %.2f\nAccount Equity: %.2f\n" "Market Spread: %.2f\nMin Lot Size: %.2f, Max Lot Size: %.2f\n" "Market Volatility (ATR): %.2f\nLast Update Time: %s\nPossible Lot Size: %.2f", previousDayOpen, previousDayClose, previousDayHigh, previousDayLow, previousDayVolume, currentDayVolume, marketDirection, support, resistance, accountBalance, accountEquity, marketSpread, minLotSize, maxLotSize, atrValue, lastUpdateStr, lotSize); // Log the information Print(infoStr); // Display information on the chart Comment(infoStr); // Remove old trend lines and create new ones for previous day's high/low ObjectsDeleteAll(0); // Draw continuous trend lines DrawContinuousTrendLine("PrevDayHigh", previousDayHigh); DrawContinuousTrendLine("PrevDayLow", previousDayLow); // Update last update time lastUpdateTime = TimeCurrent(); } } //+------------------------------------------------------------------+ //| Analyze market direction | //+------------------------------------------------------------------+ string AnalyzeMarketDirection(double open, double close, double high, double low) { string direction; if(close > open) { direction = "Bullish"; } else if(close < open) { direction = "Bearish"; } else { direction = "Neutral"; } // Include current trends or patterns based on high and low for further analysis if(high > open && high > close) { direction += " with bullish pressure"; // Example addition for context } else if(low < open && low < close) { direction += " with bearish pressure"; // Example addition for context } return direction; } //+------------------------------------------------------------------+ //| Draw a continuous trend line to the left on the chart | //+------------------------------------------------------------------+ void DrawContinuousTrendLine(string name, double price) { datetime startTime = TimeCurrent() - 720 * 3600; // Extend 24 hours into the past ObjectCreate(0, name, OBJ_TREND, 0, startTime, price, TimeCurrent(), price); ObjectSetInteger(0, name, OBJPROP_COLOR, (StringFind(name, "High") >= 0) ? clrRed : clrBlue); ObjectSetInteger(0, name, OBJPROP_WIDTH, 2); // Set thickness of the line ObjectSetInteger(0, name, OBJPROP_XSIZE, 0); // Set this property to extend the line infinitely to the left } //+------------------------------------------------------------------+ //| Calculate the lot size based on risk management | //+------------------------------------------------------------------+ double CalculateLotSize(double support, double resistance) { double stopLossDistance = MathAbs((support - resistance) * StopLossMultiplier); double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (RiskPercentage / 100.0); // Get the tick size for the current symbol double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); // Calculate the lot size based on the stop loss and tick size double lotSize = riskAmount / (stopLossDistance / tickSize); // Adjusted for the correct pip size lotSize = NormalizeDouble(lotSize, 2); // Normalize the lot size to two decimal places // Ensure lot size is above minimum lot size allowed by broker double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); if(lotSize < minLotSize) lotSize = minLotSize; return lotSize; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+
代码分解
1. 初始化及属性参数
input double RiskPercentage = 1.0; // Percentage of account balance to risk per trade input double StopLossMultiplier = 1.0; // Multiplier for determining the stop loss distance input int ATR_Period = 14; // Period for ATR calculation // Global variables for storing values datetime lastUpdateTime = 0; double previousDayOpen, previousDayClose, previousDayHigh, previousDayLow; double previousDayVolume; double currentDayVolume; double support, resistance;
输入参数允许用户根据自己的交易偏好来定制EA的行为。全局变量被声明用于存储历史数据,包括前一日的开盘价、收盘价、最高价、最低价,以及成交量和支撑/阻力位。
2. OnInit 和 OnDeinit 函数
int OnInit() { lastUpdateTime = 0; // Set the initial update time return INIT_SUCCEEDED; }
OnInit:此函数在EA初始化时执行。它将上次更新时间设置为零。
void OnDeinit(const int reason) { ObjectsDeleteAll(0); // Clean up any drawn objects on the current chart }
OnDeinit:当EA被移除或停止时调用此函数,它会通过删除所有图表对象来进行清理。
3. OnTick 中的主要代码
void OnTick() { UpdateMetrics(); // Call to the function that fetches and displays the metrics }
此函数在每次报价(价格变动)时触发。它调用 UpdateMetrics 函数来收集和分析数据。
4. UpdateMetrics 函数
void UpdateMetrics() { if (TimeCurrent() - lastUpdateTime >= 2 * 3600) // Check if 2 hours have passed since last update { // Fetch previous day's data datetime prevDay = iTime(NULL, PERIOD_D1, 1); previousDayOpen = iOpen(NULL, PERIOD_D1, 1); previousDayClose = iClose(NULL, PERIOD_D1, 1); previousDayHigh = iHigh(NULL, PERIOD_D1, 1); previousDayLow = iLow(NULL, PERIOD_D1, 1); previousDayVolume = iVolume(NULL, PERIOD_D1, 1); // Fetch current day's volume currentDayVolume = iVolume(NULL, PERIOD_D1, 0); // Volume for today // Calculate support and resistance support = previousDayLow - (previousDayHigh - previousDayLow) * 0.382; resistance = previousDayHigh + (previousDayHigh - previousDayLow) * 0.382; // Determine market direction string marketDirection = AnalyzeMarketDirection(previousDayOpen, previousDayClose, previousDayHigh, previousDayLow); // Calculate possible lot size based on risk management double lotSize = CalculateLotSize(support, resistance); // Retrieve account metrics double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE); double accountEquity = AccountInfoDouble(ACCOUNT_EQUITY); // Calculate market spread manually double marketBid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double marketAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double marketSpread = marketAsk - marketBid; // Calculate market volatility using ATR int atrHandle = iATR(NULL, PERIOD_H1, ATR_Period); double atrValue = 0.0; if (atrHandle != INVALID_HANDLE) // Check if the handle is valid { double atrBuffer[]; if (CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0) { atrValue = atrBuffer[0]; } IndicatorRelease(atrHandle); // Release the indicator handle } // Create the output string including the last update time string lastUpdateStr = TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES); string infoStr = StringFormat("Prev Day Open: %.2f\nPrev Day Close: %.2f\nPrev Day High: %.2f\nPrev Day Low: %.2f\n" "Prev Day Volume: %.0f\nCurrent Day Volume: %.0f\nMarket Direction: %s\n" "Support: %.2f\nResistance: %.2f\nAccount Balance: %.2f\nAccount Equity: %.2f\n" "Market Spread: %.2f\nMin Lot Size: %.2f, Max Lot Size: %.2f\n" "Market Volatility (ATR): %.2f\nLast Update Time: %s\nPossible Lot Size: %.2f", previousDayOpen, previousDayClose, previousDayHigh, previousDayLow, previousDayVolume, currentDayVolume, marketDirection, support, resistance, accountBalance, accountEquity, marketSpread, minLotSize, maxLotSize, atrValue, lastUpdateStr, lotSize); // Log the information Print(infoStr); // Display information on the chart Comment(infoStr); // Remove old trend lines and create new ones for previous day's high/low ObjectsDeleteAll(0); // Draw continuous trend lines DrawContinuousTrendLine("PrevDayHigh", previousDayHigh); DrawContinuousTrendLine("PrevDayLow", previousDayLow); // Update last update time lastUpdateTime = TimeCurrent(); } }
- 时间检查:该函数仅在自上次更新后已过去2小时时才执行,以最大限度地减少不必要的计算。
- 数据获取:使用 iTime、iOpen、iClose、iHigh、iLow 和 iVolume 来收集昨日和今日的数据。
- 支撑与阻力:脚本根据前一日的最低价和最高价计算斐波那契回撤位。
- 市场方向分析:调用 AnalyzeMarketDirection 函数来评估市场状况。
- 手数计算:调用 CalculateLotSize 函数,根据风险管理原则确定交易量。
- 账户与市场指标:获取账户余额、净值和市场点差,以做出更优的交易决策。
- ATR 计算:获取平均真实波幅(ATR)以衡量市场波动性。
- 信息输出:将相关指标格式化并显示在 infoStr 字符串中,并通过 Print 函数将其输出到日志。
- 趋势线绘制:清除旧的趋势线,并根据前一日的最高价和最低价创建新的趋势线。
5. 市场方向分析
string AnalyzeMarketDirection(double open, double close, double high, double low) { string direction; if (close > open) { direction = "Bullish"; } else if (close < open) { direction = "Bearish"; } else { direction = "Neutral"; } // Include current trends or patterns based on high and low for further analysis if (high > open && high > close) { direction += " with bullish pressure"; // Example addition for context } else if (low < open && low < close) { direction += " with bearish pressure"; // Example addition for context } return direction; }
- 判断市场方向:该函数利用前一日的开盘价、收盘价、最高价和最低价,来判断市场是处于看涨、看跌还是中性状态。
- 额外功能:它还会基于最高价和最低价检查压力指标,从而提供更具上下文的市场状况分析。
6. 趋势线绘制
void DrawContinuousTrendLine(string name, double price) { datetime startTime = TimeCurrent() - 24 * 3600; // Extend 24 hours into the past ObjectCreate(0, name, OBJ_TREND, 0, startTime, price, TimeCurrent(), price); ObjectSetInteger(0, name, OBJPROP_COLOR, (StringFind(name, "High") >= 0) ? clrRed : clrBlue); ObjectSetInteger(0, name, OBJPROP_WIDTH, 2); // Set thickness of the line ObjectSetInteger(0, name, OBJPROP_XSIZE, 0); // Set this property to extend the line infinitely to the left }
- 绘制趋势线:该函数在图表上为前一日的最高价或最低价创建一条趋势线,并将其向后延伸24小时。
- 自定义设置:每条线都有特定的颜色(最高价为红色,最低价为蓝色)和指定的宽度。
7. 交易量计算
double CalculateLotSize(double support, double resistance) { double stopLossDistance = MathAbs((support - resistance) * StopLossMultiplier); double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (RiskPercentage / 100.0); // Get the tick size for the current symbol double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); // Calculate the lot size based on the stop loss and tick size double lotSize = riskAmount / (stopLossDistance / tickSize); lotSize = NormalizeDouble(lotSize, 2); // Normalize the lot size to two decimal places // Ensure lot size is above minimum lot size allowed by broker double minLotSize = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); if (lotSize < minLotSize) lotSize = minLotSize; return lotSize; }
- 风险管理:该函数根据用户设定的风险百分比相对于账户余额以及计算出的止损距离,来计算交易手数。
- 标准化处理:确保计算出的交易手数在经纪商设定的可接受范围内。
代码实现和测试
在 MetaTrader 5 上实现EA:分步指南- 打开 MetaTrader 5:在您的计算机上启动 MetaTrader 5 交易平台。
- 访问 MetaEditor:要打开 MetaEditor,请前往菜单栏,点击“工具” > “MetaQuotes 语言编辑器”,或直接按 F4 键。或者,如果您单独安装了 MetaEditor,也可以直接运行它。
- 插入 EA:在 MetaEditor 中,选择“文件” > “新建” > “EA”,或打开一个现有的 EA 文件(.mq5)。如果创建新的 EA,请按照提示为其命名并进行定义。
- 编译 EA:编辑完 EA 代码后,点击“编译”按钮(或按 F7 键)。确保没有错误;成功编译后将生成一个可执行文件。
- 将 EA 加载到 MetaTrader 5:返回 MetaTrader 5 平台,打开“导航器”面板(Ctrl + N)。在“智能交易系统”部分找到您编译好的 EA。
- 将 EA 附加到图表:将 EA 拖放到所需的图表上,或右键点击 EA 并选择“附加到图表”。将弹出一个设置窗口,供您自定义参数。
- 启用自动交易:通过点击 MetaTrader 5 工具栏上的绿色“自动交易”按钮,确保已启用自动交易功能。如果出现系统提示,请在 EA 设置中勾选“允许自动交易”选项。
- 监控性能:密切关注 EA 在图表上的表现。如有需要,可使用“策略测试器”进行回测。
- 根据需要调整设置:您可以通过右键点击图表,直接在 EA 设置窗口中修改参数或设置。
图 5. 分析结果
图5展示了将EA附加到图表上的过程及其产生的结果。
图 6. 分析结果
上图6展示了我们EA的整体性能,该系统能够自动计算关键市场指标,并以图表形式呈现。该EA根据前一日的支撑位和阻力位绘制趋势线。它每两小时定期更新一次市场信息,如最后两张图所示,图中也显示了最新的更新时间戳。
结论
总而言之,本EA的成功部署,标志着我们向自动化交易领域迈出了重要一步。该EA不仅实现了对关键市场指标的自动化分析,还提供了关于支撑位和阻力位的宝贵信息,帮助交易者做出更明智的决策。通过整合有效的风险管理并提供实时更新,它支持交易者自信地应对复杂的市场环境。总体而言,该工具提升了交易效率,并赋能用户在其交易策略中保持信息灵通和积极主动。
请花时间在历史数据上对该EA进行回测,以了解其在不同市场条件下的表现。这将帮助您微调其设置,以适应您的交易风格。定期审查EA提供的信息。市场状况可能瞬息万变,因此保持信息更新对于做出及时决策至关重要。始终坚持您的风险管理策略。调整风险百分比设置,使其与您的个人风险承受能力和账户规模相匹配。积极学习有关交易策略、市场行为和技术分析的方法,作为对EA提供信息的补充。如果您遇到问题或有改进建议,请随时向开发者反馈。用户的意见对于未来的改进工作至关重要。
遵循这些建议,您将能最大化“交易大师”EA的有效性,并改善您的整体交易体验。
日期 | 工具名称 | 说明 | 版本 | 更新 | 提示 |
---|---|---|---|---|---|
01/10/24 | 图表投影仪(Chart Projector) | 用于叠加前一天价格走势(带“幽灵”效果)的脚本。 | 1.0 | 首次发布 | Lynnchris工具箱中的第一款工具 |
18/11/24 | 分析评论(Analytical Comment) | 它以表格形式提供前一日的市场信息,并预测市场的未来走向。 | 1.0 | 首次发布 | Lynnchris工具箱中的第二款工具 |
27/11/24 | 分析大师(Analytics Master) | 市场指标每两小时定期更新 | 1.01 | 第二版 | Lynnchris工具箱中的第三款工具 |
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/16434
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。



您好Ifeanyichukwu Ikwecheghe,
感谢您的积极反馈!我很高兴听到您认为该工具很有价值。
回答您的问题:
1. 该工具不会为您开启交易;相反,它提供分析和信号,您可以利用这些分析和信号做出明智的交易决策。您将根据其预测手动执行交易。
2. 信号定期更新,大约每两小时更新一次,使您能够适应不断变化的市场条件。虽然它们不能反映整个交易时段的实时变化,但这些更新将帮助您了解市场情绪的变化,无论是看跌状态转变为看涨状态,还是反之亦然。
欢迎讨论您的观点和进一步建议。
前两个工具是独立的:
因此,第二个脚本并不是第一个脚本的升级版。真正的延续是分析大师 EA,它是分析评论的扩展。
本脚本/EA 仅适用于 MT5。没有 MT4 版本,因为 MT4 已经停产,不再维护,所以只有在 MT5 上开发才有意义。