比尔·威廉姆斯策略(或结合其他指标和预测)
引言
比尔·威廉姆斯是来自美国的一位公认的交易者、作家和心理学家,他因对交易和金融分析的贡献而赢得了赞誉。在他的交易生涯中,他开发了多种指标和交易策略,这些策略和指标被众多交易者所使用。
比尔·威廉姆斯拥有心理学博士学位。也许这就是他为什么研究市场情绪。因此,可以通过使用人工智能(AI)的情感分析脚本来实施一种扩展方法,该方法通过抓取网络市场(如社交媒体平台)来评估交易者的情绪得分。在本文末尾,将提供一个市场情绪分析应用于市场新闻的示例。
比尔·威廉姆斯的心理学背景帮助他将心理学概念应用于交易。他从人类的角度研究市场,试图理解情绪如何影响交易者及其交易。比尔·威廉姆斯对市场有全面的看法,他认为市场是混乱的,必须考虑到这一点来研究和交易市场。为了研究市场,他提出了一些指标,我们将在本文中研究这些指标。
这是一张包含我们将要使用的指标和振荡器的EA图片:

图片显示了三个指标:鳄鱼指标(The Alligator Indicator)、动量振荡指标(The Awesome Oscillator,AO)和分形(Fractals)指标。这些指标共同反映了人类行为和市场的混沌性。
鳄鱼线指标
鳄鱼线指标由三条移动平均线(MA)组成,分别是颚线(蓝色线)、牙齿线(红色线)和唇线(绿色线)。该指标旨在识别市场的沉睡阶段和觉醒阶段,它反映了人类行为,因为市场有沉睡阶段(低活跃度),随后是一系列觉醒阶段(高活跃度)。市场经历震荡阶段后,会进入趋势阶段。鳄鱼指标有助于识别市场何时处于沉睡状态,以便避免交易,因为交易者通常从市场的高波动性中获利。
在低活跃度阶段,鳄鱼指标的各条线非常接近且相互交织。
在高活跃度阶段,鳄鱼指标的各条线分开,表明市场觉醒,随后将出现趋势。

注意:如图所示,该策略试图在牛市趋势中建立多头头寸以跟随趋势。还有更多调整策略的方式,你可以在鳄鱼指标交叉时以及动量振荡指标从下方穿越0并持续运行时下单。
在市场沉睡阶段,交易者似乎不愿意进行交易,他们正在等待新数据的出现或某种将引发市场趋势的因素的出现。在这种市场阶段,交易者不应做出决策,直到他们能够清楚地看到市场将走向何方。他们应该关注到市场运动的方向,这些方向在市场觉醒并显示出下一个趋势时会变得可见。
因此,在市场沉睡阶段,各条线往往彼此接近并横向移动。该指标告诉你当前没有趋势,最好不进行交易。
当各条线开始分离时,这意味着活跃度提高。如果绿线在红线和蓝线之上,则表明存在上升趋势;如果绿线在红线和蓝线之下,则表明存在下降趋势。这两种情况都意味着是进入市场的最佳时机。
绿色==嘴唇
红色==牙齿
蓝色==下颚
鳄鱼指标与心理学的共同点是什么?
鳄鱼指标中的移动平均线(MAs)是平均价格的总和(例如,2+3 / 2=2.5),但它们平滑了价格的波动,并更多地考虑了最新的价格,因此,价格波动所占的比重较小。这有助于我们更好地把握趋势的全局。这与人类的行为非常相似,人们试图在市场中存在的噪音中清晰地看到最重要的事物。
动量振荡器(AO)
动量振荡器(AO)显示了周期为5和周期为34,使用中点((高点+低点)/2)来计算的简单移动平均线(SMA)之间的差异。
两个不同周期的SMA之间的差异显示了市场的冲动:短期SMA衡量市场的冲动或快速变化,而长期SMA衡量市场的趋势。这与人类的行为相似,人类有短期的冲动,但长期来看,他们有一个倾向或趋势。
这种冲动:AO衡量市场冲动的强度,正的AO意味着正的冲动,而向负值交叉则意味着相反的冲动。
分形
根据比尔·威廉姆斯的定义,分形是由五个具有特定要求的蜡烛图组成的序列,这些要求决定了它们是被归类为看涨分形还是看跌分形。
- 看涨分形的特点是,它的最低点低于前两个和后两个蜡烛图的最低点。
- 相反,看跌分形的特点是,它的最高点高于前两个和后两个蜡烛图的最高点。
分形能够识别出市场可能改变方向的潜在点。分形背后的心理学原理是,它们反映了关键的支持点和阻力点。交易者通过识别这些点,可以根据市场参与者的集体行为来预测方向的改变。
威廉姆斯认为金融市场是受到人类行为影响的混沌系统。他认为市场参与者受到情绪和心理行为的影响,这些行为创造出看似随机但实际上具有可识别潜在结构基础的模式。
当将心理学应用于他的指标时,它帮助交易者理解了影响交易决策的人类情绪,如希望、恐惧、贪婪等。趋势和整理形态反映了人类在不同时期的活动和放松的心理状态。
现在让我们来看看所使用的策略。在第一个代码中,我们将使用分形、动量振荡器(AO)和鳄鱼指标。
买入的条件如下(从代码中可以非常清楚地看出)。请记住,[0]表示当前时刻的位置,而[1]表示前一个位置。
alligatorLips[1] > alligatorTeeth[1] && alligatorTeeth[1] > alligatorJaw[1] && ao[1] > 0 && ao[1] > ao[2] && fractalsUp[1] != 0 && PositionsTotal()==0
卖出条件如下:
alligatorLips[1] < alligatorTeeth[1] && alligatorTeeth[1] < alligatorJaw[1] && ao[1] < 0 && ao[1] < ao[2] && fractalsDown[1] != 0 && PositionsTotal()==0
作为基于比尔·威廉姆斯指标的策略的一个例子,我们可以使用动量振荡器(AO)从正到负或从负到正的交叉。你可以尝试更多可能方式,并根据需要修改代码。如果你在使用MetaTrader 5策略测试器中相同的时间段内获得了更好的结果,请在文章讨论区留下评论。
平仓的条件如下。
对于买入的持仓:
ao[0] < 0 || (alligatorLips[1] < alligatorTeeth[1] && alligatorTeeth[1] < alligatorJaw[1])
对于卖出的持仓:
ao[0] > 0 || (alligatorLips[1] > alligatorTeeth[1] && alligatorTeeth[1] > alligatorJaw[1])
完整的代码在文章附件Bill Williams Strategy.mq5文件中提供。
在这里我分享策略测试中的测试结果。
我使用下面的输入参数和设置:




