区块链技术学院:区块链资产量化策略之 多平台对冲稳定套利 V2.1 | 区块链商机

多平台套期保值稳定性套利 (正文版本)

对冲策略是风险较小,更沉着的的策略,类似地通常高地砖块摆脱掉战术。,不一样的是砖块下令转变。,提币 ,充币。在如此航线中,价钱动摇轻易形成错过。。对冲是经过在不一样集市同时去买东西买卖,造成外币资产使展开的低物价。,这笔钱工序方向高价钱的买卖所。,造成收益。

顺序逻辑工序

正文版本源:

var initState;
var isBalance = true;
var feeCache = new Array();
var feeTimeout = optFeeTimeout * 60000;
var lastProfit = 0; // 全程变量 记载前番利害
var lastAvgPrice = 0;
var lastSpread = 0;
var lastOpAmount = 0;
function adjustFloat(v) { // 用于处置履历的自定义效能 ,你可以选择决定等式。 v 处置 使恢复原状 保养3个十进位的(上限)
return Math.floor(v*1000)/1000; // 根本的骑行1000 让十进制记数制向左摆脱掉三位。,下取整 整体,舍入一切的少数部件,除号1000 , 将十进位的摆脱掉到马上三位。,那就是保存三个十进位的。。
}

function isPriceNormal(v) { // 断定价钱假如正规军。, StopPriceL 是极端的。,StopPriceH 这是极端的。,在此区间使恢复原状 true ,超越如此 区间 思索价钱非常 使恢复原状false
return (v >= StopPriceL) && (v <= StopPriceH); // 在此区间
}

function stripTicker(t) { // 鉴于决定等式 t , 设计本人版式 T输入履历。
return 买 ” + adjustFloat() + ” Sell: ” + adjustFloat();
}

function updateStatePrice(state) { // 更新的行为或事例 价钱
var now = (新的 履历() // 记载 介绍工夫戳
for (var) i = 0; i < .length; i++) { // 着陆传入的决定等式 state(getExchangesState 效能的使恢复原状值),遍历 var ticker = null; // 正式的一 变量 ticker var key = [i].() + [i].(); // 获取介绍提及 i 的 元素,运用其援用于对换客体 exchange ,下令GetName、GetCurrency效能 // 买卖所名称 + 币种 字符串 工作给 key ,作为键 var fee = null; // 正式的一变量 Fee while (!(ticker = [i].())) { // 用介绍 对换客体 下令 GetTicker 效能获取 行情,获取舍弃,担当管理人流传 宁静(距离) // 担当管理人 Sleep 效能,使安静 Interval 设置的手写本数 } if (key in feeCache) { // 在feeCache 中查询,假如找到 key var v = feeCache[key]; // 取出 键名为 key 的变量值 if ((now - v.time) > feeTimeout) { // 着陆集市记载工夫 和 now 的差值,假如大于 费更新的行为或事例圈出
delete feeCache[key]; // 删去 过时的 估价 履历
} else {
fee = ; // 假如不大于更新的行为或事例圈出, 取出 工作给 fee
}
}
if (!费) { // 假如不注意找到 fee 最好还是初始空值? , 触发电器假如
while (!(费) = [i].())) { // 下令 电流对换客体 GetFee 效能 获取 估价
宁静(距离)
}
feeCache[key] = {费 fee, time: now}; // 速率缓存 履历结构 feeCache 中贮存 获取的 fee 和 介绍工夫戳
}
// Buy-=fee Sell+=fee
[我] = {买通 * (1-()), Sell: * (1+())}; // 经过集市价钱处置 移居经纪费后, 价钱是用来计算不抵消的。
[i].realTicker = ticker; // 实践的 行情价钱
[费] = fee; // 估价
}
}

function getProfit(stateInit, stateNow, coinPrice) { // 获取 利害效能的现行计算
var netNow = stateNow.allBalance + ( * coinPrice); // 计算常常同上的总资产集市意义
var netInit = stateInit.allBalance + ( * coinPrice); // 计算初始记述的总资产意义。
return adjustFloat(netNow – netInit); // 介绍的 减去 初始的 即是 盈亏,return 利害
}

