价格行为分析工具包开发(第12部分):外部资金流(3)趋势图谱(TrendMap)
概述
在2020年新冠疫情危机引发的市场波动期间,交易者们纷纷借助各种技术工具,以帮助判断市场何时可能复苏。有些人甚至尝试利用斐波那契时间区间,根据历史价格走势来识别潜在的转折点。尽管斐波那契预测与重大反弹之间的吻合度仍存在争议,但随着各国政府开始实施刺激措施,经济逐步重新恢复,这些工具为投资者在不确定环境中提供多种可供参考的分析框架之一。
在先前的价格行为分析工具包开发系列文章中,我们探讨了一种基于VWAP的策略,该策略着重研究了VWAP水平如何影响市场决策——即当价格高于VWAP时发出买入信号,低于VWAP时发出卖出信号。然而,仅依赖VWAP可能会带来问题,特别是在市场条件极端、可能出现反转的时期。
在本文中,我们通过将VWAP与斐波那契水平相结合,进一步深入分析,以生成交易信号。斐波那契回调位有助于识别潜在的支撑和阻力区域,当与VWAP结合使用时,它们可以增强交易策略的稳健性。我们首先解释相关的基础概念,然后概述MQL5 EA和Python脚本中的关键功能。接下来,我们将深入探讨其他功能的细节,并讨论预期结果,最后总结关键要点。请参考以下目录。
概述
斐波那契回调位是基于由莱昂纳多·斐波那契在13世纪提出的斐波那契数列推导出的比率,在技术分析中被广泛应用于确定价格可能发生反转的潜在支撑位和阻力位。将斐波那契回调位与VWAP相结合,为我们提供了一个更为稳健的交易工具,因为VWAP融合了价格和成交量数据,能够真实反映市场情绪和流动性状况。这种整合通过以成交量作为依据来确认关键反转区域,增强了决策的科学性,减少了虚假信号,并提供了对市场行为的动态视角。
趋势图谱(TrendMap) 系统是一个交易信号生成框架,它将MQL5 EA与基于Python的分析服务器相结合。该系统处理斐波那契回调位、VWAP和价格数据,以生成交易信号(买入或卖出)。
- 如果VWAP低于50%斐波那契回调位(中间价),则生成买入信号。
- 如果VWAP高于50%斐波那契回调位(中间价),则生成卖出信号。
这样确保了根据相对于VWAP和斐波那契回调位的价格走势来提供信号。以下是我展示的一张图表,呈现出市场如何与斐波那契水平位和VWAP相互作用。该图展示了我们基于Python系统监控在生成信号时所需的必要条件。
- Fib 0 - 0%
- Fib 1 - 24%
- Fib 2 - 38%
- Fib 3 - 50%
- Fib 4 - 62%
- Fib 5 - 79%
- Fib 6 - 100%
斐波那契3(Fib 3)代表50%的回调水平位,我们观察到VWAP位于该水平位之上,这表明市场可能出现反转。因此,系统生成了卖出信号。我还圈出了价格与斐波那契水平位和VWAP同时产生交互的位置。

图例1. 价格与斐波那契及VWAP的关系
MQL5 EA将斐波那契回调水平位分析与VWAP分析相结合,以生成交易信号,但不执行实际交易。根据指定数量的过去K线计算斐波那契水平位,确定波动高点和低点,并计算VWAP以评估市场趋势。该EA通过HTTP协议将此数据发送至Python服务器,由服务器分析市场状况并返回买入或卖出信号。收到新信号后,EA通过在图表上显示信号、绘制斐波那契线、VWAP线以及指示箭头来进行可视化展示。
该系统采用基于定时器的方法运行,确保定期更新,同时记录并跟踪市场变化。此脚本设置了一个Flask服务器,用于接收来自MQL5 EA的市场数据,处理这些数据,并返回交易信号。
当EA发送包含VWAP、斐波那契回调水平位、波动高点/低点和价格数据的JSON数据时,脚本会评估VWAP是位于波动范围中价之上还是之下,以确定“买入”或“卖出”信号。同时,会生成一个使用Matplotlib库绘制的图表,展示了VWAP、斐波那契水平位和价格数据,并将图像保存以供参考。绘图过程在单独的线程中运行,以确保流程顺畅。
所有操作均被记录以供跟踪,服务器运行在127.0.0.1:5110地址上。下面,让我们通过流程图来全面了解这一过程。

