2018-12-08 12:40:55 +08:00
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
> Name
|
2018-12-08 12:40:55 +08:00
|
|
|
|
2023-04-18 23:12:35 +08:00
|
|
|
多交易所集合行情-下单-策略-范例
|
2018-12-08 12:40:55 +08:00
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
> Author
|
2018-12-08 12:40:55 +08:00
|
|
|
|
2025-04-30 11:10:28 +08:00
|
|
|
发明者量化-小小梦
|
2018-12-08 12:40:55 +08:00
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
> Strategy Description
|
2018-12-08 12:40:55 +08:00
|
|
|
|
2018-12-08 12:48:26 +08:00
|
|
|

|
2018-12-08 12:40:55 +08:00
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
> Strategy Arguments
|
2018-12-08 12:40:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
|Argument|Default|Description|
|
2019-03-10 14:59:52 +08:00
|
|
|
|----|----|----|
|
|
|
|
|
|StrProxy|socks5://|代理配置|
|
|
|
|
|
|
|
|
|
|
|
2018-12-08 12:40:55 +08:00
|
|
|
|
|
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
|Button|Default|Description|
|
2018-12-08 12:40:55 +08:00
|
|
|
|----|----|----|
|
|
|
|
|
|UpdateAmount|0.1|修改下单量|
|
|
|
|
|
|
|
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
> Source (javascript)
|
2018-12-08 12:40:55 +08:00
|
|
|
|
|
|
|
|
``` javascript
|
|
|
|
|
// 参数,可设置到界面。
|
|
|
|
|
var Interval = 100
|
|
|
|
|
var TickerInterval = 1000
|
|
|
|
|
var RecordsInterval = 1000
|
|
|
|
|
|
|
|
|
|
// 全局变量
|
|
|
|
|
var Amount = 0.1
|
|
|
|
|
|
|
|
|
|
function CreateExchanges(){
|
|
|
|
|
var exs = {
|
|
|
|
|
// 交易所对象
|
|
|
|
|
ex_objs : [],
|
|
|
|
|
|
|
|
|
|
// exs 的属性
|
|
|
|
|
table : null,
|
|
|
|
|
tickerInterval : 0,
|
|
|
|
|
recordsInterval : 0,
|
|
|
|
|
runCount : 0,
|
|
|
|
|
}
|
|
|
|
|
// 初始化
|
|
|
|
|
exs.tickerInterval = TickerInterval
|
|
|
|
|
exs.recordsInterval = RecordsInterval
|
|
|
|
|
|
|
|
|
|
var funcDict = {
|
|
|
|
|
"GetTicker" : ["routine_ticker", "ticker", "tickerPreTime"],
|
|
|
|
|
"GetRecords" : ["routine_records", "records", "recordsPreTime"],
|
|
|
|
|
"Trade" : ["routine_trade", "trade", "tradePreTime"], // 可扩展挂单,多线程发单等功能
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化
|
|
|
|
|
var timeStamp = new Date().getTime()
|
|
|
|
|
for(var i = 0 ; i < exchanges.length ; i++){
|
|
|
|
|
var obj = {
|
|
|
|
|
name : exchanges[i].GetName(),
|
|
|
|
|
currency : exchanges[i].GetCurrency(),
|
|
|
|
|
index : i,
|
|
|
|
|
routine_ticker : null,
|
|
|
|
|
ticker : null,
|
|
|
|
|
tickerPre : null,
|
|
|
|
|
tickerPreTime : timeStamp,
|
|
|
|
|
routine_trade : null,
|
|
|
|
|
trade : null,
|
|
|
|
|
tradePreTime : timeStamp,
|
|
|
|
|
routine_records : null,
|
|
|
|
|
records : null,
|
|
|
|
|
recordsPre : null,
|
|
|
|
|
recordsPreTime : timeStamp,
|
|
|
|
|
recordsPreBarTime : 0,
|
|
|
|
|
rows : null,
|
|
|
|
|
|
|
|
|
|
}
|
2019-03-10 14:59:52 +08:00
|
|
|
// 设置代理
|
|
|
|
|
exchanges[i].SetProxy(StrProxy)
|
|
|
|
|
|
2018-12-08 12:40:55 +08:00
|
|
|
exs.ex_objs.push(obj)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exs.Go = function(func, interval){
|
|
|
|
|
var self = this
|
|
|
|
|
if(typeof(func) == "undefined"){
|
|
|
|
|
throw "error, no param func"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_.each(self.ex_objs, function(obj){
|
|
|
|
|
if(typeof(obj[funcDict[func][1]]) !== "undefined"){
|
|
|
|
|
obj[funcDict[func][0]] = exchanges[obj.index].Go(func)
|
|
|
|
|
obj[funcDict[func][2]] = new Date().getTime()
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
Sleep(interval)
|
|
|
|
|
|
|
|
|
|
_.each(self.ex_objs, function(obj){
|
|
|
|
|
obj[funcDict[func][1]] = obj[funcDict[func][0]].wait(10)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exs.TableUpdate = function(){
|
|
|
|
|
var self = this
|
|
|
|
|
|
|
|
|
|
self.table = {
|
|
|
|
|
type : "table",
|
|
|
|
|
title : "交易所行情",
|
|
|
|
|
cols : ["名称", "交易对", "卖一价", "买一价", "最新成交价", "操作A", "操作B", "最近一次请求耗时"],
|
|
|
|
|
rows : [],
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_.each(self.ex_objs, function(obj){
|
|
|
|
|
var ticker = obj.ticker
|
|
|
|
|
if(typeof(ticker) == "undefined" || !ticker){
|
|
|
|
|
ticker = obj.tickerPre ? obj.tickerPre : {Buy : "Nan", Sell : "Nan", Last : "Nan", High : "Nan", Low : "Nan"}
|
|
|
|
|
}
|
|
|
|
|
self.table.rows.push([
|
|
|
|
|
obj.name,
|
|
|
|
|
obj.currency,
|
|
|
|
|
ticker.Sell,
|
|
|
|
|
ticker.Buy,
|
|
|
|
|
ticker.Last,
|
|
|
|
|
{
|
|
|
|
|
'type': 'button',
|
|
|
|
|
'cmd': "LogStatus" + "_" + obj.index + "_" + "Buy",
|
|
|
|
|
'name': '买入'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
'type': 'button',
|
|
|
|
|
'cmd': "LogStatus" + "_" + obj.index + "_" + "Sell",
|
|
|
|
|
'class': 'btn btn-xs btn-danger',
|
|
|
|
|
'name': '卖出'
|
|
|
|
|
},
|
|
|
|
|
(new Date().getTime() - obj.tickerPreTime),
|
|
|
|
|
])
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
self.runCount++
|
|
|
|
|
LogStatus("时间:", _D(), "运行次数:", self.runCount, " ", "\n", '`' + JSON.stringify(self.table) + '`')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exs.Chart = function(chartObj, chartCfg){
|
|
|
|
|
var self = this
|
|
|
|
|
|
|
|
|
|
_.each(self.ex_objs, function(obj){
|
|
|
|
|
if(typeof(obj.records) !== "undefined" && obj.records){
|
|
|
|
|
if(obj.recordsPreBarTime == 0){ // 初始化
|
|
|
|
|
for(var i = 0; i < obj.records.length; i++){
|
|
|
|
|
chartObj.add(obj.index, [obj.records[i].Time, obj.records[i].Open, obj.records[i].High, obj.records[i].Low, obj.records[i].Close])
|
|
|
|
|
}
|
|
|
|
|
obj.recordsPreBarTime = obj.records[obj.records.length - 1].Time
|
|
|
|
|
} else {
|
|
|
|
|
if(obj.records[obj.records.length - 1].Time !== obj.recordsPreBarTime){
|
|
|
|
|
chartObj.add(obj.index, [obj.records[obj.records.length - 1].Time, obj.records[obj.records.length - 1].Open, obj.records[obj.records.length - 1].High, obj.records[obj.records.length - 1].Low, obj.records[obj.records.length - 1].Close])
|
|
|
|
|
obj.recordsPreBarTime = obj.records[obj.records.length - 1].Time
|
|
|
|
|
} else {
|
|
|
|
|
chartObj.add(obj.index, [obj.records[obj.records.length - 1].Time, obj.records[obj.records.length - 1].Open, obj.records[obj.records.length - 1].High, obj.records[obj.records.length - 1].Low, obj.records[obj.records.length - 1].Close], -1)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
chartObj.update(chartCfg)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exs.Trade = function(){
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exs.GetTicker = function(){
|
|
|
|
|
var self = this
|
|
|
|
|
self.Go("GetTicker", self.tickerInterval)
|
|
|
|
|
_.each(self.ex_objs, function(obj){
|
|
|
|
|
if(typeof(obj.ticker) !== "undefined" && obj.ticker){
|
|
|
|
|
obj.tickerPre = obj.ticker
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exs.GetRecords = function(){
|
|
|
|
|
var self = this
|
|
|
|
|
self.Go("GetRecords", self.recordsInterval)
|
|
|
|
|
_.each(self.ex_objs, function(obj){
|
|
|
|
|
if(typeof(obj.records) !== "undefined" && obj.records){
|
|
|
|
|
obj.recordsPre = obj.records
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return exs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function main(){
|
|
|
|
|
// 初始化 交易所集合对象
|
|
|
|
|
var exs = CreateExchanges()
|
|
|
|
|
|
|
|
|
|
// 图表初始化
|
|
|
|
|
var arrCfg = []
|
|
|
|
|
for(var i = 0 ; i < exchanges.length ; i++){
|
|
|
|
|
var cfg = {
|
|
|
|
|
title: {
|
|
|
|
|
text: exchanges[i].GetName() + "-" + exchanges[i].GetCurrency()
|
|
|
|
|
},
|
|
|
|
|
xAxis: {
|
|
|
|
|
type: 'datetime'
|
|
|
|
|
},
|
|
|
|
|
series: [{
|
|
|
|
|
type: 'candlestick',
|
|
|
|
|
name: 'K线',
|
|
|
|
|
id: "" + i,
|
|
|
|
|
data: []
|
|
|
|
|
}]
|
|
|
|
|
}
|
|
|
|
|
arrCfg.push(cfg)
|
|
|
|
|
}
|
|
|
|
|
var chart = Chart(arrCfg)
|
|
|
|
|
chart.reset()
|
|
|
|
|
|
|
|
|
|
while(true){
|
|
|
|
|
// 处理交互
|
|
|
|
|
var cmd = GetCommand()
|
|
|
|
|
if(cmd){
|
2019-08-24 12:26:10 +08:00
|
|
|
Log("cmd:", cmd) // 测试
|
|
|
|
|
|
2018-12-08 12:40:55 +08:00
|
|
|
var arr = cmd.split("_")
|
|
|
|
|
if(arr.length == 3){
|
|
|
|
|
var idx = parseInt(arr[1])
|
|
|
|
|
var type = arr[2]
|
|
|
|
|
if(type == "Buy"){
|
|
|
|
|
$.Buy(exchanges[idx], Amount)
|
|
|
|
|
} else if(type == "Sell"){
|
|
|
|
|
$.Sell(exchanges[idx], Amount)
|
|
|
|
|
} else {
|
|
|
|
|
Log("错误的 命令,type:", type, "#FF0000")
|
|
|
|
|
}
|
|
|
|
|
} else if(arr.length == 1) {
|
|
|
|
|
var amount = arr[0].split(":")[1]
|
|
|
|
|
Amount = parseInt(amount)
|
|
|
|
|
}else {
|
|
|
|
|
Log("错误的 命令", "#FF0000")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取 records 数据
|
|
|
|
|
exs.GetRecords()
|
|
|
|
|
// 获取 ticker 数据
|
|
|
|
|
exs.GetTicker()
|
|
|
|
|
|
|
|
|
|
// 处理界面
|
|
|
|
|
exs.TableUpdate()
|
|
|
|
|
exs.Chart(chart, arrCfg)
|
|
|
|
|
|
|
|
|
|
Sleep(Interval)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
> Detail
|
2018-12-08 12:40:55 +08:00
|
|
|
|
|
|
|
|
https://www.fmz.com/strategy/125569
|
|
|
|
|
|
2023-07-14 18:39:48 +08:00
|
|
|
> Last Modified
|
2018-12-08 12:40:55 +08:00
|
|
|
|
2019-08-24 12:26:10 +08:00
|
|
|
2019-07-19 11:44:04
|