Name
001单平台均衡策略-研究
Author
风利
Strategy Description
这个需要建仓,比如账户有5000块钱,跟1个币,如果币的价值大于账户的余额5000了并且差价超过阀值,比如币现在值6000块钱,就卖掉(6000-5000)/6000/2个币,说明币升值了,把钱兑换回来,如果币贬值了,比如4000块钱了,就买入(5000-4000)/4000/2个币, 币跌的时候买一些回来,如果再涨了,就再卖掉,好像天平一样,两边不同的对冲,所以我命名为均衡策略
Strategy Arguments
Argument | Default | Description |
---|---|---|
threshold | 10 | 阀值 |
Interval | 2000 | 出错重试间隔(毫秒) |
LoopInterval | 60 | 轮询间隔(秒) |
Source (javascript)
/* 单平台策略*/
function adjustFloat(v) { // 处理数据的自定义函数 ,可以把参数 v 处理 返回 保留3位小数(floor向下取整)
return Math.floor(v*1000)/1000; // 先乘1000 让小数位向左移动三位,向下取整 整数,舍去所有小数部分,再除以1000 , 小数点向右移动三位,即保留三位小数。
}
function GetTicker() { //定义获取行情函数,获取卖一价,买一价,最后成交价,成交量,时间等
var ticker;
while (!(ticker = exchange.GetTicker())) {
Sleep(Interval);
}
return ticker;
}
function GetAccount() { //定义获得账户信息,持币数目,资金量
var account;
while (!(account = exchange.GetAccount())) {
Sleep(Interval);
}
return account;
}
function CancelPendingOrders() { //定义函数取消挂单的订单
var ret = false;
while (true) {
var orders = null;
while (!(orders = exchange.GetOrders())) {
Sleep(Interval);
}
if (orders.length == 0) {
return ret;
}
for (var j = 0; j < orders.length; j++) {
exchange.CancelOrder(orders[j].Id);
ret = true;
if (j < (orders.length-1)) {
Sleep(Interval);
}
}
}
return ret;
}
function updateProft(accountInit, accountNow, ticker) { //更新自己账户的收益情况
LogProfit(accountNow.Balance + accountNow.FrozenBalance + ((accountNow.Stocks + accountNow.FrozenStocks - accountInit.Stocks - accountInit.FrozenStocks) * ticker.Buy) - accountInit.Balance - accountInit.FrozenBalance);
}
var STATE_WAIT_IDLE = 0; //定义变量操作状态默认值为 0
var STATE_WAIT_BUY = 1; //定义变量操作状态等待买入状态为1
var STATE_WAIT_SELL = 2; //定义变量操作状态等待卖出状态为2
var State = STATE_WAIT_IDLE; //定义变量State 默认状态为0
var InitAccount = null; //定义账户初始状态为NULL
function onTick() { //定义函数onTick 为判定逻辑操作买入与卖出状态
var opSuccess = false; //定义变量opSuccess 起始状态为 false
if (State != STATE_WAIT_IDLE) { //判断函数如果 初始状态不为0,为真,也就是现在有买入挂单,与卖出挂单
opSuccess = !CancelPendingOrders(); //并且变量操作没有执行取消挂单操作
State = STATE_WAIT_IDLE; //定义变量State 默认为默认状态(等待状态)
}
var portfolio = GetAccount(); //定义变量 portfolio 是获取账户信息
var ticker = GetTicker(); //定义变量 Ticker 是获得行情信息
if (opSuccess) { //如果opSuccess为真的话,就是跟新自己的收益
updateProft(InitAccount, portfolio, ticker);
}
// 下面是策略逻辑的精髓所在
var diff = portfolio.Balance - (portfolio.Stocks * ticker.Sell); //定义变量diff 账户的收益=账户金额- 账户数量*卖一价
if (diff > threshold) { //如果差额大于 阈值 threshold(默认值为10)
var amount = adjustFloat(diff / 2 / ticker.Buy);
if (amount < 0.001) {
return;
}
exchange.Buy(ticker.Buy*1.1, amount);
State = STATE_WAIT_BUY;
} else if (diff <= -threshold) {
var amount2 = adjustFloat(Math.abs(diff) / 2 / ticker.Sell);
if (amount2 < 0.001) {
return;
}
exchange.Sell(ticker.Sell*0.9, amount2); //这里添加了滑价,所以其中的价格为*0.9 这也这样的方式需要优化
State = STATE_WAIT_SELL;
}
}
function main() { //这里调用了主函数进行操作
InitAccount = GetAccount();
LoopInterval = Math.max(LoopInterval, 1); //这里使用JS内置函数Math.max() 方法可返回两个指定的数中带有较大的值的那个数。
while (1) {
onTick();
Sleep(LoopInterval * 1000);
}
}
Detail
https://www.fmz.com/strategy/82325
Last Modified
2018-03-24 00:41:40