图例2. 流程图
主函数
MQL5 EA
在本部分中,我们将详细介绍为MQL5中斐波那契-VWAP EA提供核心功能的函数。目标:
- 利用波动高点和低点计算斐波那契回调水平位
- 确定VWAP以确认趋势
- 将市场数据发送至Python,Python将进行更深入的分析并返回买入/卖出信号
- 一旦满足所有条件,便在图表上绘制信号箭头
让我们逐步详细解析。
1. 更新斐波那契和VWAP指标
首先,在生成任何信号之前,我们必须确保斐波那契回调水平位和VWAP是最新的。我们通过调用两个关键函数来实现这一点。首先,CalculateFibonacciLevels()函数负责识别波动高点和波动低点,并计算相关的斐波那契回调水平位。
这些水平位对于理解潜在的支撑和阻力区域至关重要。第二个函数,CalculateVWAP(),用于计算VWAP,该指标根据成交量和价格来确定整体市场趋势。通过不断更新这些指标,我们确保使用的是最新的市场数据,这对于准确的分析和决策至关重要。
void UpdateIndicators() { CalculateFibonacciLevels(InpTimeFrame, InpNumBars, g_SwingHigh, g_SwingLow, g_FibLevels); g_VWAP = CalculateVWAP(InpTimeFrame, InpNumBars); Print("Updated Indicators: SwingHigh=" + DoubleToString(g_SwingHigh, Digits()) + ", SwingLow=" + DoubleToString(g_SwingLow, Digits()) + ", VWAP=" + DoubleToString(g_VWAP, Digits())); }
2. 发送市场数据至Python
更新斐波那契和VWAP指标后,下一步便是将市场数据发送至Python,以便进行更高级的分析。这需要创建一个包含所有后续处理所需关键信息的JSON数据负载。该数据负载的结构包含关键数据点,如图表交易品种和时间框架、波动高点和低点、VWAP值以及计算得出的斐波那契水平位。此外,我们还包含近期价格数据,以便进一步分析市场情况。一旦数据被结构化为此JSON格式,便会通过HTTP请求发送至Python服务器,由Python对其进行处理,并根据计算结果返回交易信号。
string BuildJSONPayload() { string jsonPayload = "{"; jsonPayload += "\"symbol\":\"" + Symbol() + "\","; jsonPayload += "\"timeframe\":\"" + EnumToString(InpTimeFrame) + "\","; jsonPayload += "\"swingHigh\":" + DoubleToString(g_SwingHigh, Digits()) + ","; jsonPayload += "\"swingLow\":" + DoubleToString(g_SwingLow, Digits()) + ","; jsonPayload += "\"vwap\":" + DoubleToString(g_VWAP, Digits()) + ","; jsonPayload += "\"fibLevels\":["; for(int i = 0; i < 7; i++) { jsonPayload += DoubleToString(g_FibLevels[i], 3); if(i < 6) jsonPayload += ","; } jsonPayload += "],"; jsonPayload += "\"priceData\":["; for(int i = 0; i < InpNumBars; i++) { jsonPayload += DoubleToString(iClose(Symbol(), InpTimeFrame, i), Digits()); if(i < InpNumBars - 1) jsonPayload += ","; } jsonPayload += "]}"; return jsonPayload; }
3. 与Python通信并接收信号
在此阶段,HTTP请求被发出,将JSON数据负载发送至Python脚本。随后,Python服务器将对数据进行分析,并返回包含买入或卖出信号的响应。HTTP请求的构建方式可同时处理数据发送和响应接收,并检查过程中是否出现任何错误。如果请求成功(以200的响应码为标识),则解析响应,并从Python返回的JSON数据中提取相关信号(买入、卖出或持仓)。这使MQL5 EA能够将外部计算能力整合到其决策过程中,从而生成更稳健的交易信号。
string SendDataToPython(string payload) { string headers = "Content-Type: application/json\r\n"; char postData[]; StringToCharArray(payload, postData); char result[]; string resultHeaders; int resCode = WebRequest("POST", InpPythonURL, headers, InpHTTPTimeout, postData, result, resultHeaders); if(resCode == 200) { string response = CharArrayToString(result); Print("HTTP Response: " + response); string signal = ParseSignalFromJSON(response); return signal; } else { Print("Error: WebRequest failed with code " + IntegerToString(resCode)); return ""; } }
4. 在图表上绘制买入/卖出信号
从Python接收到交易信号后,下一步便是在图表上以可视化的方式呈现该信号。具体做法是在当前市场价格处绘制一个箭头,用以指示建议采取的操作。如果信号为买入信号,则绘制一个指向上的箭头(颜色为绿色);若为卖出信号,则绘制一个指向下的箭头(颜色为红色)。这种视觉提示对于交易者而言至关重要,它使交易者无需分析数字即可迅速理解交易建议。
这些箭头是使用ObjectCreate函数动态创建的,并且其外观(如颜色和大小)可进行调整,以确保更好的可视性。这些箭头可使交易信号清晰易懂,即使是对系统分析细节不甚了解的人也能轻松识别。
void DrawSignalArrow(string signal) { int arrowCode = 0; color arrowColor = clrWhite; string lowerSignal = MyStringToLower(signal); if(lowerSignal == "buy") { arrowCode = 233; // Upward arrow arrowColor = clrLime; } else if(lowerSignal == "sell") { arrowCode = 234; // Downward arrow arrowColor = clrRed; } else { Print("Invalid signal: " + signal); return; } string arrowName = "SignalArrow_" + IntegerToString(TimeCurrent()); ObjectCreate(0, arrowName, OBJ_ARROW, 0, TimeCurrent(), iClose(Symbol(), PERIOD_CURRENT, 0)); ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, arrowCode); ObjectSetInteger(0, arrowName, OBJPROP_COLOR, arrowColor); ObjectSetInteger(0, arrowName, OBJPROP_WIDTH, 2); }
Python脚本
1. 绘制VWAP与斐波那契回调位对比价格图
plot_vwap_fib_vs_price()函数用于可视化价格走势、VWAP以及斐波那契回调水平位。该函数旨在帮助理解这三个指标之间的关系。函数接受以下参数:
- symbol:正在分析的资产
- vwap:计算得出的成交量加权平均价
- swingHigh和swingLow:用于计算斐波那契回调水平位的高点和低点
- fibLevels:斐波那契回调水平位(默认值包括常见的回调比例,如0.236、0.382等)
- price_data:包含随时间变化的价格数据的pandas Series
函数分解:
- 绘制价格数据:函数首先使用sns.set设置样式,并通过ax.plot可视化随时间变化的价格数据
- 绘制斐波那契水平:对于列表中的每个斐波那契水平,函数计算对应的价格,并使用ax.axhline绘制水平线
- 绘制VWAP:VWAP以黄色水平线形式绘制
- 保存图表:图表以带时间戳的名称保存,避免覆盖之前的图像文件
保存该图表为图像文件,有助于直观观察价格如何与关键斐波那契回撤位及VWAP联动。
def plot_vwap_fib_vs_price(symbol: str, vwap: float, swingHigh: float, swingLow: float, fibLevels: list, price_data: pd.Series) -> str: sns.set(style="whitegrid") fig, ax = plt.subplots(figsize=(7.5, 5), dpi=100) ax.plot(price_data.index, price_data.values, label="Price", color='blue', marker='o', markersize=4) for level in fibLevels: level_price = swingLow + (swingHigh - swingLow) * level ax.axhline(y=level_price, linestyle='--', linewidth=1.5, label=f'Fib {level*100:.1f}%: {level_price:.5f}') ax.axhline(y=vwap, color='yellow', linestyle='-', linewidth=2, label=f'VWAP: {vwap:.5f}') ax.set_title(f'VWAP & Fibonacci vs Price for {symbol}') ax.set_xlabel('Time Index') ax.set_ylabel('Price') ax.legend() filename = f"vwap_fib_plot_{symbol}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png" plt.savefig(filename) plt.close(fig) return filename
2. 用于信号与分析的Flask路由
get_signal()函数是处理POST请求的核心路由,负责接收市场数据、执行分析并返回交易信号。数据以JSON负载的形式从MQL5发送到该路由。
函数分解:
- 接收数据:该函数以原始格式接收市场数据,对其进行解码,并解析为JSON对象。
- 提取数据:从传入的JSON中提取关键数据点,如交易品种、swingHigh(波动高点)、swingLow(波动低点)、vwap(成交量加权平均价)、fibLevels(斐波那契水平位)和priceData(价格数据)。
- 绘制图表:启动一个新线程,调用绘图函数生成市场状况(VWAP和斐波那契)的可视化表示。
- 信号生成:通过比较VWAP与波动高点和低点之间的中点来生成买入/卖出信号。如果VWAP低于中点,则生成“买入”信号;否则,发出“卖出”信号。
- 响应:返回包含生成的信号(“买入”、“卖出”或“无信号”)及解释的响应。
信号生成逻辑简单但却有效:
- 买入信号:VWAP低于波动高点和低点之间的中点,表明可能存在上行动力。
- 卖出信号:VWAP高于中点,表明可能存在下行趋势或看跌条件。
@app.route('/getSignal', methods=['POST']) def get_signal(): try: # Get the raw data from the request raw_data = request.data.decode('utf-8').strip() logging.debug("Raw data received: " + raw_data) # Parse JSON decoder = json.JSONDecoder() data, idx = decoder.raw_decode(raw_data) if idx != len(raw_data): logging.error(f"Extra data found after valid JSON: index {idx} of {len(raw_data)}") logging.info("Data received from MQL5: " + json.dumps(data, indent=2)) except Exception as e: logging.error("Error parsing JSON: " + str(e)) return jsonify({"signal": "None", "error": str(e)}) try: # Extract parameters symbol = data.get('symbol', 'Unknown') swingHigh = float(data.get('swingHigh', 0)) swingLow = float(data.get('swingLow', 0)) vwap = float(data.get('vwap', 0)) fibLevels = data.get('fibLevels', [0.236, 0.382, 0.5, 0.618, 1.618]) # Default levels if not provided # Convert priceData list into a pandas Series price_data = pd.Series(data.get('priceData', [])) # Start thread for visualization threading.Thread(target=plot_vwap_fib_vs_price, args=(symbol, vwap, swingHigh, swingLow, fibLevels, price_data)).start() # Determine signal based on VWAP & Fibonacci mid_price = np.mean([swingHigh, swingLow]) if vwap < mid_price and price_data.iloc[-1] < swingLow + (swingHigh - swingLow) * 0.382: signal = "Buy" elif vwap > mid_price and price_data.iloc[-1] > swingLow + (swingHigh - swingLow) * 0.618: signal = "Sell" else: signal = "None" explanation = f"Signal: {signal} based on VWAP and Fibonacci analysis." except Exception as e: logging.error("Error processing data: " + str(e)) signal = "None" explanation = "Error processing the signal." # Build response response = { "signal": signal, "explanation": explanation, "received_data": data } logging.debug("Sending response to MQL5: " + json.dumps(response)) return jsonify(response)
在代码中,信号生成过程同时考虑了VWAP(成交量加权平均价)和斐波那契水平位,其逻辑明确依赖于这两者来决定是否生成买入或卖出信号。买入或卖出信号直接基于VWAP和斐波那契水平位的对齐情况。例如:
- 买入信号:当VWAP低于中点,且价格接近支撑位(斐波那契回调位)时,这是强烈的买入信号。
- 卖出信号:如果VWAP高于中点,且价格处于斐波那契阻力位,则卖出信号更为强烈。
其他函数
MQL5 EA
- 辅助函数
我们先从辅助函数说起。这类函数就像我们工具箱里的小工具,能在后续工作中简化我们的操作。例如,函数BoolToString可将真/假值转换为字符串(“true”或“false”),这样当您记录或显示这些值时,它们就易于阅读了。然后是CharToStr,它接收一个字符代码(无符号短整型)并将其转换为字符串——当您需要处理文本数据时,这是一个非常实用的函数。最后,MyStringToLower会逐个字符地遍历给定字符串,将任何大写字母转换为小写字母。当您想比较字符串而无需担心大小写差异时,这个函数尤其有用。具体代码如下:
//+------------------------------------------------------------------+ //| Helper: Convert bool to string | //+------------------------------------------------------------------+ string BoolToString(bool val) { return(val ? "true" : "false"); } //+------------------------------------------------------------------+ //| Helper: Convert ushort (character code) to string | //+------------------------------------------------------------------+ string CharToStr(ushort ch) { return(StringFormat("%c", ch)); } //+------------------------------------------------------------------+ //| Helper: Convert a string to lower case | //| This custom function avoids the implicit conversion warning. | //+------------------------------------------------------------------+ string MyStringToLower(string s) { string res = ""; int len = StringLen(s); for(int i = 0; i < len; i++) { ushort ch = s[i]; // Check if character is uppercase A-Z. if(ch >= 'A' && ch <= 'Z') ch = ch + 32; res += CharToStr(ch); } return res; }
本质上讲,这类函数有助于确保我们的EA在整个文本和数据处理过程中保持一致性。
- 初始化与清理
接下来,我们介绍初始化与清理例程。可将它们想象成戏剧开演前的舞台布置以及演出结束后的收尾工作。在OnInit函数中,EA首先会打印一条欢迎信息。接着,使用EventSetTimer设置一个定时器(这对于周期性任务至关重要),并调用InitializeFibonacciArray来预加载我们的斐波那契水平位。此外,还会记录当前时间,以便管理后续的更新操作。如果定时器设置失败,EA会立即停止运行,以防止出现进一步的问题。相反,当EA从图表中移除时,会调用OnDeinit函数,使用EventKillTimer终止定时器,并记录移除原因。以下是具体代码示例:
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { Print("FibVWAP No-Trade EA initializing..."); if(!EventSetTimer(InpTimerInterval)) { Print("Error: Unable to set timer."); return(INIT_FAILED); } InitializeFibonacciArray(); g_LastUpdateTime = TimeCurrent(); Print("FibVWAP No-Trade EA successfully initialized."); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); Print("FibVWAP No-Trade EA deinitialized, reason code: " + IntegerToString(reason)); } //+------------------------------------------------------------------+ //| Initialize Fibonacci levels array | //+------------------------------------------------------------------+ void InitializeFibonacciArray() { g_FibLevels[0] = 0.000; g_FibLevels[1] = 0.236; g_FibLevels[2] = 0.382; g_FibLevels[3] = 0.500; g_FibLevels[4] = 0.618; g_FibLevels[5] = 0.786; g_FibLevels[6] = 1.000; }
通过精心设置和清理运行环境,我们能够确保EA平稳运行,避免留下任何未处理的遗留问题。
- 周期性执行与事件处理
现在,我们来看看EA在运行期间如何管理任务。这里的OnTimer函数是关键,它会按照用户设定的间隔(由InpTimerInterval设定)触发。每次定时器触发时,EA都会更新其指标,构建一个JSON负载,将该负载发送到我们的Python端点,并处理返回的任何信号。如果有新信号,EA甚至会在图表上绘制一个箭头。虽然OnTick 会在每次市场更新(或每个tick到来时)时被调用,但我们仅用它来调用MainProcessingLoop,这样就不会在每个tick到来时都进行繁重的处理——而是只在受控的间隔内进行。这种设计有助于保持EA的高效性。请查看以下代码:
//+------------------------------------------------------------------+ //| Expert timer function: periodic update | //+------------------------------------------------------------------+ void OnTimer() { UpdateIndicators(); string payload = BuildJSONPayload(); Print("Payload sent to Python: " + payload); string signal = SendDataToPython(payload); if(signal != "") { if(signal != g_LastSignal) { g_LastSignal = signal; Print("New signal received: " + signal); Comment("ML Signal: " + signal); // Draw an arrow on the chart for the new signal. DrawSignalArrow(signal); } else { Print("Signal unchanged: " + signal); } } else { Print("Warning: No valid signal received."); } UpdateChartObjects(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { MainProcessingLoop(); } //+------------------------------------------------------------------+ //| Main processing loop: can be called from OnTick | //+------------------------------------------------------------------+ void MainProcessingLoop() { datetime currentTime = TimeCurrent(); if(currentTime - g_LastUpdateTime >= InpTimerInterval) { UpdateChartObjects(); g_LastUpdateTime = currentTime; } }
这种设置可以确保我们的EA以适当的频率执行更新,而不会在每个tick到来时应接不暇。
- 图表对象管理
在交易中,视觉反馈至关重要,而这正是我们的图表对象管理发挥作用的地方。DrawChartObjects函数负责在图表上绘制各种视觉元素,例如表示斐波那契水平位和VWAP的水平线。该函数首先清除任何先前绘制的对象,以避免图表杂乱无章,然后采用适当的颜色、样式和文本标签创建新的对象。辅助函数UpdateChartObjects只需调用DrawChartObjects以保持模块化,而如果我们需要执行任何附加的更新或调试操作,则可以使用ExtendedProcessing函数。代码如下:
//+------------------------------------------------------------------+ //| Draw objects on the chart for visual indicator levels | //+------------------------------------------------------------------+ void DrawChartObjects() { string objPrefix = "FibVWAP_"; // Remove previous objects with the given prefix. ObjectsDeleteAll(0, objPrefix); double range = g_SwingHigh - g_SwingLow; for(int i = 0; i < 7; i++) { double levelPrice = g_SwingLow + range * g_FibLevels[i]; string name = objPrefix + "FibLevel_" + IntegerToString(i); if(!ObjectCreate(0, name, OBJ_HLINE, 0, 0, levelPrice)) Print("Error creating object: " + name); else { ObjectSetInteger(0, name, OBJPROP_COLOR, clrDeepSkyBlue); ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT); ObjectSetString(0, name, OBJPROP_TEXT, "Fib " + DoubleToString(g_FibLevels[i]*100, 0) + "%"); } } string vwapName = objPrefix + "VWAP"; if(!ObjectCreate(0, vwapName, OBJ_HLINE, 0, 0, g_VWAP)) Print("Error creating VWAP object."); else { ObjectSetInteger(0, vwapName, OBJPROP_COLOR, clrYellow); ObjectSetInteger(0, vwapName, OBJPROP_STYLE, STYLE_SOLID); ObjectSetString(0, vwapName, OBJPROP_TEXT, "VWAP"); } } //+------------------------------------------------------------------+ //| Periodically update chart objects | //+------------------------------------------------------------------+ void UpdateChartObjects() { DrawChartObjects(); } //+------------------------------------------------------------------+ //| Extended processing: additional updates and chart redraw | //+------------------------------------------------------------------+ void ExtendedProcessing() { Print("Extended processing executed."); UpdateChartObjects(); }
- 附加实用功能函数
//+------------------------------------------------------------------+ //| Convert char array to string | //+------------------------------------------------------------------+ string CharArrayToString(const char &arr[]) { string ret = ""; for(int i = 0; i < ArraySize(arr); i++) ret += CharToStr(arr[i]); return(ret); } //+------------------------------------------------------------------+ //| Custom logging function for detailed debug information | //+------------------------------------------------------------------+ void LogDebugInfo(string info) { string logMessage = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " | " + info; Print(logMessage); } //+------------------------------------------------------------------+ //| Additional utility: Pause execution (for debugging) | //+------------------------------------------------------------------+ void PauseExecution(int seconds) { datetime endTime = TimeCurrent() + seconds; while(TimeCurrent() < endTime) { Sleep(100); } }
这些函数或许并非属于EA中的“明星角色”,但在故障排查和确保一切按预期运行时,却发挥着至关重要的作用。
Python脚本
- Python交易系统中的关键导入库
import datetime import json import logging import threading import numpy as np import pandas as pd import pandas_ta as ta import matplotlib.pyplot as plt import seaborn as sns from flask import Flask, request, jsonify
| 库 | 目的 | 在我们系统中的用途 |
|---|---|---|
| datetime | 时间管理 | 用于为保存的交易图表和日志事件添加时间戳。每次我们生成一张图表时,都会附上一个时间戳,以便随时间追踪不同的市场状况。 |
| json | 数据交换 | 由于系统与MQL5进行通信,因此我们以JSON格式发送和接收数据。该模块帮助我们在Python和MQL5之间对JSON消息进行编码和解码。 |
| logging | 调试与监控 | 用于追踪系统事件。我们使用它来记录每一步——何时接收到信号、处理信号,或者是否发生错误——从而使调试变得更加容易。 |
| threading | 在后台运行任务 | 当我们生成VWAP-斐波那契图表时,我们在一个单独的线程中运行它,以确保服务器保持响应,并且不会延迟向MQL5发送信号。 |
| numpy | 数值计算 | 我们使用NumPy来快速且高效地计算中间价格和执行其他数学运算。在处理实时市场数据时,速度至关重要。 |
| pandas | 数据处理 | 由于市场数据以行和列的形式组织(类似于电子表格),pandas使得存储、过滤和操作这些数据以进行分析变得轻而易举。 |
| pandas_ta | 技术指标 | 虽然它并非当前系统的核心部分,但若未来有需求,该功能可为系统增添更多技术分析工具。 |
| matplotlib.pyplot | 图表绘制与可视化 | 这是我们视觉分析的支柱。我们利用它来绘制价格走势、VWAP水平位以及斐波那契回调区域。 |
| seanborn | 图表样式增强 | 有助于使我们的图表更具视觉吸引力,从而更轻松地识别趋势和关键水平位。 |
| flask | MQL5与Python之间的通信 | 此模块是实现实时信号交换的关键。Flask创建了一个API,使我们的MQL5 EA能够即时发送价格数据并接收交易信号。 |
- Flask Server Initialization (if __name__ == '__main__')
工作原理:
- 将服务器绑定至5110端口
- 以调试模式运行,实现实时日志记录和故障排查
- 确保服务器不会出现不必要地自动重启(use_reloader=False)
if __name__ == '__main__': port = 5110 logging.info(f"Starting Flask server on 127.0.0.1:{port} (debug mode ON)") app.run(host="127.0.0.1", port=port, debug=True, use_reloader=False)
成果
要测试该系统,首先运行Python脚本以激活端口和服务器,建立连接。如果您不确定如何运行脚本,请参阅外部流程文章获取指导。服务器激活后,运行MQL5 EA。现在,让我们来看看成功运行系统后的结果。
命令提示符日志
2025-02-06 12:45:32,384 DEBUG: Sending response to MQL5: {"signal": "Sell", "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", "received_data": {"symbol": "EURUSD", "timeframe": "PERIOD_H1", "swingHigh": 1.05331, "swingLow": 1.02099, "vwap": 1.03795, "fibLevels": [0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0], "priceData": [1.03622, 1.03594, 1.03651, 1.03799, 1.03901, 1.03865, 1.03871, 1.0392, 1.03951, 1.04025, 1.03974, 1.03986, 1.04041, 1.04017, 1.04049, 1.04072, 1.04156, 1.04197, 1.04181, 1.04223, 1.04224, 1.04079, 1.04192, 1.04147, 1.04251, 1.04039, 1.04039, 1.04026, 1.0385, 1.03778, 1.03786, 1.03796, 1.03845, 1.03734, 1.03786, 1.03714, 1.0378, 1.03786, 1.03854, 1.03817, 1.03811, 1.03767, 1.03784, 1.03801, 1.03593, 1.03404, 1.03254, 1.03223, 1.0335, 1.03386, 1.03344, 1.03115, 1.03067, 1.02932, 1.0306, 1.03147, 1.0322, 1.03221, 1.03178, 1.03281, 1.0342, 1.03441, 1.02955, 1.02846, 1.02785, 1.02795, 1.02761, 1.03162, 1.0251, 1.0264, 1.02577, 1.02522, 1.02438, 1.0231, 1.02436, 1.02249, 1.02431, 1.02404, 1.02265, 1.02216, 1.02235, 1.02377, 1.02314, 1.0247, 1.02504, 1.03583, 1.03733, 1.03763, 1.03698, 1.042, 1.03998, 1.03964, 1.03687, 1.03822, 1.03825, 1.03759, 1.03765, 1.03836, 1.03845, 1.0404, 1.03946, 1.03888, 1.03875, 1.0385, 1.03897, 1.03884, 1.03867, 1.03969, 1.03873, 1.03885, 1.04076, 1.0428, 1.0425, 1.0417, 1.04197, 1.04314, 1.0428, 1.04562, 1.04033, 1.03918, 1.04007, 1.04076, 1.04217, 1.04239, 1.04139, 1.0422, 1.04191, 1.04253, 1.0423, 1.042, 1.04259, 1.04247, 1.04216, 1.04209, 1.04105, 1.04164, 1.042, 1.04213, 1.04157, 1.04194, 1.04013, 1.03878, 1.0404, 1.04016, 1.04037, 1.04038, 1.04244, 1.04161, 1.04372, 1.04403, 1.04386, 1.04374, 1.0434, 1.04272, 1.04304, 1.04272, 1.04286, 1.04301, 1.04315, 1.0435, 1.04264, 1.04279, 1.04262, 1.04241, 1.04314, 1.04249, 1.04203, 1.04234, 1.0425, 1.04352, 1.04252, 1.04342, 1.04376, 1.04364, 1.04336, 1.04291, 1.04336, 1.04378, 1.04453, 1.0437, 1.04886, 1.04916, 1.04881, 1.04926, 1.04849, 1.04888, 1.04908, 1.04992, 1.05094, 1.05199, 1.05212, 1.0513, 1.05054, 1.04888, 1.04875, 1.04571, 1.04591, 1.0463, 1.04633, 1.04686]}} 2025-02-06 12:39:32,397 INFO: 127.0.0.1 - - [06/Feb/2025 12:39:32] "POST /getSignal HTTP/1.1" 200 - 2025-02-06 12:39:32,805 DEBUG: VWAP & Fibonacci vs Price graph saved as vwap_fib_plot_EURUSD_20250206_123932.png
MQL5日志
2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 0 (0%): 1.02099 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 1 (24%): 1.02862 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 2 (38%): 1.03334 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 3 (50%): 1.03715 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 4 (62%): 1.04096 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5) Fib Level 5 (79%): 1.04639 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5) Fib Level 6 (100%): 1.05331 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5) Updated Indicators: SwingHigh=1.05331, SwingLow=1.02099, VWAP=1.03795 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5) Payload sent to Python: {"symbol":"EURUSD","timeframe":"PERIOD_H1","swingHigh":1.05331,"swingLow":1.02099,"vwap":1.03795,"fibLevels":[0.000,0.236,0.382,0.500,0.618,0.786,1.000],"priceData":[1.03583,1.03594,1.03651,1.03799,1.03901,1.03865,1.03871,1.03920,1.03951,1.04025,1.03974,1.03986,1.04041,1.04017,1.04049,1.04072,1.04156,1.04197,1.04181,1.04223,1.04224,1.04079,1.04192,1.04147,1.04251,1.04039,1.04039,1.04026,1.03850,1.03778,1.03786,1.03796,1.03845,1.03734,1.03786,1.03714,1.03780,1.03786,1.03854,1.03817,1 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) HTTP Response: { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "received_data": { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "fibLevels": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.0, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.236, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.382, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.5, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.618, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 0.786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) ], 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) "priceData": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03583, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03594, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03651, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03799, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03901, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03865, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03871, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0392, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03951, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04025, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03974, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03986, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04041, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04017, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04049, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04072, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04156, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04197, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04181, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04223, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04224, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04079, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04192, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04147, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04251, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.04026, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0385, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03778, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03796, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03845, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03734, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03714, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.0378, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03854, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03817, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03811, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5) 1.03767, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03784, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03801, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03593, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03254, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03223, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0335, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03344, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03115, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03067, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02932, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0306, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03147, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0322, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03221, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03178, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03281, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03441, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02955, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02846, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02785, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02795, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02761, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03162, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0251, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02577, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02522, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02438, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0231, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02436, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02431, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02265, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02235, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02377, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.02504, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03583, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03733, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03763, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03698, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03998, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03964, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03687, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03822, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03825, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03759, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03765, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03836, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03845, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03946, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0385, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03897, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03884, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03867, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03969, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03873, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03885, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0417, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04197, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04562, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04033, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03918, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04007, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04217, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04239, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04139, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0422, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04191, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04253, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0423, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04259, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04209, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04105, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04164, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04213, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04157, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04194, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04013, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.03878, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04016, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04037, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04038, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04244, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04161, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04372, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04403, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04374, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0434, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04304, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04286, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04301, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04315, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0435, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04279, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04262, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04241, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04203, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04234, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04352, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04252, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04376, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04364, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04291, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04378, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04453, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0437, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04886, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04916, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04881, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04926, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04849, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04908, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04992, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05094, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05199, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05212, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0513, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.05054, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04571, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04591, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.0463, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04633, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) 1.04686 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) ], 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "swingHigh": 1.05331, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "swingLow": 1.02099, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "symbol": "EURUSD", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "timeframe": "PERIOD_H1", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "vwap": 1.03795 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) }, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) "signal": "Sell" 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5) }
VWAP-斐波那契与价格对比图也已经绘制完成,并保存在与Python脚本相同的目录下。该图表有助于直观展示价格与VWAP及斐波那契水平位的联动关系。

