跨周期指标写法(以均线为例子)  

| 发表于 2022-5-13 05:14:11 | 显示全部楼层 |复制链接
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "Ma"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2


input bool               AutoMatchTF  = true;
extern ENUM_TIMEFRAMES   TimeFrame    = PERIOD_CURRENT;
input int                MaPeriods    = 12;
input ENUM_MA_METHOD     MaMethod     = MODE_EMA;
input ENUM_APPLIED_PRICE MaPrice      = PRICE_CLOSE;



double         MaBuffer[];

int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0,MaBuffer);  
   for(int i=0; i<1; i++)
   {
      SetIndexEmptyValue(i,0.0);
      SetIndexDrawBegin(i,MaPeriods);
   }
  
//--- 是否自动匹配周期
   if(AutoMatchTF)
   {
      if(Period()==1)TimeFrame =30;
      else if(Period()==5)TimeFrame =240;
      else if(Period()==15||Period()==30||Period()==60)TimeFrame=PERIOD_D1;
      else if(Period()==240)TimeFrame = PERIOD_W1;
      else if(Period()>=1440)TimeFrame = PERIOD_MN1;
   }
   else
     {
      if(TimeFrame<=Period())TimeFrame=0;
     }


   string name = StringFormat("MA mtf(%s,%s,%d)",StringSubstr(EnumToString(TimeFrame),7), StringSubstr(EnumToString(MaMethod),5),MaPeriods);
   IndicatorShortName(name);
   IndicatorDigits(Digits);


   if(MaPeriods<=0)
   {
      return(INIT_FAILED);
   }


//---
   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[])
{
//---
   int limit=0;
   if(rates_total<MaPeriods)return(0);
   if(prev_calculated>0) limit = rates_total - prev_calculated +1;
   else if(prev_calculated<=0)limit = rates_total;


   if(TimeFrame==0)
   {
      for(int i=0; i<limit; i++)
      {
         if(i>=rates_total-1-MaPeriods-1)continue;
         MaBuffer = iMA(NULL,0,MaPeriods,0,MaMethod,MaPrice,i);
      }
   }
   else //跨周期
   {
      if(iBars(Symbol(),TimeFrame)<MaPeriods)return(0);
      int max = iBarShift(NULL,0,iTime(NULL,TimeFrame,1));
      limit  = MathMax(limit,max);
      for(int i=0; i<limit; i++)
      {
         if(i>=rates_total-1-MaPeriods-1)continue;        
         int shift =iBarShift(NULL,TimeFrame,time);
         MaBuffer  =iMA(NULL,TimeFrame,MaPeriods,0,MaMethod,MaPrice,shift);
      }
   }


   return(rates_total);
}
//+------------------------------------------------------------------+
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论17

nanaliu
CCC
| 发表于 2022-5-13 08:29:39 | 显示全部楼层
看看。。感谢分享。。。。
举报

点赞 评论 使用道具

紫竹青荷
CC
| 发表于 2022-5-13 12:06:35 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

Jerryxia0826
CC
| 发表于 2022-5-13 12:17:58 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

mamapi
C
| 发表于 2022-5-13 12:20:47 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

不忘初心的远航
DDD
| 发表于 2022-5-13 13:34:51 | 显示全部楼层
感谢楼主分享,好好学习,天天向上!
举报

点赞 评论 使用道具

qwe11
CC
| 发表于 2022-5-13 14:24:04 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

daerbushen
DDD
| 发表于 2022-5-13 16:16:36 | 显示全部楼层
路过。。看看先。。
举报

点赞 评论 使用道具

davidwu
DDD
| 发表于 2022-5-13 17:12:51 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

zsf888
DDD
| 发表于 2022-5-13 20:31:23 | 显示全部楼层
谢谢分享
举报

点赞 评论 使用道具

whl
DDD
| 发表于 2022-5-13 20:40:16 | 显示全部楼层
謝謝分享
举报

点赞 评论 使用道具

luo518
C
| 发表于 2022-5-14 12:39:48 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

ssbienhild
DDD
| 发表于 2022-5-14 16:28:10 | 显示全部楼层
非常好,感谢分享
举报

点赞 评论 使用道具

wangyang
DDD
| 发表于 2022-5-15 21:59:35 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

JOKEEBOSS
CC
| 发表于 2022-5-15 22:06:34 | 显示全部楼层
看看。。感谢分享。。。。
举报

点赞 评论 使用道具

cdebjihong
C
| 发表于 2022-5-16 00:12:37 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

零度°
DDD
| 发表于 2022-5-16 15:14:36 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

宝宝
DDD
| 发表于 2022-5-16 15:23:32 | 显示全部楼层
感谢分享
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册