Разработка системы управления синхронизацией заказов на основе квантификации FMZ (2)
Заказать синхронный сервер
Продолжим предыдущую статью:Разработка системы управления синхронизацией заказов на основе квантификации FMZ (1)После обсуждения с экспертами мы приступили к разработке стратегии синхронного копирования сделок.
Рассмотрим следующие вопросы дизайна:
-
- Если вы пока не хотите выполнять приказы синхронно, можете ли вы поставить их на паузу? После паузы запуск из API расширения запрещен, используется аутентификация по паролю.
Для реализации этой функции добавьте две глобальные переменные:
javascriptvar isStopFollow = false // 用于标记当前是否跟单 var reStartPwd = null // 用于记录重启密码Затем добавьте интерактивные элементы управления на страницу редактирования стратегии, чтобы приостановить/перезапустить стратегию (это не останавливает реальную торговлю, а только приостанавливает логику, прекращает выполнение ордеров и ничего не делает). При паузе вы можете установить пароль паузы, чтобы даже если у вас есть расширенный API KEY
订单同步管理系统类库(Single Server)Даже реальный счет не сможет пробудить вашу стратегию. При перезапуске копирования сделок введите предустановленный пароль, чтобы активировать функцию копирования сделок.
Код реализации связанных функций:javascript... // 判断交互指令 if (arr.length == 2) { // 带控件的按钮 if (arr[0] == "stop/restart") { // 暂停/重启跟单 if (!isStopFollow) { isStopFollow = true reStartPwd = arr[1] Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000") } else if (isStopFollow && arr[1] == reStartPwd) { isStopFollow = false reStartPwd = null Log("已经重启跟单,", "清空重启密码。", "#FF0000") } else if (isStopFollow && arr[1] != reStartPwd) { Log("重启密码错误!") } } continue } - Если вы пока не хотите выполнять приказы синхронно, можете ли вы поставить их на паузу? После паузы запуск из API расширения запрещен, используется аутентификация по паролю.
-
- Вы можете указать объем заказа или масштабировать его в большую или меньшую сторону.
Добавьте параметры в стратегию:
selectedAmount: указывает сумму последующего заказа. Значение по умолчанию -1, что означает, что оно не указано.
zoomAmountRatio : масштабирование в соответствии с суммой заказа в отправленном сигнале, например, отправленный сигнал:ETH_USDT,swap,buy,1, умножьте количество заказа на zoomAmountRatio. Значение по умолчанию -1, что означает отсутствие масштабирования.javascriptvar amount = specifiedAmount == -1 ? action.amount : specifiedAmount amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatioЗдесь мы реализуем объем заказа, который необходимо отслеживать в полученном сигнале.УвеличитьилиУкажите конкретные значения。
- Вы можете указать объем заказа или масштабировать его в большую или меньшую сторону.
-
- Сохраняйте код максимально лаконичным и используйте другие библиотеки шаблонов для обработки заказов.
Точечный заказ с использованием библиотеки классов: https://www.fmz.com/strategy/10989
Библиотека фьючерсных заказов: https://www.fmz.com/strategy/203258javascriptfunction trade(action) { // 切换交易对,设置合约 exchange.SetCurrency(action.symbol) if (action.ct != "spot") { exchange.SetContractType(action.ct) } var retTrade = null var amount = specifiedAmount == -1 ? action.amount : specifiedAmount amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio if (action.direction == "buy") { retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount) } else if (action.direction == "sell") { retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount) } else if (action.direction == "closebuy") { retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount) } else if (action.direction == "closesell") { retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount) } return retTrade }Итак, как видите, для размещения заказа достаточно одного предложения:
$.Sell(amount)、$.Buy(amount)、$.OpenLong(exchange, action.ct, amount).. ждать.
Код стратегии:
Предыдущий订单同步管理系统(Synchronous Server)Временный код такой:
Начните редизайн сейчас订单同步管理系统(Synchronous Server):
javascript
// 全局变量
var isStopFollow = false
var reStartPwd = null
function trade(action) {
// 切换交易对,设置合约
exchange.SetCurrency(action.symbol)
if (action.ct != "spot") {
exchange.SetContractType(action.ct)
}
var retTrade = null
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
if (action.direction == "buy") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
} else if (action.direction == "sell") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
} else if (action.direction == "closebuy") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
} else if (action.direction == "closesell") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
}
return retTrade
}
function parseCmd(cmd) {
var objAction = {}
// 解析cmd ,例如:ETH_USDT,swap,buy,1
var arr = cmd.split(",")
if (arr.length != 4) {
return null
}
objAction.symbol = arr[0]
objAction.ct = arr[1]
objAction.direction = arr[2]
objAction.amount = arr[3]
return objAction
}
function main() {
// 清除所有日志
LogReset(1)
if (isSimulateOKEX) {
exchange.IO("simulate", true)
Log("切换到OKEX模拟盘!")
}
// 设置精度
exchange.SetPrecision(pricePrecision, amountPrecision)
// 检查缩放、指定不能同时设置
if (specifiedAmount != -1 && zoomAmountRatio != -1) {
throw "不能同时指定同步量和缩放量"
}
while (true) {
var cmd = GetCommand()
if (cmd) {
Log("cmd: ", cmd)
var arr = cmd.split(":")
// 判断交互指令
if (arr.length == 2) {
// 带控件的按钮
if (arr[0] == "stop/restart") {
// 暂停/重启跟单
if (!isStopFollow) {
isStopFollow = true
reStartPwd = arr[1]
Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000")
} else if (isStopFollow && arr[1] == reStartPwd) {
isStopFollow = false
reStartPwd = null
Log("已经重启跟单,", "清空重启密码。", "#FF0000")
} else if (isStopFollow && arr[1] != reStartPwd) {
Log("重启密码错误!")
}
}
continue
}
// 允许跟单
if (!isStopFollow) {
// 解析跟单信号交互指令
var objAction = parseCmd(cmd)
if (objAction) {
// 解析正确
var ret = trade(objAction)
} else {
Log("错误的信号指令 cmd:", cmd)
}
}
}
// 显示跟单情况
LogStatus(_D(), isStopFollow ? "停止同步" : "保持同步", "\n")
Sleep(1000)
}
}
тест
На этот раз счет с ордерами будет использовать для тестирования реальный счет Binance, а реальный счет для копирования ордеров будет использовать счет OKEX. Мы по-прежнему используем тестовую функцию, использованную в предыдущей статье (订单同步管理系统类库(Single Server)В шаблонеmainфункция).
Мы только что изменили направление транзакции на короткую продажу и объем транзакции на 0,003 (контракты Binance на основе USDT могут размещать ордера в десятичных числах). Однако счет OKEX должен быть целым числом (ордера биржи OKEX должны быть размещены целыми числами), поэтому я указываю параметры стратегииspecifiedAmountравно 1.
订单同步管理系统类库(Single Server)Тестовая функция запускает реальную транзакцию.
Стратегия копирования ордеров в реальном времени получает сигнал и выполняет действие копирования:
Биржа открыла соответствующий ордер.
Далее давайте протестируем закрытие позиции и изменим направление ордера в основной функции теста, чтобы закрыть короткую позицию в 0,003 контракта.
Затем снова запустите реальный диск, отвечающий за прием заказов (订单同步管理系统类库(Single Server))。
Та же операция запускается и при копировании реального заказа:
Адрес политики:
Библиотека классов системы управления синхронизацией заказов (один сервер)
Заказать синхронный сервер
Стратегический дизайн предназначен только для общения и обучения. Пожалуйста, изменяйте, корректируйте и оптимизируйте его в соответствии с реальными производственными потребностями.
- 1












