区块链技术学院:区块链资产量化策略之 多平台对冲稳定套利 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 言归正传空值 同时将一向处决。 在周围,再份量)
// 交流[我] 这是流行的的在周围。 作物物交换不赞成,we的所有格形式称之为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+(详述)))); // 由于经纪费是可结论的。 是 币数,因而 we的所有格形式要素包罗经纪费。。
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 是任一作物物交换不赞成大厦,we的所有格形式判别其长度 ,假定不足2处决{}内法典
throw 买卖所的号码反正有两个来完全的套期保值。 // 过失,顺序终止。
}

TickInterval = (TickInterval, 50); // TickInterval 是接合上的限度局限精神错乱。, 检测频率, 运用JS =mathematics不赞成=mathematics ,喊叫 应变量 max 来限度局限 TickInterval 的最低的 为 50 。 (单位)) 手写本)
Interval = (区间, 50); // 同上,限度局限 认不出重试区间 此接合限度局限精神错乱, 最低的是50。 。(单位)) 手写本)

cancelAllOrders(); // 在最开端的时辰 缺乏制止。。因而 财产的查核都要证明一下。 ,脱掉财产制止。。

initState = getExchangesState(); // 喊叫定做 getExchangesState 应变量抵达 财产买卖所知识, 评价给 initState
if ( == 0) { // 假定 财产买卖所 金币的总和是0。 ,投错。
throw 财产作物物交换钱币的总和是空的。, we的所有格形式必需品先在一点买卖所创立仓库栈,此后才干完全的套期保值。
}
if ( == 0) { // 假定 财产买卖所 这笔钱是0英币1镑。 ,投错。
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 策略顺序使安定的用户、新的显影剂可以提出任一大好的策略书法样板。,we的所有格形式可以很快学会少数策略书法诡计。,这朝着原版的定量策略书法技术有很大扶助。。

策略可以是坚决的。,但它是最根本的学说版本。,可扩展性依然很大。,原版的了这认为的先生也可以尝试。 重构 策略。

发表评论

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