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

저자:작은 꿈, 2016-05-22 20:05:36, 업데이트: 2019-08-01 10:31:58

지난 며칠 동안, 몇 가지 문제를 해결한 후, 고객에게 코드를 작성 할 때, 지표 (특히 자신의 지표) 를 표시하는 차트 템플릿을 작성하는 것이 필요하다고 느꼈습니다. 거래 위치 등.

질문 1:

 var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    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'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: 'WT'},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]                  
};
var chart = Chart(ChartObj);
var isFirst = true;
var preRecordTime = 0;
function Draw(){
    var strState = "";
    var fcolor = "";
    var msg = "";
    getRecords();
    if(isFirst === true){
        chart.reset();
        isFirst = false;
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    if(preRecordTime === globalRecords[globalRecords.length - 1].Time){
        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ],-1]);
    }else{
        //更新前一柱
        chart.add([1,[globalRecords[globalRecords.length - 2].Time,globalRecords[globalRecords.length - 2].Open,globalRecords[globalRecords.length - 2].High,globalRecords[globalRecords.length - 2].Low,globalRecords[globalRecords.length - 2].Close ],-1]);

        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ]]);
       
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    chart.update(ChartObj);
    //chart.reset(500);
}

코드가 붙여지는 것은 좋지 않습니다~ 비교적 경시 할 수 있습니다, 당신은 붙여서 sublime 텍스트를 볼 수 있습니다. 먼저 간단하게 문제를 설명합니다. 코드가 작성되고 실행되는 동안 이상한 장면이 있습니다.

이상하게도, 100%에 도달하는 진행선은 항상 고정되어 있고, 움직이지 않고, 가짜 사망이 아니라, 고정되어 있어야 합니다. 나는 또한 다양한 방법을 사용하여 테스트했습니다. 예를 들어, 주기의 횟수를 제한하고, 주기의 횟수를 표시하는 것을 표시하고, 주기의 마지막 실행까지 고정되어 있습니다. 프로그램 코드를 보며 아무 문제도 없어야 한다는 느낌을 받았습니다. 베스트는 풀 수 없었습니다. 그래프가 초기화될 때, 저는 데이터 서열을 이렇게 썼습니다.

 series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},        //    索引为0的 数据项,   
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  // 索引为1
        {name:'wt2',type:'spline',yAxis:1,data:[]},    //索引为2
        {type:'flags',onSeries:'wt',data:[]}   //......
        ] 

