龙虎大师

 找回密码
 立即注册

微信登录,快人一步

查看: 733|回复: 50

[MQL4(MT4)] 动态交易者振荡指标 - MetaTrader 5脚本

[复制链接]

468

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
81350
发表于 2019-4-29 20:57:00 | 显示全部楼层 |阅读模式
理论:
Robert Miner 所开发的称为 "动态交易者振荡指标(Dynamic Trader Oscillator,通常简称为 DTOSC)。这个指标实际上是 RSI 的随机振荡,但是为了有些人会根据“DTOSC”的名字来寻找它,就沿用了这个名字,并且发布在这里。
用法 :
它是 RSI 的随机振荡 (也就是说: 一种通过随机振荡对RSI数值的的规范化) 并且加上了通常的信号线。您可以使用 "DTOSC" 数值颜色的改变作为信号。
cb__18.png

  1. //------------------------------------------------------------------
  2. #property copyright   "© mladen, 2018"
  3. #property link        "mladenfx@gmail.com"
  4. #property description "Dynamic Trader Oscillator"
  5. //------------------------------------------------------------------
  6. #property indicator_separate_window
  7. #property indicator_buffers 4
  8. #property indicator_plots   2
  9. #property indicator_label1  "DTOSC"
  10. #property indicator_type1   DRAW_COLOR_LINE
  11. #property indicator_color1  clrMediumSeaGreen,clrOrangeRed
  12. #property indicator_label2  "Signal"
  13. #property indicator_type2   DRAW_LINE
  14. #property indicator_color2  clrGray
  15. #property indicator_style2  STYLE_DOT
  16. #property indicator_level1  0
  17. #property indicator_level2  100
  18. #include <MovingAverages.mqh>

  19. //
  20. //--- input parameters
  21. //

  22. input int                inpPeriod     = 14;          // Period
  23. input ENUM_APPLIED_PRICE inpPrice      = PRICE_CLOSE; // Price
  24. input int                inpStoPeriod  = 32;          // Stochastic period
  25. input int                inpStoSlowing =  3;          // Stochastic slowing
  26. input int                inpStoSignal  =  3;          // Stochastic signal period
  27. input ENUM_MA_METHOD     inpStoMethod  = MODE_EMA;    // Stochastic signal method

  28. //
  29. //--- buffers declarations
  30. //

  31. double sto[],stoc[],sig[],rsi[];
  32. int  ª_rsiHandle,ª_rsiPeriod;

  33. //------------------------------------------------------------------
  34. // Custom indicator initialization function
  35. //------------------------------------------------------------------

  36. int OnInit()
  37. {
  38.    //
  39.    //--- indicator buffers mapping
  40.    //
  41.          SetIndexBuffer(0,sto ,INDICATOR_DATA);
  42.          SetIndexBuffer(1,stoc,INDICATOR_COLOR_INDEX);
  43.          SetIndexBuffer(2,sig ,INDICATOR_DATA);
  44.          SetIndexBuffer(3,rsi ,INDICATOR_CALCULATIONS);

  45.          //
  46.          //---
  47.          //
  48.                   
  49.          ª_rsiPeriod   = (inpPeriod>1) ? inpPeriod : 1;
  50.          ª_rsiHandle   = iRSI(_Symbol,0,ª_rsiPeriod,inpPrice); if (!_checkHandle(ª_rsiHandle,"RSI")) return(INIT_FAILED);
  51.          
  52.    //         
  53.    //--- indicator short name assignment
  54.    //
  55.    IndicatorSetString(INDICATOR_SHORTNAME,""DTOSC" ("+(string)inpPeriod+","+(string)inpStoPeriod+","+(string)inpStoSlowing+","+(string)inpStoSignal+")");
  56.    return (INIT_SUCCEEDED);
  57. }
  58. void OnDeinit(const int reason) { }

  59. //------------------------------------------------------------------
  60. //  Custom indicator iteration function
  61. //------------------------------------------------------------------
  62. //
  63. //---
  64. //

  65. int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],
  66.                 const double &open[],
  67.                 const double &high[],
  68.                 const double &low[],
  69.                 const double &close[],
  70.                 const long &tick_volume[],
  71.                 const long &volume[],
  72.                 const int &spread[])
  73. {
  74.    int _copyCount = rates_total-prev_calculated+1; if (_copyCount>rates_total) _copyCount=rates_total;
  75.          if (CopyBuffer(ª_rsiHandle,0,0,_copyCount,rsi)!=_copyCount) return(prev_calculated);

  76.    //
  77.    //---
  78.    //
  79.    
  80.    int start= prev_calculated-1; if (start<0) start=0; for (int i=start; i<rates_total && !_StopFlag; i++)
  81.    {
  82.       if (rsi[i]==EMPTY_VALUE) rsi[i] = 0;
  83.          sto[i] = iStoch(rsi[i],rsi[i],rsi[i],inpStoPeriod,inpStoSlowing,i);
  84.    }
  85.    int weightsum=0;
  86.    switch (inpStoMethod)
  87.    {
  88.       case MODE_SMA  : SimpleMAOnBuffer(rates_total,prev_calculated,0,inpStoSignal,sto,sig); break;
  89.       case MODE_EMA  : ExponentialMAOnBuffer(rates_total,prev_calculated,0,inpStoSignal,sto,sig); break;
  90.       case MODE_SMMA : SmoothedMAOnBuffer(rates_total,prev_calculated,0,inpStoSignal,sto,sig); break;
  91.       default        : LinearWeightedMAOnBuffer(rates_total,prev_calculated,0,inpStoSignal,sto,sig,weightsum);
  92.    }
  93.    for (int i=start; i<rates_total && !_StopFlag; i++) stoc[i] = (sto[i]>sig[i]) ? 0 : (sto[i]<sig[i]) ? 1 : (i>0) ? stoc[i-1] : 0;
  94.    return (rates_total);
  95. }

  96. //------------------------------------------------------------------
  97. //    Custom function(s)
  98. //------------------------------------------------------------------
  99. //
  100. //---
  101. //

  102. double iStoch(double price, double priceHigh, double priceLow, int period, int slowing, int i,int instance=0)
  103. {
  104.    #define ¤ instance
  105.    #define _functionInstances 1
  106.    #define _functionRingSize 32
  107.    
  108.       class cStochasticWork
  109.       {
  110.          public :
  111.             int    originalPeriod;
  112.             int    period;
  113.             int    slowing;
  114.             int    slowingSize;
  115.             double maxArray[];
  116.             double minArray[];
  117.             double diffh[];
  118.             double diffl[];
  119.             double sumh[];
  120.             double suml[];
  121.          
  122.             cStochasticWork() { originalPeriod=-1; return; }
  123.            ~cStochasticWork() { ArrayFree(maxArray); ArrayFree(minArray); ArrayFree(diffh); ArrayFree(diffl); ArrayFree(sumh); ArrayFree(suml); return; }
  124.       };
  125.       static cStochasticWork  m_work[_functionInstances];
  126.          if (m_work[¤].originalPeriod!=period)
  127.          {
  128.             m_work[¤].originalPeriod =  period;
  129.             m_work[¤].period         = (period>0) ? period : 1;
  130.             m_work[¤].slowing        = (slowing>0) ? slowing : 1;
  131.             m_work[¤].slowingSize    = m_work[¤].slowing+_functionRingSize;
  132.                   ArrayResize(m_work[¤].maxArray,m_work[¤].period);      ArrayInitialize(m_work[¤].maxArray,priceHigh);
  133.                   ArrayResize(m_work[¤].minArray,m_work[¤].period);      ArrayInitialize(m_work[¤].minArray,priceLow);
  134.                   ArrayResize(m_work[¤].diffh   ,m_work[¤].slowingSize); ArrayInitialize(m_work[¤].diffh   ,0);
  135.                   ArrayResize(m_work[¤].diffl   ,m_work[¤].slowingSize); ArrayInitialize(m_work[¤].diffl   ,0);
  136.                   ArrayResize(m_work[¤].sumh    ,m_work[¤].slowingSize); ArrayInitialize(m_work[¤].sumh    ,0);
  137.                   ArrayResize(m_work[¤].suml    ,m_work[¤].slowingSize); ArrayInitialize(m_work[¤].suml    ,0);
  138.          }
  139.       
  140.       //
  141.       //---
  142.       //
  143.       
  144.       int _pos = (i) % m_work[¤].period;
  145.                        m_work[¤].minArray[_pos]=priceLow;
  146.                        m_work[¤].maxArray[_pos]=priceHigh;
  147.          double min =  m_work[¤].minArray[ArrayMinimum(m_work[¤].minArray)];
  148.          double max =  m_work[¤].maxArray[ArrayMaximum(m_work[¤].maxArray)];
  149.                _pos = (i) % m_work[¤].slowingSize;
  150.                        m_work[¤].diffh[_pos] = max  -min;
  151.                        m_work[¤].diffl[_pos] = price-min;

  152.                        //
  153.                        //---
  154.                        //
  155.                         
  156.                        if (i>m_work[¤].slowing)
  157.                        {
  158.                            int _posp = (i-1                ) % m_work[¤].slowingSize;
  159.                            int _posf = (i-m_work[¤].slowing) % m_work[¤].slowingSize;
  160.                               m_work[¤].sumh[_pos] = m_work[¤].sumh[_posp]+m_work[¤].diffh[_pos]-m_work[¤].diffh[_posf];
  161.                               m_work[¤].suml[_pos] = m_work[¤].suml[_posp]+m_work[¤].diffl[_pos]-m_work[¤].diffl[_posf];
  162.                        }
  163.                        else
  164.                        {
  165.                            m_work[¤].sumh[_pos] = m_work[¤].diffh[_pos];
  166.                            m_work[¤].suml[_pos] = m_work[¤].diffl[_pos];
  167.                            for (int k=1, _posp=_pos-1; k<m_work[¤].slowing; k++, _posp--)
  168.                            {
  169.                               if (_posp<0) _posp += m_work[¤].slowingSize;
  170.                                  m_work[¤].sumh[_pos] += m_work[¤].diffh[_posp];
  171.                                  m_work[¤].suml[_pos] += m_work[¤].diffl[_posp];
  172.                            }
  173.                        }
  174.       return((m_work[¤].sumh[_pos]!=0.0)? 100.0*m_work[¤].suml[_pos]/m_work[¤].sumh[_pos]:0);
  175.       
  176.       //
  177.       //---
  178.       //
  179.       
  180.    #undef ¤ #undef _functionInstances #undef _functionRingSize
  181. }

  182. //
  183. //---
  184. //

  185. bool _checkHandle(int _handle, string _description)
  186. {
  187.    static int  _chandles[];
  188.           int  _size   = ArraySize(_chandles);
  189.           bool _answer = (_handle!=INVALID_HANDLE);
  190.           if  (_answer)
  191.                { ArrayResize(_chandles,_size+1); _chandles[_size]=_handle; }
  192.           else { for (int i=_size-1; i>=0; i--) IndicatorRelease(_chandles[i]); ArrayResize(_chandles,0); Alert(_description+" initialization failed"); }
  193.    return(_answer);
  194. }
  195. //------------------------------------------------------------------
