PriceDiff), Precision); // Открытие позиции ПЛИС, то есть пространство прибыли для каждого узла var state = fishTable[idx]; // присвоение значения var fishId = uuidTable[idx]; // Номерация
// 此处判断作用为: 过滤 未完成的订单
if (hasOrder(orders, fishId)) { // 如果 所有未完成订单,即挂单数组 中有ID为 fishId 的订单
continue; // 跳过本次循环 继续循环
}
if (fishId != -1 && IsSupportGetOrder) { // 网格 节点 id 不等于 初始值,即下过订单,并且 交易所支持 GetOrder
var order = trader.GetOrder(fishId); // 获取 该 fishId 号 的订单
// 此处判断作用为: 过滤 没有找到订单 的 网格节点,以下判断(state == STATE_WAIT_COVER) 等等 的逻辑不会触发
if (!order) { // 如果 !order 为真 即获取订单失败
Log("获取订单信息失败, ID: ", fishId); // 输出日志
continue; // 跳过本次循环 继续循环
}
// 此处判断作用为: 过滤 处于挂起状态,未成交,或者 未完全成交的 网格节点, 以下判断(state == STATE_WAIT_COVER) 等等 的逻辑不会触发
if (order.Status == ORDER_STATE_PENDING) { // 如果订单状态 是在交易所 挂起状态
//Log("订单状态为未完成, ID: ", fishId);
continue; // 跳过本次循环 继续循环
}
}
if (state == STATE_WAIT_COVER) { // 如果 当前节点 状态是 等待平仓
var coverId = CoverFunc(coverPrice, (BuyFirst ? amountS[idx] : amountB[idx]), (BuyFirst ? '完成买单:' : '完成卖单:'), openPrice, '量:', (BuyFirst ? amountB[idx] : amountS[idx]));
// 调用 平仓 函数 CoverFunc 挂出 平仓单
if (typeof(coverId) === 'number' || typeof(coverId) === 'string') { // 判断 如果 平仓函数 返回的 Id 为 数值(由 发明者量化 API 直接返回) 或者 字符串(由 trader 对象的 Buy/Sell函数返回)
fishTable[idx] = STATE_WAIT_CLOSE; // 已经挂出 平仓单, 更新状态为 : STATE_WAIT_CLOSE 即等待 节点任务完成
uuidTable[idx] = coverId; // 把 订单号 储存在 uuidTable 对应的 idx 位置上。
}
} else if (state == STATE_WAIT_OPEN || state == STATE_WAIT_CLOSE) { // 如果状态是 等待开仓 或者 等待完成
var openId = OpenFunc(openPrice, BuyFirst ? amountB[idx] : amountS[idx]); // 下开仓单。
if (typeof(openId) === 'number' || typeof(openId) === 'string') { // 判断是否下单成功
fishTable[idx] = STATE_WAIT_COVER; // 更新状态 为等待平仓
uuidTable[idx] = openId; // 记录当前 节点 订单ID
if (state == STATE_WAIT_CLOSE) { // 如果是等待完成 (开仓订单下了后 才会触发)
ProfitCount++; // 累计盈利次数
var account = _C(exchange.GetAccount); // 获取当前账户信息
var ticker = _C(exchange.GetTicker); // 获取当前行情信息
var initNet = _N(((InitAccount.Stocks + InitAccount.FrozenStocks) * ticker.Buy) + InitAccount.Balance + InitAccount.FrozenBalance, 8);
// 计算 初始 资产 净值
var nowNet = _N(((account.Stocks + account.FrozenStocks) * ticker.Buy) + account.Balance + account.FrozenBalance, 8);
// 计算 当前 资产 净值
var actualProfit = _N(((nowNet - initNet)) * 100 / initNet, 8); // 计算 收益率
if (AmountType == 0) { // 根据 买卖同量 , 自定义量 不同的处理。
var profit = _N((ProfitCount * amount * PriceDiff) + LastProfit, 8); // 计算: 所有盈利节点的 盈亏 和 上次撒网盈亏 之和 即 总盈亏
Log((BuyFirst ? '完成卖单:' : '完成买单:'), coverPrice, '量:', (BuyFirst ? amountS[idx] : amountB[idx]), '平仓收益', profit);
// 输出 订单完成信息
} else {
Log((BuyFirst ? '完成卖单:' : '完成买单:'), coverPrice, '量:', (BuyFirst ? amountS[idx] : amountB[idx]));
}
}
}
}
}
Sleep(CheckInterval); // 网格逻辑 主要 while 循环检测, 每次 暂停一定时间 CheckInterval 即:检测间隔
}
return true; // 本次撒网完成 返回 true
}
function main() { // Политика основная функция, программа начинает выполнять с этого места. if (ResetData) { // RestData Для параметров интерфейса, по умолчанию true, контролировать, будет ли все данные очищены при запуске. По умолчанию все очищены. LogProfitReset ((); // Использует функцию API LogProfitReset, чтобы очистить все доходы. LogReset ((); // Использует функцию API LogReset, чтобы очистить все журналы. {y:bi} // exchange.SetMaxDigits ((Precision) // был отменен, вместо него используется exchange.SetPrecision. exchange.SetPrecision ((Precision, 3) // exchange.SetPrecision ((2, 3); // Установка ценовой дробитовой точности в 2 бита, дробитовой точности в 3 бита под разновидностью // Precision для параметров интерфейса.
if (typeof(AmountType) === 'undefined') { // 订单 数量类型, 0:“买卖同量” , 1:“自定义量” , 检测 如果该参数是 未定义的,默认设置 0 。
AmountType = 0; // typeof 会 检测 AmountType 的类型, 如果是 undefined 即 “未定义” ,则给 AmountType 赋值 0。
}
if (typeof(AmountDot) === 'undefined') { // 订单量 小数点 最长位数 AmountDot 如果是 未定义的, 设置 AmountDot 为 3 。
AmountDot = 3; // 其实已经由 exchange.SetPrecision(Precision, 3) 设置过了,在底层会截断处理。
}
if (typeof(EnableDynamic) === 'undefined') { // 检测 是否 开启动态挂单 参数, 如果 EnableDynamic 是未定义的, 设置 为 false 即 不开启。
EnableDynamic = false;
}
if (typeof(AmountCoefficient) === 'undefined') { // 如果未定义, 默认设置 "*1"
AmountCoefficient = "*1";
}
if (typeof(EnableAccountCheck) === 'undefined') {// 如果未定义, 启用资金检验 参数 设置为 true ,即 开启。
EnableAccountCheck = true;
}
BuyFirst = (OpType == 0); // 根据 OpType 的设置 去 给BuyFirst 赋值, OpType 设置网格类型, 0: 先买后卖, 1: 先卖后买
IsSupportGetOrder = exchange.GetName().indexOf('itstamp') == -1; // 检测 交易所 名称, 如果是 Bitstamp 则提醒
if (!IsSupportGetOrder) {
Log(exchange.GetName(), "不支持GetOrder, 可能影响策略稳定性.");
}
SetErrorFilter("502:|503:|S_U_001|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|refused|EOF|When");
// SetErrorFilter 过滤错误信息
exchange.SetRate(1);
Log('已经禁用汇率转换, 当前货币为', exchange.GetBaseCurrency()); // 禁用汇率转换
if (!RestoreProfit) { // 恢复上次盈利 若果是 false 则 给 LastProfit 赋值 0 , 即不恢复。
LastProfit = 0;
}
var orgAccount = _C(exchange.GetAccount); // 获取账户信息, 此处记录 策略开始运行时的 初始账户信息 ,用于 计算一些收益,如: 总体浮动盈亏 等。本策略有几个参数 都是 该变量传入。
var fishCount = 1; // 撒网次数 初始1
while (true) { // 策略 主循环
if (!fishing(orgAccount, fishCount)) { // 撒网函数 fishing
break;
}
fishCount++; // 撒网次数 累计
Log("第", fishCount, "次重新撒网..."); // 输出 撒网信息。
FirstPriceAuto = true; // 重置 首价格自动 为true
Sleep(1000); // 轮询间隔 1000毫秒
}
}
### 如有注释错误,欢迎指正 ^^
ЖивойВы можете оставить мне контактную ссылку?
ЖивойЭта стратегия может устанавливать максимальный предел выгодной позиции, который может быть автоматически перемещен, если это неблагоприятная позиция, или просто пересекать сетку с помощью остановки убытков, но пересекать сетку, как будто у баланса есть проблемы, и не может балансировать до начального состояния стратегии. Я несколько раз балансировал, но не хватает монет, чтобы создать только двухместную сетку.
18180828122Не поддерживаете ли вы контракт, который указывает на неудачу подписки?
kkmsотметка
- Что?Когда сеть больше, она перевешивает частоту вызовов API, где добавляется задержка?
Чэнь Юху ЦСХозяин дома может оставить контактную информацию?
nxtplayer666, научитесь кодировать.
Изобретатели количественного измерения - мечтыV: DoMyBestForeverAgo (Сделай лучшее, что сможешь)
Изобретатели количественного измерения - мечтыЭто должна быть стратегия на месте.
- Что?Я не знаю, где именно.
Изобретатели количественного измерения - мечтыКонтролируемый промежуток времени в консультациях Или, промежуток времени при заказе.
Изобретатели количественного измерения - мечтыBotVS QQ группа может QQ меня ^^: маленькая мечта