발명자의 양화학 학습 일기 (제1) 완료

저자:작은 꿈, 2016-05-23 23:10:46, 업데이트: 2019-08-01 10:31:25

이전에는 거의 일기를 작성하지 않았으며, 지금은 매일 기록해야하는 것처럼 느껴집니다. 글씨를 쓸 수 없습니다! 공부를 기록하십시오. 작업하십시오! (사실 거의 모든 것...) 오늘날 일상 업무 외에도 고객에게 모듈을 작성하고 전체 코드를 다시 테스트하는 데 문제가 없습니다.

질문 1:

  • 1, 그래프 K줄은 때때로 BAR가 부족하고, BUG를 찾고 있다. 문제 발견, 분석, 아날로그 디스크로 테스트할 때 데이터를 받지 않는다. 데이터를 수신할 때, 2개의 BAR가 지나갔기 때문에 최신의 데이터가 차트에 그려져 있고, 중간 간격이 하나 또는 그 이상의 바를 지나게 된다.
  • 2, 한동안 실행 (K 라인 사이클 1분) 문제없이, 다시 시도 (K 라인 사이클 30분) 문제와 함께, 이상한 현상이 나타났습니다:

TypeError: cannot read property length of null duk_hobject_props.c:2258 WToneAndWTtwo __FIL 이 오류를 보고합니다.

아래에서 WToneAndWTtwo 함수에서 오류가 발생해야 하는 것을 보고, null 값의 이름인 length라는 속성을 읽었습니다. 즉, var name = null 같은 변수입니다. name.length를 읽어서 전체 코드에서 length를 호출할 수 있는 위치를 찾습니다. 이 오류를 해결하기 위해 함수:

function isNullAndLog(arr,strArrName){//空数组报错
     if(!arr){
         Log("arr is:",arr,"name:",strArrName);
         return true;
      }
      return false;
}

여기 있는 모든 변수들을 이 함수 안에 넣고 검증해보겠습니다. 0의 BUG는 절대 피할 수 없습니다. 30분 동안 K선 테스트를 마친 후, ~~는 다시:

TypeError: null duk_hobject_props.c:2258 WToneAndWTtwo의 속성 length을 읽을 수 없습니다파일1315 오류 보고

바츠는 이해할 수 없었다!!! 인내심을 가져라! 밖으로 나가서 한 바퀴 돌고 생각을 바꾸면 깨달을 수 있습니다! 다시 돌아와서, 내가 지표库를 호출하는 지에 대해 생각해봤습니다. 입력된 매개 변수는 null이고, 지표库가 실행되는 동안 오류가 발생했습니다.

function isNullAndLog(arr,strArrName){//空数组报错
    if(!arr){
        Log("arr is:",arr,"name:",strArrName);
        return true;
    }
    return false;
}

function main(){
   if(typeof(x) === undefined ){
       Log(typeof(x));
   }
    var aaa = null;
    Log(isNullAndLog(aaa));
    /*
    while(!aaa || aaa.length < 9){
        Log("while xunhuan");
        Sleep(5000 * 1000);
    } 
    */
    talib.EMA(aaa,5);
} 

