技术指标

如何使用MT4指标评估交易策略?
MetaTrader4
如何使用MT4指标评估交易策略?

大家好!今天我们来聊聊如何在MetaTrader 4(MT4)中使用指标来评估交易策略。 很多交易者常常希望能用可视化的方式来发现某个交易策略的缺陷。如果能够同时看到客观的交易统计数据,那就更完美了! 在MT4中虽然有回测工具,但每次修改交易系统(EA)后,进行可视化回测的过程非常耗时。而且,它的可视化能力也相对有限,特别是对于多货币策略的测试,效率更是低下。 为了应对这些问题,我开发了这个开源指标,旨在帮助大家更直观地测试交易策略。虽然不可能做到完全通用,但当前的框架可以轻松地根据具体需求进行修改和扩展(例如多货币策略)。 在这个指标中,我们特别关注了点差管理。该指标在计算时考虑了实际交易中的点差,这与MT4的回测器一致。如果你对指标进行了修改,一定要详细研究点差管理,否则可能会在M1时间框架上看到不错的策略结果,但在实际交易中却可能会遭遇惨败。:-) 为了演示这个策略测试指标,我还附上了一个简单交易策略的指标。该策略的规则基于移动平均线交叉与价格行为的结合(这样可以在交叉之前就下单,消除滞后)。此外,还包含了退出策略(使用相反信号和慢速移动平均线交叉的反向方式),以及通过修改后的吊灯止损策略来处理止损。这一指标提供了一个可以根据具体需求扩展的示例,有些人甚至觉得它足够好用于手动交易。 整个系统背后的理念 该指标系统采用模块化设计。首先,我们需要将交易策略实现为一个交易指标,目前有两个缓冲区用于入场信号,两个用于出场信号,还有一个用于止损。附带的StrategyIndi_1.0就是一个完整功能的示例。 接下来,我们可以利用策略测试指标 StrategySym_1.0来评估这个策略。如果对结果不满意,我们只需优化交易指标,就能实时客观地查看变化结果和统计数据。 如果将来想要实现一个EA,这也非常简单,因为通过调用自定义交易指标,我们可以获得所有的入场和出场信号以及止损值。 如何使用这个系统并根据自己的需求进行调整? 要直接使用这个系统,你只需将两个指标复制到MetaTrader的experts\indicators文件夹中。在使用之前,请确保重启终端,以便编译它们。 有一些设置你可能想要修改,大部分参数的名称是显而易见的,我只描述其他的一些: StrategyIndi参数: ChandBars = 7 吊灯止损策略的柱数 ChandATRFact = 2.0 乘以长期ATR的因子,以获取吊灯距离 RiskPercent = 2.0 根据起始止损计算的账户余额风险百分比(仅用于手动交易信息) Offset = 10 放置箭头的偏移量,单位为4位小数点的点数 BarsBack = 2000 要处理的历史柱数 AlertSound = "alert.wav" 声音提醒的WAV文件 UseSoundAlert = true 如果希望有声音提醒(用于手动交易) UsePopupAlert = true 如果希望有弹窗提醒(用于手动交易) WriteToLog = false 如果希望记录日志(用于调试) StrategySim参数: MaxLossAtSL = 200.0 每个止损点的最大损失(账户货币) BarsBack = 2000 要处理的历史柱数 WriteToLog = false 如果希望记录日志(用于调试) 如果你想根据自己的需求调整系统,需将所有与模拟相关的参数从你的StrategyIndi指标添加到StrategySym指标中。它们会在GetIndiSignals方法中使用,而其他参数(如UseSoundAlert)可以直接填入固定值。若要用于其他目的(如多货币策略),则可能需要更改代码注释和变量名称。如果需要帮助,请随时联系我! 通过这个系统,我希望能帮助大家更客观地评估交易策略(无论是手动系统还是EA),因为目前的市场营销方式往往非常具有误导性,导致许多新手交易者损失辛辛苦挣来的资金。 祝好,Robert 如有任何意见、MT4编程或相关咨询,请联系我:robert [dot] leskovar [at] gmail [dot] com。MQLTools网站的源代码已不再活跃。

2010.04.01
Market Way - MetaTrader 4的强大指标解析
MetaTrader4
Market Way - MetaTrader 4的强大指标解析