虽然这些结果看起来不太好,但这个策略似乎在其他时间框架上有效,因此,我们将保留这个策略,并尝试通过添加其他指标或(和)预测来获得更好的结果。
如果我们将其同ADX指标结合起来,这个策略会怎样?有了ADX,它应该能更准确地识别趋势模式,所以让我们来看看我们需要做出哪些改变。
ADXHandle = iADX(Symbol(), Period(), 14); if(ADXHandle == INVALID_HANDLE) { Print("Error initializing ADX indicator: ", GetLastError()); return INIT_FAILED; }
CopyBuffer(ADXHandle, 0, 0, 3, adx);
if(alligatorLips[1] > alligatorTeeth[1] && alligatorTeeth[1] > alligatorJaw[1] && ao[1] > 0 && ao[1] > ao[2] && fractalsUp[1] != 0 && adx[1] > ADXThreshold && PositionsTotal() == 0)
现在结果如下:

仍旧不理想。让我们看看如果使用基于ATR的止损会怎样。


不错,看上去好多了。现在,如果我们使用深度学习和预测会如何?让我们来看看结果:


考虑到模型使用120个值作为步长,因此,我至少会每120天重新构建一次模型。所以,如果模型能够使用最近的数据进行更新,结果可能会更好。
此外,该策略使用的是8小时的时间框架周期,而ONNX模型则设置为1天的值。因此,在修改脚本时,请记得将1天周期调整为所需的时间周期。
在应用深度学习预测进行优化后,我们得到了以下总体结果,几乎所有结果都相当不错:

从这张图表中可以看出,几乎所有的优化都带来了正的夏普比率(Sharpe Ratio),这意味着该策略非常可靠且表现良好。