function getExchangesState() { // 获取 买卖所正式的 效能
var allStocks = 0; // 一切的金币
var allBalance = 0; // 一切的的总和
var minStock = 0; // 最小买卖 币数
var details = []; // details 铺子选派 的衣服。
for (var) i = 0; i < ; i++) { // 遍历 对换客体衣服
var account = null; // 每回 宣告 account 变量。
while (!(账) = 买卖所[I] { // 运用对换机 衣服中 介绍提及值 对换客体,下令它的分子效能,存取往还账人。使恢复原状给 account 变量,!20个不断地真实的。。
宁静(距离) // 假如!account 为真,就是,账探望舍弃。,呼叫宁静 效能 使安静 Interval 设置的 手写本数 工夫,重行流传,直抵达到预期的目的无效的账人。。
}
allStocks += + account.FrozenStocks; // 累计一切的 互换钱币号码
allBalance += account.Balance + account.FrozenBalance; // 累计一切的 买卖所总和
minStock = (minStock, 买卖所[我] // 设定最小买卖量 为 一切的买卖所 最小买卖量最大的值
({对换) 交流[我], account: account}); // 把每个对换客体 和 记述人 衣服到客体衣服中。 details
}
return {allStocks: adjustFloat(allStocks), allBalance: adjustFloat(allBalance), minStock: minStock, details: details}; // 使恢复原状 一切的买卖所 钱币总结,总总和 ,一切的最小买卖的非常好的, 底细衣服
}

function cancelAllOrders() { // 移居一切的定货单效能
for (var) i = 0; i < ; i++) { // 遍历对换客体衣服(就是在新建机器人时添加的买卖所,对应的客体)
while (真) { // 每回你进入遍历,你进入本人。 while 流传
var orders = null; // 正式的一 orders 变量,招待会处 API 效能 GetOrders 使恢复原状的 大致上的定货单 履历。
while (!(命令) = 交流[我].GetOrders())) { // 运用 while 流传 检测 API 效能 GetOrders 您使恢复原状无效履历吗? 假如 GetOrders 使恢复原状空值 同时将一向担当管理人。 流传,再考查)
// 交流[我] 这是介绍的流传。 对换客体,咱们称之为API。 GetOrders (交流[我] 分子效能 ,大致上定货单。
宁静(距离) // Sleep 效能基 决定等式 Interval 的设定 ,让顺序使安静。 设定的 手写本(1000手写本) = 1秒)。
}

if ( == 0) { // 假如 本人不完善阶的衣服 非零值 , 就是,经过以上所述的工夫。 流传, 又 比得上 0(空衣服),不注意账目。。
break; // 担当管理人 break 跳出 介绍的 while 流传(即 不注意移居定货单。
}

for (var) j = 0; j < ; j++) { // 遍历orders 衣服, 着陆挂出 定货单ID,逐个下令 API 效能 CancelOrder 撤销挂单
交流[我].CancelOrder(命令)[j].Id, 命令[ J ]
}
}
}
}

