区块链技术学院:区块链资产量化策略之 多平台对冲稳定套利 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 策略顺序组成的用户、新的显像剂可以给予人家好的的策略书法举例。,笔者可以很快学会稍微策略书法技能。,这到某种状态硕士定量策略书法技术有很大帮忙。。

策略可以是坚决的。,但它是最根本的教授版本。,可扩展性依然很大。,硕士了合乎逻辑的推论是思索的先生也可以尝试。 重构 策略。

发表评论

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