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

作者: リン・ハーン小さな夢, 作成日:2016-05-23 23:10:46, 更新日:2019-08-01 10:31:25

以前はほとんど日記を書いていませんでしたが,今は毎日記入する必要が感じています. 暗闇を見ることはできませんよね! 何を書けばいいですか? 勉強を記録してください. 作業してください! (実際はほぼすべてです. ) 今日,日常の仕事以外に,クライアントにモジュールを書いて,コード全体を復習することは問題ありません. グラフ上の奇妙な指針線を除いて,他のすべてが正常に見える,OK,上模擬テスト. あらゆる種類の問題が出てきます.

疑問1:

  • 1,図 K 線が時々 BAR が欠けているとき,BUG を探している.問題が見つかり,解析したところ,模擬盤でテストしたときにデータを受け取っていない. データの受信時に,2つのBARが過ぎたので,最新のデータがグラフに描かれ,中間隔が1つまたは複数のBARを過ぎた.
  • 2、しばらく (K線周期1分) 実行して,問題なく,再び (K線周期30分) やってみよう.

TypeError: cannot read property length of null duk_hobject_props.c:2258 WToneAndWTtwo __FIL このエラーが報告されています.

この関数では,wToneAndWTtwoのエラーが表示されていて,null値の名前,longthという属性,つまり,var name = nullのような変数を読み取りました. name.length を読み,コード全体で呼び出しの長さを求める場所を見つけました.このエラーを解決するために,関数も書き出しました:

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

この関数で測ると,nullのBUGは絶対に逃れられない.コードを修正して,ロボットにテストします. 半分のK線テストで,擦り―また:

TypeError: null duk_hobject_props.c:2258 WToneAndWTtwo のプロパティ length を読み取れないファイル誤り報告

バストは理解できなかった!!! 忍耐! 外に出て一周して考えを変えたら悟る! (Zが教えてくれた) 滑り一周して効果があった. 戻ると,指針庫が呼び出されたのか, 参数が 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);
} 

タリブ.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,22,3,56,78,4,23] のように見えるが,発明者の量化テストでは,Log関数で出力するときに,この行列は null と表示されます. 困惑してしまいましたが,大穴,覚えておいてください,あなたがnullを見ているのは,NaNなのかも知れないので,nullを判断することはできません.
このとき,この式は,この式で,この式が,この式で,この式で,この式が,この式で,この式が,この式で,この式で,この式が,この式で,この式で,この式が,この式で,この式で,この式が,この式で,この式で,この式で,この式が,この式で,この式が,この式で,この式で,この式が,この式で,この式で,この式で,この式が,この式で,この式で,この式が,この式で,この式で,この式が,この式で,この式で,この式が,この式で,この式が,この式で,この式で,この式が,この式で,この式が,この式で,この式が,この式で,この式が,この式で,この式が,この式が,この式で,この式が,この式が,この式で,この式が,この式が,この式で,この式が,この式が,この式が, 中!aaa は true であり,その後の aaa.length は実行されない可能性があります. (これは,HTML,CSS,DOM を学ぶときに見たようです.ブラウザを判断します.) このアプリは,多くのユーザーに提供されています.

問題3

