量化现货合约跟单交易软件开发策略详情|交易所跟单系统二开定制方案

简介: 量化现货合约跟单交易软件开发策略详情|交易所跟单系统二开定制方案

策略设计成多交易所架构,所以可以在这个策略上配置多个交易所对象,也就是可以控制多个不同账户的下单操作。只用在信号结构中Exchange指定要操作的交易所即可,设置1就是要让这个信号操作第一个添加的交易所对象对应的交易所账户。如果要操作的是现货ContractType设置为spot,期货就写具体合约,例如永续合约写swap。市价单价格传-1就可以了。Action设置对于期货、现货、开仓、平仓都是有区别的,不能设置错。

接下来就可以设计策略代码了,完整的策略代码:

//信号结构
var Template = {

Flag: "45M103Buy",     // 标识,可随意指定
Exchange: 1,           // 指定交易所交易对
Currency: "BTC_USDT",  // 交易对
ContractType: "swap",  // 合约类型,swap,quarter,next_quarter,现货填写spot
Price: "{{close}}",    // 开仓或者平仓价格,-1为市价
Action: "buy",         // 交易类型[ buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多]
Amount: "0",           // 交易量

}

var BaseUrl = "api/v1" // 扩展API接口地址
var RobotId = _G() // 当前实盘ID
var Success = "#5cb85c" // 成功颜色
var Danger = "#ff0000" // 危险颜色
var Warning = "#f0ad4e" // 警告颜色
var buffSignal = []

// 校验信号消息格式
function DiffObject(object1, object2) {

const keys1 = Object.keys(object1)
const keys2 = Object.keys(object2)
if (keys1.length !== keys2.length) {
    return false
}
for (let i = 0; i < keys1.length; i++) {
    if (keys1[i] !== keys2[i]) {
        return false
    }
}
return true

}

function CheckSignal(Signal) {

Signal.Price = parseFloat(Signal.Price)
Signal.Amount = parseFloat(Signal.Amount)
if (Signal.Exchange <= 0 || !Number.isInteger(Signal.Exchange)) {
    Log("交易所最小编号为1,并且为整数", Danger)
    return
}
if (Signal.Amount <= 0 || typeof(Signal.Amount) != "number") {
    Log("交易量不能小于0,并且为数值类型", typeof(Signal.Amount), Danger)
    return
}
if (typeof(Signal.Price) != "number") {
    Log("价格必须是数值", Danger)
    return
}
if (Signal.ContractType == "spot" && Signal.Action != "buy" && Signal.Action != "sell") {
    Log("指令为操作现货,Action错误,Action:", Signal.Action, Danger)
    return
}
if (Signal.ContractType != "spot" && Signal.Action != "long" && Signal.Action != "short" && Signal.Action != "closesell" && Signal.Action != "closebuy") {
    Log("指令为操作期货,Action错误,Action:", Signal.Action, Danger)
    return
}
return true

}

function commandRobot(url, accessKey, secretKey, robotId, cmd) {

// api/v1?access_key=xxx&secret_key=xxx&method=CommandRobot&args=[xxx,+""]
url = url + '?access_key=' + accessKey + '&secret_key=' + secretKey + '&method=CommandRobot&args=[' + robotId + ',+""]'
var postData = {
    method:'POST',
    data:cmd
}
var headers = "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36\nContent-Type: application/json"
var ret = HttpQuery(url, postData, "", headers)
Log("模拟TradingView的webhook请求,发送用于测试的POST请求:", url, "body:", cmd, "应答:", ret)

}

