
이전 기사를 계속 읽어 보겠습니다.FMZ 정량화 기반 주문 동기화 관리 시스템 설계(1)우리는 전문가들과 논의한 후 동기식 복제 트레이딩을 위한 전략을 설계하기 시작했습니다.
다음과 같은 디자인 문제를 고려해 보세요.
var isStopFollow = false // 用于标记当前是否跟单
var reStartPwd = null // 用于记录重启密码

그런 다음 전략 편집 페이지에 대화형 컨트롤을 추가하여 전략을 일시 중지/재시작합니다(실제 거래를 중단하지는 않고, 로직만 일시 중지하고, 주문 추적을 중단하며, 아무것도 하지 않습니다). 일시 중지 시 확장 API 키가 있어도 일시 중지 비밀번호를 설정할 수 있습니다.订单同步管理系统类库(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
}

specifiedAmount: 후속 주문 금액을 지정합니다. 기본값은 -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)
}
}
이번에는 주문을 담은 계정은 테스트를 위해 바이낸스 실제 계정을 사용하고, 주문을 복사하는 실제 계정은 OKEX 계정을 사용할 것입니다. 우리는 여전히 이전 기사에서 사용한 테스트 기능을 사용합니다.订单同步管理系统类库(Single Server)템플릿에서main기능).

유일한 차이점은 거래 방향을 공매도로 변경하고, 거래량을 0.003으로 변경했다는 것입니다(바이낸스 USDT 기반 계약은 소수점으로도 주문할 수 있습니다). 하지만 OKEX 계정은 정수여야 합니다(OKEX 거래소 주문은 정수로 해야 함). 따라서 전략 매개변수를 지정합니다.specifiedAmount1입니다.

订单同步管理系统类库(Single Server)테스트 함수는 실제 거래를 트리거합니다.

주문 복사의 실시간 전략은 신호를 수신하고 복사 작업을 실행합니다.

거래소는 해당 주문을 열었습니다.

다음으로 테스트 메인 함수에서 포지션을 닫고 주문 방향을 변경해 0.003 계약의 숏 포지션을 닫아보겠습니다.

그런 다음 주문을 받는 실제 디스크를 다시 실행합니다.订单同步管理系统类库(Single Server))。

실제 주문을 복사해도 동일한 작업이 트리거됩니다.

정책 주소: 주문 동기화 관리 시스템 클래스 라이브러리(단일 서버) 동기 서버 주문
전략 설계는 커뮤니케이션과 학습을 위한 것입니다. 실제 생산 요구에 따라 수정, 조정 및 최적화하십시오.