概述: 这个指标的概念虽然不算新,但在外汇交易中依然有其独特的价值。它主要是用来总结某个时间段内开盘价和收盘价之间的差异。 该指标的主线显示了以下内容: 只统计熊市K线的差值; 只统计牛市K线的差值; 同时,它还增加了总周期的加权平均值。 优点: 结合了重要的振荡器和趋势指标的功能; 易于理解和解读; 能有效指出上涨或下跌的进场时机; 可以识别牛市或熊市压力,并预估价格波动的重要点,这对于设置止损和止盈至关重要; 能指出横盘整理的存在及其强度(高波动或低波动); 能够显示超买/超卖的水平; 清晰地反映价格波动的波浪特性,并可能显示背离/趋同的水平; 通过这个指标,可以对未来价格走势做出决策,并且(重要!)仅凭此指标即可入场; 适用于任何时间框架的数据,以及非外汇市场的数据; 无需额外的平滑滤波器,可以过滤掉错误信号,尤其是在相同周期的SMA突破时。 缺点: 必须始终有一个结算周期,这自然会降低分析数据样本的准确性(这是所有指标的主要问题); 该指标的所有功能尚未被充分研究。 推荐参数: extern int IdMain = 12; // 指标的主线(在图表上绘制的点),最好(但不是必须)保持在牛市和熊市线之间,参数应相应调整。 extern int IdBull = 12; // 牛市线,最好与熊市线和主线的值相等。 extern int IdBear = 12; // 熊市线,最好与牛市线和主线的值相等。 extern int IdArray = 12; // 所有SMA线的平滑值,或称为信号线。 该指标在图表上以直方图形式显示牛市线(白色柱)和SMA及熊市线(黑色柱)与SMA的差异。更多信息在指标代码内部说明。推荐设置为12的倍数,以及能够同时被3和4整除的数字,最大值108,最小值12,可能的值9和7。这些假设源自其他工作的研究,因此仅供参考。 此指标在策略测试中的应用: 这是一个用来验证指标有效性的例子。 这些交易没有经过优化,都是在K线开盘时进行的,因此不需要测试“每个滴答”,可以在K线开盘时进行1笔交易。时间框架:日线,工具:EURUSD,期间:1999年到2010年的所有可用数据。止损和止盈设置为500点。 多头入场条件: MainAccumulation1 - MainSMA1 > 0 // 如果主线在平滑值之上 &amp;&amp; BullPressure1 - Point > 0 // 如果牛市压力在0以上 &amp;&amp; BearPressure1 - Point > 0 // 如果熊市压力在0以上 &amp;&amp; MainAccumulation1 - Point > 0 // 如果主线在0以上 空头入场条件: MainAccumulation1 - MainSMA1 < 0 // 如果主线在其平滑值之下 &amp;&amp; BullPressure1 - Point < 0 // 如果牛市压力在0以下 &amp;&amp; BearPressure1 - Point < 0 // 如果熊市压力在0以下 &amp;&amp; MainAccumulation1 - Point < 0 // 如果主线在0以下 出场条件严格相反。 下面是资产变化的图表(权益),精度为5位数字,可以看到,在任何交易开启后,权益很少低于-200点。

2010.03.30
高时间框趋势指标 - MetaTrader 4交易者必备工具
MetaTrader4
高时间框趋势指标 - MetaTrader 4交易者必备工具