请注意,我们在所有测试和模拟中都使用8小时的时间周期,但在进行预测时则使用1天的时间周期。这样做的目的是为了确保预测既不太超前也不太滞后,从而能够捕捉到市场趋势。如果使用过于长远的预测,虽然仍然能够捕捉到趋势,但可能会错过短期趋势,导致测试中的订单数量减少,这并不利于评估整个策略的有效性。在止损方面,我们使用ATR。此外,我们还向策略中添加了平均方向移动指数(ADX)。
从这个优化后的EA中,我们可以观察到什么?
- 该策略具有盈利能力,总净利润为$847.70,且利润因子高达3.85,这表明该策略在盈利交易中的收益远大于亏损交易中的损失。
- 恢复因子为4.59,意味着该策略能够相对快速地从亏损中恢复过来。
- 算术平均收益率(AHPR)和几何平均收益率(GHPR)均为1.0000,这表明平均收益率和几何收益率之间没有明显偏差。
- 夏普比率为3.52,表现相当强劲,表明该策略具有良好的风险调整后收益。
- 余额和权益回撤百分比都非常低,意味着发生重大损失的风险极小。
我们将使用什么来制作ONNX模型?
我们将使用我经常在这系列文章中使用的Python循环脚本。该脚本已附在文章末尾。我们只需要修改交易品种(symbol),如果清楚自己在做什么,还可以修改时间周期或其他参数。
我还将附上所使用的模型,以便您能够重现我的结果。
此外,我还将附上另一个.py脚本,用于创建包含相关性和指标的ONNX模型,以便了解该模型是否适合使用。该脚本的结果如下:
train_mse=0.000 test_mse=0.000 train_r2=0.994 test_r2=0.970 train_corr=0.997 test_corr=0.989
凭借97%的R²值和98.9%的测试相关性,我们现在可以确定可以使用该模型进行EA的开发。
这些统计数据意味着,例如,98.9%的相关性表明,在测试过程中,模型的预测精度为99次准确预测对应1次错误。97%的R²值即决定系数,它是统计测量中自变量(本例中的模型)所能解释的因变量(本例中的收盘价)变异比例。换句话说,R²表达了模型预测值与实际价格值相比的调整程度有多好。
R²值达到85%即为良好结果,相关性达到95%也为良好结果。任何高于这些值的结果都被视为良好,但应注意避免过度拟合。
如果您想了解更多关于比尔·威廉姆斯(Bill Williams)的信息,我建议您阅读他的一些经典著作,如:
- 《交易混沌》(1995年):这是他的最知名著作之一,他在书中介绍了金融市场中的混沌理论,并解释了本文中我们使用的指标以及如何利用这些指标作为交易投资机会的参考点。
- 《新交易维度:如何从股票、债券和大宗商品的混沌中获利》(1998年):这本书更深入地探讨了他的方法,并解释了更复杂和先进的全新策略。他介绍了自己的指标,并展示了如何运用和组合这些指标,以获得更精准的交易信号。
- 《交易混沌:利用经过验证的技术技巧最大化利润》(第二版,2004年):这是对他原著的更新,其中包含了基于他的经验和采用他技术的交易者提供的反馈的新策略和新重点。
市场新闻情感分析示例
现在,让我们通过Python中的一个示例来考虑市场新闻的情绪分析。
您必须先为Python安装以下库:
pip install requests beautifulsoup4 textblob
创建一个新的Python脚本,并复制粘贴以下代码:
import requests from bs4 import BeautifulSoup from textblob import TextBlob def get_eurusd_news(): url = 'https://www.investing.com/currencies/eur-usd-news' headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') # Encontrar todos los elementos <li> que contienen artículos de noticias articles = soup.find_all('li', class_='border-b') news = [] for article in articles: title_tag = article.find('a', class_='mb-2 inline-block text-sm font-bold leading-5 hover:underline sm:text-base sm:leading-6 md:text-lg md:leading-7') if title_tag: title = title_tag.get_text(strip=True) news.append(title) return news def analyze_sentiment(news): sentiment_results = [] for article in news: analysis = TextBlob(article) sentiment = analysis.sentiment.polarity sentiment_results.append((article, sentiment)) return sentiment_results def summarize_sentiment(sentiments): positive = sum(1 for _, sentiment in sentiments if sentiment > 0) negative = sum(1 for _, sentiment in sentiments if sentiment < 0) neutral = len(sentiments) - positive - negative total = len(sentiments) summary = { 'total': total, 'positive': positive, 'negative': negative, 'neutral': neutral } return summary news = get_eurusd_news() if news: sentiments = analyze_sentiment(news) summary = summarize_sentiment(sentiments) for i, (article, sentiment) in enumerate(sentiments, 1): sentiment_type = 'Positive' if sentiment > 0 else 'Negative' if sentiment < 0 else 'Neutral' print(f"{i}. {article}\n Sentiment: {sentiment_type} (Polarity: {sentiment})\n") print(f"Sentiment Summary: {summary}") print(f"Total articles: {summary['total']}, Positive: {summary['positive']}, Negative: {summary['negative']}, Neutral: {summary['neutral']}") else: print("No news articles found for EUR/USD.")
这段代码会从Investing.com上抓取新闻,读取标题,并对数据进行分析,给出一个分数。所有新闻发布的内容都会被加起来,最终得出文章的总分数。因此,通过这个分数,你可以看出市场对某个交易品种的感觉如何,这可以让你判断它是处于沉睡状态、处于趋势中还是正在觉醒。
1. 美元略微走低,但本周 仍有望 继续大幅上涨 情绪:中性(极性:0.0) 2. 欧洲股市受全球疲软情绪影响;英国零售销售大幅下滑 情绪:负面(极性:-0.125) 3. 美元因美国商业活动提振而走高 情绪:正面(极性:0.25) 4. 美元在美联储会议纪要后企稳,此前曾大幅上涨;英镑保持强势 情绪:负面(极性:-0.125) 5. 欧洲股市普遍上涨;英伟达财报与PMI数据备受关注 情绪:正面(极性:0.125) 6. 美元兑欧元走高,受美联储会议纪要支撑 情绪:正面(极性:0.25) 7. 美元在美联储会议纪要发布前保持稳定,英镑在CPI数据发布后上涨 情绪:正面(极性:0.16666666666666666) 8. 美国银行(Bank of America)表示,欧元兑美元汇率的上涨势头预计将持续 情绪:负面(极性:-0.1) 9. 美元坚挺,因 美联储官员呼吁对降息保持耐心 情绪:负面(极性:-0.2) 10. 美元保持稳定;美联储发言人或提供动力 情绪:正面(极性:0.16666666666666666) 情绪汇总: {'总数':10,'正面':5, '负面':4,'中性':1} 所有文章:10,正面:5,负面:4,中性: 1
结论
尽管比尔·威廉姆斯策略以其比本测试中所见更为盈利而闻名,但我们通过一些修改以及添加另一个周期的深度学习预测,已经取得了更好的结果。通过向策略中添加预测,我们成功使策略更加稳定,并在尝试判断市场是牛市还是熊市时减少了错误。通过添加ADX,我们帮助EA在做出长期趋势决策时更加准确,而添加ATR则使我们能够在管理头寸风险时做出更好的决策。
这不是一个完整的EA,因此如果您想要或需要使用它进行交易,您必须自己完成它或请其他人(例如在Freelance平台上)帮您完成。
接下来,我将研究这些策略,并尝试使用其他指标甚至深度学习将它们提升到新的水平(如果可能的话)。如果您觉得这篇文章很有趣,请告诉我,并给出关于这篇文章或其他您想听的文章的反馈。
我可能会使用比尔·威廉姆斯在其第二本书 《新交易维度:如何从股票、债券和大宗商品的混沌中获利》(1998年) 中的策略,再写一篇关于比尔·威廉姆斯指标的文章。如果您觉得这很有趣,或者您希望将其他内容作为EA来实现,请告诉我。
此外,如果您想要一篇关于特定策略的文章,请通过写信或在文章讨论中留言告诉我。迟早,我会创建这样一篇文章(如果出版商也觉得它很有趣的话)。
希望您喜欢这篇文章。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/14975
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
开发回放系统(第 46 部分):Chart Trade 项目(五)
改编版 MQL5 网格对冲 EA(第 III 部分):优化简单对冲策略(I)
使用图表可视化交易(第一部分):选择分析时段
感谢您尝试改进这种交易方法。
类似的还有 "3 8 陷阱 "系统,它在 20 EMA 上升趋势中将 3 EMA 跌入 8 EMA 进行交易,在 20 EMA 下降趋势中将 3 EMA 拉回 8 EMA 进行交易。
我得到的股本曲线与您在文章中展示的第一份测试报告 非常相似。
我目前的很多工作都涉及使用对冲作为风险缓解方法,而不是止损,然后能够把握对冲的卖出时机,从而使所有对冲交易和原始策略交易都能作为盈利头寸卖出。回归均值是实现这一目标的主要方法。
非常有趣。感谢您的发布。
我会仔细研究,尝试添加一些额外的技术交易过滤器。
供参考:3/8 陷阱:
非常感谢这次内容丰富的讨论/培训。
问候
gerrit
非常感谢这次内容丰富的讨论/培训。
问候
gerrit
谢谢!不客气!在 MQL5 文章中,您可以从很多方面入手。
我目前的很多工作都涉及使用对冲作为风险缓解方法,而不是止损,然后能够把握对冲的卖出时机,从而使所有对冲交易和原始策略交易都能作为盈利头寸卖出。回归均值是实现这一目标的主要方法。
非常有趣。感谢您的发布。
我会仔细研究,尝试增加一些技术交易过滤器。
供参考:3/8 陷阱:
不客气,谢谢!
有 900 多万种组合!如果考虑到时间范围,.... 超过 9000 万......我的首选组合是添加 DL。
您的工作非常出色!祝您一切顺利