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
다른 문제는 이전에 생각했던 지금 코드를 기록하는 것입니다.
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는 이미 사용되고 있습니다.
또 다른 그룹 친구의 요청에 따라 가격 차이 모니터링을 수정하는 데 도움이되었습니다. 실제로는 검사 차이 범위를 추가하고 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;
}
코드 빈 라인 사이에 붙여진 코드입니다. 간단하고 아직 완성되지 않은 것일 수 있습니다.
요즘은 선물에 대한 전략을 작성하는 것을 배우고 있습니다. 이것은 현장 상품보다 더 복잡합니다. (축복하게도 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 밀리 초 이내에 오류가 있습니다. 아마도 리모컨 시스템이 샌드박스 모델에 속하고, 내부의 시간 실행 알고리즘으로 인해 오류가 발생했습니다. 모형은 매우 작았습니다. (한 초 이내에). 그러나 친구 소설은 모형 오류가 있었지만, 실행하는 것은 여전히 다르지 않았습니다.
- 이건 로그입니다.
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/
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 httpreceived EOF reused ); 함수 부적절, 함수가 한 번만 호출되어야 하며, 회전 구조에 쓸 수 없습니다. 위의 문제 ( ( 存不断膨胀) 는 이 함수가 onTick 함수에서 쓰여진 것이기 때문에, onTick 함수가 지속적으로 회전 호출되어 최종 붕괴로 이어지는 것입니다.
설명: 이 함수는 주로 오류 용납 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);
}
실행 결과:
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원입니다. 그러면 위의 방법으로 이 기간 동안 거래의 수익과 손실을 계산합니다. 이산 = (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이며, 실제로는 쉽게 알 수 있습니다. 첫 번째 방법은 초기 보유자의 부가가치 상승으로 인한 손실을 무시합니다. 두 번째 알고리즘은 수익 손실을 계산할 때 초기 보유자의 부가가치 상승으로 인한 손실을 포함합니다. 이산화탄소 (이산화탄소) 가 유출되는 경우 유동 이익은 거래로 인한 수익과 손실에 해당한다. 이 모든 것은 작은 꿈의 일부 경험입니다. 오류가 있다면, 대 신에게 지지를 부탁드립니다.
이 사이트의 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");
}
리우싱후이
루이스이건 칭찬해야 할 것 같아요!
엄청난 비가 내렸습니다.좋은 것, 많은 것, 많은 것, 많은 것, 많은 것, 많은 것, 많은 것.
잎겨드랑이셰림은 항상 좋은 것들을 정리합니다.
단선 왕승은 높은 가격에 전략을 판매합니다좋은 것!
작은 꿈이봐요. https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png 이 강의는 이 링크를 통해 진행됩니다: https://www.botvs.com/bbs-topic/475
작은 꿈모든 사람들이 쉽게 배울 수 있습니다!