区块链技术学院:区块链资产量化策略之 多平台对冲稳定套利 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 单一买卖量, 币差 , 电流互感器 存款 币数 达到目标 最小的。 由于详细经济状况早已混合物了。,0是难以应验的的价钱。,这是是人难以应验的买卖所的销售的。
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 策略顺序调解的新使用者、新的显像剂可以补充独身终止的策略构图包围。,咱们可以很快学会若干策略构图才能。,这当作急切地寻求定量策略构图技术有很大扶助。。

策略可以是坚决的。,但它是最根本的所教的东西版本。,可扩展性依然很大。,急切地寻求了这么胚胎的先生也可以尝试。 重构 策略。

发表评论

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