発明者の量化学学習日記 (二) (終了)

作者: リン・ハーン小さな夢作成日:2016年5月22日 20:05:36 更新日:2019年8月1日 10:31:58

先日,いくつかの問題を解いた後,クライアントにコードを書くときに,指標 (特に自分の書いた指標) や取引位置などを表示するグラフのテンプレートを書くことが必要だと感じました. 私は初心者なので,ハイチャートに慣れていないが,Zの商品先物例を見て,猫の絵画の虎が解決すべきだと感じました.

疑問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 text の内側を見ることができます. まず,簡単な問題を述べます. コードが書き終わると,実行中に奇妙なシーンが起こります.

奇妙なことに,進捗 पट्टीが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

今日投稿を更新したのは,グループ内の友人が質問したため,調査,問題解決,特別記録. 新しいユーザーに類似した疑問がある場合は,簡単に説明します. OK質問は以下の通りです.

gettickerは,先物価格を入手します. なぜ実際の価格と違うのか?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関数を使って換算しました. (OK フューチャー公式サイトでは,人民元に設定できます)img公式なAPIの紹介を見て,OKフューチャーではなく,自分の通貨を使っている.

グラフに直接表示される結果です.imgOKの公式サイトでは,価格が小数から1位 (残りは全部表示されていない) しかありませんので,少し誤りがあると考えられています. 結果は基本的には同じで,GetTickerの市場価格とOKフューチャー公式サイトの価格の違いが,通貨格差によるものだと確信することは不可能である.


問題3: Bitcoin 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線周期の取得方法について尋ねています. 現在の取引所通貨の取得にはAPI機能が利用可能で,私は比較的に洗練された方法を使用して,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)) は何を意味するのか?

  • この2日間は空いた時間でpythonを見ていて,全体的に学習は難しくありませんが,多くの問題に直面しています.

    この質問は,x = [1 for i in range ((n)) ] は何を意味するのか? この文法を見たとき,私はすでに頭が大きくなり,このような文法を見たことがないように感じました. 推測して推測して,何を意味するか推測できません. 断固としたバウダを見て,バウダもこのことを話すことがほとんどないことに気づきました. 幸いにもいくつか見つけました.

これは,python のリスト解析です. 1 から n までのリストを構成します. リスト解析については,以下のように説明します: 定義と説明 >Pythonの強みの一つは,リスト解析である.それはリスト内のすべての要素に関数を適用することで,リストを別のリストにマッピングするコンパクトな方法を提供している. リスト解析は,リストインデクティブと呼ばれる. リストインデクティブは,特に大きなデータに対して, for より精密に,より速く動作する. リストインデクティブは,マップとフィルターを使用する必要のあるほとんどの場合を代替する. リストインデクティブは,map (マップ), filter (フィルター) および lambda を使用せずにリンクを作成するための簡単な方法を提供します. 定義方法でリストを取得することは,通常,構造関数を使用するよりも,これらの列表を明確に作成します. すべてのリストインデクティブは,if (if) 式,if (if) 式,if (if) 式,if (if) 式,if (if) 式,if (if) 式から構成された要素をリストに追加する必要があります. 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 (()) ] この2回回転を l1 = [1,2,3,4] とします. これは,x^2の2乗です. x+y=x in l1=y in l2 とすると, [2,3,4,5,3,4,5,6,4,5,6,7,5,6,7,8] これは,この2つの数字を 函数[ 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]] この記事へのトラックバック一覧です.

この文は,いくつかの重複作用があるはずであるという概念が少し明らかであるように見える.
支援活動に参加した人々もいます.

i は range ((n) の範囲を回転し,i=0,1,2,...,n-1 となる.それぞれは, for を計算する前の表現の値としてリストの項目を計算する. 式は1で,対応値は1,1,1...,nつの1のために,nつの1を含むリストを生成する[1,1...]

この話は,もっと分かりやすく見える.

x = [i for i in list] i はリスト内のi について 一つのリストを別のリストにマッピングし,各要素を変数 i に設定します x = [1 for i in range ((n) ] は,x は,x について,x は,x について,x は,x について,x は,x について,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x です. リストのrange (n) をリストxにマッピングし,各要素を定数1にします. Forpython をご利用ください.

問題8: Pythonの基礎がしっかりしていないので,返信され半日放置されました.問題については,下記を参照してください.

昨日は,Python 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 を書き込みました. これは問題ではありません. テストの問題がやってきました. 金叉,死叉を起動しないときの Cross 関数です. 返される値は?

実験をしてみました.

img

テスト関数を定義し,単一のメッセージを出力します.

img

この式を書き,Noneが -1 に等しいかを確認しましょう.

img

函数では return を実行しない場合,返される値は None です. None は -1 ではありません. しかし,None が 0 未満だと判断すると,これは真値です.

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のスペースを特別に申請したので,見やすく,簡単に見つけることができます.