区块链技术学院:区块链资产量化策略之 多平台对冲稳定套利 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 变量,!记述常常真实的。。
供应住宿(间距) // 设想!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 =mathematics目的=mathematics ,换乘 有或起作用 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 策略顺序编译的新使用者、新的开发者应用程式可以供应任一终止的策略书法诉讼手续。,敝可以很快学会若干策略书法熟练。,这向急切地抓住定量策略书法技术有很大帮忙。。

策略可以是坚决的。,但它是最根本的教义版本。,可扩展性依然很大。,急切地抓住了大约运动的先生也可以尝试。 重构 策略。

发表评论

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