Name
图表模板增加状态栏表格
Author
小小梦
Strategy Description
图表模板
Strategy Arguments
Argument | Default | Description |
---|---|---|
indicatorsName | 指标轴1 | 指标轴 |
indicators_1 | 指标1 | 指标1 |
indicators_2 | 指标2 | 指标2 |
indicators_3 | 指标3 | 指标3 |
Interval | 500 | 间隔(毫秒) |
isOpenRightY | true | 是否开启右边Y轴 |
lineType | line | 指标线类型 |
Source (javascript)
/*
这个是一个图表模板,详细用法见广场帖子。
*/
//----------------------------------图表模块----------------------------------------------------------------
var ChartObj = {//画图
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
chart: { zoomType:'x',panning:true },//图表类型
title: { text: title}, //标题
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: subtitle},//副标题
xAxis:{type: 'datetime'},
yAxis: [{
title: {text: 'K线'},//标题
style: {color: '#4572A7'},//样式
opposite: false //生成右边Y轴
},
{
title:{text: indicatorsName},
opposite: isOpenRightY //生成右边Y轴 ceshi
}
],
series: [//系列
{type:'candlestick',yAxis:0,name:'K',id:'KLine',data:[]},
{type:'flags',onSeries:'KLine',data:[]},
{name:indicators_1,type:lineType,yAxis:isOpenRightY?1:0,data:[]},
{name:indicators_2,type:lineType,yAxis:isOpenRightY?1:0,data:[]},
{name:indicators_3,type:lineType,yAxis:isOpenRightY?1:0,data:[]},
//{name:indicators_1,type:'spline',yAxis:1,data:[]},
//{name:indicators_2,type:'spline',yAxis:1,data:[]}
]
};
var chart = Chart(ChartObj);
var isFirst = true;
var preRecordTime = 0;
var lastRecordsTime = 0;
var title = exchange.GetName();
var subtitle = indicators_1+"、"+indicators_2+"指标走势";
function Draw(records){
var strState = "";
var fcolor = "";
var msg = "";
while(!records || records.length < 5){
records = exchange.GetRecords();
//LogStatus("获取K线中...records.length:",records === null ? "records is null" : records.length);
Sleep(Interval);
}
if(isFirst === true){
chart.reset();
isFirst = false;
preRecordTime = records[records.length - 1].Time;
}
if(preRecordTime === records[records.length - 1].Time){
chart.add([0,[records[records.length - 1].Time,records[records.length - 1].Open,records[records.length - 1].High,records[records.length - 1].Low,records[records.length - 1].Close ],-1]);
}else{
//更新前一柱
chart.add([0,[records[records.length - 2].Time,records[records.length - 2].Open,records[records.length - 2].High,records[records.length - 2].Low,records[records.length - 2].Close ],-1]);
chart.add([0,[records[records.length - 1].Time,records[records.length - 1].Open,records[records.length - 1].High,records[records.length - 1].Low,records[records.length - 1].Close ]]);
preRecordTime = records[records.length - 1].Time;
}
//chart.update(ChartObj); //测试取消
//chart.reset(500); //测试取消
}
function SignOP(time,price,amount,state,message){
var msg = "";
var fcolor = ""; // ceshi
var strState = "";//ceshi
msg = "均价:"+price+"币数:"+amount;
switch(state){
case 3:strState = "自定义信息";fcolor = "black";msg = message;break;
case 1:strState = "开多仓";fcolor = "red";break;
case 2:strState = "开空仓";fcolor = "green";break;
case 0:strState = "平仓";fcolor = "blue";break;
}
chart.add(1, {x:time, color: fcolor , shape: 'flag', title: strState, text: msg});
}
//----------------------------------图表模块over------------------------------------------------------------
//----------------------------------状态栏表格模块-----------------------------------------------------------
var TV = null; //表格对象,控制表格内容。
var objTable = null;//用于显示表格的对象。
function CreateObjectString(cols,rows){
var i = cols;// column 列
var j = rows;// row 行
var firstCols = 'a';
var charValue = 0;
var firstName = ""; //对象字符串成员的字母部分
var lastName = ""; //对象字符串成员的数字部分
var strMember = ""; //对象字符串成员
var objStr = "";//返回的字符串
if(i > 26){
throw "ERROR column must less 26";
}
var strHead = '{';
var strEnd = '}';
for(var n = 0 ; n < j; n++){
//处理行
for(var m = 0 ; m < i; m++){
//处理列 处理 abc , 数字=n
charValue = firstCols.charCodeAt();//取字符的编码
firstName = String.fromCharCode(charValue + m);
lastName = n;
if(n === j - 1 && m === i - 1 ){
strMember = '"' + firstName + lastName + '"' + ':' + '""';
}else{
strMember = '"' + firstName + lastName + '"' + ':' + '""' + ',';
}
objStr += strMember;
}
}
objStr = strHead + objStr + strEnd;
return objStr;
}
var g_cols = 0;
var g_rows = 0;
$.TableInit = function(cols,rows){
g_cols = cols;
g_rows = rows;
var str = CreateObjectString(cols,rows);//生成 TV对象 字符串
TV = JSON.parse(str); // 解析字符串生成 TV对象
var tableString = CreateTableString(cols,rows);//生成表格对象字符串
objTable = JSON.parse(tableString);//解析表格对象字符串
LogStatus("当前时间:" + (new Date()) + "\n" + "`" + JSON.stringify(objTable) + "`");//初次显示 表格对象到 状态栏
//ConnectDate(cols,rows);//初次链接数据
return TV;//返回 TV对象
};
function ConnectDate(cols,rows){//关联函数
//处理cols
var i = 0;//控制 objTable.cols
for(var unit1 in TV){
if(i < cols){
objTable.cols[i] = TV[unit1];
}else{
break;
}
i++;
}
//处理rows
var m = 0;//m控制 第几行
var n = 0;//n控制 第几个
var o = 1;//跳过cols 部分的计数
for(var unit2 in TV){
if( o <= cols){
o++;
continue;
}
if(n >= cols){
n = 0;
m++;
}
objTable.rows[m][n] = TV[unit2];
n++;
}
}
function CreateTableString(cols,rows){
var strHead = '{';
var strEnd = '}';
var srtTable_type = ' "type": "table",';
var strTable_title = ' "title": "运行信息",';
var strTable_cols_begin = ' "cols" : [';
var strTable_cols_end = '],';
var strTable_rows_begin = ' "rows" : [';
var strTable_rows_end = ']';
var strCols = "";
var length = 0;
for(var y in TV){// 获得 TV对象的 成员个数
length++;
}
var i = 1;
for(var x in TV){// 初始化 strCols
if(i >= cols){
strCols += '"' + "TV." + x + '"' ;
break;
}else{
strCols += '"' + "TV." + x + '"' + ',';
}
i++;
}
i = 1;//控制循环 一行cols 后重置的计数
var n = 1; //用于最后一次 不加 都好的 计数
var m = 1; //用于跳过cols 部分的计数
var strRowsUnit = "";
var strRows = "";
length = length - cols;
for(var z in TV){
if(m <= cols){//跳过 表格cols 部分
m++;
continue;
}
if(i >= cols){
strRowsUnit += '"' + "TV." + z + '"' ;
i = 1;//重置i
if(n < length){
strRowsUnit = '[' + strRowsUnit + ']' + ',';
}else if(n === length){
strRowsUnit = '[' + strRowsUnit + ']';
}
strRows += strRowsUnit;
strRowsUnit = "";//重置
}else{
strRowsUnit += '"' + "TV." + z + '"' + ',';
i++;
}
n++;
}
var tableString = strHead + srtTable_type + strTable_title + strTable_cols_begin + strCols + strTable_cols_end + strTable_rows_begin + strRows + strTable_rows_end + strEnd;
return tableString;
}
$.UpDateLogStatus = function(msg) { //更新状态栏
//列用ABC表示,行用0123表示
ConnectDate(g_cols,g_rows);//链接数据
LogStatus("当前时间:" + (new Date()) + "msg:" + msg + "\n" + "`" + JSON.stringify(objTable) + "`");//更新状态栏
};
//----------------------------------状态栏表格模块over-------------------------------------------------------
//----------------------------------导出函数----------------------------------------------------------------
$.SignOP = function(time,price,amount,state,message){//该函数作用是在策略运行时,在K线图表上标记“开多仓”,“开空仓”,“平仓” 的位置。
//参数time: 在策略中使用此函数的时间,一般用(new Date()).getTime() , price:这个参数是在标签上显示 价格(多空平), amount:这个参数是在标签上显示 数量(成交) ,state: 这个参数是用来控制标记的类型,state = 1开多 ,2开空 ,0 平仓
if(arguments.length < 4){
Log("SignOP 函数 必须传入4个参数 : time、price、amount、state");
return;
}
if(typeof(message) === "undefined"){
message = "";
}
SignOP(time,price,amount,state,message);
};
$.Draw = function(records){
Draw(records);
};
$.AddZhiBiao = function(zhibiao_Array,records,index){//该函数是在图表上添加指标线,zhibiao_Array:这个参数是指标数据(数组),records:产生指标数据的 原始K线数据,index:指标线的编号,从1开始递增
if(records[records.length - 1].Time === lastRecordsTime){
chart.add([index+1,[records[records.length - 1].Time,zhibiao_Array[zhibiao_Array.length - 1]],-1]);
}else{
chart.add([index+1,[records[records.length - 2].Time,zhibiao_Array[zhibiao_Array.length - 2]],-1]);
chart.add([index+1,[records[records.length - 1].Time,zhibiao_Array[zhibiao_Array.length - 1]]]);
//lastRecordsTime = records[records.length - 1].Time; //测试 取消
}
//chart.update(ChartObj); //测试取消
};
$.UpDateChart = function(records){//更新图表,每次添加指标线,添加标签 后需要更新 才有效。 records: K线原始数据
if(records[records.length - 1].Time !== lastRecordsTime){
lastRecordsTime = records[records.length - 1].Time;
}
chart.update(ChartObj);
chart.reset(500);//默认 保留500个K线
};
//----------------------------------导出函数over-----------------------------------------------------------
//测试
function main(){
///*测试图表功能
var i = 0;
var records = exchange.GetRecords();
while(!records || records.length < 5){
records = exchange.GetRecords();
Sleep(500);
}
var zhibiao = [1,2,3,5,6,4,1,21,5];//ceshi
var zhibiao2 = [11,22,44,57,8,77,5];
//$.SignOP((new Date()).getTime(),null,null,3,"自定义信息标记到图表上");// 测试标记 自定义信息 到图表上
while(i < 500){
Draw(records);
if(i===20){
//Sleep(60*60*1000);
SignOP((new Date()).getTime(),2900,1,1);
$.SignOP((new Date()).getTime(),null,null,3,"自定义信息标记到图表上");// 测试标记 自定义信息 到图表上
}
//zhibiao.shift();
//zhibiao.push(zhibiao[zhibiao.length - 1] + 1);//ceshi
//Log("ceshi"); //ceshi
$.AddZhiBiao(zhibiao,records,1);
//$.AddZhiBiao(zhibiao2,records,2);
//Log("ceshi"); //ceshi
//Draw(records);
//Log("ceshi1"); //ceshi
Sleep(200);
records = exchange.GetRecords();
$.UpDateChart(records);//更新图表
i++;
}
//*/
/*测试状态栏表格功能*/
var cols = 6;//列 设置一个变量 代表 列
var rows = 4;//行 设置一个变量 代表 行
$.TableInit(cols,rows); //初始化 状态栏 会显示 各个单元格的 坐标
///*
for(var x in TV){
TV[x] = "lalala";// 全部单元格写成 lalala
}
//更新表格 显示 lalala, 表头 数据不能重复 ,否则显示不出来。
/*
TV.a0 = "a0";
TV.b0 = "b0";
TV.c0 = "c0";
TV.d0 = "d0";
TV.e0 = "e0";
TV.f0 = "f0";//先把 表头数据写成不一样的
*/
$.UpDateLogStatus(cols,rows);//更新 状态栏表格
///*
//怎么在 表格里面写入数据呢?
var num = 100;
var text = "文本:测试表格文本";
var obj = {name:"对象",age:"19",sex:"girl"};
var array = ["数组",22,33,54];
TV.a1 = num;
TV.c2 = text;
TV.b3 = obj;
TV.b0 = array;
$.UpDateLogStatus(cols,rows);//再次更新 状态栏表格
//*/
}
/*修改
1、增加了是否开启右边坐标轴
2、增加参数 lineType : spline / line
*/
Detail
https://www.fmz.com/strategy/20967
Last Modified
2018-06-05 11:52:32