mirror of https://github.com/midoks/mdserver-web
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
964 lines
32 KiB
964 lines
32 KiB
|
|
function appPost(method,args,callback, title){
|
|
var _args = null;
|
|
if (typeof(args) == 'string'){
|
|
_args = JSON.stringify(toArrayObject(args));
|
|
} else {
|
|
_args = JSON.stringify(args);
|
|
}
|
|
|
|
var _title = '正在获取...';
|
|
if (typeof(title) != 'undefined'){
|
|
_title = title;
|
|
}
|
|
|
|
var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 });
|
|
$.post('/plugins/run', {name:'cryptocurrency_trade', func:method, args:_args}, function(data) {
|
|
layer.close(loadT);
|
|
if (!data.status){
|
|
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
|
return;
|
|
}
|
|
|
|
if(typeof(callback) == 'function'){
|
|
callback(data);
|
|
}
|
|
},'json');
|
|
}
|
|
|
|
function appPostN(method,args,callback, title){
|
|
|
|
var _args = null;
|
|
if (typeof(args) == 'string'){
|
|
_args = JSON.stringify(toArrayObject(args));
|
|
} else {
|
|
_args = JSON.stringify(args);
|
|
}
|
|
|
|
var _title = '正在获取...';
|
|
if (typeof(title) != 'undefined'){
|
|
_title = title;
|
|
}
|
|
$.post('/plugins/run', {name:'cryptocurrency_trade', func:method, args:_args}, function(data) {
|
|
if(typeof(callback) == 'function'){
|
|
callback(data);
|
|
}
|
|
},'json');
|
|
}
|
|
|
|
function appAsyncPost(method,args){
|
|
var _args = null;
|
|
if (typeof(args) == 'string'){
|
|
_args = JSON.stringify(toArrayObject(args));
|
|
} else {
|
|
_args = JSON.stringify(args);
|
|
}
|
|
|
|
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
|
return syncPost('/plugins/run', {name:'cryptocurrency_trade', func:method, args:_args});
|
|
}
|
|
|
|
|
|
function appPostCallbak(method, args,callback, script){
|
|
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
|
|
|
var req_data = {};
|
|
req_data['name'] = 'cryptocurrency_trade';
|
|
req_data['func'] = method;
|
|
|
|
if (typeof(script) != 'undefined'){
|
|
req_data['script'] = script;
|
|
}
|
|
|
|
|
|
if (typeof(args) == 'string'){
|
|
req_data['args'] = JSON.stringify(toArrayObject(args));
|
|
} else {
|
|
req_data['args'] = JSON.stringify(args);
|
|
}
|
|
|
|
$.post('/plugins/callback', req_data, function(data) {
|
|
layer.close(loadT);
|
|
if (!data.status){
|
|
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
|
return;
|
|
}
|
|
|
|
if(typeof(callback) == 'function'){
|
|
callback(data);
|
|
}
|
|
},'json');
|
|
}
|
|
|
|
|
|
function appPostCallbakNoMsg(method, args,callback, script){
|
|
|
|
var req_data = {};
|
|
req_data['name'] = 'cryptocurrency_trade';
|
|
req_data['func'] = method;
|
|
|
|
if (typeof(script) != 'undefined'){
|
|
req_data['script'] = script;
|
|
} else {
|
|
req_data['script'] = req_data['name'];
|
|
}
|
|
|
|
|
|
if (typeof(args) == 'string'){
|
|
req_data['args'] = JSON.stringify(toArrayObject(args));
|
|
} else {
|
|
req_data['args'] = JSON.stringify(args);
|
|
}
|
|
|
|
$.post('/plugins/callback', req_data, function(data) {
|
|
if (!data.status){
|
|
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
|
return;
|
|
}
|
|
|
|
if(typeof(callback) == 'function'){
|
|
callback(data);
|
|
}
|
|
},'json');
|
|
}
|
|
|
|
|
|
function dbConf(){
|
|
appPost('get_db_conf','',function(data){
|
|
var rdata = $.parseJSON(data.data);
|
|
// console.log(rdata);
|
|
var db_host = '127.0.0.1';
|
|
var db_port = '3306';
|
|
var db_name = 'cryptocurrency_trade';
|
|
var db_user = 'cryptocurrency_trade';
|
|
var db_pass = 'cryptocurrency_trade';
|
|
if(rdata['status']){
|
|
db_data = rdata['data'];
|
|
db_host = db_data['db_host'];
|
|
db_port = db_data['db_port'];
|
|
db_name = db_data['db_name'];
|
|
db_user = db_data['db_user'];
|
|
db_pass = db_data['db_pass'];
|
|
}
|
|
|
|
var mlist = '';
|
|
mlist += '<p><span>数据库地址</span><input style="width: 250px;" class="bt-input-text mr5" name="db_host" value="'+db_host+'" type="text"></p>'
|
|
mlist += '<p><span>数据库端口</span><input style="width: 250px;" class="bt-input-text mr5" name="db_port" value="'+db_port+'" type="text"></p>'
|
|
mlist += '<p><span>数据库名称</span><input style="width: 250px;" class="bt-input-text mr5" name="db_name" value="'+db_name+'" type="text"></p>'
|
|
mlist += '<p><span>用户名</span><input style="width: 250px;" class="bt-input-text mr5" name="db_user" value="'+db_user+'" type="text"></p>'
|
|
mlist += '<p><span>密码</span><input style="width: 250px;" class="bt-input-text mr5" name="db_pass" value="'+db_pass+'" type="text"></p>'
|
|
|
|
var option = '<style>.conf_p p{margin-bottom: 2px}</style>\
|
|
<div class="conf_p" style="margin-bottom:0">\
|
|
' + mlist + '\
|
|
<div style="margin-top:10px; padding-right:15px" class="text-right">\
|
|
<button class="btn btn-success btn-sm" onclick="submitDbConf()">保存</button>\
|
|
</div>\
|
|
</div>';
|
|
$(".soft-man-con").html(option);
|
|
});
|
|
}
|
|
|
|
function submitDbConf(){
|
|
|
|
var pull_data = {};
|
|
|
|
pull_data['db_host'] = $('input[name="db_host"]').val();
|
|
pull_data['db_port'] = $('input[name="db_port"]').val();
|
|
pull_data['db_name'] = $('input[name="db_name"]').val();
|
|
pull_data['db_user'] = $('input[name="db_user"]').val();
|
|
pull_data['db_pass'] = $('input[name="db_pass"]').val();
|
|
|
|
appPost('set_db_conf',pull_data,function(data){
|
|
var rdata = $.parseJSON(data.data);
|
|
layer.msg(rdata['msg'],{icon:rdata['status']?1:2,time:2000,shade: [0.3, '#000']});
|
|
});
|
|
}
|
|
|
|
|
|
function userConf(){
|
|
appPost('get_user_conf','',function(data){
|
|
var rdata = $.parseJSON(data.data);
|
|
var app_key = 'app_key';
|
|
var secret = 'secret';
|
|
var password = 'password';
|
|
var uid = 'uid';
|
|
var exchange = 'okex';
|
|
if(rdata['status']){
|
|
db_data = rdata['data'];
|
|
app_key = db_data['app_key'];
|
|
secret = db_data['secret'];
|
|
password = db_data['password'];
|
|
uid = db_data['uid'];
|
|
exchange = db_data['exchange'];;
|
|
}
|
|
|
|
var mlist = '';
|
|
mlist += '<p><span>交易所</span><input style="width: 250px;" class="bt-input-text mr5" name="exchange" value="'+exchange+'" type="text"><font>必填写[okex, binance]</font></p>'
|
|
mlist += '<p><span>apiKey</span><input style="width: 250px;" class="bt-input-text mr5" name="app_key" value="'+app_key+'" type="text"><font>必填写</font></p>'
|
|
mlist += '<p><span>secret</span><input style="width: 250px;" class="bt-input-text mr5" name="secret" value="'+secret+'" type="text"><font>必填写</font></p>'
|
|
mlist += '<p><span>password</span><input style="width: 250px;" class="bt-input-text mr5" name="password" value="'+password+'" type="text"><font>根据情况填写</font></p>'
|
|
mlist += '<p><span>uid</span><input style="width: 250px;" class="bt-input-text mr5" name="uid" value="'+uid+'" type="text"><font>根据情况填写</font></p>'
|
|
|
|
var option = '<style>.conf_p p{margin-bottom: 2px}</style>\
|
|
<div class="conf_p" style="margin-bottom:0">\
|
|
' + mlist + '\
|
|
<div style="margin-top:10px; padding-right:15px" class="text-right">\
|
|
<button class="btn btn-success btn-sm" onclick="submitUserConf()">保存</button>\
|
|
</div>\
|
|
</div>';
|
|
$(".soft-man-con").html(option);
|
|
});
|
|
}
|
|
|
|
|
|
function submitUserConf(){
|
|
var pull_data = {};
|
|
|
|
pull_data['app_key'] = $('input[name="app_key"]').val();
|
|
pull_data['secret'] = $('input[name="secret"]').val();
|
|
pull_data['password'] = $('input[name="password"]').val();
|
|
pull_data['uid'] = $('input[name="uid"]').val();
|
|
pull_data['exchange'] = $('input[name="exchange"]').val();
|
|
|
|
appPost('set_user_conf',pull_data,function(data){
|
|
var rdata = $.parseJSON(data.data);
|
|
layer.msg(rdata['msg'],{icon:rdata['status']?1:2,time:2000,shade: [0.3, '#000']});
|
|
});
|
|
}
|
|
|
|
function syncDataList(){
|
|
appPost('sync_data_list', {}, function(data){
|
|
var rdata = $.parseJSON(data.data);
|
|
|
|
|
|
var list = '';
|
|
if (rdata['status']){
|
|
var dlist = rdata['data']['list'];
|
|
for(i in dlist){
|
|
|
|
list += '<tr>';
|
|
list += '<td>' + dlist[i] +'</td>';
|
|
list += '<td style="text-align:right">' +
|
|
'<a href="javascript:;" class="btlink" onclick="syncDataDelete(\''+dlist[i]+'\')" title="删除">删除</a>' +
|
|
'</td>';
|
|
list += '</tr>';
|
|
}
|
|
}
|
|
|
|
|
|
if( list == '' ){
|
|
list = "<tr><td colspan='2'>当前没有数据</td></tr>";
|
|
}
|
|
|
|
var task_status = rdata['data']['task_status'];
|
|
var task_status_check = '';
|
|
if (task_status){
|
|
task_status_check = 'checked';
|
|
}
|
|
|
|
var con = '<div class="safe bgw">\
|
|
<div>\
|
|
<button onclick="syncDataAdd()" title="添加币种" class="btn btn-success btn-sm" type="button" style="margin-right: 5px;">添加币种</button>\
|
|
<div class="ss-text pull-left mr50">\
|
|
<em>是否启动</em>\
|
|
<div class="ssh-item">\
|
|
<input class="btswitch btswitch-ios" id="add_task" type="checkbox" '+task_status_check+'>\
|
|
<label class="btswitch-btn" for="add_task" onclick="syncDataAddTask()"></label>\
|
|
</div>\
|
|
</div>\
|
|
</div>\
|
|
<div class="divtable mtb10">\
|
|
<div class="tablescroll">\
|
|
<table id="DataBody" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
|
|
<thead>\
|
|
<th>名称</th>\
|
|
<th style="text-align:right;">操作</th></tr>\
|
|
</thead>\
|
|
<tbody>'+ list +'</tbody>\
|
|
</table>\
|
|
</div>\
|
|
</div>\
|
|
</div>';
|
|
|
|
con += '<div class="code">\
|
|
<span>详细如下:</span>\
|
|
<span>*:添加同步的币种,都小写,以USDT为本币同步数据。</span>\
|
|
<span>*:需要提前安装supervisor插件。</span>\
|
|
</div>'
|
|
|
|
$(".soft-man-con").html(con);
|
|
$('#databasePage').html(rdata.page);
|
|
});
|
|
}
|
|
|
|
function syncDataAddTask(){
|
|
var at_check = $('#add_task').prop('checked');
|
|
appPost("sync_data_add_task", {'check':at_check?'0':'1'}, function(data){
|
|
rdata = $.parseJSON(data.data);
|
|
|
|
showMsg(rdata.msg,function(){
|
|
if (rdata.status){
|
|
syncDataList();
|
|
}
|
|
},{icon:rdata.status?1:2});
|
|
});
|
|
}
|
|
|
|
function syncDataDelete(name){
|
|
appPost("sync_data_delete", {"token":name}, function(data){
|
|
rdata = $.parseJSON(data.data);
|
|
|
|
showMsg(rdata.msg,function(){
|
|
if (rdata.status){
|
|
syncDataList();
|
|
}
|
|
},{icon:rdata.status?1:2});
|
|
});
|
|
}
|
|
|
|
function syncDataAdd() {
|
|
layer.open({
|
|
type: 1,
|
|
area: '500px',
|
|
title: '添加同步数据',
|
|
closeBtn: 2,
|
|
shift: 0,
|
|
shadeClose: false,
|
|
btn: ['确定', '取消'],
|
|
content: "<div class='bt_conter bt-form pd15' style='height:auto;width:100%;'>\
|
|
<div class='line'>\
|
|
<span class='tname'>名称</span>\
|
|
<div class='info-r c4'>\
|
|
<input id='name' class='bt-input-text' type='text' name='name' placeholder='请输入名称' style='width:270px' />\
|
|
</div>\
|
|
</div>\
|
|
<ul class='help-info-text c7' style='padding-left: 29px;margin-top:5px;'>\
|
|
<li style='color:#F00'>注意:币种名称用小写!</li>\
|
|
</ul>\
|
|
</div>",
|
|
yes: function(index, layero){
|
|
|
|
var token = $('input[name="name"]').val();
|
|
appPost("sync_data_add", {"token":token}, function(data){
|
|
rdata = $.parseJSON(data.data);
|
|
showMsg(rdata.msg,function(){
|
|
if (rdata.status){
|
|
layer.close(index);
|
|
syncDataList();
|
|
}
|
|
},{icon:rdata.status?1:2});
|
|
})
|
|
return;
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
function onlineEditStrategyFile(k, f, tag) {
|
|
if(k != 0) {
|
|
var l = $("#PathPlace input").val();
|
|
var h = $("#textBody").val();
|
|
var a = $("select[name=encoding]").val();
|
|
var loadT = layer.msg("正在保存中...", {icon: 16,time: 0});
|
|
appPostCallbakNoMsg('save_body',{'data':h,'path':f,'encoding':a,"tag":tag}, function(data){
|
|
var rdata = data.data;
|
|
showMsg(rdata.msg, function(){
|
|
if (rdata.status){
|
|
layer.close(loadT);
|
|
}
|
|
},{icon: rdata.status ? 1 : 2});
|
|
});
|
|
return
|
|
}
|
|
var e = layer.msg("正在读取文件,请稍候...", {icon: 16,time: 0});
|
|
var g = f.split(".");
|
|
var b = g[g.length - 1];
|
|
var d;
|
|
switch(b) {
|
|
case "html":
|
|
var j = {
|
|
name: "htmlmixed",
|
|
scriptTypes: [{
|
|
matches: /\/x-handlebars-template|\/x-mustache/i,
|
|
mode: null
|
|
}, {
|
|
matches: /(text|application)\/(x-)?vb(a|script)/i,
|
|
mode: "vbscript"
|
|
}]
|
|
};
|
|
d = j;
|
|
break;
|
|
case "htm":
|
|
var j = {
|
|
name: "htmlmixed",
|
|
scriptTypes: [{
|
|
matches: /\/x-handlebars-template|\/x-mustache/i,
|
|
mode: null
|
|
}, {
|
|
matches: /(text|application)\/(x-)?vb(a|script)/i,
|
|
mode: "vbscript"
|
|
}]
|
|
};
|
|
d = j;
|
|
break;
|
|
case "js":
|
|
d = "text/javascript";
|
|
break;
|
|
case "json":
|
|
d = "application/ld+json";
|
|
break;
|
|
case "css":
|
|
d = "text/css";
|
|
break;
|
|
case "php":
|
|
d = "application/x-httpd-php";
|
|
break;
|
|
case "tpl":
|
|
d = "application/x-httpd-php";
|
|
break;
|
|
case "xml":
|
|
d = "application/xml";
|
|
break;
|
|
case "sql":
|
|
d = "text/x-sql";
|
|
break;
|
|
case "conf":
|
|
d = "text/x-nginx-conf";
|
|
break;
|
|
default:
|
|
var j = {
|
|
name: "htmlmixed",
|
|
scriptTypes: [{
|
|
matches: /\/x-handlebars-template|\/x-mustache/i,
|
|
mode: null
|
|
}, {
|
|
matches: /(text|application)\/(x-)?vb(a|script)/i,
|
|
mode: "vbscript"
|
|
}]
|
|
};
|
|
d = j
|
|
}
|
|
$.post("/files/get_body", "path=" + encodeURIComponent(f), function(s) {
|
|
if(s.status === false){
|
|
layer.msg(s.msg,{icon:5});
|
|
return;
|
|
}
|
|
layer.close(e);
|
|
var u = ["utf-8", "GBK", "GB2312", "BIG5"];
|
|
var n = "";
|
|
var m = "";
|
|
var o = "";
|
|
for(var p = 0; p < u.length; p++) {
|
|
m = s.data.encoding == u[p] ? "selected" : "";
|
|
n += '<option value="' + u[p] + '" ' + m + ">" + u[p] + "</option>";
|
|
}
|
|
var code_mirror = null;
|
|
var r = layer.open({
|
|
type: 1,
|
|
shift: 5,
|
|
closeBtn: 1,
|
|
area: ["90%", "90%"],
|
|
title: "在线编辑[" + f + "]",
|
|
btn:['保存','关闭'],
|
|
content: '<form class="bt-form pd20">\
|
|
<div class="line">\
|
|
<p style="color:red;margin-bottom:10px">提示:Ctrl+F 搜索关键字,Ctrl+G 查找下一个,Ctrl+S 保存,Ctrl+Shift+R 查找替换!\
|
|
<select class="bt-input-text" name="encoding" style="width: 74px;position: absolute;top: 31px;right: 19px;height: 22px;z-index: 9999;border-radius: 0;">' + n + '</select>\
|
|
</p>\
|
|
<textarea class="mCustomScrollbar bt-input-text" id="textBody" style="width:100%;margin:0 auto;line-height: 1.8;position: relative;top: 10px;" value="" />\
|
|
</div>\
|
|
</form>',
|
|
success:function(){
|
|
$("#textBody").text(s.data.data);
|
|
var q = $(window).height() * 0.9;
|
|
$("#textBody").height(q - 160);
|
|
code_mirror = CodeMirror.fromTextArea(document.getElementById("textBody"), {
|
|
extraKeys: {
|
|
"Ctrl-F": "findPersistent",
|
|
"Ctrl-H": "replaceAll",
|
|
"Ctrl-S": function() {
|
|
$("#textBody").text(code_mirror.getValue());
|
|
onlineEditStrategyFile(2, f,tag);
|
|
},
|
|
"Cmd-S":function() {
|
|
$("#textBody").text(code_mirror.getValue());
|
|
onlineEditStrategyFile(2, f,tag);
|
|
},
|
|
},
|
|
mode: d,
|
|
lineNumbers: true,
|
|
matchBrackets: true,
|
|
matchtags: true,
|
|
autoMatchParens: true
|
|
});
|
|
code_mirror.focus();
|
|
code_mirror.setSize("auto", q - 150);
|
|
$(window).resize(function(){
|
|
var q = $(window).height() * 0.9;
|
|
code_mirror.setSize("auto", q - 150);
|
|
});
|
|
},
|
|
yes:function(){
|
|
$("#textBody").text(code_mirror.getValue());
|
|
onlineEditStrategyFile(1, f, tag);
|
|
}
|
|
});
|
|
//////////////////
|
|
},'json');
|
|
}
|
|
|
|
|
|
// ------------------------------------------------------------------------------
|
|
// ------------------------------------------------------------------------------
|
|
// 大屏页功能 --------------------------------------------------------------------
|
|
// ------------------------------------------------------------------------------
|
|
// ------------------------------------------------------------------------------
|
|
|
|
|
|
function changeDivH(){
|
|
var l = $(window).height();
|
|
$('.content-screen').css('height',l-80);
|
|
$('.s-right').css('height',l-80-10);
|
|
$('.s-left').css('height',l-80-10);
|
|
}
|
|
|
|
|
|
function dataSourceLog(){
|
|
appPostCallbakNoMsg('get_datasource_logs',{}, function(rdata){
|
|
$('#datasource_log').html(rdata.data);
|
|
});
|
|
}
|
|
|
|
function dataStrategyLog(){
|
|
appPostCallbakNoMsg('get_strategy_logs',{}, function(rdata){
|
|
$('#strategy_log').html(rdata.data);
|
|
});
|
|
}
|
|
|
|
|
|
// $('#strategy_list').find('span[data-id="01"]')
|
|
function setStrategyStatus(id,status){
|
|
appPostCallbakNoMsg('set_strategy_status',{"id":id,"status":status}, function(data){
|
|
var rdata = data.data;
|
|
showMsg(rdata.msg,function(){
|
|
if (rdata.status){
|
|
if (status == 'start'){
|
|
$('#strategy_list').find('tr[data-id="'+id+'"] td span').removeClass('glyphicon-pause').addClass('glyphicon-play').css('color','#20a53a');
|
|
} else{
|
|
$('#strategy_list').find('tr[data-id="'+id+'"] td span').removeClass('glyphicon-play').addClass('glyphicon-pause').css('color','red');
|
|
}
|
|
}
|
|
},{icon:rdata.status?1:2},2000);
|
|
});
|
|
}
|
|
|
|
|
|
function setStrategyRestart(id){
|
|
appPostCallbakNoMsg('set_strategy_restart',{"id":id}, function(data){
|
|
console.log(data);
|
|
var rdata = data.data;
|
|
showMsg(rdata.msg,function(){
|
|
if (rdata.status){
|
|
}
|
|
},{icon:rdata.status?1:2},2000);
|
|
});
|
|
}
|
|
|
|
function setStrategyEdit(id){
|
|
appPostCallbakNoMsg('get_strategy_path',{"id":id}, function(data){
|
|
onlineEditStrategyFile(0,data.data.msg,id);
|
|
});
|
|
}
|
|
|
|
|
|
function getStrategyList(p=1){
|
|
appPostCallbakNoMsg('get_strategy_list',{'page':p}, function(rdata){
|
|
// console.log(rdata);
|
|
|
|
ldata = rdata.data.data;
|
|
var tBody = '';
|
|
|
|
for (var i = 0; i < ldata.length; i++) {
|
|
tBody += '<tr data-id="'+ldata[i]['id']+'">'
|
|
tBody += '<td>'+ldata[i]['id']+'</td>';
|
|
tBody += '<td>'+ldata[i]['name']+'</td>';
|
|
|
|
if (ldata[i]['status'] == 'start'){
|
|
tBody += '<td><span style="color:#20a53a;cursor: pointer;" class="strategy_status glyphicon glyphicon-play"></span></td>';
|
|
} else{
|
|
tBody += '<td><span style="color:red;cursor: pointer;" class="strategy_status glyphicon glyphicon-pause"></span></td>';
|
|
}
|
|
|
|
tBody += "<td style='text-align: right;'><a class='btlink restart'>重启</a> | <a class='btlink edit'>编辑</a></td>";
|
|
tBody +='<tr>';
|
|
}
|
|
|
|
// console.log(tBody);
|
|
$('#strategy_list').html(tBody);
|
|
$('#strategy_list_page').html(rdata.data.list);
|
|
|
|
|
|
$('#strategy_list .strategy_status').click(function(){
|
|
var id = $(this).parent().parent().data('id');
|
|
var status = 'stop';
|
|
if ($(this).hasClass('glyphicon-pause')){
|
|
status = 'start';
|
|
}
|
|
setStrategyStatus(id,status);
|
|
});
|
|
|
|
$('#strategy_list .restart').click(function(){
|
|
var id = $(this).parent().parent().data('id');
|
|
setStrategyRestart(id);
|
|
});
|
|
|
|
$('#strategy_list .edit').click(function(){
|
|
var id = $(this).parent().parent().data('id');
|
|
setStrategyEdit(id);
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
function calcKLineChats(){
|
|
|
|
var chartDom = document.getElementById('k_echarts');
|
|
var myChart = echarts.init(chartDom);
|
|
var option;
|
|
|
|
const upColor = '#ec0000';
|
|
const upBorderColor = '#8A0000';
|
|
const downColor = '#00da3c';
|
|
const downBorderColor = '#008F28';
|
|
// Each item: open,close,lowest,highest
|
|
const data0 = splitData([
|
|
['2013/1/24', 2320.26, 2320.26, 2287.3, 2362.94],
|
|
['2013/1/25', 2300, 2291.3, 2288.26, 2308.38],
|
|
['2013/1/28', 2295.35, 2346.5, 2295.35, 2346.92],
|
|
['2013/1/29', 2347.22, 2358.98, 2337.35, 2363.8],
|
|
['2013/1/30', 2360.75, 2382.48, 2347.89, 2383.76],
|
|
['2013/1/31', 2383.43, 2385.42, 2371.23, 2391.82],
|
|
['2013/2/1', 2377.41, 2419.02, 2369.57, 2421.15],
|
|
['2013/2/4', 2425.92, 2428.15, 2417.58, 2440.38],
|
|
['2013/2/5', 2411, 2433.13, 2403.3, 2437.42],
|
|
['2013/2/6', 2432.68, 2434.48, 2427.7, 2441.73],
|
|
['2013/2/7', 2430.69, 2418.53, 2394.22, 2433.89],
|
|
['2013/2/8', 2416.62, 2432.4, 2414.4, 2443.03],
|
|
['2013/2/18', 2441.91, 2421.56, 2415.43, 2444.8],
|
|
['2013/2/19', 2420.26, 2382.91, 2373.53, 2427.07],
|
|
['2013/2/20', 2383.49, 2397.18, 2370.61, 2397.94],
|
|
['2013/2/21', 2378.82, 2325.95, 2309.17, 2378.82],
|
|
['2013/2/22', 2322.94, 2314.16, 2308.76, 2330.88],
|
|
['2013/2/25', 2320.62, 2325.82, 2315.01, 2338.78],
|
|
['2013/2/26', 2313.74, 2293.34, 2289.89, 2340.71],
|
|
['2013/2/27', 2297.77, 2313.22, 2292.03, 2324.63],
|
|
['2013/2/28', 2322.32, 2365.59, 2308.92, 2366.16],
|
|
['2013/3/1', 2364.54, 2359.51, 2330.86, 2369.65],
|
|
['2013/3/4', 2332.08, 2273.4, 2259.25, 2333.54],
|
|
['2013/3/5', 2274.81, 2326.31, 2270.1, 2328.14],
|
|
['2013/3/6', 2333.61, 2347.18, 2321.6, 2351.44],
|
|
['2013/3/7', 2340.44, 2324.29, 2304.27, 2352.02],
|
|
['2013/3/8', 2326.42, 2318.61, 2314.59, 2333.67],
|
|
['2013/3/11', 2314.68, 2310.59, 2296.58, 2320.96],
|
|
['2013/3/12', 2309.16, 2286.6, 2264.83, 2333.29],
|
|
['2013/3/13', 2282.17, 2263.97, 2253.25, 2286.33],
|
|
['2013/3/14', 2255.77, 2270.28, 2253.31, 2276.22],
|
|
['2013/3/15', 2269.31, 2278.4, 2250, 2312.08],
|
|
['2013/3/18', 2267.29, 2240.02, 2239.21, 2276.05],
|
|
['2013/3/19', 2244.26, 2257.43, 2232.02, 2261.31],
|
|
['2013/3/20', 2257.74, 2317.37, 2257.42, 2317.86],
|
|
['2013/3/21', 2318.21, 2324.24, 2311.6, 2330.81],
|
|
['2013/3/22', 2321.4, 2328.28, 2314.97, 2332],
|
|
['2013/3/25', 2334.74, 2326.72, 2319.91, 2344.89],
|
|
['2013/3/26', 2318.58, 2297.67, 2281.12, 2319.99],
|
|
['2013/3/27', 2299.38, 2301.26, 2289, 2323.48],
|
|
['2013/3/28', 2273.55, 2236.3, 2232.91, 2273.55],
|
|
['2013/3/29', 2238.49, 2236.62, 2228.81, 2246.87],
|
|
['2013/4/1', 2229.46, 2234.4, 2227.31, 2243.95],
|
|
['2013/4/2', 2234.9, 2227.74, 2220.44, 2253.42],
|
|
['2013/4/3', 2232.69, 2225.29, 2217.25, 2241.34],
|
|
['2013/4/8', 2196.24, 2211.59, 2180.67, 2212.59],
|
|
['2013/4/9', 2215.47, 2225.77, 2215.47, 2234.73],
|
|
['2013/4/10', 2224.93, 2226.13, 2212.56, 2233.04],
|
|
['2013/4/11', 2236.98, 2219.55, 2217.26, 2242.48],
|
|
['2013/4/12', 2218.09, 2206.78, 2204.44, 2226.26],
|
|
['2013/4/15', 2199.91, 2181.94, 2177.39, 2204.99],
|
|
['2013/4/16', 2169.63, 2194.85, 2165.78, 2196.43],
|
|
['2013/4/17', 2195.03, 2193.8, 2178.47, 2197.51],
|
|
['2013/4/18', 2181.82, 2197.6, 2175.44, 2206.03],
|
|
['2013/4/19', 2201.12, 2244.64, 2200.58, 2250.11],
|
|
['2013/4/22', 2236.4, 2242.17, 2232.26, 2245.12],
|
|
['2013/4/23', 2242.62, 2184.54, 2182.81, 2242.62],
|
|
['2013/4/24', 2187.35, 2218.32, 2184.11, 2226.12],
|
|
['2013/4/25', 2213.19, 2199.31, 2191.85, 2224.63],
|
|
['2013/4/26', 2203.89, 2177.91, 2173.86, 2210.58],
|
|
['2013/5/2', 2170.78, 2174.12, 2161.14, 2179.65],
|
|
['2013/5/3', 2179.05, 2205.5, 2179.05, 2222.81],
|
|
['2013/5/6', 2212.5, 2231.17, 2212.5, 2236.07],
|
|
['2013/5/7', 2227.86, 2235.57, 2219.44, 2240.26],
|
|
['2013/5/8', 2242.39, 2246.3, 2235.42, 2255.21],
|
|
['2013/5/9', 2246.96, 2232.97, 2221.38, 2247.86],
|
|
['2013/5/10', 2228.82, 2246.83, 2225.81, 2247.67],
|
|
['2013/5/13', 2247.68, 2241.92, 2231.36, 2250.85],
|
|
['2013/5/14', 2238.9, 2217.01, 2205.87, 2239.93],
|
|
['2013/5/15', 2217.09, 2224.8, 2213.58, 2225.19],
|
|
['2013/5/16', 2221.34, 2251.81, 2210.77, 2252.87],
|
|
['2013/5/17', 2249.81, 2282.87, 2248.41, 2288.09],
|
|
['2013/5/20', 2286.33, 2299.99, 2281.9, 2309.39],
|
|
['2013/5/21', 2297.11, 2305.11, 2290.12, 2305.3],
|
|
['2013/5/22', 2303.75, 2302.4, 2292.43, 2314.18],
|
|
['2013/5/23', 2293.81, 2275.67, 2274.1, 2304.95],
|
|
['2013/5/24', 2281.45, 2288.53, 2270.25, 2292.59],
|
|
['2013/5/27', 2286.66, 2293.08, 2283.94, 2301.7],
|
|
['2013/5/28', 2293.4, 2321.32, 2281.47, 2322.1],
|
|
['2013/5/29', 2323.54, 2324.02, 2321.17, 2334.33],
|
|
['2013/5/30', 2316.25, 2317.75, 2310.49, 2325.72],
|
|
['2013/5/31', 2320.74, 2300.59, 2299.37, 2325.53],
|
|
['2013/6/3', 2300.21, 2299.25, 2294.11, 2313.43],
|
|
['2013/6/4', 2297.1, 2272.42, 2264.76, 2297.1],
|
|
['2013/6/5', 2270.71, 2270.93, 2260.87, 2276.86],
|
|
['2013/6/6', 2264.43, 2242.11, 2240.07, 2266.69],
|
|
['2013/6/7', 2242.26, 2210.9, 2205.07, 2250.63],
|
|
['2013/6/13', 2190.1, 2148.35, 2126.22, 2190.1]
|
|
]);
|
|
function splitData(rawData) {
|
|
const categoryData = [];
|
|
const values = [];
|
|
for (var i = 0; i < rawData.length; i++) {
|
|
categoryData.push(rawData[i].splice(0, 1)[0]);
|
|
values.push(rawData[i]);
|
|
}
|
|
return {
|
|
categoryData: categoryData,
|
|
values: values
|
|
};
|
|
}
|
|
function calculateMA(dayCount) {
|
|
var result = [];
|
|
for (var i = 0, len = data0.values.length; i < len; i++) {
|
|
if (i < dayCount) {
|
|
result.push('-');
|
|
continue;
|
|
}
|
|
var sum = 0;
|
|
for (var j = 0; j < dayCount; j++) {
|
|
sum += +data0.values[i - j][1];
|
|
}
|
|
result.push(sum / dayCount);
|
|
}
|
|
return result;
|
|
}
|
|
option = {
|
|
title: {
|
|
text: '上证指数',
|
|
left: 0
|
|
},
|
|
tooltip: {
|
|
trigger: 'axis',
|
|
axisPointer: {
|
|
type: 'cross'
|
|
}
|
|
},
|
|
legend: {
|
|
data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30']
|
|
},
|
|
grid: {
|
|
left: '10%',
|
|
right: '10%',
|
|
bottom: '15%'
|
|
},
|
|
xAxis: {
|
|
type: 'category',
|
|
data: data0.categoryData,
|
|
boundaryGap: false,
|
|
axisLine: { onZero: false },
|
|
splitLine: { show: false },
|
|
min: 'dataMin',
|
|
max: 'dataMax'
|
|
},
|
|
yAxis: {
|
|
scale: true,
|
|
splitArea: {
|
|
show: true
|
|
}
|
|
},
|
|
dataZoom: [
|
|
{
|
|
type: 'inside',
|
|
start: 50,
|
|
end: 100
|
|
},
|
|
{
|
|
show: true,
|
|
type: 'slider',
|
|
top: '90%',
|
|
start: 50,
|
|
end: 100
|
|
}
|
|
],
|
|
series: [
|
|
{
|
|
name: '日K',
|
|
type: 'candlestick',
|
|
data: data0.values,
|
|
itemStyle: {
|
|
color: upColor,
|
|
color0: downColor,
|
|
borderColor: upBorderColor,
|
|
borderColor0: downBorderColor
|
|
},
|
|
markPoint: {
|
|
label: {
|
|
formatter: function (param) {
|
|
return param != null ? Math.round(param.value) + '' : '';
|
|
}
|
|
},
|
|
data: [
|
|
{
|
|
name: 'Mark',
|
|
coord: ['2013/5/31', 2300],
|
|
value: 2300,
|
|
itemStyle: {
|
|
color: 'rgb(41,60,85)'
|
|
}
|
|
},
|
|
{
|
|
name: 'highest value',
|
|
type: 'max',
|
|
valueDim: 'highest'
|
|
},
|
|
{
|
|
name: 'lowest value',
|
|
type: 'min',
|
|
valueDim: 'lowest'
|
|
},
|
|
{
|
|
name: 'average value on close',
|
|
type: 'average',
|
|
valueDim: 'close'
|
|
}
|
|
],
|
|
tooltip: {
|
|
formatter: function (param) {
|
|
return param.name + '<br>' + (param.data.coord || '');
|
|
}
|
|
}
|
|
},
|
|
markLine: {
|
|
symbol: ['none', 'none'],
|
|
data: [
|
|
[
|
|
{
|
|
name: 'from lowest to highest',
|
|
type: 'min',
|
|
valueDim: 'lowest',
|
|
symbol: 'circle',
|
|
symbolSize: 10,
|
|
label: {
|
|
show: false
|
|
},
|
|
emphasis: {
|
|
label: {
|
|
show: false
|
|
}
|
|
}
|
|
},
|
|
{
|
|
type: 'max',
|
|
valueDim: 'highest',
|
|
symbol: 'circle',
|
|
symbolSize: 10,
|
|
label: {
|
|
show: false
|
|
},
|
|
emphasis: {
|
|
label: {
|
|
show: false
|
|
}
|
|
}
|
|
}
|
|
],
|
|
{
|
|
name: 'min line on close',
|
|
type: 'min',
|
|
valueDim: 'close'
|
|
},
|
|
{
|
|
name: 'max line on close',
|
|
type: 'max',
|
|
valueDim: 'close'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
name: 'MA5',
|
|
type: 'line',
|
|
data: calculateMA(5),
|
|
smooth: true,
|
|
lineStyle: {
|
|
opacity: 0.5
|
|
}
|
|
},
|
|
{
|
|
name: 'MA10',
|
|
type: 'line',
|
|
data: calculateMA(10),
|
|
smooth: true,
|
|
lineStyle: {
|
|
opacity: 0.5
|
|
}
|
|
},
|
|
{
|
|
name: 'MA20',
|
|
type: 'line',
|
|
data: calculateMA(20),
|
|
smooth: true,
|
|
lineStyle: {
|
|
opacity: 0.5
|
|
}
|
|
},
|
|
{
|
|
name: 'MA30',
|
|
type: 'line',
|
|
data: calculateMA(30),
|
|
smooth: true,
|
|
lineStyle: {
|
|
opacity: 0.5
|
|
}
|
|
}
|
|
]
|
|
};
|
|
|
|
option && myChart.setOption(option);
|
|
}
|
|
|
|
$(document).ready(function(){
|
|
var tag = $.getUrlParam('tag');
|
|
if(tag == 'cryptocurrency_trade'){
|
|
changeDivH();
|
|
|
|
// 获取数据源更新日志
|
|
dataSourceLog();
|
|
setInterval(function(){
|
|
dataSourceLog();
|
|
},3000);
|
|
|
|
// 获取策略更新日志
|
|
dataStrategyLog();
|
|
setInterval(function(){
|
|
dataStrategyLog();
|
|
},5000);
|
|
|
|
getStrategyList(1);
|
|
|
|
calcKLineChats();
|
|
}
|
|
});
|
|
|
|
$(window).resize(function(){
|
|
changeDivH();
|
|
});
|
|
|
|
|
|
|