Delphi 计算火币网KDJ指标数值

原创 2016年08月28日 18:25:18

感谢七爷的无私帮助和纠正。
为了尽可能地提高数据复用,可能给多个指标运算。所以获取的周期K线数据保存到了一个数组。定义如下:

  //存储K线数据的结构
  TKline=record
    Open  :Extended;
    High  :Extended;
    Low   :Extended;
    Close :Extended;
    Amount:Extended;
  end;
  TKlineArray = array of TKline;
  //一些拖沓的常量
const
  KLINE_PERIOD_1MINUTE_CODE  = '001';
  KLINE_PERIOD_5MINUTE_CODE  = '005';
  KLINE_PERIOD_15MINUTE_CODE = '015';
  KLINE_PERIOD_30MINUTE_CODE = '030';
  KLINE_PERIOD_1HOUR_CODE    = '060';
  KLINE_PERIOD_1DAY_CODE     = '100';
  KLINE_PERIOD_1MONTH_CODE   = '200';
  KLINE_PERIOD_1YEAR_CODE    = '300';
  KLINE_PERIOD_1MINUTE       = 1;
  KLINE_PERIOD_5MINUTE       = 2;
  KLINE_PERIOD_15MINUTE      = 3;
  KLINE_PERIOD_30MINUTE      = 4;
  KLINE_PERIOD_1HOUR         = 5;
  KLINE_PERIOD_1DAY          = 6;
  KLINE_PERIOD_1MONTH        = 7;
  KLINE_PERIOD_1YEAR         = 8;

获取15分周期到数组

{ 获取火币K线数据 
    Exp:
         var klinearr:TKlineArray;
         klinearr := GetHuobiKLine(KLINE_PERIOD_15MINUTE);
}
function GetHuobiKLine(KLINE_PERIOD:Integer):TKlineArray;
var
  sPeriodCode:string;
  sURL,sSource:string;
  jo:ISuperObject;
  arrKline:TSuperArray;
  i:Integer;
begin
  SetLength(Result,0);
  case KLINE_PERIOD of
    KLINE_PERIOD_1MINUTE:  sPeriodCode := KLINE_PERIOD_1MINUTE_CODE;
    KLINE_PERIOD_5MINUTE:  sPeriodCode := KLINE_PERIOD_5MINUTE_CODE;
    KLINE_PERIOD_15MINUTE: sPeriodCode := KLINE_PERIOD_15MINUTE_CODE;
    KLINE_PERIOD_30MINUTE: sPeriodCode := KLINE_PERIOD_30MINUTE_CODE;
    KLINE_PERIOD_1HOUR:    sPeriodCode := KLINE_PERIOD_1HOUR_CODE;
    KLINE_PERIOD_1DAY:     sPeriodCode := KLINE_PERIOD_1DAY_CODE;
    KLINE_PERIOD_1MONTH:   sPeriodCode := KLINE_PERIOD_1MONTH_CODE;
    KLINE_PERIOD_1YEAR:    sPeriodCode := KLINE_PERIOD_1YEAR_CODE;
  end;
  sURL    := 'http://api.huobi.com/staticmarket/btc_kline_'+sPeriodCode+'_json.js';
  sSource := GetPageSrc(sURL);
  if pos('[[', sSource) <> 0 then
  begin
    jo := SO(sSource);
    if Assigned(jo) then
    begin
      arrKline := jo.AsArray;
      SetLength(Result,arrKline.Length);
      for i :=0 to arrKline.Length-1 do
      begin
        Result[i].Open    := arrKline[i].AsArray[1].AsDouble;
        Result[i].High    := arrKline[i].AsArray[2].AsDouble;
        Result[i].Low     := arrKline[i].AsArray[3].AsDouble;
        Result[i].Close   := arrKline[i].AsArray[4].AsDouble;
        Result[i].Amount  := arrKline[i].AsArray[5].AsDouble;
      end;
    end;
  end;
end;

KDJ数据结构和计算

type
{ K线数据结构 }
  TKDJ=record
    K : Extended;
    D : Extended;
    J : Extended;
    PDK : Extended;
    PDD : Extended;
    PDJ : Extended;
  end;
  TKDJArray = array of TKDJ;

{ 计算KDJ函数 返回最后一个 }
function GetKDJOriginal(KlineArr: TKlineArray; PERIOD_NUM: Integer): TKDJ;
var
  RSV_P,H9_P,L9_P,PDK,PDD,PDJ:Extended;
  i,j:Integer;
  Arr: TKlineArray;
