리소스 로딩... 로딩...

2.7 지표의 사용

저자:발명가들의 수량화 - 작은 꿈, 2016-11-10 16:19:36, 업데이트: 2019-08-01 09:25:06

지표 사용


  • TA - 최적화 된 부분 재쓰기 일반적인 지표 팩토리

TA 指标库
MACD       指数平滑异同平均线
KDJ        随机指标
RSI        强弱指标
ATR        平均真实波幅
OBV        能量潮
MA         移动平均线
EMA        指数平均数指标
BOLL       布林带
Alligator  Alligator Indicator
CMF        蔡金货币流量指标
Highest    周期最高价
Lowest     周期最低价

MACD 지표를 가지고 테스트를 작성하기 위해, 먼저 API 문서에 MACD 태그를 열고 자세한 설명을 참조하십시오.

img

DIF, DEA, 지표 알고리즘 등에 관심이 있는 학생이라면 Baidu에 가서 MACD 알고리즘을 검색할 수 있습니다. 많은 자원이 있고, 포장된 인터페이스가 있습니다. 테스트 코드는 다음과 같습니다.

function main(){
    var records = null;
    var macd = null;
    while(true){
        records = _C(exchange.GetRecords);  // 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函数。
                                            // _C 详见 https://www.fmz.com/bbs-topic/320  问题7。
        macd = TA.MACD(records);   // 不加参数的话,使用的是默认参数  12, 26, 9
        Log("macd[0]", macd[0]);   // DIF
        Log("macd[1]", macd[1]);   // DEA
        Log("macd[2]", macd[2]);   // MACD 
        Log("macd[0]长度", macd[0].length);   // DIF 长度
        Log("macd[1]长度", macd[1].length);   // DEA 长度
        Log("macd[2]长度", macd[2].length);   // MACD 长度
        Log("records 长度:", records.length);  // 显示一下 records 的长度。
        Sleep(1000 * 60 * 5);
    }
}

모형판 테스트 결과:

img

계산된 지표들은 모두 null로 시작되는 것을 볼 수 있고, 그 다음의 데이터는 특정 값으로 시작되는 것을 볼 수 있습니다. 이는 지표의 매개 변수가 정하는 계산 주기가 있기 때문에, 이 주기를 만족하지 않는 전까지 지표를 계산할 수 없습니다. 따라서 지표를 사용하기 전에 지표의 설명을 이해해야 한다. 그리고 지표를 계산하기 위해 사용되는 K선 데이터의 길이를 프로그램에서 판단해야 한다. 길이가 충분하지 않은 경우 유효하지 않은 값을 계산하지 않도록, 유효하지 않은 값을 사용하면 프로그램 오류가 발생할 수 있다.

아래는 그래프 인터페이스를 사용하여 계산된 지표가 그래프에 표시되고 거래소의 실제 차트 (실제 차트 OKCoin를 선택) 과 비교하여 코드를 보겠습니다.

var ChartCfg = {
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    chart: { zoomType:'x',panning:true },//图表类型  
    title: { text: "K-macd"}, //标题
    rangeSelector: {
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
            selected: 0,
            inputEnabled: false
        },
    subtitle: {text: "测试macd"},//副标题
    xAxis:{type: 'datetime'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: "macd"},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'KLine',data:[]},
        {name:"DIF",type:'spline',yAxis:1,data:[]},
        {name:"DEA",type:'spline',yAxis:1,data:[]},
        {name:"MACD量柱",type:'spline',yAxis:1,data:[]},
        ]                  
};
function main(){
    var records = null;
    var macd = null;
    var perRecords = _C(exchange.GetRecords);
    var perRecordTime = perRecords[perRecords.length - 1].Time;
    var chart_obj = Chart(ChartCfg); // 初始化图表
    chart_obj.reset();
    while(true){
        records = _C(exchange.GetRecords);  // 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函数。
        if(!records && records.length < 26 ){
            continue;
        }
        macd = TA.MACD(records, 12, 26, 9);   // 不加参数的话,使用的是默认参数  12, 26, 9
        if(records[records.length - 1].Time !== perRecordTime){                                    // _C 详见 https://www.fmz.com/bbs-topic/320  问题7。
            //先更新,再添加K线
            chart_obj.add(0, [records[records.length - 2].Time, records[records.length - 2].Open, records[records.length - 2].High, records[records.length - 2].Low, records[records.length - 2].Close], -1);   // 跟新刚完成的bar。
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close]);       // 添加新出现的bar
            //先更新,添加指标线
            chart_obj.add(1, [records[records.length - 2].Time, macd[0][records.length - 2]], -1);   // 更新
            chart_obj.add(1, [records[records.length - 1].Time, macd[0][records.length - 1]]);
            
            chart_obj.add(2, [records[records.length - 2].Time, macd[1][records.length - 2]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, macd[1][records.length - 1]]);
            
            chart_obj.add(3, [records[records.length - 2].Time, macd[2][records.length - 2]], -1);   // 更新
            chart_obj.add(3, [records[records.length - 1].Time, macd[2][records.length - 1]]);
            
            perRecordTime = records[records.length - 1].Time;
        }else{
            //只更新当前的bar 和 线
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close], -1);
            chart_obj.add(1, [records[records.length - 1].Time, macd[0][records.length - 1]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, macd[1][records.length - 1]], -1);   // 更新
            chart_obj.add(3, [records[records.length - 1].Time, macd[2][records.length - 1]], -1);   // 更新
        }
        chart_obj.update(ChartCfg);
        Sleep(1000);
    }
}

