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 ((order[j].Id, orders[j]) 로 되어 있어야 합니다.
발명가들의 수량화 - 작은 꿈오, 예, 상기시켜 주셔서 감사합니다.
발명가들의 수량화 - 작은 꿈이 글은 제 생각에는 매우 귀찮은 글입니다.
발명가들의 수량화 - 작은 꿈오, 이건 정말 약간의 문제였어, 수정됐어, 다시 시도해봐요. 전략 교육은 주로 사고와 전략 구조 디자인을 배우는 데 있습니다.
발명가들의 수량화 - 작은 꿈이 전략은 조금 특이해서 여러 개의 거래소 개체를 추가해야 합니다. 하나의 거래소 개체가 하나의 화폐를 제어합니다.