zoukankan      html  css  js  c++  java
  • MT5 iMA

    iMA

    函数返回移动平均数指标处理器。只有一个缓冲区。

    int  iMA(
       string               symbol,            // 交易品种名称
       ENUM_TIMEFRAMES      period,            // 周期
       int                  ma_period,         // 平均周期
       int                  ma_shift,          // 平移
       ENUM_MA_METHOD       ma_method,         // 平滑类型
       ENUM_APPLIED_PRICE   applied_price      // 价格或者处理程序类型
       );

    参量

    symbol

    [in] 证券交易品种名称,数据用来计算指标。 NULL 值代表当前交易品种。

    period

    [in] 周期值可以是 ENUM_TIMEFRAMES 值中的一个,0代表当前时间表。

    ma_period

    [in] 计算移动平均数的平均周期。

    ma_shift

    [in]  与价格图表有关的指标变化。

    ma_method

    [in]  平滑类型。可以是 ENUM_MA_METHOD 值中的一个。

    applied_price

    [in]  使用价格。可以是任意 ENUM_APPLIED_PRICE 价格常量或者另外指标处理器。

    返回值

    返回特殊技术指标处理器,失败返回 INVALID_HANDLE. 计算机内存从不使用的指标中释放,使用指标处理程序传递到的函数 IndicatorRelease()

    例如:

    //+------------------------------------------------------------------+
    //|                                                     Demo_iMA.mq5 |
    //|                        Copyright 2011, MetaQuotes Software Corp. |
    //|                                             https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2011, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    #property description "The indicator demonstrates how to obtain data"
    #property description "of indicator buffers for the iMA technical indicator."
    #property description "A symbol and timeframe used for calculation of the indicator,"
    #property description "are set by the symbol and period parameters."
    #property description "The method of creation of the handle is set through the 'type' parameter (function type)."
    #property description "All other parameters like in the standard Moving Average."
     
    #property indicator_chart_window
    #property indicator_buffers 1
    #property indicator_plots   1
    //--- iMA 标图
    #property indicator_label1  "iMA"
    #property indicator_type1   DRAW_LINE
    #property indicator_color1  clrRed
    #property indicator_style1  STYLE_SOLID
    #property indicator_width1  1
    //+------------------------------------------------------------------+
    //| 枚举处理创建方法                                                   |
    //+------------------------------------------------------------------+
    enum Creation
      {
       Call_iMA,               // 使用iMA
       Call_IndicatorCreate    // 使用IndicatorCreate
      };
    //--- 输入参数
    input Creation             type=Call_iMA;                // 函数类型
    input int                  ma_period=10;                 // ma周期
    input int                  ma_shift=0;                   // 移动
    input ENUM_MA_METHOD       ma_method=MODE_SMA;           // 平滑类型
    input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE;    // 价格类型
    input string               symbol=" ";                   // 交易品种 
    input ENUM_TIMEFRAMES      period=PERIOD_CURRENT;        // 时间帧
    //--- 指标缓冲区
    double         iMABuffer[];
    //--- 存储iMA指标处理程序的变量
    int    handle;
    //--- 存储变量
    string name=symbol;
    //--- 图表上的指标名称
    string short_name;
    //--- 我们将在移动平均指标中保持值的数量
    int    bars_calculated=0;
    //+------------------------------------------------------------------+
    //| 自定义指标初始化函数                                                |
    //+------------------------------------------------------------------+
    int OnInit()
      {
    //--- 分配指标缓冲区数组
       SetIndexBuffer(0,iMABuffer,INDICATOR_DATA);
    //--- 设置移动
       PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);   
    //--- 定义绘制指标的交易品种  
       name=symbol;
    //--- 删除向左和向右的空格
       StringTrimRight(name);
       StringTrimLeft(name);
    //--- 如果它返回 'name' 字符串的零长度
       if(StringLen(name)==0)
         {
          //--- 获得指标附属的图表交易品种
          name=_Symbol;
         }
    //--- 创建指标处理程序
       if(type==Call_iMA)
          handle=iMA(name,period,ma_period,ma_shift,ma_method,applied_price);
       else
         {
          //--- 以指标参数填充结构
          MqlParam pars[4];
          //--- 周期
          pars[0].type=TYPE_INT;
          pars[0].integer_value=ma_period;
          //--- 移动
          pars[1].type=TYPE_INT;
          pars[1].integer_value=ma_shift;
          //--- 平滑类型
          pars[2].type=TYPE_INT;
          pars[2].integer_value=ma_method;
          //--- 价格类型
          pars[3].type=TYPE_INT;
          pars[3].integer_value=applied_price;
          handle=IndicatorCreate(name,period,IND_MA,4,pars);
         }
    //--- 如果没有创建处理程序
       if(handle==INVALID_HANDLE)
         {
          //--- 叙述失败和输出错误代码
          PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                      name,
                      EnumToString(period),
                      GetLastError());
          //--- 指标提前停止
          return(INIT_FAILED);
         }
    //--- 显示移动平均指标计算的交易品种/时间帧
       short_name=StringFormat("iMA(%s/%s, %d, %d, %s, %s)",name,EnumToString(period),
                               ma_period, ma_shift,EnumToString(ma_method),EnumToString(applied_price));
       IndicatorSetString(INDICATOR_SHORTNAME,short_name);
    //--- 指标正常初始化
       return(INIT_SUCCEEDED);
      }
    //+------------------------------------------------------------------+
    //| 自定义指标迭代函数                                                 |
    //+------------------------------------------------------------------+
    int OnCalculate(const int rates_total,
                    const int prev_calculated,
                    const datetime &time[],
                    const double &open[],
                    const double &high[],
                    const double &low[],
                    const double &close[],
                    const long &tick_volume[],
                    const long &volume[],
                    const int &spread[])
      {
    //--- 从iMA指标复制的值数
       int values_to_copy;
    //--- 确定指标计算的数量值
       int calculated=BarsCalculated(handle);
       if(calculated<=0)
         {
          PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
          return(0);
         }
    //--- 如果它是指标计算的最初起点或如果iMA 指标数量值更改
    //--- 或如果需要计算两个或多个柱形的指标(这意味着价格历史中有些内容会发生变化)
       if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
         {
          //--- 如果iMABuffer数组大于交易品种/周期iMA指标的数量值,那么我们不会复制任何内容
          //--- 否则,我们复制小于指标缓冲区的大小
          if(calculated>rates_total) values_to_copy=rates_total;
          else                       values_to_copy=calculated;
         }
       else
         {
          //--- 它意味着这不是初次指标计算,因为 OnCalculate())最近调用
          //--- 为了计算,添加不超过一柱
          values_to_copy=(rates_total-prev_calculated)+1;
         }
    //--- 以适合移动平均指标的值填充iMABuffer 数组
    //--- 如果FillArrayFromBuffer 返回 false,它表示信息还未准备,退出操作
       if(!FillArrayFromBuffer(iMABuffer,ma_shift,handle,values_to_copy)) return(0);
    //--- 形成信息
       string comm=StringFormat("%s ==>  Updated value in the indicator %s: %d",
                                TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
                                short_name,
                                values_to_copy);
    //--- 在图表上展示服务信息
       Comment(comm);
    //--- 记住移动平均指标的数量值
       bars_calculated=calculated;
    //--- 返回prev_calculated值以便下次调用
       return(rates_total);
      }
    //+------------------------------------------------------------------+
    //| 填充MA指标的指标缓冲区                                              |
    //+------------------------------------------------------------------+
    bool FillArrayFromBuffer(double &values[],   // 移动平均值的指标缓冲区
                             int shift,          // 移动
                             int ind_handle,     // iMA指标的处理程序
                             int amount          // 复制值的数量
                             )
      {
    //--- 重置错误代码
       ResetLastError();
    //--- 以0标引指标缓冲区的值填充部分iMABuffer数组
       if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
         {
          //--- 如果复制失败,显示错误代码
          PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
          //--- 退出零结果 - 它表示被认为是不计算的指标
          return(false);
         }
    //--- 一切顺利
       return(true);
      }
    //+------------------------------------------------------------------+
    //| 指标去初始化函数                                                   |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {
    //--- 删除指标后清空图表
       Comment("");
      }     

  • 相关阅读:
    Flash向量1点和向量
    Flash/Flex学习笔记(2):捕获摄像头
    Flash向量0序言
    Flash向量3加法和投影
    Flash/Flex学习笔记(3):动态添加组件
    Flash/Flex学习笔记(5):捕获摄像头(续)在线抓屏并保存到客户端本地
    异常写法
    关于存储过程得传出参数的错误
    python Beautiful Soup模块的安装
    python学习笔记比较全
  • 原文地址:https://www.cnblogs.com/anlewang/p/10186769.html
Copyright © 2011-2022 走看看