function balanceAccounts() { // 抵消买卖所 记述 总和 币数
// already balance
if (isBalance) { // 假如 isBalance 为真 , 即 抵消正式的,不注意抵消的下令。,迅速地使恢复原状
return;
}

cancelAllOrders(); // 抵消前 要先移居一切的买卖所挂单

var state = getExchangesState(); // 下令 getExchangesState 效能 获取一切的对换正式的(包罗账人)
var diff = – ; // 计算局获取的对换的介绍正式的。 钱币总结与初始正式的钱币总结 仅有的坏(即) 初始正式的 和 介绍的 钱币总不抵消)
var adjustDiff = adjustFloat((区分))); // 先下令 计算 diff 的绝对事物,再次下令自定义效能 adjustFloat 保养少数位数为3位。。
if (adjustDiff < ) { // 假如 处置后的 总币差履历 以内 消除一切的买卖所最小买卖量的履历 minStock,即不消除抵消环境 isBalance = true; // 设置 isBalance 为 true ,即抵消正式的 } else { // adjustDiff >= 的条款 则:
日记(初始金币总和:, , 现时的总概略 ”, , 区分:, adjustDiff);
// 输入抵消人。
// other ways, diff is 0.012, bug A only has 0.006 B only has 0.006, all less then minstock
// we try to statistical orders count to recognition this situation
updateStatePrice(state); // 更新的行为或事例 ,走快 分开买卖所行情
var details = ; // 取出 工作给 details
var ordersCount = 0; // 正式的一变量 用于记载定货单量子。
if (区分) > 0) { // 断定 币差 假如大于 0 , 即 它是? 多币。平均估价富余金币。
var attr = 卖 // 默许 设置 将要获取的 ticker 属性为 Sell ,即 卖一价
if (UseMarketOrder) { // 假如 设置 为 运用集市价钱表, 则 设置 ticker 待获取属性 为 Buy 。(经过将值工作给ATRR)
attr = 买
}
// Sell adjustDiff, sort by price high to low
底细(排序)(效能(A), b) {使恢复原状 b.ticker[attr] – a.ticker[attr];}); // return 大于0,则 b 在前,A后, return 以内0 则 a 在前 乙后,衣服正中鹄的元素,比照 活泼排序举行。
// 此处 运用 b – a ,排序是 details 衣服 由高到低。
for (var) i = 0; i < details.length && adjustDiff >= ; i++) { // 遍历 details 衣服
if (isPriceNormal(details[我][attr]) && (底细) >= )) { // 断定 价钱不正规军吗?, 而且 常常记述钱币大于最小买卖量吗?
var orderAmount = adjustFloat((AmountOnce, adjustDiff, 底细[我]
// 给下单量 orderAmount 工作 , 取 AmountOnce 单一买卖量, 币差 , 电流互感器 记述 币数 正中鹄的 最小的。 因底细曾经花色品种了。,起始点是非常好的价钱。,这是因为非常好买卖所的销路。
var orderPrice = 底细[I] RealtKe[AtTr] – SlidePrice; // 着陆 集市的实践价钱(详细价钱是平均估价的)。 最好还是 买本人价钱买 安宁UsMARKATORD设置。
// 因我以为卖掉定货单。 ,负滑动价钱 SlidePrice 。构造定货单价钱。
if ((orderPrice * orderAmount) < details[i].()) { // 断定 介绍提及的买卖所的最小买卖额度 假如 足够本次下单的 概略。
continue; // 假如以内 则 清澈的 担当管理人下本人提及。
}
ordersCount++; // 定货单量子 计数 加1
if (底细)(orderPrice, orderAmount, stripTicker(details[我]))) { // 比照 构造了前述的顺序。 价钱 和 买卖量 下单, 而且输入 起飞经纪费后处置集市履历。
adjustDiff = adjustFloat(adjustDiff – orderAmount); // 假如 定货单API 使恢复原状定货单ID , 着陆此定货单量子更新的行为或事例 不抵消量
}
// only operate one platform // 只在本人平台上 举动抵消,因而 以下 break 跳出如此层的for流传。
break;
}
}
} else { // 假如 币差 以内0 , 即 缺币 赚钱是下令的。
var attr = 买 // 同上
if (UseMarketOrder) {
attr = 卖
}
// Buy adjustDiff, sort by sell-price low to high
底细(排序)(效能(A), b) {使恢复原状 a.ticker[attr] – b.ticker[attr];}); // 价钱从小到大 排序,因从最低限度的价钱对换 补币
for (var) i = 0; i < details.length && adjustDiff >= ; i++) { // 流传 从本人小价钱开端
if (isPriceNormal(details[我][attr])) { // 假如价钱正规军 则担当管理人 if {} 内法典
var canRealBuy = adjustFloat(底细)account.Balance / (details[我][attr] + SlidePrice));
var needRealBuy = (AmountOnce, adjustDiff, canRealBuy);
var orderAmount = adjustFloat(needRealBuy * (1+(底细)))); // 因经纪费是可起飞的。 是 币数,因而 咱们下令包罗经纪费。。
var orderPrice = 底细[I] RealtKe[AtTr] + SlidePrice;
if ((orderAmount < details[i].()) ||
((orderPrice * orderAmount) < 底细[我] {
continue;
}
ordersCount++;
if (底细)(orderPrice, orderAmount, stripTicker(details[我]))) {
adjustDiff = adjustFloat(adjustDiff – needRealBuy);
}
// only operate one platform
break;
}
}
}
isBalance = (命令)Count == 0); // 假如 抵消, ordersCount 为 0 则 ,true
}