talib.EMA ((aaa,5); 이 키는 aaa가 null이고, 제가 의도적으로 설정해서, 어떻게 되는지 보려고 옮겼습니다. TypeError: Cannot read property length?? of null ~~OK 아마 그게 문제일 겁니다. 코드를 계속 수정하세요.

질문 2:

다른 문제는 이전에 생각했던 지금 코드를 기록하는 것입니다.

function DeleteNullEle(initArr){
    var dealArr = [];
    var initArrLen = initArr.length;
    for(var i = 0,j = 0 ; i < initArrLen ; i++,j++){
    //Log("initArr-",i,":",initArr[i]);//ceshi
    if(initArr[i] === null || isNaN(initArr[i]) ){
        j--;
        //Log("i:",i);//ceshi
        continue;
    }
        dealArr[j] = initArr[i];
    }
    //Log("dealArr:",dealArr);//ceshi
return dealArr;
}

이 함수를 추가하는 이유는 어떤 배열이 이렇게 생겼기 때문입니다 [NaN, NaN, NaN, NaN, 22,3,56,78,4,23] 하지만 발명가들의 정량화 테스트에서 난 너무 오랫동안 혼란스러웠어, 덩어리, 기억해야 할 것은, 당신이 볼 수 있는 것은 null이거나 NaN이 아닐 수도 있다는 것입니다. 그래서 null을 판단하는 것은 불가능합니다.
또 다른 점은, while (!aaa て aaa.length < 10) {...}, 만약 aaa === null이라면, 왜 오류를 반환하지 않는가? 중!aaa true 표현식이 항상 true이기 때문에 다음 aaa.length는 실행되지 않을 수 있습니다. (이 부분은 HTML, CSS, DOM을 배우면서 본 것 같습니다. 이 API는 이미 사용되고 있습니다.

질문 3:

또 다른 그룹 친구의 요청에 따라 가격 차이 모니터링을 수정하는 데 도움이되었습니다. 실제로는 검사 차이 범위를 추가하고 WeChat을 눌러서 간단합니다.

 if (diff != __lastDiff) {
//--------------------------------------------------------------------------------------------
        if(openWeixin){
            if( (diff <= price1 || diff >= price2 ) && off_on === true ){
                Log("差价:"+diff+"微信推送@");
                off_on = false;
                Sleep(1000);
            }else{
                off_on = true;
                Sleep(1000);
                }
        }
//---------------------------------------------------------------------------------------------
        // add添加数据到series, 参数格式为[series序号, 数据];
        __chart.add([0, [new Date().getTime(), diff]]);
        __lastDiff = diff;
    }

img

코드 빈 라인 사이에 붙여진 코드입니다. 간단하고 아직 완성되지 않은 것일 수 있습니다.

질문 4 (실제로 문제가 아닙니다.

요즘은 선물에 대한 전략을 작성하는 것을 배우고 있습니다. 이것은 현장 상품보다 더 복잡합니다. (축복하게도 Z 크기의 선물 거래 템플릿이 있습니다. 예를 들어: 오픈 포지션 (?? 多), 판매 평형 포지션 (?? 多), 판매 평형 포지션 (?? 空), 구매 평형 포지션 (?? 空平仓) 이 기본이 명확하다. 또한 선물 거래의 API는 현장보다 더 많고 복잡한 점도 있다. 이 목록에는 API 문서의 몇 가지 사항도 있습니다.

  • exchange.GetPosition() //는 포지션 정보를 얻기 위해 사용됩니다. 이 함수는 포지션 구조의 배열을 반환하고 있으며 포지션에 대한 특정 정보를 모두 포함하고 있습니다.
  • exchange.SetMarginLevel ((MarginLevel) // 이 함수는 레버리지를 설정하는 것이다. 특정 매개 변수 MarginLevel 선택 ((5배? 10배?) 종류, 거래소, 구체적으로, 어떤 것은 변경될 수 없다 ((예: CTP 상품 선물)
  • exchange.SetDirection ((Direction) // 이것은 매우 중요한 API입니다. 이 API는 4개의 동작을 소개하기 때문에 아래와 같이 호출됩니다. 이 함수는 이러한 동작을 설정합니다.
  • exchange.SetContractType ((ContractType) // 거래 개시, 평상시 전의 한 쪽은 거래 방향을 명확히 하기 (더 많은? 빈? 평상시?), 다른 하나는 거래 방향을 명확히 하기 위한 계약 (백당? 면?), 그래서 이 함수를 사용하여 계약 유형을 설정한다. 파라미터는 서로 다른 거래소에서 구체적으로 결정된다. 이 함수들은 기본적으로 사용되기도 합니다. 나머지 함수들은 현상과 동일합니다.
  • exchange.Buy() // 구매
  • exchange.Sell ((() // 판매 아래의 코드는 제가 실험한 것인데, 단 하나의 부분을 선택해서 (main 함수에서 복사할 수 있습니다) 다시 테스트합니다. 테스트하는 거래소는 상품 선물 거래소입니다.img
 if (!manager) {//Z大写的商品期货模板类库,用来管理交易的对象(manager 初始时null)。不明白的可以去看源代码,QQ群共享有注释版。
        if (_C(exchange.GetPosition).length > 0) {
            throw "策略启动前不能有持仓.";
        }
        Log('交易平台:', exchange.GetName(), _C(exchange.GetAccount));  //输出当前交易所 信息
        var insDetail = _C(exchange.SetContractType, ContractTypeName);  // 用容错函数 _C ,容错调用 SetContractType函数  首先明确 设置交易的合约类型。
        Log("合约", insDetail.InstrumentName, "一手", insDetail.VolumeMultiple, "份, 最大下单量", insDetail.MaxLimitOrderVolume, "保证金率:", insDetail.LongMarginRatio.toFixed(4), insDetail.ShortMarginRatio.toFixed(4), "交割日期", insDetail.StartDelivDate);
        // 上面这个Log 显示出合约的一些信息,注意 在回测的时候,与实际运行的结果不一样,可以看图杠杆都是null,保证金率都是0,可以试试看。
        manager = $.NewPositionManager();  // 这个生成管理者 对象
    }
    exchange.SetMarginLevel(10); //不支持       在这里我试着设置了一下杠杆试试,发现  显示 错误:Not support     ,CTP商品期货 应该不能自己调整杠杆
    var positions = exchange.GetPosition();     在所有的操作前 ,我试着调用了一下 GetPosition 函数  获取一下持仓信息,显示的null
    Log(positions[0]);
    exchange.SetDirection("buy"); // 在所有的操作前需要设置  操作方向  ,这里设置 买开仓(做多)。
    var id = exchange.Buy(1911,1); // 执行买入操作  下了一个  限价单,  有兴趣的同学 可以试试 市价单。(嘿嘿!自己动手记得牢)
    positions = _C(exchange.GetPosition); //再获取下 持仓信息 看看
    Log(positions);  //有持仓信息了,  在上面 Buy的时候  有兴趣的同学 试试 用低价格 买入。  Buy(1000,1) 看看。

질문 5: 오늘 친구 한 명이 코드 한 장을 썼는데, Sleep () 함수에는 큰 오류가 발생하여 HF 정책에 영향을 미쳤습니다.

function main(){
    for(var i = 0 ; i < 10 ; i++){
        var b1 = 0;
        var b2 = 0;
        var b3 = 15;
        while(b1 < 200){
            var t2s1 = (new Date()).getTime();
            b1++;
            Sleep(b3);
            var t2s6 = (new Date()).getTime();
            b2 += (t2s6 - t2s1);
        }
        Log("Sleep()",b3,"MS",b1,"平均次数",b2/b1);
    }
    throw 2;
}

저는 리모컨을 테스트했는데, Sleep 함수가 리모컨에서 1초를 실행하는 것을 발견했습니다. (전후 시간차 1000), 그리고 이 테스트 코드의 시간 오류는 매우 크지만, 모형 드라이브를 사용하면 기본적으로 1 밀리 초 이내에 오류가 있습니다. 아마도 리모컨 시스템이 샌드박스 모델에 속하고, 내부의 시간 실행 알고리즘으로 인해 오류가 발생했습니다. 모형은 매우 작았습니다. (한 초 이내에). 그러나 친구 소설은 모형 오류가 있었지만, 실행하는 것은 여전히 다르지 않았습니다.

질문 6: 오늘 아침 친구 M가 내 호스트가 중간에 무너졌다고 말했고, 시스템 로그를 보냈습니다.

- 이건 로그입니다.

runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7f332c591cc9 m=2

goroutine 0 [idle]:

goroutine 1 [select, 207 minutes]:

첫 번째 라인에서 볼 수 있는 스레드 생성 실패, 자원이 일시적으로 사용 불가능하다 (불충분). 아마도 메모리 문제일 것으로 보이며, 아마도 메모리 부족으로 인해 발생할 수 있다. 해법: 1, 실행 중인 로봇 정책 코드, 사용된 자원이 공개되지 않았는지, 멀티 스레드를 사용하는 API가 있는지 확인한다. 2、ulimit 명령어를 사용하여 호스트가 있는 시스템의 제한을 확인합니다. 이 블로그는 다음과 같이 볼 수 있습니다: (블로그 주소)http://smilejay.com/2012/04/fork_resource/ 3. 시스템 메모리의 사용량에 주의하십시오.

ulimit -a를 사용하여 표시합니다.img

ulimit 명령어의 파라미터: -H는 하드 리소스 제한을 설정합니다. -S는 소프트웨어 리소스 제한을 설정합니다. -a는 현재 모든 리소스 제한을 보여줍니다. -c size: 코어 파일의 최대값을 설정합니다. 단위:blocks -d size: 데이터 단위의 최대값을 설정합니다. 단위:kbytes -f size: 파일을 생성하는 최대값을 설정합니다. 단위:blocks -l size: 메모리에 잠겨있는 프로세스의 최대 값을 설정합니다. 단위:kbytes -m size: 사용할 수 있는 상용 메모리의 최대 값을 설정합니다. 단위:kbytes -n size: 커널이 동시에 열 수 있는 파일 설명자의 최대 값을 설정합니다. 단위:n -p size: 파이프 버퍼 영역을 설정하는 최대 값. 단위:kbytes -s size: 스택의 최대값을 설정합니다. 단위:kbytes -t size: 최대 CPU 사용 시간을 설정합니다. 단위:초 -v size: 가상 메모리의 최대 값을 설정합니다. 단위: kbytes -u <프로그램 수> 사용자가 실행할 수 있는 최대 프로그램 수

이 문제를 겪은 친구가 잘못된 필터 함수가 문제를 일으키는 원인이 될 수 있다는 것을 발견했고, 호스트 (모임의 팽창) 가 붕괴되는 원인을 찾았습니다. SetErrorFilter ((502: 503: tcp character unexpected network timeout WSARecv Connect GetAddr no such reset httpreceived EOF reused); 함수 부적절, 함수가 한 번만 호출되어야 하며, 회전 구조에 쓸 수 없습니다. 위의 문제 ( (存不断膨胀) 는 이 함수가 onTick 함수에서 쓰여진 것이기 때문에, onTick 함수가 지속적으로 회전 호출되어 최종 붕괴로 이어지는 것입니다.

문제 7: 간단한 요약 _C() 함수, _N() 함수, _G() 함수의 사용 방법.

  • _C() 함수

설명: 이 함수는 주로 오류 용납 API를 위해 사용되며, 예를 들어, exchange.GetAccount () 함수는 _C ((exchange.GetAccount)) 로 호출됩니다. 예를 들어라.

function main(){
    var account = null;
    var amount = 1;
    var price = 2000;
    account = exchange.GetAccount();
    Log("_C 函数使用前  account :",account);
    //exchange = null; 
    _C(exchange.Buy,price,amount);
    //exchange.Buy(price,1);
    account = exchange.GetAccount();
    Log("_C 函数使用后  account :",account);
}

이 함수들은 다음과 같습니다.

 function ___C(functionName,p1){
    functionName("执行需要容错的函数,传入的测试参数为:",p1);
    Log("__C 容错函数启动,容错完毕");
}
function main(){
    pstr = "测试参数--hello";
    ___C(Log,pstr);
}

실행 결과:img

  • _N() 함수 설명: 이 함수는 소수점 후자자수를 너무 많이 처리하기 위해 몇 개의 소수자수를 보존하는 데 사용됩니다. 예를 들어:
function main(){
    var pi = 3.1415926535897;
    Log("使用_N函数 前pi:",pi);
    var piOfDeal = _N(pi,2);
    Log("使用_N函数后 pi:",piOfDeal);
}

실행 결과:img

  • _G() 함수 설명: 이 세계적 사전 목록은 API 문서에 소개되어 저장될 수 있습니다. KV 테이블, 영구적으로 로컬 파일, 각 로봇에 개별 데이터베이스, 다시 시작하거나 관리자가 종료 후에도 계속 존재 K는 숫자나 문자열이어야 하고, 크기와 작음도 상관없고, V는 JSON에 서열화될 수 있는 모든 내용으로 쓰일 수 있습니다. _G ((num, 1); // 1로 설정된 범용 변수 num _G ((num, ok); // 전 세계 변수 num를 ok 문자열로 변경 _G ((num, null); // 범용변수 num를 삭제 _G ((num); // 전체 변수 num의 값을 반환합니다 _G(); // 현재 로봇의 ID를 반환합니다 _G(null); // 모든 글로벌 변수를 삭제합니다
function main(){
    Log("totalYLMoney 初始赋值 0");
    var totalYLMoney = 0;
    Log("totalYLMoney 已赋,  = ",totalYLMoney);
    if(typeof(_G("totalYLMoney_save")) !== "object"){
        totalYLMoney = _G("totalYLMoney_save"); 
        Log("读取 totalYLMoney 本地数据库 名称为totalYLMoney_save 的值 赋给 totalYLMoney ");
    }else{
        totalYLMoney = 100.12546328765458;
        _G("totalYLMoney_save",totalYLMoney.toString());
        Log("记录 totalYLMoney 保存到本地数据库");
    }
    Log("totalYLMoney",totalYLMoney);
    Log("typeof\(_G(\"totalYLMoney_save\"))",typeof(_G("totalYLMoney_save")));
}

위의 _G ((() 함수 테스트 코드는 로봇에 테스트가 필요하며, 재테스트는 지원되지 않습니다. 테스트 방법, 로봇에 프로그램을 배포하면, 로봇을 처음 시작할 때, 로봇은 100.12546328765458을 기록합니다. 이 값은 범세계 사전 "totalYLMoney_save"의 이름 안에 다시 한번 로봇을 실행하면, var totalYLMoney = 0을 발견합니다. 이 변수 totalYLMoney가 초기화 된 후에도 사전에서 전략이 처음 실행되었을 때 저장된 값을 읽습니다.

질문 8: 전략적 이익/손실 계산에 대한 몇 가지 생각:

많은 경우 그룹에 새로운 동료를보고, 전략 수익 손실 알고리즘을 묻습니다. 일반적으로 처리 방법은 몇 가지가 있습니다.

  • 유동 수익:

변동이익은 (현금 - 초기금) x 현금 + (현금 - 초기금)

예를 들어, 초기 코인 가격은 10원/원이고, 계정에는 5원, 금전 100원이 있습니다. 일정 기간 동안, 저는 평균 15원/원 가격으로 3개를 샀습니다. 이 기간이 끝나면, 코인 가격은 20원/원으로 상승했습니다. 현재 제 계정은: 8원, 금전 55원입니다. 그러면 위의 방법으로 이 기간 동안 거래의 수익과 손실을 계산합니다. 이산 = (8 - 5) * 20 + (55 - 100) = 60 + (-45) = 15 이 계산 방법은 이윤은 15원이다. (주의: 지금 당신의 이익은 떠돌고 있기 때문에, 만약 지금 동전의 가격이 크게 떨어지면, 당신은 수익을 얻지 못할 뿐만 아니라 돈을 잃을 수도 있습니다. 물론 손실도 떠돌고 있습니다. 추가로, 만약 동전 가격이 20원/동전일 때, 평형화, 즉 20원 대가로 15원 대가로 구입한 3동전을 판매한다면, 현재 계좌는: 동전 5동전, 동전 115동전이다. 이윤 = (5 - 5) * 20 + (115 - 100) = 15, 이윤은 여전히 15원이다. 차이점은 초기 보유 금전 부진을 고려하지 않으면 이윤이 가격 변화에 따라 변하지 않는다는 것입니다.

  • 이산화탄소

계산수익: (현금 x 현금 + 현금) - (시작금 x 초기 가격 + 초기 돈)

또한 위의 예제를 사용하십시오. 예를 들어, 초기 동전 가격은 10원/동전, 계정에는 5동전, 100달러가 있습니다. 일정 기간 동안, 나는 평균 15달러/동전으로 3동전을 샀습니다. 이 기간이 끝나면, 동전 가격은 20달러/동전으로 증가했습니다. 현재 내 계정은 8동전, 55달러입니다. 이산 = (8 * 20 + 55) - (5 * 10 + 100) = 215 - 150 = 65 이 계산 방식의 수익은 65원입니다. 마찬가지로, 저는 15의 평균 가격으로 구입한 3개의 동전을 20원 평형으로 팔았습니다. 현재 계정은: 5개의 동전, 115달러, 다시 계산합니다. 이윤 = (5 * 20 + 115) - (5 * 10 + 100) = 215 - 150 = 65

위의 두 가지 방법을 비교하면, 한 가지 수익은 15이며, 다른 하나는 65이며, 실제로는 쉽게 알 수 있습니다. 첫 번째 방법은 초기 보유자의 부가가치 상승으로 인한 손실을 무시합니다. 두 번째 알고리즘은 수익 손실을 계산할 때 초기 보유자의 부가가치 상승으로 인한 손실을 포함합니다. 이산화탄소 (이산화탄소) 가 유출되는 경우 유동 이익은 거래로 인한 수익과 손실에 해당한다. 이 모든 것은 작은 꿈의 일부 경험입니다. 오류가 있다면, 대 신에게 지지를 부탁드립니다.

질문 9: 한 그룹 친구가 공개된 정책의 상태 탭이 표를 표시하는 것을 보았고, 아래 API를 검색하여 새로운 기능을 추가한 것으로 보이는 API의 LogStatus 함수가 표를 그리는 것을 발견했습니다. 이 그룹 친구가 테스트 테스트를 요청했습니다.

이 사이트의 API 설명은 다음과 같습니다:

LogStatus(Msg); //	此信息不保存到日志列表里, 只更新当前机器人的状态信息, 在日志上方显示, 可多次调用, 更新状态
LogStatus('这是一个普通的状态提示');
LogStatus('这是一个红色字体的状态提示 #ff0000');
LogStatus('这是一个多行的状态信息\n我是第二行');
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table)+'`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table)+'`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table])+'`'); // 支持多个表格同时显示, 将以TAB显示到一组里

테스트 코드:

function main(){
    var value1 = 99;
    var value2 ="ceshi 01";
    var table1 = { type : "table", title : "ceshi1", cols : ["列1","列2","列3"] , rows : [ ["abc","def","ghi"] , ["1","2","3"] ] };
    var table2 = { type : "table", title : "ceshi2", cols : ["列1","列2","列3"] , rows : [ ["abc",value1,"ghi"] , [value2,"2","3"] ] };
    LogStatus("测试文本1\n`" + JSON.stringify([table1,table2]) + "`");
}

img첫 번째 그림에서 볼 수 있듯이, 우리가 ceshi1이라는 테이블을 페이지화한 상태에서, 테이블의 데이터 형식은 var table1와 var table2입니다. 이 두가지 변수는 선언되어 있습니다. 물론 table1 테이블의 모든 내용은 고정된 문자열입니다. 주의해야 할 것은 JSON.stringify (([table1,table2]) 함수 앞뒤에 `을 추가해야 한다. 그렇지 않으면 표가 표시되지 않는다. 물론, 우리는 테이블을 사용하여 데이터를 동적으로 표시해야하며, 항상 고정된 텍스트 콘텐츠가 될 수 없습니다. table2 이 분화에는 두 개의 테스트 데이터, value1 、 value2가 있습니다.img새로운 학생들은 코드를 복사하여 직접 시도하고 수정할 수 있습니다.

질문 10: 사용자가 수익률의 그래프를 원한다고 남기면, 현재 발명자가 양적화된 API 문서의 서술은 비교적 간단하고 그래프 사용은 상대적으로 어려울 수 있다.

직접 테스트 할 수 있습니다. 저는 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의 임의의의 임의의 임의의 임의의 임의의의 임의의의 임의의의의 임의의의의 임의의의의 임의의의의 임의의의의 임의의의의 임의의의의 임의의의의 임의의의의 임의의의의 임의의

var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A',enabled:true,valueDecimals:2,valueSuffix:'%'}, //提示框  就是鼠标在线上时 显示的一个 框框 里面有一些内容,这里是设置提示框的格式
    chart: { zoomType:'x',panning:true },//图表缩放  
    title: { text: '收益率 %'}, //标题
    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: " 显示瞬时收益率 % "},//副标题
    xAxis:{type: 'datetime'}, //设置 X轴  的数值为时间类型
    yAxis: [{
            title: {text: '收益率 %'},//标题
            style: {color: '#4572A7'},//样式 
            //opposite: false  //生成右边Y轴
        }
    ],
    series: [//系列
        {name:'收益率',dataLables:{enabled:true,format:'{y} %'},type:'spline',yAxis:0,data:[]} //该图标只用到一条曲线  ,所以 只用设置一个数据序列
        ]                  
};
var chart = Chart(ChartObj);  //初始化

function main(){ //测试用的主函数
    chart.update(ChartObj); //更新
    chart.reset(); //清空图表
    var i = 0; //初始一个 i 值 , 后面循环用,   用来限制循环次数
    var randomNum = 0; //声明一个  随机数 初始化 0
    while(i < 5000){ //限制循环次数
        randomNum = Math.random() * 10;  // 生产随机数 0  -  9.9999
        //chart.add([0,[(new Date()),randomNum]]);
        chart.add(0,[(new Date()).getTime(),randomNum + 5]);  //把生成的随机数  按照时间(X 坐标)     把随机数 画在图表上(Y坐标)     
        Sleep(1000*60); // 程序 每次循环暂停60秒
        //chart.update(ChartObj);
        //chart.reset(500);
    }
    Log("over");
}
  • 여기 한 가지 문제가 있는데요, 제가 반일 동안 혼란스러웠고, 기록했습니다. 바로 시간 입력 시에는 밀리초수가 있어야 합니다. 이렇게 써요: new Date (().getTime (() 이것은 밀리초수입니다. 또한 도구 팁: {xDateFormat: %Y-%m-%d %H:%M:%S, %A,enabled:true,valueDecimals:2,valueSuffix:%}, 이 설정은 자료를 볼 수 있습니다.

더 많은

리우싱후이

루이스이건 칭찬해야 할 것 같아요!

엄청난 비가 내렸습니다.좋은 것, 많은 것, 많은 것, 많은 것, 많은 것, 많은 것, 많은 것.

잎겨드랑이셰림은 항상 좋은 것들을 정리합니다.

단선 왕승은 높은 가격에 전략을 판매합니다좋은 것!

작은 꿈이봐요. https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png 이 강의는 이 링크를 통해 진행됩니다: https://www.botvs.com/bbs-topic/475

작은 꿈모든 사람들이 쉽게 배울 수 있습니다!