FMZ를 기반으로 한 양적 주문 동기 관리 시스템 설계 (2)

저자:작은 꿈, 창작: 2022-02-16 12:11:36, 업데이트: 2023-09-15 20:46:46

img

FMZ를 기반으로 한 양적 주문 동기 관리 시스템 설계 (2)

주문 동기 관리 시스템 (Synchronous Server)

우리는 이전 기사에서 계속합니다:FMZ를 기반으로 한 양적 주문 동기 관리 시스템 설계 (1)이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들은, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이, 이 모든 것들이.

이런 몇 가지 디자인 문제를 생각해보세요.

  • 1, 일시적으로 연결을 동기화하지 않으려면 일시 중지할 수 있습니까. 일단 일시 중지되면 확장 API에서 시작하여 암호 검증을 사용하는 것이 금지됩니다. 이 기능을 구현하기 위해, 두 개의 글로벌 변수를 추가합니다:

    var isStopFollow = false   // 用于标记当前是否跟单
    var reStartPwd = null      // 用于记录重启密码
    

    img

    그 다음 정책 편집 페이지에 인터랙티브 컨트롤을 추가하여 정책의 일시 중지/재시작 (이 디스크를 중지하는 것이 아니라 논리적인 일시 중지, 더 이상 순서, 아무것도 하지 않는 것) 을 사용합니다. 일시 중지 시에는 일시 중지 암호를 설정할 수 있습니다.订单同步管理系统类库(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 
              }
    
  • 2 째, 목록의 단위 크기를 지정할 수 있습니다. 또는 곱셈으로 확장할 수 있습니다. 정책에 매개 변수를 추가합니다:

    img

    specifiedAmount: 계열의 수를 지정합니다. 기본값은 -1, 즉 지정하지 않습니다. zoomAmountRatio: 전송된 신호의 아래 단위 크기에 따라 확대, 예를 들어 전송된 신호는:ETH_USDT,swap,buy,1, 이 중 하위 단위의 값을 zoomAmountRatio로 곱합니다. 기본값은 -1, 즉 확장되지 않습니다.

        var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
        amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
    

    여기서는 수신된 신호의 필요량과 수요량에 대한 계산을 수행합니다확장또는특정 값

  • 3, 코드를 최대한 간소화하고, 다른 템플릿 클래스 라이브러리를 사용하여 처리하십시오.

    현금 주문을 통해 사용 가능한 클래스: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)이 사이트의 임시 코드는 다음과 같습니다:

img

이제 다시 디자인하기 시작합니다.订单同步管理系统(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함수) ᅳ

img

하지만 우리는 거래 방향을 0으로 바꾸고 거래의 양을 0.003으로 변경합니다. 하지만 OKEX 계정 계정은 정수여야 합니다. 그래서 저는 전략 매개 변수를 지정합니다.specifiedAmount1 ⋅

img

订单同步管理系统类库(Single Server)이 테스트 함수는 실제 디스크에서 거래를 촉발합니다.

img

이 비디오에서, 이 비디오는 실제 디스크 정책에 의해 신호를 받고, 이 작업을 수행합니다.

img

이 거래소는 해당 주문을 발령했습니다.

img

다음으로 평형을 테스트하고, 테스트 main 함수에서 아래 순서 방향을 평형으로 바꾸어 0.003개의 빈자리를 제거한다.

img

그리고 다시 실행에 옮기기 위해 이 리얼 디스크를 사용했습니다.订单同步管理系统类库(Single Server))。

img

이 비디오는 이 비디오에서 볼 수 있는 것과 같습니다.

img

그라운드:주문 동기 관리 시스템 클래스 라이브러리 (Single Server) 주문 동기 관리 시스템 (Synchronous Server)

전략 설계는 교류 학습, 실제 생산은 스스로 수정, 조정, 최적화해야 합니다.


관련

더 많은