- 精华
- 0
- 在线时间
- 3840 小时
- UID
- 20842
- 积分
- 931
- 帖子
- 382
- 阅读权限
- 255
- 注册时间
- 2010-12-3
- 最后登录
- 2022-2-15
- 精华
- 0
- UID
- 20842
- 积分
- 931
- 帖子
- 382
- 主题
- 2
- 阅读权限
- 255
- 注册时间
- 2010-12-3
- 最后登录
- 2022-2-15
|
本帖最后由 追涨杀跌 于 2011-6-23 22:33 编辑
拖了好几天了,一直没有把跨周期已经完成的几个指标贴上来。致富网友,也提出了很高的要求,我试着来写一写吧。
首先把跨周期的KDJ指标完成,新建函数MtKDJ,代码如下:- Params
- Numeric TimeFrame(1440); // 目标时间周期参数,参数说明参见MtBar
- Numeric BarsBack(1); // 目标时间周期BAR偏移参数,说明见MtBar函数
- Numeric Length(14);
- Numeric SlowLength(3);
- Numeric SmoothLength(3);
-
- NumericRef oKValue;
- NumericRef oDValue;
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtOpen;
- NumericSeries mtHigh;
- NumericSeries mtLow;
- NumericSeries mtClose;
- NumericSeries mtVol;
- NumericSeries mtOpenInt;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
- NumericSeries HighestValue;
- NumericSeries LowestValue;
- NumericSeries KValue;
- Numeric DValue;
- Numeric i;
- Numeric j(0);
- Numeric SumHLValue(0);
- Numeric SumCLValue(0);
- Numeric sumValue(0);
- Begin
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtHigh = refHigh;
- mtLow = refLow;
- mtClose = refClose;
-
- HighestValue = mtHigh;
- LowestValue = mtLow;
- For i = 1 to Length-1
- {
- j = j + mtBarCnt[j];
- If (mtHigh[j] == InvalidNumeric) HighestValue = InvalidNumeric;
- Else If ( mtHigh[j] > HighestValue) HighestValue = mtHigh[j];
- If (mtLow[j] == InvalidNumeric) LowestValue = InvalidNumeric;
- Else If ( mtLow[j] < LowestValue) LowestValue = mtLow[j];
- }
- j = 0;
- For i = 1 to SlowLength
- {
- If (mtClose[j] == InvalidNumeric)
- {
- SumHLValue = 0; //InvalidNumeric;
- SumCLValue = 0; //InvalidNumeric;
- }
- Else
- {
- SumCLValue = SumCLValue + mtClose[j] - LowestValue[j];
- SumHLValue = SumHLValue + HighestValue[j] - LowestValue[j];
- j = j + mtBarCnt[j];
- }
- }
- If (SumHLValue <> 0)
- {
- KValue = SumCLValue/SumHLValue*100;
- }Else
- {
- KValue = 0;
- }
- j = 0;
- For i = 1 to SmoothLength
- {
- If (KValue[j] == InvalidNumeric) SumValue = 0; //InvalidNumeric;
- Else
- {
- SumValue = SumValue + KValue[j];
- j = j + mtBarCnt[j];
- }
- }
- DValue = SumValue/SmoothLength;
- oKValue = KValue;
- oDValue = DValue;
- return mtBarCnt;
- End
复制代码 然后和往常一样,写个调用的例子,新建公式应用TestMtKdj,随便在日线以下的时间周期中使用,参数为1440,表示求日线KDJ,根据日线KDJ,金叉买入,死叉卖出,不管交叉发生的位置。代码如下:- Params
- Numeric TimeFrame(1440); // 日线
- Numeric BarsBack(1); // 求前一日的值
- Numeric Length(14);
- Numeric SlowLength(3);
- Numeric SmoothLength(3);
- Numeric Lots(1);
- Vars
- NumericSeries KValue;
- NumericSeries DValue;
- Numeric ooKValue;
- Numeric ooDValue;
- Numeric PreBar;
- Begin
- PreBar = MtKDJ(TimeFrame,BarsBack,Length,SlowLength,SmoothLength,ooKValue,ooDValue);
- KValue = ooKValue;
- DValue = ooDValue;
- PlotNumeric("K",KValue);
- PlotNumeric("D",DValue);
- PlotNumeric("J",3*KValue - 2*DValue);
- PlotNumeric("Ref1",20);
- PlotNumeric("Ref2",80);
- If (KValue[PreBar] < DValue[PreBar] and KValue>DValue)
- {
- Buy(Lots,Open);
- }
- If (KValue[PreBar] > DValue[PreBar] and KValue<DValue)
- {
- SellShort(Lots,Open);
- }
- End
复制代码 |
|