function createManager() {

var self = {}
self.tasks = []

self.process = function() {
    var processed = 0
    if (self.tasks.length > 0) {
        _.each(self.tasks, function(task) {
            if (!task.finished) {
                processed++
                self.pollTask(task)
            }
        })
        if (processed == 0) {
            self.tasks = []
        }
    }
}

self.newTask = function(signal) {
    // {"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"10000","Action":"buy","Amount":"0"}
    var task = {}
    task.Flag = signal["Flag"]
    task.Exchange = signal["Exchange"]
    task.Currency = signal["Currency"]
    task.ContractType = signal["ContractType"]
    task.Price = signal["Price"]
    task.Action = signal["Action"]
    task.Amount = signal["Amount"]
    task.exchangeIdx = signal["Exchange"] - 1
    task.pricePrecision = null
    task.amountPrecision = null
    task.error = null
    task.exchangeLabel = exchanges[task.exchangeIdx].GetLabel()
    task.finished = false

    Log("创建任务:", task)
    self.tasks.push(task)
}

self.getPrecision = function(n) {
    var precision = null
    var arr = n.toString().split(".")
    if (arr.length == 1) {
        precision = 0
    } else if (arr.length == 2) {
        precision = arr[1].length
    }
    return precision
}

self.pollTask = function(task) {
    var e = exchanges[task.exchangeIdx]
    var name = e.GetName()
    var isFutures = true
    e.SetCurrency(task.Currency)
    if (task.ContractType != "spot" && name.indexOf("Futures_") != -1) {
        // 非现货,则设置合约
        e.SetContractType(task.ContractType)
    } else if (task.ContractType == "spot" && name.indexOf("Futures_") == -1) {
        isFutures = false
    } else {
        task.error = "指令中的ContractType与配置的交易所对象类型不匹配"
        return
    }

    var depth = e.GetDepth()
    if (!depth || !depth.Bids || !depth.Asks) {
        task.error = "订单薄数据异常"
        return
    }

    if (depth.Bids.length == 0 && depth.Asks.length == 0) {
        task.error = "盘口无订单"
        return
    }

    _.each([depth.Bids, depth.Asks], function(arr) {
        _.each(arr, function(order) {
            var pricePrecision = self.getPrecision(order.Price)
            var amountPrecision = self.getPrecision(order.Amount)
            if (Number.isInteger(pricePrecision) && !Number.isInteger(self.pricePrecision)) {
                self.pricePrecision = pricePrecision
            } else if (Number.isInteger(self.pricePrecision) && Number.isInteger(pricePrecision) && pricePrecision > self.pricePrecision) {
                self.pricePrecision = pricePrecision
            }
            if (Number.isInteger(amountPrecision) && !Number.isInteger(self.amountPrecision)) {
                self.amountPrecision = amountPrecision
            } else if (Number.isInteger(self.amountPrecision) && Number.isInteger(amountPrecision) && amountPrecision > self.amountPrecision) {
                self.amountPrecision = amountPrecision
            }
        })
    })

    if (!Number.isInteger(self.pricePrecision) || !Number.isInteger(self.amountPrecision)) {
        task.err = "获取精度失败"
        return
    }

    e.SetPrecision(self.pricePrecision, self.amountPrecision)

    // buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多
    var direction = null
    var tradeFunc = null
    if (isFutures) {
        switch (task.Action) {
            case "long":
                direction = "buy"
                tradeFunc = e.Buy
                break
            case "short":
                direction = "sell"
                tradeFunc = e.Sell
                break
            case "closesell":
                direction = "closesell"
                tradeFunc = e.Buy
                break
            case "closebuy":
                direction = "closebuy"
                tradeFunc = e.Sell
                break
        }
        if (!direction || !tradeFunc) {
            task.error = "交易方向错误:" + task.Action
            return
        }
        e.SetDirection(direction)
    } else {
        if (task.Action == "buy") {
            tradeFunc = e.Buy
        } else if (task.Action == "sell") {
            tradeFunc = e.Sell
        } else {
            task.error = "交易方向错误:" + task.Action
            return
        }
    }
    var id = tradeFunc(task.Price, task.Amount)
    if (!id) {
        task.error = "下单失败"
    }

    task.finished = true
}

return self

}

var manager = createManager()
function HandleCommand(signal) {

// 检测是否收到交互指令
if (signal) {
    Log("收到交互指令:", signal)     // 收到交互指令,打印交互指令
} else {
    return                            // 没有收到时直接返回,不做处理
}

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试
if (signal.indexOf("TestSignal") != -1) {
    signal = signal.replace("TestSignal:", "")
    // 调用扩展API接口,模拟Trading View的webhook,交互按钮TestSignal发送的消息:{"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"10000","Action":"buy","Amount":"0"}
    commandRobot(BaseUrl, _AccessKey, _SecretKey, RobotId, signal)
} else if (signal.indexOf("evalCode") != -1) {
    var js = signal.split(':', 2)[1]
    Log("执行调试代码:", js)
    eval(js)
} else {
    // 处理信号指令
    objSignal = JSON.parse(signal)
    if (DiffObject(Template, objSignal)) {
        Log("接收到交易信号指令:", objSignal)
        buffSignal.push(objSignal)

        // 检查交易量、交易所编号
        if (!CheckSignal(objSignal)) {
            return
        }

        // 创建任务
        manager.newTask(objSignal)
    } else {
        Log("指令无法识别", signal)
    }
}

}