描述: 这个指标可以在当前(较低时间框)图表上显示较高时间框的整体趋势,如下所示: 如果 MA_1 &lt; MA_2 &lt; MA_3 &lt; MA_4,说明在较高时间框上已经建立了正常的顺序,并且处于下跌趋势。在当前的较低时间框图表上,将出现红色线条来指示这一点。红线基于价格通道指标(PCI)并可作为支撑线使用。如果启用了内置的相对强弱指标(RSI),每当 RSI 进入超买区域时,会发出警报,提醒可能出现反转的风险,即较低时间框的趋势将恢复到较高时间框的整体趋势。建议在红色 PCI 支撑线下方收盘时入场。请参见下面的示例图片。 如果 MA_1 &gt; MA_2 &gt; MA_3 &gt; MA_4,说明在较高时间框上已经建立了正常的顺序,并且处于上涨趋势。在当前的较低时间框图表上,将出现绿色线条来指示这一点。绿线基于价格通道指标(PCI)并可作为阻力线使用。如果启用了内置的相对强弱指标(RSI),每当 RSI 进入超卖区域时,会发出警报,提醒可能出现反转的风险,即较低时间框的趋势将恢复到较高时间框的整体趋势。建议在绿色 PCI 阻力线以上收盘时入场。 灰色线条表示当前没有较高时间框的趋势。 注意:我建议使用以下时间框组合: 较高时间框: 当前时间框: 日线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1小时 4小时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15分钟 1小时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5分钟 5/15分钟&nbsp;&nbsp;&nbsp;1分钟 图片: 属性: extern int Upper_Timeframe = 240; // 较高时间框,以分钟为单位,例如240 = 4小时 extern int Upper_Timeframe_MA_1 = 10; // MA_1必须是最快的MA extern int Upper_Timeframe_MA_2 = 20; extern int Upper_Timeframe_MA_3 = 50; extern int Upper_Timeframe_MA_4 = 100; // MA_4必须是最慢的MA extern bool RSI_Check_On = true; // 检查RSI超买超卖条件 extern bool RSI_Alert_On = true; // 超买超卖条件的音频警报 extern int RSI_Period = 12; // RSI周期 extern int Upper_RSI_Limit = 70; // 超过此上限表示超买 extern int Lower_RSI_Limit = 30; // 低于此下限表示超卖 extern int PCI_Period = 5; // PCI周期,例如5设置下跌趋势的支撑线为过去5根K线的最低点 extern int PCI_Shift = 1; // PCI偏移,最佳设置为1 extern double Entry_Buffer = 0.0002; // 增加PCI通道的宽度,以指定的点数降低下跌趋势的支撑线 extern color Dot_Color = Blue;

2010.03.26
MetaTrader 5的DemoBufferPattern指标详细介绍
MetaTrader5
MetaTrader 5的DemoBufferPattern指标详细介绍

大家好!今天我想和大家聊聊MetaTrader 5中的一个非常实用的指标——DemoBufferPattern。这个指标结合了蜡烛图、分形、Zigzag颜色和移动平均线,能够帮助我们更好地分析市场趋势。 这个指标主要使用以下绘图风格: 绘制彩色蜡烛图 绘制箭头 绘制彩色Zigzag 绘制彩色线条 //+------------------------------------------------------------------+ //| 自定义指标初始化函数 | //+------------------------------------------------------------------+ int OnInit() &nbsp;&nbsp;{ //--- 指标缓冲区映射 &nbsp;&nbsp; SetIndexBuffer( 0,P1B1,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 1,P1B2,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 2,P1B3,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 3,P1B4,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 4,P1BC,INDICATOR_COLOR_INDEX); &nbsp;&nbsp; SetIndexBuffer( 5,P2B1,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 6,P3B1,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 7,P4B1,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 8,P4B2,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer( 9,P4BC,INDICATOR_COLOR_INDEX); &nbsp;&nbsp; SetIndexBuffer(10,P5B1,INDICATOR_DATA); &nbsp;&nbsp; SetIndexBuffer(11,P5BC,INDICATOR_COLOR_INDEX); //--- 辅助缓冲区,用于中间计算 &nbsp;&nbsp; SetIndexBuffer(12,P4M1,INDICATOR_CALCULATIONS); &nbsp;&nbsp; SetIndexBuffer(13,P4M2,INDICATOR_CALCULATIONS); //--- 这些缓冲区应该放在所有要显示的缓冲区之后,否则...你可以自己试试 //--- 箭头 &nbsp;&nbsp; PlotIndexSetInteger(1,PLOT_ARROW,217); &nbsp;&nbsp; PlotIndexSetInteger(2,PLOT_ARROW,218); &nbsp;&nbsp; PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-iArrowShift); &nbsp;&nbsp; PlotIndexSetInteger(2,PLOT_ARROW_SHIFT,iArrowShift); &nbsp;&nbsp; PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); &nbsp;&nbsp; PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- Zigzag &nbsp;&nbsp; PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0.0); //--- MA &nbsp;&nbsp; maHandle=iMA(Symbol(),0,ExtPeriod,0,MODE_EMA,PRICE_CLOSE); &nbsp;&nbsp; return(0); &nbsp;&nbsp;} //+------------------------------------------------------------------+ //| 自定义指标迭代函数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const int prev_calculated, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const datetime&amp; time[], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const double&amp; open[], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const double&amp; high[], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const double&amp; low[], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const double&amp; close[], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const long&amp; tick_volume[], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const long&amp; volume[], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const int&amp; spread[]) &nbsp;&nbsp;{ //--- &nbsp;&nbsp; CalcCandles(rates_total,prev_calculated,open,high,low,close); &nbsp;&nbsp; CalcFractal(rates_total,prev_calculated,high,low,P2B1,P3B1); &nbsp;&nbsp; CalcZigzag (rates_total,prev_calculated,high,low,P4B1,P4B2,P4BC,P4M1,P4M2); &nbsp;&nbsp; CalcColorMA(rates_total,prev_calculated,P5B1,P5BC); //--- 返回下次调用的prev_calculated值 &nbsp;&nbsp; return(rates_total); &nbsp;&nbsp;}

