TypeError: cannot read property
length of null duk_hobject_props.c:2258 WToneAndWTtwo __FIL Dieser Fehler wird zurückgegeben.
Wenn ich einen Fehler sehe, der in der Funktion WToneAndWTtwo erscheinen sollte, dann lese ich die Eigenschaft der Namen der Null-Werte, genannt length, also eine Variable wie var name = null; dann lese ich die Null-Werte, die die Namen der Null-Werte, die Namen der Null-Werte, genannt length, haben. Name.length wurde gelesen, um den Ort zu finden, an dem sich die Länge im gesamten Code befindet.
function isNullAndLog(arr,strArrName){//空数组报错
if(!arr){
Log("arr is:",arr,"name:",strArrName);
return true;
}
return false;
}
Denken Sie, hey! Ich habe alle Variablen, die bis zur Länge verwendet werden, in diese Funktion eingegeben, um zu testen, ob es einen Null-BUG gibt. Ich habe 30 Minuten lang K-Funk getestet, und dann ist es wieder gegangen:
TypeError: kann Eigenschaft
length DateiEin Fehler wurde gemeldet.von null duk_hobject_props.c:2258 WToneAndWTtwo nicht lesen
Das ist nicht zu verstehen! Geduld! Geh raus und dreh dich um, um deine Gedanken zu ändern, oder du wirst aufwachen! Als ich zurückkam, dachte ich mir, ob ich die Indikatorbank aufgerufen habe, die eingegebenen Parameter waren null, die Indikatorbank wurde ausgeführt und es gab einen Fehler.
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); der Schlüssel ist aaa null, das habe ich absichtlich gesetzt, um zu sehen, was passiert.
TypeError: Cannot read property
Ein weiteres Problem ist, dass man jetzt den Code aufzeichnet, der vorher gedacht wurde:
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;
}
Das ist der Grund, warum manche Arrays so aussehen [NaN, NaN, NaN, 22, 3, 56, 78, 4, 23].
Ich habe mich so lange verwirrt, aber ich muss mich daran erinnern, dass du Null oder NaN siehst, also kann man Null nicht beurteilen.
Wenn aaa === null ist, warum gibt es keine Fehlermeldung, denn die Ausdrücke für diesen Operator sind in der Regel null, wenn die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke für die Ausdrücke.
Wenn die Ausdrücke in aaa.length immer wahr sind, dann wurde die aaa.length wahrscheinlich nicht ausgeführt.
Einige der APIs wurden verwendet.
Ein weiterer Anforderung, die ich von einem Freund erhalten habe, war die Änderung der Preisdifferenzüberwachung, nämlich die Ermittlung der Differenzbereiche, und WeChat-Push ist sehr einfach.
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;
}
Es ist einfach und möglicherweise noch nicht perfekt.
Die Strategie des Futures-Lernens ist heutzutage komplizierter als die des Futures-Lernens. (Wir haben glücklicherweise ein großes Futures-Trading-Modell, sonst ist es einfach genug, die Details zu schreiben.) Es ist wichtig, die Grundlagen zu verstehen, z. B.: Kauf- und Verkaufsposten, Verkaufspositionen, Kauf- und Verkaufspositionen. Außerdem ist die API für Futures-Handel viel komplexer als die für Bargeld.
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;
}
Ich habe eine Nachprüfung durchgeführt und festgestellt, dass die Sleep-Funktion in der Nachprüfung 1 Sekunde läuft (Zeitverschiebung von 1000), und dann ist der zeitliche Fehler des Testcodes sehr groß, aber bei einem Analoglauf liegt der Fehler grundsätzlich innerhalb von 1 Millisekunde. Möglicherweise ist der Fehler des Nachprüfsystems im Sandbox-Modell und der Fehler, der durch die Algorithmen des Laufzeitraums verursacht wird. Die Simulation hat einen geringen Fehler (Zwischen 1 Sekunde).
- Das ist ein Tagebuch.
runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7f332c591cc9 m=2
goroutine 0 [idle]:
goroutine 1 [select, 207 minutes]:
Aus der ersten Zeile sieht man, dass die Threadgenerierung fehlschlägt und die Ressourcen vorübergehend nicht verfügbar sind (nicht ausreichend). Die Lösung: 1. Überprüft, ob der laufende Roboter-Politikcode nicht freigegeben wurde und ob es eine API mit mehreren Themen gibt. 2, mit dem ulimit-Befehl überprüfen Sie die Systembeschränkungen des Administrators ((Linux) ).http://smilejay.com/2012/04/fork_resource/Ich habe ihn nicht gesehen. 3. Achten Sie auf den Einsatz von Systemspeicher.
Siehe ulimit -a:
Die Parameter des Befehls ulimit: -H setzt Hardware-Ressourcen-Beschränkungen. -S setzt Soft-Resource-Einschränkungen. -a zeigt alle aktuellen Ressourcenbeschränkungen an. -c size: Maximaler Wert der Kerndatei. Einheit: blocks -d size: Maximaler Wert des eingestellten Datensatzes. Einheit: kbytes -f size: Setzen Sie den maximalen Wert für die Erstellung der Datei. Einheit: blocks -l size: Maximaler Wert, den ein Prozess im Speicher sperren kann. Einheit: kbytes -m size: Setzen Sie den maximal verfügbaren Speicherwert. Einheit: kbytes -n size: Setzt den maximalen Wert für alle zugleich geöffneten Dokumentenkennzeichen des Kerns. Einheit: n -p size: Maximaler Wert für die Pipeline Bufferzone. Einheit: Kbytes -s size: Setzen Sie den maximalen Wert des Stapels. Einheit: Kbytes -t size: Setzt die maximale CPU-Nutzung. Einheit:seconds -v size: Höchstwert für den virtuellen Speicher. Einheit: Kbytes -u < Anzahl der Programme> Höchstzahl der Programme, die ein Benutzer starten kann
Ein Freund, der das Problem hatte, fand heraus, dass die Fehlerfilterfunktion möglicherweise die Ursache für das Problem war, und fand heraus, warum der Host (die ständig wachsende Speicher) zusammenbrach. SetErrorFilter ((
502: 503: tcp character unexpected networktimeout WSARecv Connect GetAddr no such reset httppreceived EOF reused ); Funktion Missbrauch, die Funktion muss nur einmal aufgerufen werden und kann nicht in die Loop-Struktur geschrieben werden.
Beschreibung: Diese Funktion wird hauptsächlich für die Fehlerbewältigung von APIs verwendet, z. B. für die Exchange.GetAccount-Funktion, die so aufgerufen wird: _C ((exchange.GetAccount); beachten Sie, dass der Funktionsname ohne Klammern geschrieben wird. Ein Beispiel.
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);
}
Die _C-Funktion sieht ungefähr so aus:
function ___C(functionName,p1){
functionName("执行需要容错的函数,传入的测试参数为:",p1);
Log("__C 容错函数启动,容错完毕");
}
function main(){
pstr = "测试参数--hello";
___C(Log,pstr);
}
Das Ergebnis:
function main(){
var pi = 3.1415926535897;
Log("使用_N函数 前pi:",pi);
var piOfDeal = _N(pi,2);
Log("使用_N函数后 pi:",piOfDeal);
}
Das Ergebnis:
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")));
}
Der obige _G() Funktionstestcode muss auf dem Roboter getestet werden, Retesting wird nicht unterstützt. Testmethoden, wenn man die Programme auf dem Roboter bereitstellt und den Roboter zum ersten Mal startet, wird der Roboter 100.12546328765458 aufzeichnen. Dieser Wert wird in das globale Wörterbuch "totalYLMoney_save" eingegeben, ein weiteres Mal wird der Roboter ausgeführt, und Sie werden feststellen, dass var totalYLMoney = 0, die Variable totalYLMoney nach der Initialisierung immer noch den Wert aus dem Wörterbuch liest, den die Strategie beim ersten Laufen gespeichert hat.
Ich sehe oft neue Schüler in der Gruppe, die nach Algorithmen fragen, die Strategien gewinnen und verlieren. Im Allgemeinen gibt es verschiedene Behandlungsmethoden, die hier ein wenig einfach sind.
Das ist, wenn wir das hier tun, dann ist es, wenn wir das hier tun, dann ist es, wenn wir das hier tun.
Ein Beispiel: Zum Beispiel, wenn der Anfangspreis 10 Euro ist, beginnt das Konto mit 5 Euro und 100 Euro. In einem bestimmten Zeitraum kaufte ich 3 Euro mit einem Durchschnittspreis von 15 Euro. Am Ende dieses Zeitraums stieg der Preis auf 20 Euro. Im Moment habe ich 8 Euro und 55 Euro. Profit = (8 - 5) * 20 + (55 - 100) = 60 + (-45) = 15 Diese Berechnungsmethode Der Gewinn beträgt 15 Yuan. Zusätzlich, wenn man bei einem Preis von 20 US-Dollar pro Münze, also 20 US-Dollar für den Verkauf von 3 Münzen, die für 15 US-Dollar gekauft wurden, ein Gleichgewicht herstellt, ist das Konto jetzt: 5 Münzen, 115 US-Dollar; oder der Algorithmus oben: Profit = (5 - 5) * 20 + (115 - 100) = 15, der Gewinn bleibt 15 Yuan, der Unterschied ist, dass der Gewinn nicht mit dem Preis schwankt, wenn die anfängliche Währungsabwertung nicht berücksichtigt wird.
Der Profit in der Rechnung: (jetzt die Münze x, jetzt der Preis + jetzt das Geld) - (Jetzt die Münze x, jetzt der Preis + jetzt das Geld)
Verwenden Sie auch das Beispiel oben: Zum Beispiel, wenn ich anfänglich 10 US-Dollar für einen Monat habe, beginnt mein Konto mit 5 US-Dollar und 100 US-Dollar. In einer gewissen Zeit habe ich 3 Münzen zu einem durchschnittlichen Preis von 15 US-Dollar für einen Monat gekauft. Am Ende dieser Zeit stieg mein Konto auf 20 US-Dollar. Profit = (8 * 20 + 55) - (5 * 10 + 100) = 215 - 150 = 65 Diese Art der Berechnung ist der Gewinn von 65 Yuan. Profit = (5 * 20 + 115) - (5 * 10 + 100) = 215 - 150 = 65.
Es ist nicht schwer zu erkennen, ob man die beiden Methoden vergleicht, eine mit 15, eine mit 65. Die erste Methode ignoriert die Gewinne und Verluste, die durch die Erhöhung der Devaluation der ursprünglichen Währung entstehen. Die zweite Algorithmus berechnet die Gewinne und Verluste, indem sie die Gewinne und Verluste der Erhöhung der Devaluation der ursprünglichen Währung einbeziehen. Die Berechnung des Gewinns wird für die Abwicklung von Geld ausgezahlt. Floating Profit ist ein Gewinn oder Verlust, der über einen bestimmten Zeitraum durch einen Handel entsteht. Dies sind einige Erfahrungen, die ich mit kleinen Träumen gemacht habe, wenn es Fehler gibt, bitte geben Sie mir die Finger und danke im Voraus ^-^
Einer der wichtigsten Punkte, die wir in diesem Artikel erörtern, ist die Art und Weise, wie wir unsere Produkte vermarkten.
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显示到一组里
Test-Code: Das ist das erste Mal, dass ich einen Test habe.
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]) + "`");
}
Die erste Abbildung zeigt, dass wir in der Tabelle ceshi1 die Datenformate der Tabelle mit den beiden erklärten Variablen var table1 und var table2 haben.
Es ist zu beachten, dass vor und nach der JSON.stringify (([table1, table2]) Funktion das
Ich habe die Ertragsraten der dynamischen Veränderungen mit Hilfe von randomisierten Zahlen getestet, um die Ertragskurve auf dem Diagramm darzustellen.
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");
}
LiuxinghuiWie soll ich das machen, wenn ich nach der Bestellung noch unvollendete Bestellungen stornieren muss?
LouisDas muss eine sein!
Der Regen ist schrecklich.Es gibt viele Dinge, die in der API-Dokumentation nicht erwähnt werden.
Die Blätter fallen abSchön, dass Sie das alles zusammengestellt haben.
Kurzfristig verkauft Wang Won seine Strategie für hohe PreiseDas ist gut!
Kleine TräumeDas ist nicht gut. Siehe auch: https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png Tutorial: Link: https://www.botvs.com/bbs-topic/475
Kleine TräumeEs ist einfach für alle zu lernen!