로봇 인터페이스에서 K선 주기가 1분으로 설정되어 있기 때문에 효과를 보기 위해 시간이 걸리기 때문에 조금 작은 주기를 선택하십시오.

img img

도표에서 볼 수 있는 발명자 정량화 로봇 실행 계산된 DIF는 약 2.729이며 DEA는 약 2.646 MACD 양 기둥 약 0.0831 실제 OKCoin 거래소 지표 DIF는 2.73이며 DEA는 2.65이며 MACD 크기의 기둥은 0.17입니다. 보시다시피, 두 개의 DIF와 DEA는 작은 차이점이 있습니다. OKCoin은 4개와 5개를 만들었고 MACD는 두 배에 가깝습니다. OKCoin은 이렇게 계산되기 때문입니다. (DIF - DEA) * 2, 일반적으로 DIF - DEA = 2.729 - 2.646 = 0.083, 다시 2로 곱하면 0.166가 0.17에 해당합니다.

다른 지표의 사용 방법은 거의 비슷합니다.

  • 탈리브 -http://ta-lib.org/

    TA 도서관에서 일반적으로 사용되는 지표 외에도 타리브 도서관에는 많은 지표가 있습니다. 예를 들어, talib.STOCHRSI라는 지표를 사용해보자.
STOCHRSI	Stochastic Relative Strength Index
STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]

보시다시피, 파라그램 설정은 talib.STOCHRSI ((records, 14, 14, 3, 3); 기본적으로 상단 MACD와 비슷한 코드입니다.

var ChartCfg = {
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    chart: { zoomType:'x',panning:true },//图表类型  
    title: { text: "stochrsi"}, //标题
    rangeSelector: {
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
            selected: 0,
            inputEnabled: false
        },
    subtitle: {text: "测试stochrsi"},//副标题
    xAxis:{type: 'datetime'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: "K-D"},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'KLine',data:[]},
        {name:"K",type:'line',yAxis:1,data:[]},
        {name:"D",type:'line',yAxis:1,data:[]},
        ]                  
};
function main(){
    var records = null;
    //var macd = null;
    var stochrsi = null;
    var perRecords = _C(exchange.GetRecords);
    var perRecordTime = perRecords[perRecords.length - 1].Time;
    var chart_obj = Chart(ChartCfg); // 初始化图表
    chart_obj.reset();
    while(true){
        records = _C(exchange.GetRecords);  // 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函数。
        if(!records && records.length < 26 ){
            continue;
        }
        //macd = TA.MACD(records, 12, 26, 9);   // 不加参数的话,使用的是默认参数  12, 26, 9
        stochrsi = talib.STOCHRSI(records, 14, 5, 3, 0);
        if(records[records.length - 1].Time !== perRecordTime){                                    // _C 详见 https://www.fmz.com/bbs-topic/320  问题7。
            //添加K线
            chart_obj.add(0, [records[records.length - 2].Time, records[records.length - 2].Open, records[records.length - 2].High, records[records.length - 2].Low, records[records.length - 2].Close], -1);   // 跟新刚完成的bar。
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close]);       // 添加新出现的bar
            //添加指标线
            chart_obj.add(1, [records[records.length - 2].Time, stochrsi[0][records.length - 2]], -1);   // 更新
            chart_obj.add(1, [records[records.length - 1].Time, stochrsi[0][records.length - 1]]);
            
            chart_obj.add(2, [records[records.length - 2].Time, stochrsi[1][records.length - 2]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, stochrsi[1][records.length - 1]]);
            
            perRecordTime = records[records.length - 1].Time;
        }else{
            //只更新当前的bar 和 线
            chart_obj.add(0, [records[records.length - 1].Time, records[records.length - 1].Open, records[records.length - 1].High, records[records.length - 1].Low, records[records.length - 1].Close], -1);
            chart_obj.add(1, [records[records.length - 1].Time, stochrsi[0][records.length - 1]], -1);   // 更新
            chart_obj.add(2, [records[records.length - 1].Time, stochrsi[1][records.length - 1]], -1);   // 更新
        }
        chart_obj.update(ChartCfg);
        LogStatus("倒数第一组数据:", stochrsi[0][stochrsi[0].length - 1], stochrsi[1][stochrsi[1].length - 1], "    倒数第二组数据:", stochrsi[0][stochrsi[0].length - 2], stochrsi[1][stochrsi[1].length - 2]);
        Sleep(1000);
    }
}