if (isBalance) {
var currentProfit = getProfit(initState, state, lastAvgPrice); // 计算介绍收益
LogProfit(currentProfit, “Spread: “, adjustFloat((currentProfit – lastProfit) / lastOpAmount), “Balance: “, adjustFloat(), “Stocks: “, adjustFloat());
// 邮票介绍收益人
if (StopWhenLoss && currentProfit < 0 && (currentProfit) > MaxLoss) { // 超越最大错过中止码块
日记(事务错过超越最大限度局限)。, 顺序从一切的定货单中撤出。
cancelAllOrders(); // 移居一切的 挂单
if (SMSAPI.length > 10 && SMSAPI.indexOf(”http”) == 0) { // 短信流通的 法典块
HttpQuery(SMSAPI);
日记(短信流通的)
}
throw 中止 // 铸造非常 中止策略
}
lastProfit = currentProfit; // 应用介绍利害表 更新的行为或事例 前番利害记载
}
}

function onTick() { // 首要流传
if (!isBalance) { // 断定 全程变量 isBalance 假如是 false (表现不抵消), !isBalance 为 真,担当管理人 if 申请有特殊教育需要在监狱里法典。
balanceAccounts(); // 不抵消 工夫担当管理人 抵消记述效能 balanceAccounts()
return; // 担当管理人后使恢复原状。持续下本人流传担当管理人 onTick
}

var state = getExchangesState(); // 获取 一切的买卖所正式的
// We also need details of price
updateStatePrice(state); // 更新的行为或事例 价钱, 不包罗买卖价钱为的套期保值价钱

var details = ; // 取出 state 正中鹄的 details 值
var maxPair = null; // 最大 结成
var minPair = null; // 最小 结成
for (var) i = 0; i < details.length; i++) { // 遍历 details 如此衣服 var sellOrderPrice = details[i]. * (底细)realTicker.Buy - SlidePrice); // 计算 介绍提及 买卖所 记述币数 平均估价的总和(平均估价价为对手买一负滑动价钱) if (((!maxPair) || (底细) > maxPair.)) && (底细) >= ) &&
(sellOrderPrice > 底细[我] { // 率先,断定最大对。 无论 null ,假如责备空 就断定 起飞费等式后的价钱 大于 最大对集市履历的买通价钱
// 残余物环境 是 最低限度买卖量是可以消除的。,并消除最低限度买卖概略。,消除顺风的环境。。
底细[我] = 底细[我] // 关于介绍提及 details 衣服的元素 添加属性 canSell 把 现行演奏者外币账 币数 把它分人类它
maxPair = 底细[我] // 把介绍的 details 衣服元素 援用到 maxPair 用于 for 流传下一关系上地,关系上地最大的价钱。。
}

var 买断 = adjustFloat(底细)account.Balance / (底细)realTicker.Sell + SlidePrice)); // 计算 介绍提及的 外币记述基金 买通钱币数
var buyOrderPrice = 买断 * (底细)realTicker.Sell + SlidePrice); // 计算 下单概略
if (((!minPair) || (底细) < minPair.)) && (买断 >= ) && // 并卖 部件寻觅 最大价钱是最大对价。,在在这里寻觅最低限度的价钱。
(buyOrderPrice > 底细[我] {
details[i].买断 = 买断; // 夸大 买断 属性记载 买断
// how much coins we real got with fee // 以下计算 买流行的 聚积费后 (买通费起飞), 实践买通的金币数。
底细[我] = adjustFloat(底细)account.Balance / (底细) + SlidePrice)); // 运用 不免费价钱 计算买通概略。
minPair = 底细[我] // 适合环境的 最低限度物价钱结成记载 minPair
}
}

if ((!maxPair) || (!minPair) || ((maxPair. – minPair.) < MaxDiff) || // 着陆以上所述 对比出的一切的买卖所最小、最大价钱,检测假如不适合对冲环境
!isPriceNormal(maxPair.) || !isPriceNormal(minPair.)) {
return; // 假如不消除 那时的使恢复原状
}