图例3. Matplotlib绘制的图表
在下方图表中,MetaTrader 5平台上的MQL5 EA记录并显示了来自Python服务器的响应。图表中用箭头标示了两个买入信号,这些信号也记录在“Experts”选项卡中。我们可以看出,市场走势与这些信号的方向一致,验证了信号的有效性。为了更清晰地进行分析,我选择查看M1时间框架的图表。

图例4. 在Boom 300指数上的测试
结论
该系统对交易者而言极为实用。除了提供交易信号外,它还能在信号生成过程中,清晰呈现价格与斐波那契水平位及VWAP的联动关系。这种可视化呈现通过两种方式实现:Python利用Matplotlib库绘制图表,而MQL5 EA则直接在图表上显示VWAP和斐波那契线,以便进行更深入的分析。这种增强的可视化呈现有助于交易者做出更为明智的决策。
| 日期 | 工具名 | 描述 | 版本 | 更新 | 备注 |
|---|---|---|---|---|---|
| 01/10/24 | 图表展示器 | 以重影效果覆盖前一日价格走势的脚本 | 1.0 | 初始版本 | Lynnchris工具箱的第一个工具 |
| 18/11/24 | 分析评论 | 以表格形式提供前一日的信息,并预测市场的未来方向 | 1.0 | 初始版本 | Lynnchris工具箱的第二个工具 |
| 27/11/24 | 分析大师 | 每两小时定期更新市场指标 | 1.01 | 第二个版本 | Lynnchris工具箱的第三个工具 |
| 02/12/24 | 分析预测 | 集成Telegram通知功能,每两小时定时更新市场指标 | 1.1 | 第三个版本 | 工具4 |
| 09/12/24 | 波动率导航仪 | 该EA通过布林带、RSI和ATR三大指标综合分析市场状况 | 1.0 | 初始版本 | 工具5 |
| 19/12/24 | 均值回归信号收割器 | 运用均值回归策略分析市场并提供交易信号 | 1.0 | 初始版本 | 工具6 |
| 9/01/25 | 信号脉冲 | 多时间框架分析器 | 1.0 | 初始版本 | 工具7 |
| 17/01/25 | 指标看板 | 带分析按钮的控制面板 | 1.0 | 初始版本 | 工具8 |
| 21/01/25 | 外部数据流 | 通过外部库进行分析 | 1.0 | 初始版本 | 工具9 |
| 27/01/25 | VWAP | 成交量加权平均价 | 1.3 | 初始版本 | 工具10 |
| 02/02/25 | Heikin Ashi | 平滑趋势和反转信号识别 | 1.0 | 初始版本 | 工具11 |
| 04/02/25 | FibVWAP | 通过python分析生成信号 | 1.0 | 初始版本 | 工具12 |
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/17121
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
MQL5中交易策略的自动化实现(第六部分):掌握智能资金交易中的订单块(Order Block)检测技巧
将您自己的 LLM 集成到 EA 中(第 5 部分):使用 LLM 开发和测试交易策略(三)—— 适配器微调
交易中的神经网络:使用小波变换和多任务注意力的模型(终篇)
从基础到中级:浮点数
1 更新脚本,使用您的地址或本地主机 127.0.0.1
2 在工具选项 Web 请求 url 中添加您使用的地址
4 确保已安装所有 Python 部分
安装 matplotlib
pip install pandas
必要时,使用 pip 安装 Flask seaborn 和 Numpty
3 在该地址上运行 python 文件,启动 flask 应用程序,其中包含您正在使用的地址
感谢 Chris 提供的所有想法和出版物,它们绝对是有用的东西。对于这篇文章,在重新检查《价格行动分析工具包开发(第 9 部分)》之后,我需要根据我的环境进行一些设置,才能让它发挥作用:外部流程 - MQL5 可能对他人有帮助的文章
1 更新脚本,使用您的地址或本地主机 127.0.0.1
2 在工具选项 Web 请求 url 中添加您使用的地址
4 确保安装了所有 Python 部分
安装 matplotlib
pip install pandas
必要时,使用 pip 安装 Flask seaborn 和 Numpty
3 在该地址上运行 python 文件,启动 flask 应用程序,其中包含您正在使用的地址