また,グループメンバーの要請により,価格差のモニタリングを修正しました. 実際には,値差の範囲を検知し,微信をプッシュします. とても簡単です.

 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であり,下記の表記の前に呼び出されます. 4つの操作が紹介されているので,この関数はこれらの操作を設定します (しかし,少し追加的な内容があります).
  • exchange.SetContractType ((ContractType) // 取引開始・平成前に,一つは取引の方向を明確にすること (多?空?平?) であり,もう一つは取引の方向を明確にすること (白糖?綿?) であるため,この関数を使用して契約の種類を設定します.パラメータは異なる取引所によって異なります. 基本的にはこれらの関数も使います. 残りの関数は現物と同じです.
  • exchange.Buy ((() // 購入する
  • exchange.Sell ((() // 販売する 以下は私の実験のコードで,ただ1つの部分だけ (メイン関数でコピーできる) を選択して,テストを繰り返す.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 () 関数について質問するコードを書きました. 誤差が大きいので,高周波ポリシーに影響します. 友人がコードを送信し,私も試してみました. 上記コード:

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ミリ秒以内に誤差がある.復習システムがサンドボックスモデルに属している可能性があり,内部での動作時間のアルゴリズムが原因である. 復習は誤差が小さいが,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行から見るには,スレッド生成が失敗し,リソースが一時的に利用できない (不足) である.おそらくメモリの問題であるべきで,メモリ不足が原因である可能性がある. 解決策は 1,実行中のロボットポリシーコード,使用されたリソースがリリースされていないか,マルチスレッドを使用したAPIが使用されているかチェックする. 2、ulimit コマンドを使ってホストのシステム (Linux) の制限をチェックします. このブログは以下のように見ることができます: (ブログアドレス)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 について httppreceived EOF について reused について); 機能の誤用,この関数は一度のみ呼び出され,回路構造に書き込むことができません.上記の問題 (<メモリ膨張>) は,この関数が onTick 函数に書き込まれているため, onTick の数の連続した回路呼び出しが最終的なクラッシュにつながることです.

問題7: 簡単な概要 _C() 関数, _N() 関数, _G() 関数の使い方.

  • _C() 関数

説明:この関数は,主にAPIのエラー容認のために使われます.例えば,exchange.GetAccount ((() 関数は,以下のように呼びます: _C ((exchange.GetAccount);関数の名前には括弧が付いていないので注意してください.エラー容認関数にはパラメータを追加する必要がある場合は,_C ((() 関数の第2パラメータに書き込み,次いで後ろにします. この例を用いましょう.

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);
}

この関数は,Cの関数で,

 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); // 全域変数numを1に設定する _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を初期化した後も,辞書から読み取られ,策略が最初に実行されたときに保存された値です.

Q8 戦略について少し考えてみましょう.

多くの場合,新しい同級生がグループを見て,戦略の利益と損失のアルゴリズムについて尋ねます. 一般的に,処理方法はいくつかあります.

  • 浮遊利益:

浮遊利益は,xの現在の価格+ (現在のお金=初期金) で割ったものです.

例えば,最初のコイン価格は10元/枚で,口座には5コイン,100コインがあります. ある期間中,私は平均15元/枚で3コインを購入しました. この期間中,コインの価格は20元/枚に上昇しました. 現在,私の口座は,8コイン,55コインです. Profit = (8 - 5) * 20 + (55 - 100) = 60 + (-45) = 15 この計算方法では利益は15元である. (注意:今あなたの利益は浮動している.もし今コインの価格が大きく下がると,あなたは利益を得ることなく,お金を失うかもしれません.もちろん,損失も浮動します. さらに,もしコインの価格が20元/枚で平衡した場合,つまり20元で15元で購入した3コインを20ドルで売ると,現時点で口座は,5コイン,115元です. Profit = (5 - 5) * 20 + (115 - 100) = 15,利益は依然として15元である.違いは,初期持有通貨の值を考慮しない場合,利益は価格の変化に伴わないことである.

  • 経金利益:

計算上の利益: (現金x現金価格+現金) - (初期金x初期価格+初期金)

上記の例も使います. 例えば,最初のコインは10元/枚で,口座は5枚,100ドルで始まります. 期間中,私は平均15ドル/枚で3枚のコインを購入しました. この期間が終わると,コインは20ドル/枚に上昇しました. 現在,私の口座は,8枚,55ドルです. この計算方法では利益は65元になります. 同じように,私は15で購入した3コインを20ドルの平価で販売します. この時点で口座は,5コイン,115ドル,再び計算します. 利益 = (5 * 20 + 115) - (5 * 10 + 100) = 215 - 150 = 65 同じように.

上記の2つの方法を比較すると,1利回り15と,1利回り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 このページには2つのテストデータ, 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 (()) これはミリ秒数で, new Date (()) は時間表示やX軸拡大が使用できないような小さな問題が発生します. また,tooltip: {xDateFormat: %Y-%m-%d %H:%M:%S, %A, enabled:true,valueDecimals:2,valueSuffix:%}は,この設定は資料閲覧で確認できます. valueDecimals:2は,Y軸の値が2桁の小数値で表示されるのを制限しています. valueSuffix:%'は,提示ボックスの表示の最後に%とこの符号を追加します.

もっと

リュキシンヒュイ小小夢先生,どうしたらいいですか? 注文が終わったら,まだ完成していない注文がすべてキャンセルされます.

ルイスこの写真がすごい!

ひどい雨素晴らしいことですが,APIのドキュメントに書かれていないことがたくさんあります.

葉が落ちる秋シェイムンはいつも整理している

ショートライン王勝は高価格戦略を売る素晴らしいもの!

小さな夢礼儀正しく https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png ファイルボックス ツールのリンク: https://www.botvs.com/bbs-topic/475

小さな夢学習に便利です!