复制代码

回复

使用道具 举报

205

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
80621
发表于 2019-4-29 20:57:14 | 显示全部楼层
一个鸡蛋结婚了,结果它变成了(婚)混蛋;
回复 支持 反对

使用道具 举报

230

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
81011
发表于 2019-4-29 20:57:19 | 显示全部楼层
对着镜子照一会若有所思的说:\"我发现我长的真好看!~
回复 支持 反对

使用道具 举报

发表于 2019-4-29 20:59:01 | 显示全部楼层
人世际间的分分合合,在生活中演绎出的许多恩恩怨怨,有缘无分,源头水尾难以相见;有情无缘,行色匆匆远隔天涯;
回复 支持 反对

使用道具 举报

215

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
80449
发表于 2019-4-29 21:01:18 | 显示全部楼层
生物课上,老师问:如何才能正确分辨章鱼的手和脚?学生答:放个屁给它闻,会捂住鼻子的就是手,其他的就是脚。全班皆倒。
回复 支持 反对

使用道具 举报

205

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
80621
发表于 2019-4-29 21:01:28 | 显示全部楼层
以后不要在我面前说英文,OK?
回复 支持 反对

使用道具 举报

229

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
81696
发表于 2019-4-29 21:01:35 | 显示全部楼层
每天靠搜索能有500-900的ip
回复 支持 反对

使用道具 举报

217

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
81316
发表于 2019-4-29 21:01:56 | 显示全部楼层
回答了那么多,没有加分了,郁闷。。
回复 支持 反对

使用道具 举报

477

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
81125
发表于 2019-4-29 21:04:33 | 显示全部楼层
爷爷都是从孙子走过来的。
回复 支持 反对

使用道具 举报

433

主题

5万

帖子

8万

积分

高级VIP会员

Rank: 8Rank: 8

积分
82145
发表于 2019-4-29 21:04:34 | 显示全部楼层
唉!累了啊!回帖,拿米,求加分!哈哈。。。痛恨邪恶
回复 支持 反对

使用道具 举报

QQ|Archiver|手机版|小黑屋|努金智能 ( 沪ICP备18033831号-1 )

GMT+8, 2019-10-16 11:20 , Processed in 0.088899 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表