# 发明者量化学习日记（二）（已完结）

Author: 小小梦, Created: 2016-05-22 20:05:36, Updated: 2019-08-01 10:31:58

#### 问题1：

`````` 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);
}
``````

`````` 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:[]}
]
``````

`````` chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........（太长了。。。）
``````

#### 问题2

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);
}
}

``````

#### 问题4： 昨天深夜，一位群友问我哪里有 关于策略 交互按钮的 使用范例，我想了一下，干脆自己写写，练练手，顺便方便大家一起学习，老套路，先上码！

``````/* 交互按钮 测试
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);
}
}
``````

#### 问题 5： 有用户问，怎么获取 当前操作的电子货币的名称，还有怎么获取当前K线的周期。 获取当前交易所的货币是有API函数可以用的，我用了比较笨的办法解决了获取K线周期的问题。

``````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);
}
``````

#### 问题6： 如果对于新版的 商品期货交易类库 增加的函数功能不理解可以到QQ群共享下载新的注释版代码。

• 策略模板在 策略广场可以复制。

#### 问题7： x = [1 for i in range(n)] 代表什么意思？

• 这两天有空时在看python ，整体学习起来没什么难度，但是还是遇到不少问题，我都先记下。时间长了自己也可以复习复习，python的新手遇到同样的问题不用头大了 =_=！

如题： x = [1 for i in range(n)] 代表什么意思？ 当初看到这里我也已经头大了，这样的语法似乎以前从没见过。猜来猜去，猜不出是什么意思。果断百度一下，百度也发现讲这个的不多。所幸还是找到了一些。

##### 再看看其他的热心帮助：

i 在 range(n)的范围内循环,即 i=0,1,2,…,n-1,分别计算for之前的表达式的值,作为列表的项 表达式是1,对应的值分别为 1,1,1…,供n个1,生成了包含n个1的列表[1,1…]

##### 这个看起来就明白多了，再看。

x = [i for i in list] 将一个 list 映射为另一个 list，每个元素设为变量i x = [1 for i in range(n)] 将列表range(n)映射到列表x，每个元素设为常量1 欢迎访问forpython。com进行交流

#### 问题8： python基础不扎实， 被return 忽悠了半天，下面来看看问题

``````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
``````

#### 问题9： JS 循环引用的问题。

``````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 （这个错误虐我半个小时啊！），这个报错,在百度查了一下。是说代码里面有循环引用，JSON 无法解析。

``````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) + '`');
}
``````

#### 问题10： 商品期货 在星期五的晚上 开仓，持有的仓位，在下个星期一开市后，调用GetPosition 函数 获取的持仓信息，为什么

##### 看到这，我是感觉应该动手实践实践了…你呢？

More

huaguo3 不错

kakababa2 动手出真知！！

botvsing2 直接贴出来啊