예를 들어, 이 프로그램에서 데이터를 그래프로 작성하는 방법은 다음과 같습니다.

  chart.add([1,[globalR.........    (太长了 没写完)      //   可以看到这里 我写入索引为1 的数据序列,就是add后面[ 符号后的 1,代表写入到{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  这个序列中。问题就在这,我越过了索引0,直接写入索引1的数据序列里,就会导致卡死。

그래서 저는 이것을 바꾸었습니다.

  series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]  

그래프에 쓰기 위한 모든 코드 (주로 1을 0으로 바꾸는 것)

 chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........(太长了。。。)

"이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요, 이봐요".


질문 2

오늘 게시물을 업데이트했습니다. 그룹에 있는 친구들이 질문을 던졌기 때문에, 연구하고 문제를 해결하고 특별히 기록했습니다.

티커는 미래에셋대우가격에 접근합니다.img

저는 직접 테스트를 해봤습니다. 실제로는 다릅니다. 발명가들의 양자화 로보트 상위 거래소는 OK 선물입니다. GetTicker를 통해 얻은 최신 시장 가격입니다. 그래서 이 코드를 써서 테스트를 했습니다.

function main(){
    exchange.SetContractType("this_week");
    var ticker = exchange.GetTicker();
    var huilv = exchange.GetRate();
    var OKhuilv = exchange.GetUSDCNY();
    while(true){
        huilv = exchange.GetRate();
        ticker = exchange.GetTicker();
        OKhuilv = exchange.GetUSDCNY();
        LogStatus("ticker:",ticker,"\n","huilv",huilv,"OKhuilv",OKhuilv);
        Sleep(1000);
    }
}

운영상태:img img다른 환율을 발견하면, 2개의 다른 API 함수를 사용하여 환율을 얻습니다.img이 API를 보시면, OK 선물은 자신의 환율을 사용합니다.

이 글의 내용은 이쪽에서 확인해 보겠습니다.imgOK의 공식 사이트의 가격은 소수자리 뒤에 1자리 (다른 것들은 전체적으로 표시되지 않습니다) 에 불과하기 때문에 약간의 오류가 있을 것으로 추정됩니다. 결과물들이 거의 같다는 것을 볼 때, GetTicker에서 얻은 시장 가격과 OK 퓨처스 공식 사이트에서 얻은 가격의 차이는 환율의 불일치로 인해 발생할 수 있다고 확신할 수 없습니다.


문제 3: 비트코인 OKcoin 플랫폼 시가 목록 문제 (이 문제는 조정되어 현재 리테이크 시가 목록과 실전 시가 목록이 통합되었습니다.https://www.fmz.com/bbs-topic/474


질문 4: 어젯밤에 한 친구가 제게 트래픽에 대한 사용 예제를 물어봤습니다. 대화 버튼에 대해요. 그래서 생각해봤습니다.

/* 交互按钮 测试
while (true) {
  var cmd = GetCommand();
  if (cmd) {
    Log(cmd);
  }
  Sleep(1000);
}
*/
function main(){
    var cmd = null; //初始化一些用到的变量,这个变量是直接接受 GetCommand 函数 返回值的。
    var jsonObjStr = null; //接收JSON对象字符串 的变量
    var jsonObj = null; // JSON 对象
    var keyValue = null; // JSON 对象中的  KEY 的值
    var arrStr = null; // 字符串数组
    var ticker = exchange.GetTicker(); 
    while(true){
        $.Draw(); // 画图函数 , 图表模板的 导出函数
        while(!ticker){
            ticker = exchange.GetTicker();
            Sleep(500);
        }
        cmd = GetCommand(); //获取  交互命令
        if (cmd) {
            Log("按下了按钮:",cmd);
            arrStr = cmd.split(":"); // GetCommand 函数返回的 是一个字符串,这里我处理的麻烦了,因为想熟悉一下JSON ,所以先对字符串做出处理,把函数返回的字符串以 : 号分割成2个字符串。储存在字符串数组中。
            
            
            jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新 拼接 ,拼接成 JSON 字符串  用于转换为JSON 对象。
            //Log(jsonObjStr);//ceshi
            //Log(typeof(cmd));//ceshi
            /*ceshi
            for(var obj1 in cmd){ //  测试用  注释掉了
                Log(cmd[obj1]);
            }
            */
            
            jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象
            //Log("ceshi"); //ceshi
            for(var key in jsonObj){ // 遍历对象中的  成员名
                keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
            }
            Log(keyValue); //ceshi 
            switch(keyValue){ // 分支选择 操作
                case 1:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); //开多仓
                    break;
                case 2:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); // 开空仓
                    break;
                case 0:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue );//平仓
                    break;
                default: break;
            }
        }
        Sleep(2000);
    }
}

이 코드는 제가 테스트를 해봤는데, 광장에 공개되지 않았기 때문에, 여러분들이 테스트를 하고 싶다면, 직접 상호작용 버튼을 추가해야 합니다. 그리고 그래프 템플릿을 추가해야 합니다.img이 글은 이쪽에서 시작됩니다.

: : : :

img img

물론 전략 재검토는 테스트할 수 없으며, 로봇을 직접 만들어서, 모형판으로 테스트해야 하며, 상호 작용 버튼을 누르면 그래프에 해당 동작을 표시한다. 여기 우표를 던지고, NB의 전략을 작성하기를 바랍니다.


질문 5: 사용자가 현재 운영 중인 전자 화폐의 이름을 어떻게 얻을 수 있는지, 그리고 현재 K 라인의 주기를 어떻게 얻을 수 있는지 묻습니다.

