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);
}
Có thể bạn sẽ thấy nó khá khó nhìn, bạn có thể dán nó vào bên trong văn bản sublime để xem, trước tiên hãy nói một cách đơn giản vấn đề, đó là mã được viết trong khi chạy, gặp một cảnh kỳ lạ, xem hình:
Thật kỳ lạ, thanh tiến bộ đi đến 100% luôn bị kẹt, không di chuyển, không chết giả, nên bị kẹt. Tôi cũng sử dụng nhiều phương pháp để kiểm tra, ví dụ: hạn chế số lần quay, hiển thị số lần quay, hiển thị tất cả đều chạy cho đến lần quay cuối cùng bị kẹt. Nhìn vào mã của chương trình, cảm giác là không có vấn đề gì cả. Basty không thể giải quyết. Sau khi làm xong, làm lâu, cuối cùng tôi đã phát hiện ra vấn đề, đây là lý do. Khi khởi tạo biểu đồ, tôi viết chuỗi dữ liệu như thế này:
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:[]} //......
]
Trong chương trình, viết dữ liệu vào biểu đồ như thế này:
chart.add([1,[globalR......... (太长了 没写完) // 可以看到这里 我写入索引为1 的数据序列,就是add后面[ 符号后的 1,代表写入到{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]}, 这个序列中。问题就在这,我越过了索引0,直接写入索引1的数据序列里,就会导致卡死。
Vì vậy, tôi đã thay đổi nó thành:
series: [//系列
{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
{name:'wt2',type:'spline',yAxis:1,data:[]},
{type:'flags',onSeries:'wt',data:[]}
]
Tất cả các mã được chuyển sang biểu đồ (chủ yếu là chuyển 1 thành 0)
chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........(太长了。。。)
Điều đó thật tuyệt vời, không bị kẹt, hoạt động không có vấn đề.
Hôm nay, tôi đã cập nhật bài viết vì một người bạn trong nhóm đã đặt câu hỏi, bằng cách nghiên cứu, giải quyết vấn đề, ghi lại. Nếu người dùng mới có câu hỏi tương tự, hãy giải thích.
Getticker lấy giá tương lai tại sao lại khác với giá thực?
Tôi đã tự mình thử nghiệm, và thực sự khác nhau. Các nhà phát minh định lượng trên robot. Sàn giao dịch là OK Futures, với giá mới nhất được lấy bằng GetTicker. Có sự khác biệt thực sự với OK Futures trên trang web chính thức, thực sự kỳ lạ, chắc chắn là không hiểu đâu. Vì vậy, tôi đã viết một đoạn mã để kiểm tra cụ thể:
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);
}
}
Các hoạt động: Tôi tìm thấy tỷ giá khác nhau, tôi lấy tỷ giá ở đây bằng 2 hàm API khác nhau.Bạn đã xem phần giới thiệu về API, OK Futures không sử dụng tỷ giá của riêng mình?
Hãy thử và kiểm tra xem kết quả sẽ như thế nào:Vì giá trên trang web của OK chỉ là 1 chữ số sau số nhỏ (những chữ số còn lại không hiển thị đầy đủ), ước tính sẽ có một chút sai lầm. Nhìn thấy kết quả về cơ bản là như nhau, bạn có thể không chắc chắn hoàn toàn rằng giá thị trường của GetTicker và giá tương lai của OK có sự khác biệt, có lẽ là do tỷ giá không phù hợp.
/* 交互按钮 测试
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);
}
}
Tôi đã thử nghiệm mã trên và nó không được hiển thị trên quảng trường, vì vậy nếu bạn muốn thử, bạn cần phải thêm một nút tương tác bằng tay.Theo các thiết lập trên.
Hãy xem nó hoạt động như thế nào:
Tất nhiên, việc kiểm tra lại chính sách là không thể thử nghiệm, cần phải tự tạo robot, thử nghiệm bằng đĩa mô phỏng, nhấn nút tương tác, sẽ được đánh dấu trên biểu đồ.
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);
}
Bạn bè quan tâm có thể thử.
Những ngày rảnh rỗi này tôi đã xem python, nói chung không khó khăn gì để học, nhưng tôi vẫn gặp rất nhiều vấn đề, tôi nhớ trước.
Câu hỏi: nghĩa là gì khi x = [1 for i in range ((n))? Khi nhìn thấy nơi này, tôi cũng đã lớn lên, và ngữ pháp như vậy dường như chưa bao giờ thấy trước đây. Đánh đoán, đoán, không đoán ý nghĩa của nó.
Đây là phân tích danh sách trong Python, nghĩa là tạo ra một danh sách từ 1 đến n. Một trong những tính năng mạnh mẽ nhất của Python là phân tích list, nó cung cấp một phương pháp nhỏ gọn để tạo ra các liên kết bằng cách áp dụng một hàm cho mỗi phần tử trong list để lập bản đồ một list khác.> List comprehension, còn được gọi là cách suy luận danh sách.> List comprehension hoạt động tinh tế hơn và nhanh hơn so với for, đặc biệt là đối với dữ liệu lớn, phân tích danh sách thay thế hầu hết các trường hợp cần sử dụng map và filter. 2. Giải pháp danh sách cơ bản cơ bản [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] [
%s = %s for (k, v) in a_map.items))) L1 = [1, 2, 3, 4]. L2 = [1,2,3,4] [x + y cho x trong l1 cho y trong l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] Bạn có thể gọi hàm [ func ((x) for x in l1] # bằng map Lưu ý rằng phân tích danh sách không thay đổi giá trị của danh sách ban đầu, nó sẽ tạo ra một danh sách mới. 3. Xác định danh sách điều kiện [ x for x in range ((100) if x%2 ==0 ] 4., danh sách mảng phân tíchmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] Chuyển matrix [ [row[i] for row in mat] for i in (0,1,2)] # [[1, 4, 7, [2, 5, 8], [3, 6, 9]] Bài viết trên được chuyển từ bài viết trên blog của CSDN.
i xoay vòng trong phạm vi range ((n), tức là i = 0, 1, 2,..., n-1, tính cho các giá trị của biểu thức trước đó, như các mục trong danh sách biểu thức là 1, giá trị tương ứng là 1,1,1..., cho n 1, tạo ra một danh sách chứa n 1.
x = [i for i in list] Định dạng một list thành một list khác với mỗi phần tử là i x = [1 for i in range ((n) ] Đặt danh sách range ((n) vào danh sách x, mỗi phần tử được đặt thành hằng số 1 Chào mừng bạn đến forpython.com để trao đổi
Hôm qua, tôi đã viết một chiến lược thử nghiệm về đường thẳng tương lai hàng hóa của Python CTP, và ông cho phép tôi thử nghiệm hệ thống kiểm tra tương lai hàng hóa của Python CTP. Ngày hôm nay tiếp tục thử nghiệm phát hiện ra chiến lược hoàn toàn không theo đường thẳng vàng đúc chết đúc để mở giao dịch giao dịch, cảm giác chắc chắn có vấn đề, kiểm tra từng chức năng, thử nghiệm, phát hiện ra Các hàm chéo không trả về các mã giá trị chính xác theo thiết kế:
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
Làm thế nào? Bạn có thể thấy điều này, một sai lầm rất mới! Tôi đã viết return n trong nhánh điều kiện, điều này dường như không có vấn đề. Và giá trị mà nó trả về là gì?
Định nghĩa một hàm kiểm tra, chỉ xuất một thông báo
Chúng ta hãy gọi nó, và viết nó như thế này, để xem nếu không phải là -1
Nếu bạn nhìn vào kết quả, bạn sẽ thấy rằng khi không thực hiện return trong hàm, giá trị trả về của hàm sẽ là None, và None cũng không bằng -1, nhưng nếu None nhỏ hơn 0, thì đó là giá trị thực.
Ví dụ, đoạn mã này sẽ trả lại lỗi:
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 (Lỗi này làm tôi đau đớn nửa giờ!)
Sau nửa ngày suy nghĩ, tôi đã phát hiện ra vấn đề.obj.exchange = exchange;
Câu nói dẫn đến tham chiếu vòng tròn, quyết định khi gặp k ===
Mã là:
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) + '`');
}
Có thể nhìn thấy cách liên kết vòng tròn không? (thậm chí có một chút nhầm lẫn trong thời gian này, ngón tay cao!)
Có một lý do là:
Các giá trị của thuộc tính type của các vị trí cụ thể của các đối tượng lưu trữ thông tin:https://www.fmz.com/bbs-topic/672
botvsing2Đăng ngay.
Giấc mơ nhỏVì vậy, tôi đã đăng ký một không gian QQ đặc biệt để dễ dàng xem và tìm kiếm.