2010.03.25
MetaTrader 5 交易时段指标介绍
MetaTrader5
MetaTrader 5 交易时段指标介绍

今天我们来聊聊一个非常实用的指标:交易时段指标,它是基于 DRAW_FILLING 缓冲区的。 这个指标没有输入参数,主要使用了 TimeTradeServer() 和 TimeGMT() 函数。 请注意,交易时段的时间可能存在不准确性,数据来源于我找到的第一个网站 :))。你可以在常量块中修改这些值,使用的是 GMT 时间。 // 时间常量以格林威治时间为准 const int&nbsp;&nbsp; AsiaOpen=0; const int&nbsp;&nbsp; AsiaClose=9; const int&nbsp;&nbsp; AsiaOpenSummertime=1;&nbsp;&nbsp; // 亚洲交易时段在夏令时的开盘时间 const int&nbsp;&nbsp; AsiaCloseSummertime=10; // 夏令时变更后的时间 const int&nbsp;&nbsp; EuropaOpen=6; const int&nbsp;&nbsp; EuropaClose=15; const int&nbsp;&nbsp; AmericaOpen=13; const int&nbsp;&nbsp; AmericaClose=22; 你还可以利用夏令时的变化,目前这个功能很简单,通过 TimeDaylightSavings() 函数实现。 //+--------------------------------------------------------------------+ // 夏令时的判断保留用于未来的计算 //+--------------------------------------------------------------------+ bool Summertime(datetime time) { &nbsp;&nbsp; if(TimeDaylightSavings()!=0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(true); &nbsp;&nbsp; else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(false); }&nbsp; 所以,在夏令时变更后,所有的历史时间都会随之变化,反之亦然。 这个指标的第一个版本已经在 MQL4 上发布了。希望对大家的交易有所帮助!

2010.03.15
优化移动平均交叉指标 - MetaTrader 4 的实用指南
MetaTrader4
优化移动平均交叉指标 - MetaTrader 4 的实用指南