// filter invalid price
if (.Sell <= .Buy || .Sell <= 买通) { // 过滤 无效价钱, 比如 卖一价 是不可能以内比得上 买一价的。
return;
}

// what a 交尾。
if (maxPair.() == minPair.()) { // 履历非常,同时 最低限度 非常好的是买卖所。。
return;
}

lastAvgPrice = adjustFloat((.Buy + 买通) / 2); // 记载下 非常好价 最低限度物价 的平均值
lastSpread = adjustFloat((.Sell – 买通) / 2); // 记载 去买东西 差价

// compute amount // 计算定货量
var amount = (AmountOnce, maxPair.canSell, minPair.realBuy); // 着陆这些 量取最少的,用作定货量
lastOpAmount = amount; // 记载 定货量 全程变量
var hedgePrice = adjustFloat((.Buy – 销路) / (SlideRatio, 2)) // 着陆 滑动系数 ,计算套期保值 滑动 hedgePrice
if (minPair.(.Sell + hedgePrice, amount * (1+(minPair.)), stripTicker())) { // 先下 付帐
maxPair.(.Buy – hedgePrice, amount, stripTicker()); // 付账后 下卖单
}

isBalance = false; // 设置为 不抵消,再反省 抵消。
}

function main() { // 保险单的进入效能
if ( < 2) { // 率先断定 exchanges 策略添加的对换客体个数, exchanges 是本人对换客体衣服,咱们断定其长度 ,假如以内2担当管理人{}内法典
throw 买卖所的量子至多有两个来结尾套期保值。 // 误差,顺序中止。
}

TickInterval = (TickInterval, 50); // TickInterval 是连接上的决定等式。, 检测频率, 运用JS 算学客体算学 ,下令 效能 max 来限度局限 TickInterval 的最少的 为 50 。 (单位)) 手写本)
Interval = (距离, 50); // 同上,限度局限 错误的重试距离 此连接决定等式, 最少的是50。 。(单位)) 手写本)

cancelAllOrders(); // 在最开端的时辰 不注意账目。。因而 一切的的抑制都要证明一下。 ,移居一切的账目。。

initState = getExchangesState(); // 下令用户化 getExchangesState 效能抵达 一切的买卖所人, 工作给 initState
if ( == 0) { // 假如 一切的买卖所 金币的总和是0。 ,投错。
throw 一切的互换钱币的总和是空的。, 咱们不可避免的先在无论哪一个买卖所构造仓库栈,那时的才干结尾套期保值。
}
if ( == 0) { // 假如 一切的买卖所 这笔钱是0拍打。 ,投错。
throw 一切的买卖所的人民币总和是空的。, 无法持续套期保值
}

for (var) i = 0; i < .length; i++) { // 遍历获取的买卖所正式的正中鹄的 底细衣服。
var e = [i]; // 将介绍提及的对换人分人类
日志(E), e.(), ); // 下令E 援用于 对换客体的分子效能 GetName , GetCurrency , 和 电流互感器人中贮存的 记述人 运用日记 输入。
}

日记(整个 Balance: “, , “Stocks: “, , “Ver:”, Version()); // 邮票日记 输入 夸大一切的买卖所的钱币总和, 钱币总结, 保管人版本

while (真) { // while 流传
onTick(); // 首席担当管理人官 逻辑效能 onTick
Sleep(parseInt(TickInterval));
}
}
战术解读

多平台套期保值 策略 可以造成 多个 数字钱币现货商品平台的套期买卖,法典像是用腰带围绕的。,根本套期保值效能。因如此版本是根本的教学的版本。,如此优化组合阻止得分较大。,初学者用BOTVS 策略顺序写的用户、新的开发者应用程式可以供本人精致的的策略书写艺术判例。,咱们可以很快学会许多的策略书写艺术本领。,这关于控制力定量策略书写艺术技术有很大扶助。。

策略可以是坚决的。,但它是最根本的教学的版本。,可扩展性依然很大。,控制力了如此理念的先生也可以尝试。 重构 策略。

发表评论

电子邮件地址不会被公开。 必填项已用*标注