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);
}
Нехорошо наклеивать код ~ может показаться немного небрежным, можно наклеить и посмотреть на sublime text, прежде чем просто сказать, что проблема, это то, что код написан во время запуска, столкнулся с странным эпизодом, см. рисунок:
Странно, что прогрессная полоса доходит до 100%, постоянно застряла, не двигалась, не притворялась мертвой, должна была застрять. Я также использовал различные методы для тестирования, например: ограничение количества циклов, показывающее количество циклов, показывающее, что все застряло до последнего цикла. Посмотрев на программный код, я почувствовал, что ничего плохого не должно быть. Когда я инициировал график, последовательность данных была написана так:
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:[]} //......
]
Например, в программе можно записать данные в график так:
chart.add([1,[globalR......... (太长了 没写完) // 可以看到这里 我写入索引为1 的数据序列,就是add后面[ 符号后的 1,代表写入到{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]}, 这个序列中。问题就在这,我越过了索引0,直接写入索引1的数据序列里,就会导致卡死。
Я перевела его на:
series: [//系列
{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
{name:'wt2',type:'spline',yAxis:1,data:[]},
{type:'flags',onSeries:'wt',data:[]}
]
Все коды, которые были записаны на графике, были изменены (в основном 1 в 0).
chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........(太长了。。。)
Это потрясающе, не застряло, работает без проблем. Хотя я не знаю, почему, я думаю, что это должно быть проблемой с графикой.
Сегодня мы обновили пост, потому что друзья в группе задали вопросы, и мы сделали это путем исследования, решения вопросов и записи.
Почему цена фьючерса отличается от реальной?
Я проверил это сам, и это действительно не то же самое. Изобретатель количественно настроил робот. Биржа - это OK futures, последние цены на рынке, полученные с помощью GetTicker. Я написал в своем блоге, что я не могу найти ни одного человека, который мог бы мне помочь.
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);
}
}
Осуществление: Я нашел разные валютные курсы, и я получил их с помощью двух различных API-функций.Посмотрев на презентацию API, можно сказать, что не OK Futures использует свой собственный курс.
Если вы не знаете, что это такое, вы можете перейти к следующему шагу:Поскольку цены на сайте ОК находятся только на одном месте после запятой (остальные не отображаются полностью), предполагается, что произойдет небольшая ошибка. Поскольку результаты в основном одинаковые, можно не быть абсолютно уверенным, что рыночная цена, полученная GetTicker, отличается от цены, полученной на официальном сайте OK Futures, вероятно, из-за несоответствия валютных курсов.
/* 交互按钮 测试
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);
}
}
Код, который я тестировал, не был опубликован на площадке, поэтому друзья, которые хотят его проверить, должны вручную добавить кнопку взаимодействия.Посмотрите, как это делается.
Посмотрите, как это работает:
Разумеется, повторение стратегии не может быть проверено, необходимо самостоятельно создать робота, протестировать его с помощью анимационной диски, нажать на кнопку взаимодействия, и соответствующие действия будут отмечены на графике. Здесь бросается запятая, надеюсь, что все напишут стратегию NB.
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);
}
Друзья, которые заинтересованы, могут попробовать.
В эти два дня, когда у меня есть свободное время, я смотрю на python, и в целом мне не очень сложно учиться, но я все равно сталкиваюсь со многими проблемами.
Вопрос: Что означает x = [1 for i in range ((n)) ]? Когда я впервые увидел это место, я тоже был взрослым, и такой грамматики, кажется, я никогда не видел раньше.
Это расшифровка списка в Python, которая означает формирование списка от 1 до n. О расшифровке списка можно прочитать ниже: Определение и описание Одним из сильных свойств >Python является его расшифровка списка, которая предоставляет компактный способ, который позволяет наложить функцию на каждый элемент в списке и таким образом отобразить один список в другой list. > Расшифровка списка, также называемая списковой индукцией (list comprehension) > Расшифровка списка удобнее и быстрее, чем for, особенно для больших данных. Расшифровка списка может заменить большинство случаев, когда требуется использование maps и filters. 2. Основные списки для анализа основы [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 для x в l1 для y в l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] Можно вызвать функцию [ func ((x) for x in l1] #, равной map Обратите внимание, что анализ списка не меняет значения исходного списка, но создает новый список. 3. Рассмотрение списка условий [ x for x in range ((100) if x%2 ==0 ] 4., несетный список резюмеmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] обменный матриц [ [row[i] for row in mat] for i in (0,1,2) ] # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] Это статья из блога CSDN, написанного Линью.
i циркулирует в диапазоне range ((n), т. е. i = 0, 1, 2,..., n-1, соответственно, вычисляется для предыдущих значений выражения, используемых в качестве пункта в списке Если выражение 1, соответствующее значение 1, 1, 1..., для n 1, получается список, содержащий n 1 [1, 1].
x = [i для i в списке] Карта одного списка в другой список, каждый элемент настраивается на i x = [1 for i in range ((n) ] Мапируйте список range ((n) к списку x, где каждый элемент имеет постоянную 1. Добро пожаловать на forpython.com
Вчера я написал тест-стратегию на Python CTP Commodity Futures Equilibrium, и начальник попросил меня проверить Python CTP Commodity Futures Retesting System. Продолжаем сегодня тестирование и обнаруживаем, что стратегия полностью не соответствует уравненной линии золотой вилки, чтобы открыть игровой баланс, чувствую, что должны быть проблемы, проверка, тестирование и обнаружение функции. Кросс-функция не возвращает правильное значение кода по своей конструкции:
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
Как? Видите, это очень необычная ошибка! Я написал return n в условный отрасль, и это, кажется, не проблема. Какие значения мы вернем?
Определите тест-функцию, которая выводит только одно сообщение
Позвольте мне назвать это и написать это так, и, кстати, посмотреть, не будет ли None равно -1
Если мы посмотрим на результаты, то увидим, что при выполнении функции без return она возвращает значение None, и None не равняется -1, но если None меньше 0, это верно.
Например, этот код дает ошибку:
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 (Эта ошибка отнимала у меня полчаса!), эта ошибка, проверив её на Baidu, означает, что в коде есть циркулярные ссылки, которые JSON не может разрешить.
Полгода мы думали, а потом поняли, что это не так.obj.exchange = exchange;
Это привело к циркуляции цикла, которая решительно перескакивает, когда в цикле for ((var k in obj) встречается k ===
Код выглядит так:
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) + '`');
}
Это нормально, но можно ли увидеть, как циркулируют ссылки?
Посмотрите, почему:
Показать различные значения свойства type для конкретных позиций.https://www.fmz.com/bbs-topic/672
Ботвизинг2Сделайте это прямо сейчас.
Маленькие мечтыЯ готов много писать, поэтому специально заказал QQ-пространство, чтобы было легко смотреть и искать.