更新版本。 以下是详细说明。 我一直相信移动平均交叉指标,作为一名程序员,我总是在寻找最简单的解决方案。我曾看到一句话:“没有魔法设置适用于交叉移动平均。”这个指标每当时间框架或符号变化,甚至每个新蜡烛时,都会尝试很多设置。它通过“平淡的交易”过去 100 根蜡烛来工作,并选择成功率最高的设置。它仅仅测量短期和长期信号之间的距离,就好像任何人都在没有止损的情况下进行交易。它还考虑了点差的影响。 下方窗口显示短期和长期移动平均之间的距离,正值表示适合做多,负值则适合做空,单位为点(pips)。利用“盈利振荡器”,您可以在短/长交易之间的最大差异之前结束交易,从而实现盈利。 上方的提示显示:“今天的盈利来自 MA 5/19,共计 60 点。”该指标或用户选择了 5 作为快速 MA 和 19 作为慢速 MA。接下来的文本框显示了昨天的结果,以及“做多”或“做空”的信号。交易者可以在图表上放置两个移动平均线,并将其设置为给定值。 我正在搜索更多不同的 MA 推荐文献。 参数设置 PeriodShort=6;快速 MA 的周期。如果优化为真,则忽略此项。 PeriodLong=40;慢速 MA 的周期。如果优化为真,则忽略此项。 Method=0;iMA 的计算方法。 Optimize=true;指标会自动选择快速和慢速 MA 的值。 DrawTringles=true;在图表中绘制三角形。 MinShortMA=2; MaxShortMA=20;MaxLongMA=100;优化的最小和最大值,快速 MA 的值将在 2 到 20 之间,慢速 MA 的值将在 7 到 100 之间尝试。 StepLongMA=5;StepShortMA=5;为了加快搜索速度,每隔 3 个值尝试一次。 CountOptimize=200;分析过去 200 根蜡烛。分析的蜡烛越多,速度越慢,较大的数字可能会导致较差的结果。 OptimizeOnNewCandle=false;在每个新蜡烛上开始优化。注意:优化可能需要一些时间并减慢您的终端。 Alarm=true;如果出现新信号,则发出警报。 接下来,我想基于此创建一个专家顾问,然而我仍在思考如何检测不应在交叉 MA 下交易的横盘趋势。到目前为止,我的 EA 基于优化的交叉 MA 有时能获得丰厚的收益,但第二天又会亏损。 更新版本 新特性: - 该指标现在在图表中绘制移动平均线,“盈利振荡器”则在另一个指标 (MAProfit2) 中,二者通过全局变量相互通信。 - 支持 MA 通道(请参阅 www.vnchanger.org 的电子书),慢速移动平均线被分为两条线,分别代表低值和高值,这应该可以避免在横盘市场中的损失。 - 不再测试所有组合,而是可以测试文献中找到的某些 MA 范围。为此,请将 OptimizeAll 设置为 false,将 OptimizeSystems 设置为 true。 您可以添加或修改系统表。确保以 0,0,0,0,0,0 结束。 extern bool OptimizeAll=false;extern bool OptimizeSystems=true;int Systems[] = {PRICE_MEDIAN,MODE_SMA,50, PRICE_MEDIAN,MODE_SMA,200, PRICE_MEDIAN,MODE_SMA,50, PRICE_MEDIAN,MODE_SMA,100, // 死亡交叉 PRICE_MEDIAN,MODE_SMA,10, PRICE_MEDIAN,MODE_SMA,40, PRICE_MEDIAN,MODE_SMA,13, PRICE_MEDIAN,MODE_SMA,26, PRICE_MEDIAN,MODE_SMA,5, PRICE_MEDIAN,MODE_SMA,10, PRICE_CLOSE, MODE_EMA,5, PRICE_OPEN, MODE_EMA,6, PRICE_MEDIAN,MODE_SMA,3, PRICE_MEDIAN,MODE_SMA,8, 0,0,0,0,0,0}; - 新的警报可以以语音形式发出,为了支持这一点,您需要从 https://www.mql5.com/en/code/8621 下载 gspeak。 如果您不想使用语音,则需要修改代码。删除从 #import "speak.dll" 到 #import 的行,并取消注释 gSpeak 函数。感谢作者提供这个出色的 DLL。 #import "speak.dll"void gRate(int rate);void gVolume(int rate);void gPitch(int rate);void gSpeak(string text);#import// 如果您没有(或不想要)speak.dll,请取消注释此行/*void gSpeak(string x){}*/ 如果您不删除语音,在盈利后,您可能会开始喜欢“山姆叔叔”的声音。 - 在首次启动或参数更改时,它会记住第一次交易的蜡烛,这应该避免用不同的蜡烛重绘旧交易。 - 三角形现在有三种颜色:绿色表示做多,红色表示做空,紫色表示亏损(无论是做多还是做空)。颜色可以在源代码中修改:int ColorLongTrade = MediumSpringGreen;int ColorShortTrade = Red;int ColorBadTrade = Violet;- MA 优化的步骤已设置为 5。 - 该指标的内部名称已更改为 SMA(智能助手……它显示您应如何进行后续交易)。 MA 优化器

2010.03.03
首页 上一页 337 338 339 340 341 342 343 344 345 346 347 下一页 末页