function main() {

Log("WebHook地址:", "api/v1?access_key=" + _AccessKey + "&secret_key=" + _SecretKey + "&method=CommandRobot&args=[" + RobotId + ',+""]', Danger)
Log("交易类型[ buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多]", Danger)
Log("指令模板:", JSON.stringify(Template), Danger)

while (true) {
    try {
        // 处理交互
        HandleCommand(GetCommand())

        // 处理任务
        manager.process()

        if (buffSignal.length > maxBuffSignalRowDisplay) {
            buffSignal.shift()
        }
        var buffSignalTbl = {
            "type" : "table",
            "title" : "信号记录",
            "cols" : ["Flag", "Exchange", "Currency", "ContractType", "Price", "Action", "Amount"],
            "rows" : []
        }
        for (var i = buffSignal.length - 1 ; i >= 0 ; i--) {
            buffSignalTbl.rows.push([buffSignal[i].Flag, buffSignal[i].Exchange, buffSignal[i].Currency, buffSignal[i].ContractType, buffSignal[i].Price, buffSignal[i].Action, buffSignal[i].Amount])
        }
        LogStatus(_D(), "\n", "`" + JSON.stringify(buffSignalTbl) + "`")
        Sleep(1000 * SleepInterval)
    } catch (error) {
        Log("e.name:", error.name, "e.stack:", error.stack, "e.message:", error.message)
        Sleep(1000 * 10)
    }
}

}

相关文章
|
存储 算法 安全
秒合约量化跟单交易系统开发源码|指南与方案
由于区块链各节点之间的数据交换必须遵循固定的、预知的算法,因此区块链上节点之间不需要彼此认知
|
1月前
|
监控 数据管理 数据挖掘
量化合约对冲交易软件|合约一键跟单社区平台系统开发技术规则
本文介绍了量化合约对冲交易软件和合约一键跟单社区平台系统的开发技术规则。涵盖编程语言与框架选择、数据获取与处理、策略开发与回测、实时交易与风险管理、用户认证与权限管理、合约管理与跟单功能、数据管理与分析、社区互动与分享以及系统稳定性与安全性等方面。
|
3月前
|
存储 监控 前端开发
现货合约量化交易系统开发技术规则
现货合约量化交易系统的开发是综合性工程,涵盖目标确定、市场调研、功能规划等前期准备;选择编程语言和技术栈;设计系统架构;开发策略管理、资金管理、交易执行、数据分析及用户界面模块;进行单元、集成、压力测试及优化;最后选择服务器部署并持续监控。
|
5月前
|
存储 算法 安全
现货合约跟单交易所系统开发(方案)源码逻辑规则
在网络上,每隔一段时间就会生成一个块。该块等效于网络记录簿,该记录簿用于记录一段时间内发生的相关信息。记录已满时,将生成一个新记录。一旦记录了信息,记录簿将通知所有参与者并更新每个人的记录簿。
|
5月前
|
机器学习/深度学习 监控 安全
现货量化合约跟单/交易所系统开发成熟技术/案例搭建/玩法详情/步骤指南
现货量化合约跟单系统开发是指构建一个系统,通过使用量化交易策略,实现将现货市场的交易信号自动化地应用到交易合约中,以进行自动化的跟单交易。 以下是现货量化合约跟单系统开发的关键概述:
|
7月前
|
供应链 安全 物联网
量化合约交易跟单系统开发|源码部署|方案设计
智能合约的作用和意义不仅在于提供可靠的合约执行机制,去除中介和提供公平透明的交易环境
币圈期现套利策略交易软件开发合约源码定制详情
class Arbitrage: def __init__(self, contracts): self.contracts = contracts self.positions = [] self.current_price = {}
|
存储 安全 区块链
量化合约现货跟单交易所系统开发|源码案例|部署
在Web 3.0世界里,所有权及掌控权均是去中心化
|
算法 数据挖掘 TensorFlow
现货量化合约一键跟单系统开发(开发策略)丨合约现货量化一键跟单系统开发(案例策略)/方案项目/源码平台
  量化交易(Quantitative Trading)是通过数学模型和计算机算法对市场进行分析和预测,And based on this,a trading strategy is developed for investment trading.与传统的基本面分析、技术分析等方法不同,Quantitative trading emphasizes the use of a large amount of data and scientific methods for research,reducing the impact of human factors and improving th
|
7月前
|
供应链 区块链
合约交易|量化交易对冲系统开发|指南方案
智能合约是一种通过计算机程序实现自动执行合约的协议。