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);
}
Der Code ist nicht gut angebracht - vielleicht sieht man es mit einem kleinen Blick an, man kann es einfach kleben, um den Sublime Text zu sehen.
Es ist merkwürdig, dass die Fortschrittsleiste bis zu 100% steckt und nicht bewegt, sondern nicht tot ist. Ich habe auch verschiedene Methoden verwendet, um zu testen, wie z. B. die Anzahl der Zyklen zu begrenzen, die Anzahl der Zyklen anzuzeigen, was angezeigt wird, bis die letzte Laufzeit des Zyklus feststeckt. Ich habe mir den Code angesehen und dachte, es müsste kein Problem sein. Ich konnte es nicht lösen. Bei der Initiierung des Diagramms schrieb ich die Datenserie so:
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:[]} //......
]
Die Daten, die in einem Programm in ein Diagramm geschrieben werden, sehen so aus:
chart.add([1,[globalR......... (太长了 没写完) // 可以看到这里 我写入索引为1 的数据序列,就是add后面[ 符号后的 1,代表写入到{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]}, 这个序列中。问题就在这,我越过了索引0,直接写入索引1的数据序列里,就会导致卡死。
Ich habe es also geändert:
series: [//系列
{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
{name:'wt2',type:'spline',yAxis:1,data:[]},
{type:'flags',onSeries:'wt',data:[]}
]
Alle Daten, die in ein Diagramm geschrieben werden, werden in Code umgewandelt (vor allem 1 in 0 umgewandelt)
chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........(太长了。。。)
Es ist fantastisch, es klebt nicht, es funktioniert ohne Probleme.
Heute habe ich den Beitrag aktualisiert, weil ein Freund in der Gruppe ein Problem gestellt hat, und ich habe es durch Recherche, Problemlösung und spezielle Aufzeichnungen aufgezeichnet.
Getticker erhält Futurespreise, die sich von den tatsächlichen Preisen unterscheiden.
Ich habe es selbst getestet und es ist wirklich anders. Der Erfinder quantifiziert den Roboter. Die Börse ist OK Futures, die neuesten Marktpreise, die mit GetTicker erhalten wurden. Ich schrieb einen Code, um einen Test zu machen:
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);
}
}
Wie funktioniert es: Ich habe zwei verschiedene API-Funktionen verwendet, um den Wechselkurs zu erhalten.Ich habe die API gesehen und nicht die OK-Futures, die ihren eigenen Wechselkurs verwenden.
Das Ergebnis ist direkt auf der Grafik:Da die Preise auf der OK-Webseite nur eine Stelle nach der kleinen Zahl sind (die restlichen sind nicht vollständig angezeigt), wird ein kleiner Fehler geschätzt. Da die Ergebnisse im Wesentlichen gleich sind, kann man nicht ganz sicher sein, ob der Unterschied zwischen dem Marktpreis von GetTicker und dem des OK Futures auf der Website wahrscheinlich durch Wechselkursungleichgewichte verursacht wurde.
/* 交互按钮 测试
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);
}
}
Der Code, den ich getestet habe, ist nicht öffentlich zugänglich, also müssen Freunde, die es testen möchten, manuell einen Interaktionsknopf hinzufügen.Das ist eine sehr schwierige Aufgabe.
Sieh mal, wie es läuft:
Natürlich ist die Strategiewiederholung nicht zu testen. Man muss den Roboter selbst erstellen und mit der Analogdiskette testen. Klicken Sie auf den Interaktionsknopf, und der entsprechende Vorgang wird auf dem Diagramm markiert.
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);
}
Interessierte Freunde können es ausprobieren.
Ich habe zwei freie Tage mit Python verbracht, und das Lernen ist insgesamt nicht schwer, aber ich habe immer noch viele Probleme.
Die Frage ist: Was bedeutet x = [1 für i in range ((n))? Als ich das erste Mal hier sah, war ich auch schon erwachsen, und es schien, als hätte ich diese Grammatik noch nie zuvor gesehen.
Dies ist eine Listeanalyse in Python, die eine Liste von 1 bis n bildet. Definition und Beschreibung Eine der starken Eigenschaften von >Python ist die Paralyse von Listen, die eine kompakte Methode bietet, um eine Liste auf eine andere Liste zu übertragen, indem man eine Funktion auf jedes Element in einer Liste anwendet. >Listenparalyse, auch als Listeinführung bezeichnet. >Listenparalyse ist schneller und leichter zu betreiben als for. 2. Grundlisten zu analysieren Grundlisten [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] Mehrwertige [
%s = %s for (k, v) in a_map.items (()) ] Zwei Runden l1 ist [1, 2, 3, 4]. L2 ist gleich [1, 2, 3, 4]. [x+y für x in l1 für y in l2] [Zwei, drei, vier, fünf, drei, vier, fünf, sechs, vier, fünf, sechs, sieben, fünf, sechs, sieben] Die Funktion [ func ((x) for x in l1] # ist gleich der Map Bitte beachten Sie, dass das Parsen der Liste die Werte der ursprünglichen Liste nicht ändert, sondern eine neue Liste erzeugt. 3. Analyse der Bedingungenliste [ x for x in range ((100) if x%2 == 0 ] 4., Nischenliste analysierenmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] Wechsel Matrix [ [row[i] for row in mat] for i in (0,1,2)] # [[1, 4, 7, [2, 5, 8], [3, 6, 9]] Das ist ein CSDN-Blog-Artikel von Ling Yue.
i wird im Bereich von range ((n), d. h. i = 0, 1, 2,..., n-1, als Punkt in der Liste umgedreht, wobei der Wert des vorherigen Ausdrucks for berechnet wird Der Ausdruck ist 1, die entsprechenden Werte sind 1, 1, 1..., für n 1, erzeugt eine Liste, die n 1 enthält [1, 1...]
x = [i für i in der Liste] Eine Liste wird auf eine andere Liste mit jeder einzelnen Variablen i abgebildet x = [1 für i in range ((n) ] Mappung der Listerange ((n) auf eine Liste x, wobei jedes Element auf die Konstante 1 gesetzt wird Bitte besuchen Sie die Seite forpython.com
Gestern schrieb ich eine Teststrategie für die Python CTP Commodity Futures Equilibrium, und mein Chef ließ mich das Python CTP Commodity Futures Retesting System testen. Heute weiter zu testen und festzustellen, dass die Strategie nicht ganz nach der Gleichlinien-Goldfork-Tod-Fork-Operation zu öffnen, das Gefühl, dass es Probleme geben muss, einzelne Funktionen zu überprüfen, zu testen und zu finden. Die Cross-Funktion kehrt nicht den richtigen Code zurück, wie sie entworfen wurde:
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
Wie? Siehst du, das ist ein sehr neuer Fehler! Ich habe die return n in den bedingten Zweig geschrieben, das scheint kein Problem zu sein. Was wird zurückgegeben?
Definition einer Testfunktion, die nur eine Nachricht ausgibt
Wir schreiben es so, um zu sehen, ob None gleich -1 ist.
Die Ergebnisse zeigen, dass, wenn keine return ausgeführt wird, der Wert der Funktion zurückgegeben wird, der auch nicht gleich -1 ist, aber wenn None kleiner als 0 ist, dann ist dies ein wahrer Wert.
Der Code liefert einen Fehler, zum Beispiel:
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) + '`');
}
TypeError: Converting circular structure to JSON (Dieser Fehler hat mich eine halbe Stunde gekostet!), Dieser Fehler wurde bei Baidu nachgefragt.
Ich habe einen halben Tag nachgedacht, und dann habe ich das Problem entdeckt.obj.exchange = exchange;
Der daraus resultierende Kreislaufbezug springt über, wenn er in der For ((var k in obj) Kreislauf k ===
Der Code lautet:
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) + '`');
}
Das ist natürlich normal, aber kann man sehen, wie man die Quellen kreist?
Die Gründe hierfür sind:
Für die einzelnen Werte der type-Attribute für die Positions-Spezifikationen der Informationsaufbewahrungsobjekte:https://www.fmz.com/bbs-topic/672
- Das ist nicht wahr.Ich habe es einfach aufgeschrieben.
Kleine TräumeIch bin bereit, viel zu schreiben, also habe ich speziell einen QQ-Bereich beantragt, um es einfach zu sehen und zu finden.