学习如何基于交易量设计交易系统
概述
欢迎阅读本系列的这篇新文章,了解如何基于最流行的技术指标设计交易系统。 这是一个新的重要技术指标,它从不同视角为我们提供了有关市场的见解 — 交易量指标。 我们会通过以下主题涵盖该指标:
在此,我们将了解交易量是什么,它测量什么。 我们将通过分享一些基于其主要概念的简单策略,来探索如何在交易中利用它,以及它如何为我们提供助力。 之后,我们将学习如何为每个提到的策略设计一个分布蓝图,来帮助我们进一步设计基于所提策略的交易系统。 这一步对于设计任何交易系统都非常重要。 然后,我们将进入最有趣的部分,即交易量交易系统,我们将学习如何利用 MQL5 把我们提到的所有内容,乃至于任何相关的有见地的思路转化为交易系统,从而根据这些策略自动生成我们所需的,来帮助我们简化、改进或增强交易过程。
如此,我们将用到内置于 MetaTrader 5 交易终端的 MQL5(MetaQuotes 语言)。 如果您想了解有关如何下载和使用它的更多信息,请阅读前一篇文章中的在 MetaEditor 中编写 MQL5 代码主题。 此外,应用所学知识对您的学习非常有用,因为它能强化和加深您对主题的理解。 在任何学习过程中,实践都是一个非常重要的因素。
免责声明:所有信息“按原样”提供仅用于教学目的,并非出于交易目的或建议。 这些信息不能保证任何结果。 如果您选择在您的任何交易账户上使用这些材料,您将自行承担风险,您是唯一的责任人。
我们跳转到主题,学习一种对我们的交易有用的新工具。
交易量定义
外汇市场的交易量指标表明特定时间内的价格变化数量,即确定合约、货币、单位、等等的实际交易量。 成交量指标可以为我们提供供需的指示,或者是市场流动性的指示。 因此,如果成交量很大,这是走高时需求旺盛,或走低时供应充足的指示。 我们可以说,成交量非常有用,因为它是趋势的确认。 如果您想了解更多关于趋势的信息,可以阅读上一篇文章中的趋势定义主题。
交易量与趋势应保持一致。 这是一个非常有用的工具,可用于确认当前走势是否强劲、抑或疲软。 最好看到,在上升趋势中,成交量伴随上升而增加,伴随向下调整而降低。 在下跌趋势中,成交量伴随着下跌而增加,这将是一个重要的信号,但有时我们发现成交量不高的情况下也会下跌,这是因为即使没有高成交量,价格也可能下跌。 换言之,在下跌趋势中,下跌走势没必要看到高成交量。 如果在下跌趋势中出现看涨调整,交易量将降低。
交易量可作为我们的指示,如果出现背离,则当前趋势存在疲软。 背离意味着,我们发现交易量与价格方向相反,并未确认价格方向。
与我们之前提到的计算相同:
在外汇市场:
交易量 = 特定时间段内价格变化的数量
在股票市场:
交易量 = 交易量 * 价格
例如:如果我们的股票在 $10 价位交易了 1000 股。 因此,交易量将与以下相同:
交易量 = 1000 * $10 = $10,000
与股票市场不同,外汇市场更分散化。
我们不需要手工计算,因为我们可以在 MetaTrader 5 中找到它。 您要做的所有工作就是从可用指标中选择:
插入 --> 指标 --> 成交量 --> 成交量
选择与上图中步骤 4 相同的交易量指标后,将打开交易量指标窗口:
1. 上行交易量柱线颜色。
2. 下行交易量柱线颜色。
3. 所应用交易量 (跳价或实际)。
4. 主线宽度。
判定之前的参数后,将其加载到图表上:
绿色表示当前柱线大于前一根,而红色表示当前柱线小于前一根。
交易量策略
在本部分中,我们将提到简单的交易量策略,从而了解如何运用交易量指标。 确实,您可以发现这些策略需要优化,这是正常的,因为它们的主要目标是了解如何根据其概念运用交易量指标,以及如何据其为基础来设计交易系统。 因此,在将这些策略用于实际帐户之前,您必须测试它们。
- 策略一: Vol - 走势:
基于此策略,我们需要比较当前和前期的交易量数值,以便据此判定相应的信号。 如果当期大于前期,这将是交易量增加的信号。 如果当期小于前期,则是交易量减少信号。
简而言之,
当期交易量 > 前期交易量 --> 交易量增加。
当期交易量 < 前期交易量 --> 交易量降低。
- 策略二: Vol - 强度:
基于这一策略,我们需要比较当期交易量值和前五期的平均值,以便判定该交易量指标的强度。 如果当期值高于平均值,则表示交易量强劲。 如果当期值低于平均值,则表示交易量弱势。
故此,
当期 > 平均 --> 交易量走强
当期 < 平均 --> 交易量走弱
- 策略三: 价格 & 交易量 - 上行趋势:
根据这一策略,在上涨趋势期间,我们将比较当期和前期的高点,以及当期和前期的成交量,以此判定是否有买入信号或无信号。 如果当期高点高于前期,当期成交量高于前期,则为买入信号;但如果当期高点位于前期之上,当期成成交量低于前期成交量,则为无信号。
当期高点 > 前期高点 && 当期成交量 > 前期成交量 --> 上涨期间的买入信号
- 策略四: 价格 & 交易量 - 下行趋势:
该策略将与前一策略相反,在下跌趋势期间,我们将比较当期和前期的低点,与当期和前期的成交量值,以此判定是否存在做空信号或无信号。 如果当期低点低于前期,当期成交量高于前期,则为做空信号;但如果当期低点位于前期之下,当期成成交量低于前期成交量,则为无信号。
当期低点 < 前期低点 && 当期成交量 > 前期成交量 --> 下跌期间的做空信号
- 策略四: 均线 & 交易量策略:
根据这一策略,我们将比较两条移动平均线的长度,一条是短期的,另一条是长期的,以及当期和前期成交量的值,以此判定是否存在买入或做空信号。 如果短期均线小于长期均线,然后短期均线高于长期均线,同时当期成交量高于前期成交量,这将是买入信号。 如果短期均线高于长期均线,然后短期均线低于长期均线,同时当期成交量高于前期成交量,这将是做空信号。
短期均线 < 长期均线,然后短期均线 > 长期均线 && 当期交易量 > 前期交易量 --> 做多信号
短期均线 > 长期均线,然后短期均线 < 长期均线 && 当期交易量 > 前期交易量 --> 做空信号
交易量策略蓝图
在这一部分中,我们将为每个策略设计一个蓝图,设计蓝图的原因是帮助我们规化我们想要做的事情,从而创建一个交易系统。 这一步对于安排我们的思路非常重要且有必要,能够辨别我们每一步想要做什么。
首先,我们将创建一个简单交易系统的蓝图,该系统仅生成交易量指标的当期值,作为图表上的注释。 我们需要系统检查每次跳价中的交易量指标值,然后在图表上返回当期值作为注释。 以下是创建此交易系统的分布蓝图。
- 策略一: Vol - 走势:
根据这一策略,我们需要创建一个简单的交易系统,该系统通过比较当期和前期的成交量指标的两个数值来生成信号,通知我们成交量的变化(如果成交量增加或减少)。 故此,我们需要系统在每次跳价检查这两个数值,然后如果当期交易量大于前期交易量,则通知交易量正在增加,如果当期交易量低于前期,则通知交易量正在减少。 以下是创建此交易系统的分布蓝图。
- 策略二: Vol - 强度:
根据这一策略,我们需要创建一个简单的交易系统,根据当期交易量指标值与前五期交易量平均值之间的比较,生成信号,告知我们交易量的强度。 故此,我们需要让系统检查所有这些值,然后计算每次跳价的前五期交易量值的平均值。 在生成合适的信号之后,如果当期交易量值大于平均交易量值,则生成交易量强劲信号、当期交易量值、前五期交易量值,且所有数值都显示在图表注释的单独行中。 如果当期值小于平均值,则生成交易量弱势信号、当期交易量值、前五期交易量值和平均值。在图表上,每个值都单独显示在一行里。 以下是创建该交易系统的每一步蓝图:
- 策略三: 价格 & 交易量 - 上行趋势:
根据这一策略,我们需要创建一个简单的交易系统,在上涨趋势期间,于每次跳价时检查当期和前期交易量高点,还有当期和前期交易量指标值,然后生成买入信号。 基于此策略,如果当期高点值大于前期值,且当期交易量大于前期值,我们需要它在图表注释上生成买入信号、当期高点、前期高点、当期成交量和前期成交量,分别在单独行中生成每个数值;或者如果当期高点值大于前期,且当期交易量值小于前期,则只生成前期的所有类型数值,且无任何买入信号。 以下是创建该交易系统的每一步蓝图:
- 策略四: 价格 & 交易量 - 下行趋势:
这一策略将与前一策略相反。 我们需要创建一个简单的交易系统,在下跌趋势期间,不光检查当期和前期的成交量指标值,还需要检查当期和前期低点,然后生成一个做空信号。 然后,如果当期低点值小于前期值,且当期交易量大于前期值,我们需要系统生成一个做空信号、当期低点、前期低点、当期交易量和前其交易量,作为图表上的注释;;或者如果当前低值小于上一个值,同时当期交易量小于前期值,仅生成所有前期类型的数值,且无任何做空信号。 我们可以看到创建此交易系统的分步蓝图,如下所示:
- 策略四: 均线 & 交易量策略:
根据这一策略,我们需要创建一个交易系统,可以逐次检查跳价的交易量和移动平均线两个指标,基于两条移动平均线之间的比较来决定是否存在做多或做空信号,其中一条均线是短期的,另一条是长期的,短期的大于长期的,然后短期小于长期,而此刻,当期成交量值大于前期,在这种情况下,我们需要系统生成做多信号。 第二种场景是短期的小于长期的均线,然后在短期的大于长期的均线同时,当期交易量大于前期,在这种情况下,我们需要系统生成做空信号。 以下是创建此类策略的分步蓝图:
交易量交易系统
我们来到了这篇文章中最有趣的部分,关于如何将之前的所有信息转换为交易系统,从而自动准确地向我们提供信号。 我们将为每个策略设计一个交易系统,但首先我们要设计一个生成交易量现值的交易系统,作为每个策略的基础。
- 使用 “double” 数据类型创建交易量数组。
double VolArray[];
- 调用 “ArraySetaSeries” 函数为数组设置排列顺序,返回布尔值( true 或 false):
ArraySetAsSeries(VolArray,true);
- 在创建 VolDef 变量后,调用 iVolumes 定义交易量指标句柄。 iVolumes 函数返回交易量指标的句柄,其参数为(品种,周期,应用的交易量类型)。 我们采用(_Symbol)来指定当前品种,采用(_ period)来指定目前时间帧。
int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
- 调用 CopyBuffer 函数从交易量指标获取数据来填充数组。
CopyBuffer(VolDef,0,0,3,VolArray);
- 创建 VolValue 变量后,调用 NormalizeDouble 函数计算交易量值。 NormalizeDouble 函数返回双精度类型值。
int VolValue=NormalizeDouble(VolArray[0],5);
- 调用 Comment 函数创建含有交易量指标值的注释。
Comment("Volumes Value is: ",VolValue);
以下是上述交易系统的完整代码:
//+------------------------------------------------------------------+ //| Simple Volumes.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Create an array for Volume double VolArray[]; //sorting the array from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating current vol value int VolValue=NormalizeDouble(VolArray[0],5); //creating a comment with current vol value Comment("Volumes Value is: ",VolValue); } //+------------------------------------------------------------------+
此代码编译后,即可在 MetaTrader 5 中执行,我们在导航窗口中可以找到它:
双击文件,或将其拖放到图表上,将出现 EA 窗口:
然后,我们能找加载到图表的 EA:
以下是测试生成的信号示例:
- 策略一: Vol - 走势:
我们将编写如下代码,创建一个交易系统,根据当期交易量和前期交易量之间的比较,在图表上的评论里提醒我们交易量指标的走势:
//+------------------------------------------------------------------+ //| Vol - Movement.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Create an array for Volume double VolArray[]; //sorting the array from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating current vol value double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //Conditions of vol movements //Volume increasing if(VolCurrentValue>VolPrevValue) { Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); } //Volume decreasing if(VolCurrentValue<VolPrevValue) { Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); } } //+------------------------------------------------------------------+
代码中的区别:
计算当期和前期交易量值:
double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5);
策略条件:
交易量指标正在增加:
if(VolCurrentValue>VolPrevValue) { Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); }
交易量指标正在降低:
if(VolCurrentValue<VolPrevValue) { Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue, "\n","Volumes previous value is: ",VolPrevValue); }
编译此代码后,我们将在导航器窗口中找到 EA:
双击,窗口将出现:
勾选“下一步”允许算法交易,并按“确定”后,它将加载到图表:
以下是采用当期和前期数值的数据窗口生成 Vol 走势策略信号的示例:
交易量的增加:
当期数据窗口:
前期数据窗口:
交易量的降低:
当期数据窗口:
前期数据窗口:
- 策略二: Vol - 强度:
以下是为该策略创建的交易系统的完整代码,可根据当期交易量指标值与前期交易量指标的比较自动生成交易量指标强度的信号:
//+------------------------------------------------------------------+ //| Vol - Strength.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Create an array for Volume double VolArray[]; //sorting the array from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,11,VolArray); //calculating current vol && 5 previous volume values double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue1=NormalizeDouble(VolArray[1],5); double VolPrevValue2=NormalizeDouble(VolArray[2],5); double VolPrevValue3=NormalizeDouble(VolArray[3],5); double VolPrevValue4=NormalizeDouble(VolArray[4],5); double VolPrevValue5=NormalizeDouble(VolArray[5],5); //calculating AVG of 5 previous volume values double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5); //conditions of Volume strength based on comparing current to AVG //strong volume if(VolCurrentValue>VolAVGVal) { Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); } //weak volume if(VolCurrentValue<VolAVGVal) { Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); } } //+------------------------------------------------------------------+
代码中的区别:
计算交易量指标的当期和前五期值:
double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue1=NormalizeDouble(VolArray[1],5); double VolPrevValue2=NormalizeDouble(VolArray[2],5); double VolPrevValue3=NormalizeDouble(VolArray[3],5); double VolPrevValue4=NormalizeDouble(VolArray[4],5); double VolPrevValue5=NormalizeDouble(VolArray[5],5);
计算前五期交易量指标的平均值:
double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5);
策略条件:
交易量走强:
if(VolCurrentValue>VolAVGVal) { Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); }
交易量走弱:
if(VolCurrentValue<VolAVGVal) { Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n", "Volume prev 1 is : ",VolPrevValue1,"\n", "Volume prev 2 is : ",VolPrevValue2,"\n", "Volume prev 3 is : ",VolPrevValue3,"\n", "Volume prev 4 is : ",VolPrevValue4,"\n", "Volume prev 5 is : ",VolPrevValue5,"\n", "AVG volume is : ",VolAVGVal); }
编译此策略后,我们即可在导航窗口里找到 EA:
拖放文件至图表,则打开 EA 窗口:
单击“确定”后,它将加载到图表:
以下是基于交易量强度生成的信号示例:
交易量走强:
交易量走弱:
- 策略三: 价格 & 交易量 - 上行趋势:
以下是为该策略创建的交易系统的完整代码:
//+------------------------------------------------------------------+ //| Price&Vol - Uptrend.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Create arrays for price & Volume MqlRates PriceArray[]; double VolArray[]; //filling price array with data int Data=CopyRates(_Symbol,_Period,0,3,PriceArray); //sorting arrays from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating the current and previous values of highs and volume double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5); double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //Conditions of buy signal //Buy signal if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue) { Comment("Buy Signal during uptrend", "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } //no signal if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue) { Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } } //+------------------------------------------------------------------+
代码中的区别:
为了创建交易量和价格数组,我们将使用与之前相同的 “double” 数据类型,以及能存储价格、交易量和点差的价格结构 MqlRates 数组。
MqlRates PriceArray[]; double VolArray[];
在为数据创建整数型变量后,调用 CopyRates 函数填充价格数组:
int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
计算当期和前期的高点和交易量值:
double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5); double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5);
基于高点和交易量值的策略条件:
做多信号
if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue) { Comment("Buy Signal during uptrend", "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
无信号:
if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue) { Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
在我们编译完这段代码后,我们就能在导航窗口中找到 EA:
如果我们想要执行此 EA,以便根据上述策略生成信号,我们需双击文件打开其窗口:
单击“确定”后,EA 将附加到图表:
以下是基于数据窗口的价格和交易量上涨策略生成的信号示例:
做多信号
当前数据:
前期数据:
无信号:
当前数据:
前期数据:
- 策略四: 价格 & 交易量 - 下行趋势:
基于此策略创建的交易系统的完整代码如下:
//+------------------------------------------------------------------+ //| Price&Vol - Downtrend.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Create arrays for price & Volume MqlRates PriceArray[]; double VolArray[]; //filling price array with data int Data=CopyRates(_Symbol,_Period,0,3,PriceArray); //sorting arrays from the current data ArraySetAsSeries(VolArray,true); //defining Volume int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling the array CopyBuffer(VolDef,0,0,3,VolArray); //calculating current and previous of lows and volume double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5); double PrevLowValue=NormalizeDouble(PriceArray[1].low,5); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //Conditions of short signal //short signal if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue) { Comment("Short Signal during downtrend", "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } //no signal if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue) { Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); } } //+------------------------------------------------------------------+
代码中的区别:
基于价格 & 交易量生成信号的条件 - 下行趋势策略:
做空信号:
if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue) { Comment("Short Signal during downtrend", "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
无信号:
if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue) { Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue, "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue); }
编译此代码后,EA 将位于导航器中:
双击文件后,出现 EA 窗口:
单击“确定”后,EA 将附加到图表:
以下是采用当期和前期数据窗口生成信号的示例:
做空信号:
当前数据:
前期数据:
无信号:
当前数据:
前期数据:
- 策略四: 均线 & 交易量策略:
基于此策略,我们可用以下代码创建交易系统:
//+------------------------------------------------------------------+ //| MA&Vol Strategy.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { //Create arrays for MA & Volume double MAShortArray[],MALongArray[]; double VolArray[]; //sorting arrays from the current data ArraySetAsSeries(MAShortArray,true); ArraySetAsSeries(MALongArray,true); ArraySetAsSeries(VolArray,true); //defining MA & Volume int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE); int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE); int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK); //filling arrays CopyBuffer(MAShortDef,0,0,3,MAShortArray); CopyBuffer(MALongDef,0,0,3,MALongArray); CopyBuffer(VolDef,0,0,3,VolArray); //calculating MA && current volume values double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6); double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6); double MALongCurrentValue=NormalizeDouble(MALongArray[0],6); double MALongPrevValue=NormalizeDouble(MALongArray[1],6); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5); //conditions of buy and short signals //buy signal if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Buy signal"); } //short signal if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Short signal"); } } //+------------------------------------------------------------------+
代码中的区别:
为短期移动平均线、长期移动平均线、和交易量创建数组:
double MAShortArray[],MALongArray[]; double VolArray[];
数组排列顺序:
ArraySetAsSeries(MAShortArray,true); ArraySetAsSeries(MALongArray,true); ArraySetAsSeries(VolArray,true);
调用 iMA 函数定义短期 MA 和长期 MA,该函数返回移动平均指标的句柄,其参数为(品种,周期,均化周期,偏移,平滑类型(即均化类型)、应用价格),并调用 iVolumes 函数定义交易量指标句柄,与前面提到的相同:
int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE); int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE); int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
填充数组:
CopyBuffer(MAShortDef,0,0,3,MAShortArray); CopyBuffer(MALongDef,0,0,3,MALongArray); CopyBuffer(VolDef,0,0,3,VolArray);
计算短期均线、长期均线、和交易量的当期值,以及前期值:
double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6); double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6); double MALongCurrentValue=NormalizeDouble(MALongArray[0],6); double MALongPrevValue=NormalizeDouble(MALongArray[1],6); double VolCurrentValue=NormalizeDouble(VolArray[0],5); double VolPrevValue=NormalizeDouble(VolArray[1],5);
策略生成信号的条件:
做多信号
if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Buy signal"); }
做空信号:
if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue &&VolCurrentValue>VolPrevValue) { Comment("Short signal"); }
编译此代码,我们就能在导航器中找到 EA:
将其拖放到图表上,EA 将被加载:
以下是基于该策略生成信号的示例:
做多信号
做空信号:
结束语
我希望,我已全面讨论了这个有用的技术指标的主题,您已经学会了如何恰当地运用交易量指标来强化您的交易。 我们已学习了什么是交易量指标,它衡量的是什么,我们如何读取它,以及如何利用它;此外,我们还通过交易量定义的主题辨别了外汇市场和股票市场之间交易量的差异。 我们还学习了一些简单的交易量策略:
- Vol - 走势:如果交易量增加或减少,则通知我们。
- Vol - 强度:通知我们当前交易量走势与平均值的强度。
- 价格和交易量 - 上升趋势:根据价格和伴随的交易量走势,在上升趋势中获得做多信号。
- Price and Vol - 下行趋势:根据价格和伴随的交易量走势,在下行趋势中获得做空信号。
- MA 和 Vol 策略:根据移动平均线和伴随交易量之间的交叉,获得做多和做空信号。
根据指标的基本概念,即使在测试和优化后,也可以使用上述策略。 我们通过交易量策略的主题学习了所有这些。 我们学习了如何为每种策略创建分步蓝图,以便帮助我们规化我们的私立,通过“交易量策略蓝图”主题为每种提到的策略创建交易系统。 然后,我们学习了本文最有趣的部分,即如何以 MQL5 为每个策略创建一个交易系统,自动准确地生成信号,以便能够在 MetaTrader 5 交易终端中运行它们。
重要的是再次确认,您必须在将任何策略用于您的真实帐户之前进行测试,因为它可能对您没有用处,因为没有适合所有人的策略。 我希望您发现这篇文章有用,并找到与文章主题或任何其它有关主题相关的新认知。 您还可以尝试思考如何将该指标与其它技术工具结合起来,令其更有意义,就像我们在文章中所做的那样,将交易量与移动平均线结合起来,因为这是一种非常有见地的方式。 如果您想阅读更多类似的文章,您可以参阅我在本系列中的其它文章,了解如何基于最流行的技术指标来设计交易系统。 我希望,您会发现它们的有益之处。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/11050