function main() {
    var records = exchange.GetRecords();
    while(!records || records.length < 2){
        records = exchange.GetRecords();
        Sleep(500);
    }
    var currency = exchange.GetCurrency();
    var diffTime = records[records.length - 1].Time - records[records.length - 2].Time;
    if(diffTime/1000 >= 1 && diffTime/1000 < 60){
        Log("周期:",diffTime/1000,"秒");
    }else if(diffTime/1000/60 >= 1 && diffTime/1000/60 < 60 ){
        Log("周期:",diffTime/1000/60,"分钟");
    }else if(diffTime/1000/60/60 >= 1 && diffTime/1000/60/60 < 24 ){
        Log("周期:",diffTime/1000/60/60,"小时");
    }else if(diffTime/1000/60/60/24 >= 1){
        Log("周期:",diffTime/1000/60/60/24,"天");
    }
    Log("货币品种:",currency);
}

관심 있는 친구들은 테스트를 할 수 있습니다. 더 나은 방법이 있습니다.


문제 6: 새로운 버전의 상품 선물 거래 서열에 추가된 기능 기능이 이해되지 않으면 QQ 그룹에 새로운 코드 코드를 공유 할 수 있습니다.

  • 전략 템플릿은 전략 광장에서 복사할 수 있습니다.img

