
Продолжим предыдущую статью:Разработка системы управления синхронизацией заказов на основе квантификации FMZ (1)После обсуждения с экспертами мы приступили к разработке стратегии синхронного копирования сделок.
Рассмотрим следующие вопросы дизайна:
var isStopFollow = false // 用于标记当前是否跟单
var reStartPwd = null // 用于记录重启密码

Затем добавьте интерактивные элементы управления на страницу редактирования стратегии, чтобы приостановить/перезапустить стратегию (это не останавливает реальную торговлю, а только приостанавливает логику, прекращает выполнение ордеров и ничего не делает). При паузе вы можете установить пароль паузы, чтобы даже если у вас есть расширенный API KEY订单同步管理系统类库(Single Server)Даже реальный счет не сможет пробудить вашу стратегию. При перезапуске копирования сделок введите предустановленный пароль, чтобы активировать функцию копирования сделок.
Код реализации связанных функций:
...
// 判断交互指令
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
}

selectedAmount: указывает сумму последующего заказа. Значение по умолчанию -1, что означает, что оно не указано.
zoomAmountRatio : масштабирование в соответствии с суммой заказа в отправленном сигнале, например, отправленный сигнал:ETH_USDT,swap,buy,1, умножьте количество заказа на zoomAmountRatio. Значение по умолчанию -1, что означает отсутствие масштабирования.
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
Здесь мы реализуем объем заказа, который необходимо отслеживать в полученном сигнале.УвеличитьилиУкажите конкретные значения。
Точечный заказ с использованием библиотеки классов: https://www.fmz.com/strategy/10989 Библиотека фьючерсных заказов: https://www.fmz.com/strategy/203258
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
}
Итак, как видите, для размещения заказа достаточно одного предложения:$.Sell(amount) 、$.Buy(amount) 、 $.OpenLong(exchange, action.ct, amount) .. ждать.
Предыдущий订单同步管理系统(Synchronous Server)Временный код такой:

Начните редизайн сейчас订单同步管理系统(Synchronous Server):
// 全局变量
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))。

Та же операция запускается и при копировании реального заказа:

Адрес политики: Библиотека классов системы управления синхронизацией заказов (один сервер) Заказать синхронный сервер
Стратегический дизайн предназначен только для общения и обучения. Пожалуйста, изменяйте, корректируйте и оптимизируйте его в соответствии с реальными производственными потребностями.