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
ビデオの動画は,この動画の動画の動画で公開されています.
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 を学ぶときに見たようです.ブラウザを判断します.)
このアプリは,多くのユーザーに提供されています.
また,グループメンバーの要請により,価格差のモニタリングを修正しました. 実際には,値差の範囲を検知し,微信をプッシュします. とても簡単です.
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;
}
文字列の間のコードは,単純で,おそらく未完成なコードです.
最近,フューチャーについて学ぶ戦略を書き出すのは,現貨よりも複雑な点です. (幸運にも,Zの大きなフューチャー取引テンプレートがあります. 例えば:開場 (多作),開場 (多頭),開場 (空作),開場 (空頭) の基本は明確である.また,先物取引のAPIは現貨よりも多く,複雑である.このリストにはAPI文書のいくつかの点も含まれている.
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) 看看。
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秒以内に).しかし,友人は,仮令模擬エラーがあったとしても,私と同じく実行していない.
- これは日記です.
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 を使って表示します.
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 の数の連続した回路呼び出しが最終的なクラッシュにつながることです.
説明:この関数は,主に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);
}
実行結果:
function main(){
var pi = 3.1415926535897;
Log("使用_N函数 前pi:",pi);
var piOfDeal = _N(pi,2);
Log("使用_N函数后 pi:",piOfDeal);
}
実行結果:
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を初期化した後も,辞書から読み取られ,策略が最初に実行されたときに保存された値です.
多くの場合,新しい同級生がグループを見て,戦略の利益と損失のアルゴリズムについて尋ねます. 一般的に,処理方法はいくつかあります.
浮遊利益は,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は,実際はわかりやすい.最初の方法は,初期保有者の
プラットフォームの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]) + "`");
}
最初の図では,この表のページを分割するceshi1のデータ形式が,var table1とvar table2と宣言された変数であることが示されています. もちろん,table1の表の内容はすべて固定文字列です.
JSON.stringify (([table1,table2]) 函数の前後には,
ランダムな数値で動的変化を模した収益率を使って, 収益率曲線をグラフに表示します. 上記コード:
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");
}
リュキシンヒュイ小小夢先生,どうしたらいいですか? 注文が終わったら,まだ完成していない注文がすべてキャンセルされます.
ルイスこの写真がすごい!
ひどい雨素晴らしいことですが,APIのドキュメントに書かれていないことがたくさんあります.
葉が落ちる秋シェイムンはいつも整理している
ショートライン王勝は高価格戦略を売る素晴らしいもの!
小さな夢礼儀正しく https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png ファイルボックス ツールのリンク: https://www.botvs.com/bbs-topic/475
小さな夢学習に便利です!