질문 7: x = [1 for i in range ((n)) 는 무엇을 의미합니까?

  • 이 두 일 동안, 나는 파이썬을 읽고, 전반적으로 배우는 데 어려움이 없지만, 많은 문제가 발생했습니다. 시간이 길어지면 스스로 검토 할 수 있습니다.

    예를 들어, x = [1 for i in range ((n)) ]는 무엇을 의미합니까? 처음 봤을 때, 나는 또한 큰 머리를 가지고 있었고, 이러한 문법은 이전에 본 적이 없었던 것처럼 보였다. 추측을 추측하고, 무엇을 의미하는지 추측하지 못했습니다.

이것은 python의 목록 해독입니다. 이것은 1에서 n까지의 목록을 생성하는 것을 의미합니다. 목록 해독에 대한 설명은 아래와 같습니다. 정의와 설명>파이톤의 강력한 특징 중 하나는 리스트를 분석하는 것인데, 그것은 리스트의 모든 요소에 함수를 적용하여 하나의 리스트를 다른 리스트로 매핑하는 것을 위한 컴팩트한 방법을 제공합니다. -> 리스트 이해, 또한 리스트 인더션 (list comprehension) 이라고도 한다. -> 리스트 인더션 (list inference) 은 for보다 더 세련되고 더 빠르게 작동합니다. 특히 더 큰 데이터에 대해, 리스트 인더션은 map과 filter가 필요한 대부분의 경우를 대체할 수 있습니다. 리스트 인더션 (list inference) 은 map (map), filter (filter)) 및 lambda를 사용하지 않고 링크를 만드는 간단한 방법을 제공합니다. 2. 기본 목록 분석 기본 [x for x in range ((5) ] # [0, 1, 2, 3, 4]l1 = [1, 2, 3,4] [x*2 for x in l1] # [2, 4, 6,8] 다중 값의 [ %s = %s for (k, v) in a_map.items (()) ] 두 번 반복하면 l1 = [1,2,3,4] l2 = [1,2,3,4] [x+y for x in l1 for y in l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] 함수 [ func ((x) for x in l1] #와 map을 동일하게 호출할 수 있습니다 참고로, 리스트 파리싱은 원래 리스트의 값을 변경하지 않고 새 리스트를 생성합니다. 3. 조건 목록 분석 [ x for x in range ((100) if x%2 ==0 ] 4., 네이처 리스트解析mat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] 교환 행렬 [ [row[i] for row in mat] for i in (0,1,2) ] # [[1, 4, 7, [2, 5, 8], [3, 6, 9]] 이 글은 린유의 CSDN 블로그 기사에서 인용되었습니다.

사실, 저는 위의 말을 잘 이해하지 못했지만, 개념적으로 좀 더 분명해 보입니다.
다른 열정적인 도움들을 살펴보세요:

i는 range ((n) 의 범위 안에서 회전한다. 즉, i=0,1,2,...,n-1, 각각 for를 계산하기 전의 표현식의 값, 리스트의 항목으로서 표현은 1, 대응값은 1,1,1..., n개의 1을 제공하여 n개의 1을 포함하는 목록을 생성한다.

이 부분은 더 명확해 보입니다.

x = [i for i in list] 하나의 리스트를 다른 리스트로 매핑합니다. 각각의 요소는 변수 i로 설정됩니다. x = [1 for i in range ((n) ] 리스트의 범위 (range) 를 리스트 (x) 로 매핑하고 각 요소가 변수가 1이 됩니다. Forpython.com에 방문하여 토론하세요.

문제 8: 파이썬 기반이 단단하지 않아 반일 동안 방치되어 돌아왔습니다. 아래 문제를 참조하십시오.

어제 파이썬 CTP 상품 선물 재검토 시스템을 테스트하기 위해 파이썬 CTP 상품 선물 재검토 시스템을 테스트하는 테스트 전략을 작성했습니다. 오늘 테스트를 계속하면 전략이 일평선 금포크에 따라 작동하지 않는다는 것을 발견했습니다. 크로스 함수는 설계대로 올바른 값 코드를 반환하지 않습니다.

def Cross(records,fast,slow): # 交叉函数 ,参数是  records K线数据   、  fast 快线周期   、slow 慢线周期
    global array_S_MA,array_F_MA   # 使用外部的 全局变量
    array_F_MA = TA.MA(records,fast)  # 调用指标函数
    array_S_MA = TA.MA(records,slow)
    n = 0   # 返回的信号值   0:不操作   , 1 : 金叉     -1: 死叉 
    if array_F_MA[-2] > array_S_MA[-2] and array_F_MA[-3] < array_S_MA[-3] and array_F_MA[-4] < array_S_MA[-4]:
        n = 1
        return n
    elif array_F_MA[-2] < array_S_MA[-2] and array_F_MA[-3] > array_S_MA[-3] and array_F_MA[-4] > array_S_MA[-4]:
        n = -1 
        return n

어떻게 된거죠? 이쪽이 보시다시피, 아주 초보적인 실수입니다! 저는 return n를 조건부 분과에 썼습니다. 이것은 아무 문제도 없는 것 같습니다. 이 값은 얼마일까요?

우리는 작은 실험을 했습니다.

img

하나의 테스트 함수를 정의하고 하나의 메시지를 출력합니다.

img

음, 음, 음, 음, 음.

img

결과를 보면, 함수에서 return을 실행하지 않을 때 함수의 반환값을 취하면 None가 되는데, None는 -1도 되지 않습니다. 하지만 None가 0보다 작다고 판단하면, 이것은 진 값입니다.

질문 9: JS 회전 참조 문제.

예를 들어, 이 코드는 오류를 나타냅니다:

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

TypeError: Converting circular structure to JSON (이 오류는 나를 반 시간 동안 괴롭혔다!), 이 오류 보고서는 바이도에서 검색했습니다.

그리고 저는 이 문제를 발견하기 위해 하루 반 동안 고민했습니다.obj.exchange = exchange;이 문장은 루킹 참조로 이어지며, for (var k in obj) 루킹에서 k ===?? exchange?? 를 만나면 지나가며 시도한다.

코드는 다음과 같습니다.

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        if(k === 'exchange'){  // 增加的代码
            continue;
        }
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

물론 괜찮지만, 어떻게 순환 인용을 하는지 볼 수 있습니까? (현재에는 약간의 혼란이 있습니다, 엄지 손가락!)

질문 10: 상품 선물 금요일 저녁에 포지션을 열고 포지션을 보유하고 다음 월요일 시장 개시 후 GetPosition 함수를 호출합니다 포지션 정보를 얻고 왜

img

그 이유는 다음과 같습니다.

img

특정 positions 저장 정보 객체의 type 속성의 각 값을 참조하십시오:https://www.fmz.com/bbs-topic/672

이 모든 것을 보고, 저는 그것을 실천에 옮길 필요가 있다고 느꼈습니다.

더 많은

보트스링2바로 붙여주세요.

작은 꿈많은 글을 쓸 준비가 되어있기 때문에 QQ 공간에 대해 특별히 신청했습니다.