begin
  FillChar(Result, SizeOf(TKDJ), #0);
//  SetLength(Result,2);
  Arr := KlineArr;
  if High(Arr) <> -1 then
  begin
    PDK := 50;
    PDD := 50;
    for I :=Low(Arr) to High(Arr) do
    begin
      Result.PDK := PDK;
      Result.PDD := PDD;
      Result.PDJ := PDJ;
      if I < PERIOD_NUM then Continue;
      H9_P := 0;
      L9_P := 0;
      for J := (I-PERIOD_NUM+1) to I do
      begin
        if H9_P=0 then H9_P := Arr[J].High;
        if L9_P=0 then L9_P := Arr[J].Low;
        H9_P := Max(H9_P, Arr[J].High);
        L9_P := Min(L9_P, Arr[J].Low);
      end;
      RSV_P := ((Arr[I].Close - L9_P) / (H9_P - L9_P)) * 100;
      Result.K   := 2/3*PDK + 1/3*RSV_P;
      Result.D   := 2/3*PDD + 1/3*Result.K;
      Result.J   := (Result.K*3)-(Result.D*2);
      PDK        := TruncTo(Result.K, 2);
      PDD        := TruncTo(Result.D, 2);
      PDJ        := TruncTo(Result.J, 2);
    end;
    Result.K := TruncTo(Result.K, 2);
    Result.D := TruncTo(Result.D, 2);
    Result.J := TruncTo(Result.J, 2);
  end;
end;

//使用例子
MyKDJ := GetKDJOriginal(klinearr,9);//KDJ(9,3,3)
版权声明:本文为博主原创文章,未经博主允许不得转载。

随机指标KDJ使用入门

随机指标KDJ使用入门 (文章来源:股市马经 http://www.goomj.com)         KDJ指标的中文名称是随机指数,最早起源于期货市场。   KDJ指标的应用法则KDJ指...
  • mm33211
  • mm33211
  • 2013年03月12日 20:14
  • 776

巨建华:火币网比特币交易系统的构建实践

巨建华:火币网比特币交易系统的构建实践 比特币作为一种数字货币,是目前互联网金融领域和极客圈最热门的话题,支撑比特币运行的除了比特币网络本身外,最关键的就是用于实现流通环节的比特币交易所。如...
  • chengying332
  • chengying332
  • 2014年10月24日 15:24
  • 1487

Delphi 计算火币网KDJ指标数值

感谢七爷的无私帮助和纠正。 为了尽可能地提高数据复用,可能给多个指标运算。所以获取的周期K线数据保存到了一个数组。定义如下: //存储K线数据的结构 TKline=record Ope...
  • MichaelJScofield
  • MichaelJScofield
  • 2016年08月28日 18:25
  • 1624

Delphi 计算MACD指标数值

基于上一篇文章Delphi 计算火币网KDJ指标数值的基础。{ MACD单个数据结构 } Type TMACD = record DIF: Extended; DEA: Exten...
  • MichaelJScofield
  • MichaelJScofield
  • 2016年08月28日 18:36
  • 1170

挖掘KDJ指标的内在规律和特殊研判功能

KDJ是随机指标,国际很流行的一个短线指标,K、D、J只不过是结果指标名称。算法原理: rsv=(收盘-N日内最低)/(N日内最高-N日内最低)*100 K是RSV的M天的移动平均价 D是K的M1天的...
  • TrueLie
  • TrueLie
  • 2007年06月30日 13:52
  • 1921

KDJ计算代码_Python代码

KDJ计算代码_Python代码
  • choclover
  • choclover
  • 2011年03月31日 10:04
  • 3776

股票 KDJ指标形态图解

KDJ指标又叫随机指标         原理:就是用目前股价在近阶段股价分布中的相对位置来预测可能发生的趋势反转。它主要是利用价格波动的真实波幅来反映价格走势的强弱和超买超卖现象,在价格尚未上升或下降...
  • aoshilang2249
  • aoshilang2249
  • 2015年04月29日 21:19
  • 1445

综合利用KDJ趋势线

强调技术指标的重要性,多是从技术分析这一理论的整体角度而言。实际操作中,投资者应该注意多种技术分析的 运用和实践。由于技术分析理论随着时间的推移,林林总总、纷繁复杂。每一个技术分析都有不同的角度和侧重...
  • TrueLie
  • TrueLie
  • 2007年06月30日 14:06
  • 1632

比特币交易平台的介绍、排名和推荐

随着比特币的迅猛发展,比特币交易平台也如雨后春笋般一个个冒了出来,既有老牌的成熟和稳重,也有新生的新颖和灵动。其实想搞比特币,选对一个平台是关键中的关键,平台的不稳定性是比特币投资中最大的风险之一,万...
  • zzs44
  • zzs44
  • 2013年12月04日 03:38
  • 1839

24个基本指标精粹讲解(2)--KDJ

随机指标——KDJ KDJ指标又叫随机指标,是由乔治?蓝恩博士(George Lane)最早提出的,是一种相当新颖、实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期...
  • TrueLie
  • TrueLie
  • 2007年07月01日 21:42
  • 1221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi 计算火币网KDJ指标数值
举报原因:
原因补充:

(最多只允许输入30个字)