English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
学习如何基于 Stochastic 设计交易系统

学习如何基于 Stochastic 设计交易系统

MetaTrader 5交易 | 25 七月 2022, 09:52
1 320 1
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

技术分析交易中最美妙的事情之一就是我们有很多工具,我们可以单独使用一个工具,也可以组合使用多个工具,这对于我们来说都很有用,且可从中盈利。 除此之外,我们还有一个了不起的工具,可以极大有助于提高我们的交易结果和业绩。 该工具是一种编程工具,允许我们创建非常有用的程序:我们根据自己的条件自动准确地向计算机发出指令,命其完成我们需要的事情。

本文是另一次贡献,其内容对于尝试学习和传授技术交易和开发盈利交易策略编程方面提供帮助。 贯穿本文,我们将讨论一款在我们的交易中有用的新工具,即 “Stochastic 振荡器” 指标,它是利用技术分析进行交易时最常用的指标之一。 如果您曾参阅过其它文章,您应该知道我喜欢学习和传授事物的根源,尽可能地了解事物的所有细节和运作机制。 所以,我将用同样的方法来与你们讨论这个话题。 本文将涵盖以下主题:

    1. Stochastic 定义
    2. Stochastic 策略
    3. Stochastic 蓝图
    4. Stochastic 交易系统
    5. 结束语

      贯穿 “Stochastic 定义” 主题,我们将详细了解 Stochastic 振荡器指标,并知晓它是什么,它测量什么。 然后,在 “Stochastic 策略” 中,我们将学习一些我们可以用到的简单策略。 之后,我们将依据这些简单策略设计蓝图,来帮助我们在 MQL5 中对其进行编码,从而我们可以在 MetaTrader 5 中进一步运用它们 — 这将在 “Stochastic 蓝图” 主题中研讨。 然后,我们将继续学习如何编写代码来设计这些简单策略的交易系统 — 这将在 “Stochastic 交易系统” 主题中完成。

      我们将利用 MetaTrader 5 交易终端和 MetaQuotes 语言,这是 MetaTrader 5 内置的。 可以通过以下链接下载终端:https://www.metatrader5.com/zh/download

      免责声明:所有信息“按原样”提供仅用于教学目的,并非出于交易目的或建议。 这些信息不能保证任何结果。 如果您选择在您的任何交易账户上使用这些材料,您将自行承担风险,您是唯一的责任人。

      现在,我们即将开始关于一个新的有趣话题的新旅程,我们开始吧。


      Stochastic 定义

      在这一部分中,我们将更详尽地了解最流行的技术指标之一,即 Stochastic 振荡器指标。 它是由乔治·莱恩(George Lane)开发的,其在佩里·J·考夫曼(Perry J. Kaufman)的《新交易系统和方法》一书中有所提及。 但关于这一点还有其它观点,其中之一是不清楚到底是谁创建了 Stochastic 指标 — 在查尔斯·D·柯克帕特里克(Charles D. Kirkpatrick)和 Julie R. Dahlquist 的《技术分析,金融市场技术分析的完整资源》一书中也曾提到过,而还有一种观点认为,该指标是 George Lane 受到 John J.Murphy 在《金融市场技术分析》一书中提及的内容所启迪。

      Stochastic 指标背后的思路如下:有一项观察表明,在上升趋势期间,收盘价往往更接近特定周期价格区间的顶部,反之亦然,在下降趋势期间,收盘价往往更接近特定区周期价格区间的底部。 它衡量当前收盘价与特定周期的最高和最低价格之间的关系。

      Stochastic 振荡器指标由两条线组成,这两条线在零级和 100 级之间振荡:

      • %K 线是最快的线。
      • %D 线是最慢的线,它是经过平滑的。

      Stochastic 振荡器指标有多种版本。 最流行的版本是以下两种:

      • 快速 Stochastic。
      • 慢速 Stochastic。

      我们将看到 Stochastic 振荡器指标的计算方法的区别。

      以下是计算 Stochastic 振荡器指标的步骤:

      1. 判定计算指标所需的周期。
      2. 检测判定时段的最高值。
      3. 检测判定时段的最低值。
      4. 得到快速 stochastic 的 %K = 100*((当前收盘价-最低价)/(最高价-最低价))
      5. 得到快速 stochastic 的 %D = 快速 stochastic 的 %K 线的 3 周期均值
      6. 得到慢速 stochastic 的 %K = 快速 stochastic 的 %D
      7. 得到慢速 stochastic 的 %D = 慢速 stochastic 的 %K 线(其与快速 stochastic 的 %D 线相同)的 3 周期均值 

      现在,我们来看看如何应用这些计算来得到 Stochastic 振荡器指标的一个示例。 如果我们有以下数据:

      天数 收盘价 最高价 最低价
      1 100 110 90
      2 130 140 120
      3 140 160 120
      4 130 150 110
      5 120 140 100
      6 140 150 130
      7 160 170 150
      8 170 180 160
      9 155 170 150
      10 140 170 130
      11 160 180 155
      12 180 190 175
      13 190 220 190
      14 200 230 200
      15 210 215 205
      16 200 200 190
      17 190 195 180
      18 185 105 180
      19 195 210 185
      20 200 220 190

      为了计算 Stochastic 振荡器指标,我们将遵循前面提到的步骤,故我们执行以下操作:

      • 判周期为 = 14,如此我们首先需要有 14 个交易周期的数据来开始计算指标。
      • 判定最后 14 个周期的最高点,它将是(230),下图将向我们展示第一个值和其余数据:

      14 最高点

      • 判定最后 14 个周期的最低点,它将是(90),下图将向我们展示第一个值和其余数据:

      14 周期最低点

      • 得到快速 stochastic 的 %K = 100*((当前收盘价 - 最低点)/(最高点- 最低点)), 
      • 得到快速 stochastic 的 %D = 快速 stochastic 的 %K 线的 3 周期均值,
      • 下图将向我们展示所提供数据的计算结果:

      快速 - K-D

      • 得到慢速 stochastic 的 %K = 快速 stochastic 的 %D
      • 得到慢速 stochastic 的 %D = 慢速 stochastic 的 %K 线的 3 周期均值,
      • 下图将向我们展示所提供数据的计算结果:

      慢速 - K-D

      经由前面的所有步骤,我们已手工计算了 Stochastic 振荡器指标。 幸运的是,我们不需要每次都手工计算,因为我们在 MetaTrader 5 交易终端中已有了一个现成的内置指标。 我们只需点击 MetaTrader 5 的“插入”选项卡,从平台可用指标列表中进行选择,如下图所示:

      Stoch 插入

      选择 “Stochastic Oscillator” 后,将打开以下指标参数窗口:

       Stoch 插入窗口

      指标参数:

      1. 检测周期
      2. 检测快速 %D 的移动平均周期
      3. 检测慢速 %D 的移动平均周期
      4. 检测衡量其关系的价格域
      5. 检测在计算中采用的移动平均值类型
      6. 检测 %K 线的颜色、线样式和线宽
      7. 检测 %D 线的颜色、线样式和线宽

      根据您的偏好检测参数后,指标将附着在图表上,如下图所示:

      图表上的 Stoch

      插入 Stochastic 振荡器之后,我们就可以发现,根据之前的图片,我们在下方窗口中绘制了指标,其中有 2 条线(%K,%D)在 0 和 100 之间振荡,且我们可以发现以下相同之处:

      • Stoch(14, 3,3): 表示指标名称和所选参数:周期为 14,快速 stochastic 的 %D 的移动平均周期为 3,快速 stochastic %D 的移动平均周期为 3。
      • 36.85: 表示 %k 值
      • 38.28: 表示 %D 值

      根据 Stochastic 振荡器指标的计算,它在大多数情况下都会顺着行情方向移动,因为我们知道收盘价往往会根据行情走势接近特定时期的价格区间上限或下限。

      上行趋势期间:

      上行趋势是指由于买家或多头的控制而导致价格上涨的行情方向。 通常,价格会创造更高的低点和高点。 在这种情况下,我们可以称这种行情为牛市。

      我们可以发现,在这个行情方向上,大多数时候,收盘价往往在“上行趋势”期间接近区间价格的顶部,stochastic 指标将在 50 级和 100 级之间振荡。 下图显示了这种情况的示例:

      上行趋势期间的 Stochastic

      下行趋势期间:

      下行趋势是指由于卖家或空头的控制而导致价格下跌的行情方向。 价格会创造更低的高点和低点。 在这种情况下,我们可以称这种行情为熊市。

      在这个行情方向上,大多数时候,收盘价都趋向于在“下行跌趋势”走势期间接近价格运动的底部范围收盘。 因此,我们可以发现,在下行走势期间,stochastic 指标在 50 级和 0 级之间移动。 下图显示了这种情况的示例:

      下行趋势期间的 Stochastic

      横盘期间:

      横盘是一种价格走势,没有明确的上行或下行方向。 它可被视为买卖双方或多空双方之间的博弈平衡。 它是除了上行或下行趋势之外的任何走势。

      在这种横盘走势期间,没有明显的上或下行走势,价格往往接近该“横盘”走势期间的价格中间区域,因此,我们可能会发现,大多时候,stochastic 在 20 和 80 级左右浮动,下图就是一个例子:

      横盘期间的 Stochastic

      现在,我们已经分析了 stochastic 指标在不同行情走势中的作用。 现在我们需要研究如何利用它来为我们带来收益,这就是我们以下主题要学习的内容。


      Stochastic 策略

      在这一部分中,我们将探讨如何通过简单的策略运用该指标。 我们可以根据行情趋势从 stochastic 指标中获得信号,这些策略是上行趋势策略、下行趋势策略、和横盘策略。

      • 策略之一: 上行趋势策略

      根据该策略,我们需要检查 %K 线和 %D 线是否低于 50 级,然后,当 %K 线上穿 %D 线时,将生成做多信号。 我们可以依据其它有效工具来获利了结,比如通过搜索最低点的价格。

      %K, %D < 50 --> %K > %D = 做多信号
        • 策略之二: 下行趋势策略

        根据该策略,我们需要检查 %K 线和 %D 线是否高于 50 级,然后,当 %K 线下穿 %D 时,将生成做空信号。 我们可以依据其它有效工具来获利了结,比如通过搜索最高点的价格。

        %K, %D > 50 --> %K < %D = 做空信号
          • 策略之三: 横盘策略
            • 做多信号:

          根据该策略,我们需要检查 %K 线和 %D 线是否低于 20 级,然后,当 %K 线上穿 %D 线时,将生成做多信号。 当 %K 线和 %D 线高于 80 级时,当 %K 线下穿 %D 线时,将生成获利了结信号。

          %K, %D < 20 --> %K > %D = 做多信号
          %K, %D > 80 --> %K < %D = 获利了结

              • 做空信号:

                根据该策略,我们需要检查 %K 线和 %D 线是否高于 80 级,然后,当 %K 线下穿 %D 时,将生成做空信号。 当 %K 线和 %D 线低于 20 级时,当 %K 线上穿 %D 线时,将生成获利了结信号。

                %K, %D > 80 --> %K < %D = 做空信号
                %K, %D < 20 --> %K > %D = 获利了结

                我要在此提到的是,有许多基于 stochastic 的策略可供使用,从简单到复杂,这个指标可以单独使用,也可以与其它工具结合使用,从而产生更好的结果,但在此,我们只涉及简单的策略,是为了理解如何运用这个指标。


                  Stochastic 蓝图

                  在这一部分中,我们将为前面提到的策略设计蓝图,这将有助于我们轻松创建一个交易系统。 该蓝图将一步步地提供指导,来辨别我们需要该程序具体做什么。

                  • 策略之一: 上行趋势策略

                  %K, %D < 50 --> %K > %D = 做多信号

                  我们首先需要程序检查(%K,%D),并决定它是否低于或高于 50 级,然后若是低于 50 级,它就等待...什么都不做,直到 %K 线上穿 %D 线,才会给出做多信号。 如果 (%K, %D) 高于或等于 50 级,则程序什么也不做。

                  下图是这一上行趋势策略的蓝图:

                  SSS- 上行策略蓝图

                  • 策略之二: 下行趋势策略

                  %K, %D > 50 --> %K < %D = 做空信号

                  我们首先需要程序检查(%K,%D),并决定它是否低于或高于 50 级,然后若是高于 50 级,它就等待...什么都不做,直到 %K 线下穿 %D 线,才会给出做空信号。 如果 (%K, %D) 低于或等于 50 级,则程序什么也不做。

                  下图是这一策略的蓝图:

                  SSS- 下行趋势策略蓝图

                  • 策略之三: 横盘策略

                  做多信号:

                  %K, %D < 20 --> %K > %D = 做多信号

                  %K, %D > 80 --> %K < %D = 获利了结

                  我们首先需要程序检查(%K,%D),并决定它是否低于或高于 20 级,然后若是低于 20 级,它就等待...什么都不做,直到 %K 线上穿 %D 线,才会给出做多信号。 如果 (%K, %D) 高于或等于 20 级,则程序什么也不做。 然后程序检查(%K,%D),并决定它是否低于或高于 80 级,然后若是高于 80 级,它就等待...什么都不做,直到 %K 线下穿 %D 线,才会给出获利了结信号。 如果 (%K, %D) 低于或等于 80 级,则程序什么也不做。

                  下图是这一策略的蓝图:

                  SSS- 横盘策略 - 做多蓝图

                  做空信号

                  %K, %D > 80 --> %K < %D = 做空信号

                  %K, %D < 20 --> %K > %D = 获利了结

                  我们首先需要程序检查(%K,%D),并决定它是否低于或高于 80 级,然后若是高于 80 级,它就等待...什么都不做,直到 %K 线下穿 %D 线,才会给出做空信号。 如果 (%K, %D) 低于或等于 80 级,则程序什么也不做。 然后程序检查(%K,%D),并决定它是否低于或高于 20 级,然后若是低于 20 级,它就等待...什么都不做,直到 %K 线上穿 %D 线,才会给出获利了结信号。 如果 (%K, %D) 高于或等于 20 级,则程序什么也不做。

                  下图是横盘策略做空信号的蓝图:

                  SSS- 横盘策略 - 做空信号

                  到目前为止,我们已经研究了可基于 stochastic 指标采用的简单策略,并为这些策略设计了蓝图,来帮助我们创建一款交易系统。 在下一部分当中,我们将学习如何设计这个交易系统。


                  Stochastic 交易系统

                  现在,我们将在本文中开始一个有趣的部分,学习如何编写一个基于这些策略操作的交易系统。 程序化是一个极好的工具,它可以帮助我们有效地交易,因为它可以帮助我们遵照纪律执行计划和策略,除了执行的准确性之外,在交易决策中不涉及情绪。不过最重要的是在执行任何策略之前需对其进行全面测试。 我们来根据前面讨论的策略编写我们的交易系统...

                  首先,我们需要编写一段代码作为一个程序,该程序提供图表上的 stochastic 指标线数值,通过编写这段代码,我们将一行行地学习我们正在编写的内容,从而在每一步骤后能够理解和创建交易系统。

                  第一步,我们需要为 %K 线和 %D 线创建数组,我们将使用 “double” 数据类型,它可以表示含有小数部分的值:

                  double Karray[];
                  double Darray[];
                  

                  然后,我们需要为所创建的数组设置排列方向,以便存储当前数据,为此我们应调用 ArraySetAsSerious 函数:

                  ArraySetAsSeries(Karray, true);
                  ArraySetAsSeries(Darray, true);

                  然后,我们需要定义 “Stochastic” 指标,创建一个 “StochDef” 变量,并调用 iStochastic 函数,如此这般它即等于 “Stochastic” 的定义:

                  int StochDef = iStochastic(_Symbol,_Period,14,3,3,MODE_SMA,STO_LOWHIGH);

                  然后,我们需要用价格数据填充数组,我们将调用 “CopyBuffer” 函数:

                  CopyBuffer(StochDef,0,0,3,Karray);
                  CopyBuffer(StochDef,1,0,3,Darray);
                  

                  然后,我们将计算当前数据的 %K 线和 %D 线的数值,并使用 “float” 数值类型来减小分数的尺寸,并进行近似:

                  float KValue = Karray[0];
                  float DValue = Darray[0];
                  

                  最后一行代码是令程序在图表上以两行显示 %K 线值和 %D 线值,我们将调用 “Comment” 函数:

                  Comment("%K value is ", KValue,"\n""%D Value is ",DValue);

                  以下代码与前面的代码相同,但在一个模块中,如果需要,您可以将它复制到您所需步骤当中:

                  //+------------------------------------------------------------------+
                  //|                       Simple Stochastic System - Lines Value.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()
                    {
                  //creating arrays for %K line and %D line   
                     double Karray[];
                     double Darray[];
                     
                  //sorting arrays from the current data   
                     ArraySetAsSeries(Karray, true);
                     ArraySetAsSeries(Darray, true);
                  
                  //defining the stochastic indicator   
                     int StochDef = iStochastic(_Symbol,_Period,14,3,3,MODE_SMA,STO_LOWHIGH);
                  
                  //filling arrays with price data   
                     CopyBuffer(StochDef,0,0,3,Karray);
                     CopyBuffer(StochDef,1,0,3,Darray);
                  
                  //calculating value of %K and %D line of cuurent data  
                     float KValue = Karray[0];
                     float DValue = Darray[0];
                     
                  //commenting calcualted values on the chart   
                     Comment("%K value is ",KValue,"\n"
                     "%D Value is ",DValue);
                        
                    }
                  //+------------------------------------------------------------------+

                  到目前为止,我们编写了一个程序的代码,该程序可以在图表上显示 stochastic 指标线的当前值,现在我们需要在我们的 Meta Trader5 交易终端上执行该程序,当我们编译之后发现它已出现在导航器窗口之中:

                  Nav 1

                  拖放 Simple Stochastic System 文件之后,将打开以下窗口:

                  SSS-lines value window


                  按“确定”后,程序或(智能交易系统)将被加载到图表上,如下图所示:

                  SSS-lines value attached

                  然后,我们可以看到程序生成的 stochastic 曲线值与下图相同:

                  SSS- lines value

                  现在,我们将开始编写代码,为我们的策略创建一个交易系统,我们在这里需要做的是创建一个交易系统,该系统会根据所采用的策略在图表上显示相应的信号作为注释。 我们开始吧...

                  • 策略之一: 上行趋势策略

                  %K, %D < 50 --> %K > %D = 做多信号

                  以下代码创建交易系统,并根据上行趋势策略执行我们所需的操作:

                  //+------------------------------------------------------------------+
                  //|                  Simple Stochastic System - Uptrend 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()
                    {
                     string signal="";
                     
                     double Karray[];
                     double Darray[];
                     
                     ArraySetAsSeries(Karray, true);
                     ArraySetAsSeries(Darray, true);
                     
                     int StochDef = iStochastic(_Symbol,_Period,14,3,3,MODE_SMA,STO_LOWHIGH);
                     
                     CopyBuffer(StochDef,0,0,3,Karray);
                     CopyBuffer(StochDef,1,0,3,Darray);
                     
                     double KValue0 = Karray[0];
                     double DValue0 = Darray[0];
                     
                     double KValue1 = Karray[1];
                     double DValue1 = Darray[1];
                     
                     if (KValue0<50&&DValue0<50)
                        if ((KValue0>DValue0) && (KValue1<DValue1))
                        {
                           signal = "BUY";
                        }      
                        
                     Comment("SSS - Uptrend Strategy - Signal is ",signal);
                        
                    }
                  //+------------------------------------------------------------------+

                  如您所见,这里的区别是:

                  为“信号”创建了一个变量并分配了空值,因为我们将在以后才计算它:

                  string signal="";

                  分别为 %K 值 和 %D 值的当前数据(索引 0)和前一个数据(索引 1)创建了两个变量:

                     double KValue0 = Karray[0];
                     double DValue0 = Darray[0];
                     
                     double KValue1 = Karray[1];
                     double DValue1 = Darray[1];

                  由于要评估 %K 和 %D 之间的交叉,故我们需要判断交叉向上,换句话说,我们需要 %K 向上突破 %D ,并在交叉之后上移,我们可以在 “if ”行代码中找到这些:

                     if (KValue0<50&&DValue0<50)
                        if ((KValue0>DValue0) && (KValue1<DValue1))
                        {
                           signal = "BUY";
                        }      
                        

                  在评估交叉后,如果它为真,我们需要一个“做多”信号,并将其分配给 “signal”。 然后我们需要在图表上依据这个信号进行注释,它是根据以下代码行:

                  Comment("SSS - Uptrend Strategy - Signal is ",signal);

                  至此,我们创建了程序的代码,编译后,我们可以在导航器窗口中找到它:

                  Nav 2

                  将此文件拖放到图表上后,将出现以下窗口:

                   SSS-Uptrend window


                  按"确定"后,它将被加载:

                  SSS-Uptrend attached

                  而当测试时,信号显示与以下示例相同:

                  SSS - uptrend - buy

                  • 策略之二: 下行趋势策略

                  %K, %D > 50 --> %K < %D = 做空信号

                  以下创建一个程序来执行此下行趋势策略:

                  //+------------------------------------------------------------------+
                  //|                Simple Stochastic System - Downtrend 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()
                    {
                     string signal="";
                     
                     double Karray[];
                     double Darray[];
                     
                     ArraySetAsSeries(Karray, true);
                     ArraySetAsSeries(Darray, true);
                     
                     int StochDef = iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,STO_LOWHIGH);
                     
                     CopyBuffer(StochDef,0,0,3,Karray);
                     CopyBuffer(StochDef,1,0,3,Darray);
                     
                     double KValue0 = Karray[0];
                     double DValue0 = Darray[0];
                     
                     double KValue1 = Karray[1];
                     double DValue1 = Darray[1];
                           
                     if (KValue0>50&&DValue0>50)
                        if ((KValue0<DValue0) && (KValue1>DValue1))
                        {
                           signal = "SELL";
                        }
                        
                     Comment("SSS - Downtrend Strategy - Signal is ",signal);
                        
                    }
                  //+------------------------------------------------------------------+

                  区别是:

                  • 交叉的条件

                     if (KValue0>50&&DValue0>50)
                        if ((KValue0<DValue0) && (KValue1>DValue1))
                        {
                           signal = "SELL";
                        }
                        

                  • 注释则根据该策略:

                     Comment("SSS - Downtrend Strategy - Signal is ",signal);

                  编译后,我们可以在导航器窗口中找到该程序的文件:

                  Nav 3

                  将此文件拖放到图表上,将打开以下窗口:

                  SSS-Downtrend window

                  按“确定”后,文件将加载到图表:

                  SSS-Downtrend attached 

                   根据该策略的条件,信号将作为注释显示在图表上,下图就是一个示例:

                  SSS - downtrend - sel

                  • 策略之三: 横盘策略
                    • 做多信号

                  %K, %D < 20 --> %K > %D = 做多信号

                  %K, %D > 80 --> %K < %D = 获利了结信号

                  以下代码用于创建能够执行此横盘策略的程序:

                  //+------------------------------------------------------------------+
                  //|           Simple Stochastic System - Sideways - Buy 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()
                    {
                     string signal="";
                     
                     double Karray[];
                     double Darray[];
                     
                     ArraySetAsSeries(Karray, true);
                     ArraySetAsSeries(Darray, true);
                     
                     int StochDef = iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,STO_LOWHIGH);
                     
                     CopyBuffer(StochDef,0,0,3,Karray);
                     CopyBuffer(StochDef,1,0,3,Darray);
                     
                     double KValue0 = Karray[0];
                     double DValue0 = Darray[0];
                     
                     double KValue1 = Karray[1];
                     double DValue1 = Darray[1];
                     
                     if (KValue0<20&&DValue0<20)
                        if ((KValue0>DValue0) && (KValue1<DValue1))
                        {
                           signal = "BUY";
                        }      
                        
                     Comment("SSS - Sideways - Buy Strategy - Signal is ",signal);
                     
                      if (KValue0>80&&DValue0>80)
                        if ((KValue0<DValue0) && (KValue1>DValue1))
                        {
                           signal = "Take Profit";
                        }
                        
                     Comment("SSS - Sideways - Buy Strategy - Signal is ",signal);  
                        
                    }
                  //+------------------------------------------------------------------+

                  区别是:

                  • 根据横盘策略的做多信号进行交叉的条件:

                     if (KValue0<20&&DValue0<20)
                        if ((KValue0>DValue0) && (KValue1<DValue1))
                        {
                           signal = "BUY";
                        }      
                        

                  • 注释则根据横盘策略的做多信号:

                     Comment("SSS - Sideways - Buy Strategy - Signal is ",signal);

                  • 根据横盘策略的获利了结信号的条件:

                      if (KValue0>80&&DValue0>80)
                        if ((KValue0<DValue0) && (KValue1>DValue1))
                        {
                           signal = "Take Profit";
                        }
                        

                  • 注释则根据横盘策略的获利了结信号:

                     Comment("SSS - Sideways - Buy Strategy - Signal is ",signal);

                  编译后,该交易系统的文件将出现在导航器窗口当中:

                  Nav 4

                  将文件拖放到图表上,将打开以下窗口:

                  SSS-Sideways - buy - window

                  按“确定”后,程序将加载到图表:

                  SSS-Sideways - buy - attached

                  根据该策略,信号将作为注释显示在图表上。 下图显示了此类信号的示例:

                  SSS - Sideways - buy - buy

                  获利了结信号示例:

                  SSS - Sideways - buy - TP

                    • 横盘策略: 做空信号

                  %K, %D > 80 --> %K < %D = 做空信号

                  %K, %D < 20 --> %K > %D = 获利了结信号

                  以下是如何编写执行此策略的程序代码:

                  //+------------------------------------------------------------------+
                  //|          Simple Stochastic System - Sideways - Sell 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()
                    {
                     string signal="";
                     
                     double Karray[];
                     double Darray[];
                     
                     ArraySetAsSeries(Karray, true);
                     ArraySetAsSeries(Darray, true);
                     
                     int StochDef = iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,STO_LOWHIGH);
                     
                     CopyBuffer(StochDef,0,0,3,Karray);
                     CopyBuffer(StochDef,1,0,3,Darray);
                     
                     double KValue0 = Karray[0];
                     double DValue0 = Darray[0];
                     
                     double KValue1 = Karray[1];
                     double DValue1 = Darray[1];  
                     
                      if (KValue0>80&&DValue0>80)
                        if ((KValue0<DValue0) && (KValue1>DValue1))
                        {
                           signal = "SELL";
                        }
                        
                     Comment("SSS - Sideways - Sell Strategy - Signal is ",signal);  
                     
                     if (KValue0<20&&DValue0<20)
                        if ((KValue0>DValue0) && (KValue1<DValue1))
                        {
                           signal = "TAKE PROFIT";
                        }         
                     Comment("SSS - Sideways - Sell Strategy - Signal is ",signal);  
                    }
                  //+------------------------------------------------------------------+
                  

                  区别是:

                  • 根据横盘策略的做空信号进行交叉的条件:
                      if (KValue0>80&&DValue0>80)
                        if ((KValue0<DValue0) && (KValue1>DValue1))
                        {
                           signal = "SELL";
                        }
                  • 注释则根据横盘策略的做空信号:
                     Comment("SSS - Sideways - Sell Strategy - Signal is ",signal);  
                  • 根据横盘策略的获利了结信号的条件:
                     if (KValue0<20&&DValue0<20)
                        if ((KValue0>DValue0) && (KValue1<DValue1))
                        {
                           signal = "TAKE PROFIT";
                        }   
                  • 注释则根据横盘策略的获利了结信号: 
                     Comment("SSS - Sideways - Sell Strategy - Signal is ",signal);  

                  编译后,该交易系统的文件将出现在导航器窗口当中:

                  Nav 5

                  将其拖放到图表上,将打开以下窗口:

                  SSS-Sideways - sell - window

                  按“确定”后,程序将加载到图表,并准备好生成信号:

                  SSS-Sideways - sell - attached

                  下图是根据横盘策略生成做空信号的示例:

                  SSS - Sideways - sell - sell

                  下图是根据横盘策略生成获利了结信号的示例:

                  SSS - Sideways - sell - TP

                  结束语

                  在本文的最后,我们可以说,我们已经学习了如何基于 “Stochastic 振荡器” 技术指标创建简单交易系统的基础知识,该指标是世界上最流行的指标之一。 我希望大家已经理解了 “Stochastic 振荡器” 指标是什么,它测量什么,以及如何计算它 — 我们已经详细研究过它了。 我还希望通过学习一些可以运用的简单策略,您已经发现了一些关于如何运用 Stochastic 指标的新知识。 本文还提出了这些简单策略的蓝图,在此基础上可以轻松、平顺地创建交易系统。 此外,我们还研究了如何基于上述简单策略设计交易系统。

                  我希望您能发现这篇文章对于您和您的交易均有益处,它将帮助您深入了解交易世界中最流行和最有用的指标之一 — “Stochastic 振荡器”,从而激发出新的思路。

                  本文由MetaQuotes Ltd译自英文
                  原文地址: https://www.mql5.com/en/articles/10692

                  最近评论 | 前往讨论 (1)
                  坤淋 葉
                  坤淋 葉 | 25 7月 2022 在 11:53
                  感謝您們精美的說明,不過您們千辛萬苦的教導我們,竟然成了詐騙集團的斂財工具,為何你們不寫一程式替使用者維護本身的使用者,謝謝
                  学习如何基于 ADX 设计交易系统 学习如何基于 ADX 设计交易系统
                  在本文中,我们将继续有关基于最流行指标设计交易系统的系列文章,这次我们将讨论平均方向指数(ADX)指标。 我们将详细学习该指标,从而能够更好地理解它,并将学习如何在简单策略里运用它。 通过深入学习,我们可以获得更多的认知,可以更好地运用它。
                  数据科学与机器学习(第 02 部分):逻辑回归 数据科学与机器学习(第 02 部分):逻辑回归
                  数据分类对于算法交易者和程序员来说是至关重要的。 在本文中,我们将重点关注一种分类逻辑算法,它有帮于我们识别“确定或否定”、“上行或下行”、“做多或做空”。
                  从头开始开发智能交易系统(第 13 部分):时序与交易(II) 从头开始开发智能交易系统(第 13 部分):时序与交易(II)
                  今天,我们将针对市场分析构建《时序与交易》系统的第二部分。 在前一篇文章《时序与交易(I)》当中,我们讨论了一种替代的图表组织系统,该系统能够针对市场上执行的成交进行最快速的解释。
                  DoEasy. 控件 (第 5 部分): 基准 WinForms 对象,面板控件,AutoSize 参数 DoEasy. 控件 (第 5 部分): 基准 WinForms 对象,面板控件,AutoSize 参数
                  在本文中,我将创建所有函数库 WinForms 对象的基准对象,并开始实现面板 WinForms 对象的 AutoSize 属性 — 自动调整尺寸,从而适应对象内部内容。