策略源码
var coinValue = {}; // 声明 全局变量 coinValue ,用一个空对象赋值
var totalValue = 0; // 总价值
function updateValue(){ // 更新 价值
var logString = 'Time: '+ _D() + '\n'; // 声明一个变量 , 日志字符串并且初始化, 初始化记录上 当前时间
var account = _C(exchanges[0].GetAccount); // 获取 为了给 coinValue的 BaseAsset 属性 (也就是基础币种资产)初始化的账户数据。
coinValue[BaseAsset] = {amount:account.Balance + account.FrozenBalance, value:account.Balance + account.FrozenBalance}; // amount , value 属性 初始化 均为 总计价币数。BaseAsset 为 基准货币
totalValue = coinValue[BaseAsset].value; // 更新 总价值
logString += BaseAsset + ': ' + _N(coinValue[BaseAsset].value,5) + '\n'; // 给日志字符串 添加上 当前 基准货币 总价值 数据
for(var i=0;i<exchanges.length;i++){ // 遍历 交易所对象
var account = _C(exchanges[i].GetAccount); // 更新当前索引的账户信息
coinValue[BaseAsset] = {amount:account.Balance + account.FrozenBalance, value:account.Balance + account.FrozenBalance}; // amount , value 属性 初始化 均为 总计价币数。BaseAsset 为 基准货币
var ticker = _C(exchanges[i].GetTicker); // 更新当前索引的账户行情信息
var symbol = exchanges[i].GetCurrency().split('_')[0]; // 获取操作币 名称
coinValue[symbol].amount = account.Stocks + account.FrozenStocks; // 记录操作币的数量
coinValue[symbol].value = coinValue[symbol].amount * ticker.Last; // 记录操作币的价值(BaseAsset计价)
totalValue += coinValue[symbol].value; // 累计总价值
coinValue[symbol].buyPrice = ticker.Buy; // 更新 当前索引的 交易所对象上的 买一价格数据
coinValue[symbol].sellPrice = ticker.Sell; // 更新 当前索引的 交易所对象上的 卖一价格数据
logString += symbol + ': ' + _N(coinValue[symbol].value,5) + '\n' // 给日志字符串添加当前索引的交易所 的操作币的价值。
Sleep(1000)
}
LogStatus(logString); // 在状态栏输出
}
var keepPercent = Ratio.split('|').map(Number); // 用字符 "|" 分割 Ratio 参数,然后调用 map 函数 ,转换字符串为 Number 类型 返回一个新的数组。
if(math.sum(keepPercent) > 1){ // 统计 keepPercent 数组中的元素值总和
throw 'sum of keep percent should be lower than 1'; // 各资产 占比总和 不能超过 100%
}
var buyPercent = ToBuy.split('|').map(Number); // 根据参数处理字符串,构造 买入比例 数组
var sellPercent = ToSell.split('|').map(Number); // ... 构造 卖出比例 数组
for(var i=0;i<exchanges.length;i++){ // 遍历交易所对象数组
var symbol = exchanges[i].GetCurrency().split('_')[0]; // 获取 交易对 中 交易币的 名称,赋值给 symbol
coinValue[symbol] = {amount:0, value:0, buyPrice:0, sellPrice:0, keepPercent:0, buyPercent:0, sellPercent:0}; // 构造每个 交易对对象 交易币的 相关数据: 数量,价值,买入价格,卖出价格,持有百分比,买入百分比,卖出百分比
coinValue[symbol].keepPercent = keepPercent[i]; // 初始化 持有百分比
coinValue[symbol].buyPercent = buyPercent[i]; // 初始化 买入百分比
coinValue[symbol].sellPercent = sellPercent[i]; // 初始化 卖出百分比
}
function CancelPendingOrders(e) { // 取消所有挂单
var orders = _C(e.GetOrders);
for (var j = 0; j < orders.length; j++) {
e.CancelOrder(orders[j].Id, orders[j]);
Sleep(300);
}
}
function onTick(){ // 主要逻辑函数 实现
updateValue(); // 更新 操作币 净值
for(var i=0;i<exchanges.length;i++){ // 遍历交易所
var symbol = exchanges[i].GetCurrency().split('_')[0]; // 获取当前交易所对象的 操作币名称
if(coinValue[symbol].value > (1+coinValue[symbol].sellPercent)*totalValue*coinValue[symbol].keepPercent){
var sellAmount = (coinValue[symbol].value - totalValue*coinValue[symbol].keepPercent)/coinValue[symbol].buyPrice
exchanges[i].Sell(coinValue[symbol].buyPrice, sellAmount)
CancelPendingOrders(exchanges[i]);
}
else if(coinValue[symbol].value < (1-coinValue[symbol].buyPercent)*totalValue*coinValue[symbol].keepPercent){
var buyAmount = (totalValue*coinValue[symbol].keepPercent - coinValue[symbol].value)/coinValue[symbol].sellPrice
exchanges[i].Buy(coinValue[symbol].sellPrice, buyAmount);
CancelPendingOrders(exchanges[i]);
}
}
}
function main() {
while(true){ // 主循环
onTick(); // 主要逻辑函数
Sleep(Interval*1000);
}
}
相关推荐
全部留言
小胡子虫
第40行应该是 e.CancelOrder(orders[j].Id, orders[j]);
2021-04-21 02:46:41
发明者量化-小小梦
哦,是的,感谢提醒。
2021-04-21 09:13:16
panming
这个策略币安跑不起来- -,各种报错了
2018-10-14 09:19:39
发明者量化-小小梦
不客气 ,如果有问题 欢迎留言。
2018-10-17 16:59:00
panming
好的 谢谢小梦总
2018-10-17 16:53:06
发明者量化-小小梦
哦 这个确实是 有点问题,已经修改了,您再试下。
策略教学 为主,主要是学习 思路以及策略结构设计。
2018-10-17 15:41:17
panming
你好,之前是因为服务器时间的问题,现在已经更换,更换后重新运行出现:TypeError: cannot read property 'value' of undefined at updateValue (__FILE__:6) at onTick (__FILE__:44) at main (__FILE__:61)
2018-10-17 11:04:53
发明者量化-小小梦
这个策略有点特殊,是需要添加 多个 交易所对象, 一个交易所对象控制一个币种。您可以截图发下具体报错信息,我帮您看下。
2018-10-15 21:44:43