한정된 문서로 스크린샷을 보여주지는 않았지만, OKCoin의 공식적인 수치와 차이가 있습니다. BOSS는 Talib库의 구현 알고리즘이 OKCoin과 다를 수 있다고 말합니다.STOCHRSI 지표 이해이 지표가 어떻게 작성되었는지 보실 수 있습니다. 이 지표는 최적화되지 않고 효율이 낮고 느려서 학습할 수 있습니다.


더 많은

호크셀라토마지막 K줄이 항상 변하기 때문에 마지막 K줄이 새로 생성될 때만 이전 K줄이 확정된다고 말할 수 있습니다. `GetRecords (,) `로 얻은 K선 데이터는 확실하지 않나요? `records (length -1) `는 현재 시간표의 K선 데이터를 나타내고, 직접 그래프에 그려서, 새로운 시간표의 K선 데이터를 추가하고, 그래프의 마지막 요소에 추가하는 것입니다.

산디안리유TA.ATR ((records, 14) 에 대한 더 자세한 설명은 없나요? 저는 BotVS의 API 문서, 비디오 및 전체 사용 설명서에서 찾을 수 없습니다.

FangBei파이썬 버전 https://dn-filebox.qbox.me/b5d2b0ecc1e196a6bfc68eb45cd818c50d279915.png https://dn-filebox.qbox.me/157db5e2659fd13bcf552cd82fe456ba469939f8.png

FangBeipython 버전 def main (: while true: while true: records = _C ((exchange.GetRecords); # 정책 인터페이스 설정의 기본 설정으로 K선 데이터를 얻는 K선 주기, _C는 오류 용납형 내장 함수이다. macd = TA.MACD ((records); # 변수를 추가하지 않으면 기본 변수 12, 26, 9가 사용됩니다. 로그 (("macd[0]", macd[0]); # DIF 로그 (("macd[1]", macd[1]); # DEA 로그 (("macd[2]", macd[2]); 로그 (("macd[0] 길이", len ((macd[0])); # DIF 길이 로그 (("macd[1] 길이", len ((macd[1])); # DEA 길이 로그 (# MACD 길이, # MACD 길이) log ( 길이가:", len ()); # records의 길이를 표시합니다. Sleep ((1000 * 60 * 5);

발명가들의 수량화 - 작은 꿈K 라인 바의 시간표는 이 바의 시작 시간이며, 실시간 시간이 아닙니다. 바의 시작 시간은 변하지 않습니다.

호크셀라토오, 제가 이전에 오해한 것은 K 라인의 **시간표지 **입니다. 디비깅 후 BotVS의 메커니즘이 다음과 같다는 것을 발견했습니다. 만약 3월 1일, 그 날의 K 라인 데이터를 가져가려고 한다면, getRecords (D1) 를 호출하면 많은 레코드를 반환하지만, 모든 레코드의 시간표는 동일합니다. 즉, 3월 1일 10시에 'GetRecords (D1) '를 호출하더라도, 얻은 K 라인 시간대는 여전히 2018-03-01 **00**:00:00이다. 그래서 당신이 말한 마지막 줄은 새로운 시간대가 있을 때까지 불확실할 것입니다. 즉, 2018-03-**02** 00:00:00:00, 3월 1일 이 날의 시간대는 확실하지 않습니다. 제가 이전에 오해한 것은, 제가 3월 1일 1시, 2시, 3시에 전화한 후에 다른 시간에 돌아왔다고 생각했기 때문입니다. 2018-03-01 **01**:00:00, 2018-03-01 **02**:00:00, 2018-03-01 **03**:00:00.

발명가들의 수량화 - 작은 꿈GetRecords (() 에서 얻어진 K선 데이터 이외에 제곱 첫 번째, 나머지는 확정된 ( (주기가 완료되었기 때문에), 제곱 첫 번째가 불확실한 것은 주기가 끝나지 않았기 때문에, Close는 항상 변하고 있습니다. 예를 들어, 일일 K선, 현재 일일 K선 기둥, 오늘이 끝나지 않았을 때, 아무도 오늘 최종 가격이 얼마 될지 모릅니다.

발명가들의 수량화 - 작은 꿈너무 무례해 ^^

산디안리유알겠습니다. 감사합니다.

발명가들의 수량화 - 작은 꿈네, 맞습니다. 첫 번째 K 선의 항을 곱합니다.

산디안리유네, 답변 감사합니다. 마지막으로 확인해 보겠습니다. var a = TA.ATR (records, 14) a[a.length-1]는 최근 k줄 데이터의 ATR입니다.

발명가들의 수량화 - 작은 꿈예, 구체적으로 얼마나 반환되는지 거래소에 의해 지정할 수 없습니다. 그래서 거래소는 일반적으로 제한된 데이터를 제공합니다.

산디안리유이, 나는 이해, TA.ATR ((() 본질은 입력된 기록에 대한 수학 연산이다. 나는 전에 명확하게 표현하지 않았다, 나는 물어보고 싶은 것은 함수 교환.GetRecords (() 를 사용하여 k 줄 데이터를 얻을 때 반환의 길이가 거래소에 의해 결정되는 것입니다.

발명가들의 수량화 - 작은 꿈이 지표 함수는 얼마나 많은 데이터를 반환하는 지에 대한 K선 데이터, 즉 records에 대응합니다.

산디안리유죄송합니다, 아직 이해가 되지 않았습니다. 제 말은, 만약 이 함수를 호출한다면, 반환되는 데이터의 길이는 거래소가 정한 길이가 될까요?

발명가들의 수량화 - 작은 꿈K선의 길이가 결정됩니다.

산디안리유이 질문에 대한 답변에 감사드립니다. 이제 명확합니다. 또 다른 질문도 하나 드리겠습니다.

발명가들의 수량화 - 작은 꿈예를 들어, 입력된 레코드는 일 K 라인, 계산된 ATR은 하나의 집합이고, 집합의 제곱의 첫 번째 요소는 그 날 (일 K 라인의 마지막 날짜) ATR 지표이다. 따라서 30분 K 라인, 15분 K 라인을 분류한다. 당신은 계산한 177의 집합은 177개의 K 라인 주기로, 각각의 KBar 라인의 ATR 지표에 대응한다.

발명가들의 수량화 - 작은 꿈을 들어주세요~ 만약 지금 K선 데이터가 10바르에 불과할 때, 15주기 평균선인 MA ((15) 를 요구한다면, 10주기만 있기 때문에, 15주기의 평균을 계산할 수 없기 때문에, 확실히 구할 수 없을 것이다.

FangBei또한, 저는 실제 디스크 레벨의 틱 리모컨을 사용했습니다. 어떤 데이터도 반환되지 않았습니다.

FangBei왜 전술한 데이터가 주기적인 요구사항을 충족시키지 못하는 걸까요?

발명가들의 수량화 - 작은 꿈이 예는 아주 좋습니다. 실제 사용에서는 가장 최신 지표 데이터가 대수단의 마지막에, 즉 인덱스 -1의 요소에 있습니다. 앞쪽은 주기 요구 사항을 충족하지 않습니다. 계산된 데이터는 None입니다. 이 글의 뒷부분에는 다음과 같은 유효한 자료가 있습니다. https://dn-filebox.qbox.me/b7837ea30e5d8396ffa91c48204f2fbc9a7f4504.png