디지털 화폐 현금 헤지킹 전략 설계 (2)

저자:작은 꿈, 2021-07-30 16:36:48, 업데이트: 2023-09-20 10:36:43

img

디지털 화폐 현금 헤지킹 전략 설계 (2)

지난 기사에서 우리는 간단한 헤지킹 전략을 함께 구현했고, 다음 기사에서는 이 전략을 어떻게 업그레이드할 수 있는지 배웠습니다. 전략 변경은 크지 않지만 변경된 세부 사항은 주의가 필요합니다. 코드에서 일부 장소의 정의와 이전 변경은 중요하게 이해해야합니다.

이 전략을 업그레이드해야 합니다.

  • 현금 거래소 객체 레버링 모드를 변경 이 변경은 실제 디스크에만 관련되어 있으며, 일부 현금 거래는 모든 현금 리버드 인터페이스를 FMZ에 포괄합니다. FMZ에 직접 포괄되어 현금 리버드를 지원하는 거래소 개체에 대한 직접 전환 모드도 가능합니다.
  • 이 그래프의 차이점을 더합니다. 이 그래프에서 보실 수 있는A交易所->B交易所B交易所->A交易所이 그래프에서, 이 그래프에서, 이 그래프에서画线类库그리고 우리는 FMZ를 사용하는 방법을 함께 배웠습니다.模版类库기능.
  • 단측 헤딩 기능 이 변화는 상대적으로 큰 것으로 볼 수 있는데, 특정 헤지핑 거래에서 두 거래소의 차이는 완전히 뒤집는 것이 어렵기 때문이다. 대부분의 시간 동안 한 거래소의 가격이 다른 거래소의 가격보다 높게 지속된다. 이 때 우리의 자산이 모두 헤지핑되어 있다면 (즉, 코인이 낮은 거래소에서, 돈이 높은 거래소에서) 헤지핑은 정체되어 있으며, 더 이상 차이의 변동 수익성에 의존할 수 없습니다. 이 때 전략이 손실을 줄일 수 있도록 해야 합니다.
  • 인터랙션 수정 헤지프리드 라인 같은 매개 변수 정책에 상호 작용 기능을 추가하여 실시간으로 가격 차이 트리거 라인을 수정할 수 있습니다.
  • 상태 탭 정보를 정리하고, 표 형식을 사용하여 표시합니다 이 자료를 보여드릴 수 있는 자료를 정리하여 쉽게 관찰할 수 있습니다.

이 프로젝트가 진행될 예정입니다.

현금 거래소 객체 레버링 모드를 전환

현금 레버리지 모드로 전환하는 코드exchanges[i].IO, 입력 파라미터trade_normal리버로 전환, 입력trade_super_margin리버 풀 포스트로 전환, 재 측정은 지원되지 않습니다. 이것은 실제 포스트에서만 사용됩니다.

이쪽에서main함수의 시작에 대한 준비 단계가 증가합니다:

    // 切换杠杆模式
    for (var i = 0 ; i < exchanges.length ; i++) {   // 遍历检测所有添加的交易所对象
        if (exchanges[i].GetName() == "Binance" && marginType != 0) {   // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
            if (marginType == 1) {
                Log(exchanges[i].GetName(), "设置为杠杆逐仓")
                exchanges[i].IO("trade_normal")
            } else if (marginType == 2) {
                Log(exchanges[i].GetName(), "设置为杠杆全仓")
                exchanges[i].IO("trade_super_margin")
            }
        }
    }

이 정책에는 단지 위안 현금에 대한 교환 위안 리버드 모드의 코드가 추가되어 있기 때문에 정책 파라미터에 전환을 설정하면 위안 현금에만 유효합니다.

이 그래프의 차이점을 더합니다.

이미 포장된 그림 템플릿을 사용하면 매우 간단합니다. 우리가 사용하는 템플릿의 이름은画线类库◎ FMZ 플랫폼 전략 광장에서 직접 검색하여 얻을 수 있습니다.

img

이 글은 한글로 번역되어 있습니다.https://www.fmz.com/strategy/27293이 템플릿을 복사하는 페이지로 이동하십시오.

img

버튼을 누르면 이 템플릿 클래스 라이브러리를 자신의 정책 라이브러리로 복사할 수 있습니다.

img

다음으로 정책 편집 페이지에서, 템플릿 탭에서 필요한 템플릿 클래스 라이브러리를 선택할 수 있습니다. 탭을 클릭한 후 저장 정책을 클릭하면 템플릿이 참조됩니다. 이것은 템플릿 탭의 사용에 대한 간단한 설명입니다. 이 정책은 이미 템플릿을 참조하여 작업을 반복할 필요가 없습니다.画线类库이 글은 이미 인용되어 있습니다.

우리는 주로 그것을 사용하는 방법을 배우고 있습니다.画线类库이 함수들은 그림들을 그리기 위한 것입니다.

img

우리가 계획하는A->B이 모든 것은 매우 중요합니다.B->A두 개의 곡선 (현재의 A에서 B, B에서 A의 차이) 과 두 개의 수평선 (시행 가격의 차이) 을 그리는 것이 필요합니다.

우리는 단편적인 헤지킹을 설계하고 있습니다.A->B그리고B->A이 글의 트리거 라인은 다릅니다. 지난 기사에서:

      var targetDiffPrice = hedgeDiffPrice
      if (diffAsPercentage) {
          targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
      }

이 모든 것은 단지 하나의 트리거입니다targetDiffPriceᅳ 그래서 여기서 우리는 코드를 수정하고, 먼저 변수를 수정합니다.

img

그리고 코드를 수정합니다:

        var targetDiffPriceA2B = hedgeDiffPriceA2B
        var targetDiffPriceB2A = hedgeDiffPriceB2A
        if (diffAsPercentage) {
            targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
            targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
        }

그리고 이 차이는 전보다 훨씬 더 높습니다.targetDiffPrice한 줄은 두 줄로 바뀌었습니다.targetDiffPriceA2BtargetDiffPriceB2Aᅳ 다음으로, 그림줄 클래스 라이브러리의 그림줄 함수를 사용하여 이 데이터를 그래프에 그려낼 수 있습니다.

        // 画图
        $.PlotHLine(targetDiffPriceA2B, "A->B")  // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
        $.PlotHLine(targetDiffPriceB2A, "B->A")

이 전략이 실행되면 다음과 같은 그래프가 나타납니다.

img

다음으로, 과도한 그래프 라인을 피하기 위해 실시간 스피리치 곡선을 그리십시오. 실시간 스피리치 데이터 그래프 곡선의 코드를 균형 검사에 넣으십시오.

        if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
            nowAccs = _C(updateAccs, exchanges)
            var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
            cancelAll()
            if (isBalance) {
                lastKeepBalanceTS = ts
                if (isTrade) {
                    var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
                    isTrade = false 
                }                
            }

            $.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price)  // 画实时差价曲线
            $.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price)  // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
        }

이 그래프 코드가 4줄에 불과하기 때문에, 실행 중일 때 그래프가 표시됩니다.

일방적인 헤딩 기능

이 문서는 가격 차이 트리거 라인을 두 개의 라인으로 변경했다고 언급했습니다.A->B이 모든 것은 우리가 할 수 있는 일입니다.B->A이 경우 이전 주문 가격 알고리즘을 사용할 수 없으며, 매매 가격 유동화 방법을 사용합니다.

        if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) {          // A -> B 盘口条件满足            
            var priceSell = depthA.Bids[0].Price - slidePrice
            var priceBuy = depthB.Asks[0].Price + slidePrice
            var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
            if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
                Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks)  // 提示信息
                hedge(exB, exA, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        } else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) {   // B -> A 盘口条件满足
            var priceBuy = depthA.Asks[0].Price + slidePrice
            var priceSell = depthB.Bids[0].Price - slidePrice
            var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
            if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
                Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks)  // 提示信息
                hedge(exA, exB, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        }

매수값이 두 개의 데이터로 분리되어 있기 때문에hedge이 글은 다른 글과 비교해 볼 수 있습니다.

function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
    var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
    var sellRoutine = sellEx.Go("Sell", priceSell, amount)
    Sleep(500)
    buyRoutine.wait()
    sellRoutine.wait()
}

이 변경 사항에 따라 약간의 변경 사항이 있습니다. 이 내용은 설명되지 않습니다.

인터랙션 수정 헤지프리드 라인 같은 매개 변수

전략에 상호작용을 추가하여 전략이 실시간으로 차이 트리거 라인을 수정할 수 있도록 한다. 이것은 반자동 전략의 설계 요구이며, 여기에 함께 교육 예시로 구현되었다. 정책의 상호 작용 디자인은 매우 간단합니다. 먼저 정책 편집 페이지에서 정책에 상호 작용 컨트롤을 추가하십시오.

img

두 개의 컨트롤이 추가되었습니다. 하나는 A2B, 하나는 B2A. 컨트롤의 입력 상자에 값을 입력 한 후 입력 상자 오른쪽의 버튼을 클릭하십시오. 즉시 정책에 명령이 보내집니다. 예를 들어: 입력 상자에 값을 입력하십시오.123클릭하세요.A2B이 버튼은 정책에 즉각적인 명령을 보내줍니다.

A2B:123

전략 코드에서 디자인에 대한 상호 탐지, 처리 코드.

        // 交互
        var cmd = GetCommand()   // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
        if (cmd) {               // 检测到有交互指令,例如:A2B:123
            Log("接收到命令:", cmd)
            var arr = cmd.split(":")   // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
            if (arr[0] == "A2B") {     // 判断触发的交互控件是不是A2B
                Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageB2A = parseFloat(arr[1])     // 修改触发差价线
                } else {
                    hedgeDiffPriceA2B = parseFloat(arr[1])          // 修改触发差价线
                }
            } else if (arr[0] == "B2A") {           // 检测到触发的控件是B2A     
                Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageA2B = parseFloat(arr[1])
                } else {
                    hedgeDiffPriceB2A = parseFloat(arr[1])
                }
            }
        }

상태 탭 정보를 정리하고, 표 형식을 사용하여 표시합니다

더 정규화되고 관찰하기 쉬운 상태 표시 표시 표시를 위해.

        var tbl = {
            "type" : "table", 
            "title" : "数据", 
            "cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"], 
            "rows" : [], 
        }
        tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
        tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])

        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")

img

재검토

재검토는 단지 테스트 전략, 초기 탐지 기능이며, 많은 BUG들이 재검토 단계에서 실제로 테스트될 수 있다. 재검토 결과를 너무 신경쓰지 않아도, 최종 전략은 실제 환경에서 실제 총알을 필요로 한다.

img

img

이 전략의 소스 코드는:https://www.fmz.com/strategy/302834


관련

더 많은

15570686905이 거래 전략은 계약 기능에 추가됩니다. 그냥 영구 계약과 거래율 계약이 추가됩니다.

가벼운 구름문장, 재검토 팁 main:127:9 - TypeError: Cannot read property 'SetPrecision of undefined' 다른 화폐에 대한 현금 헤지킹 전략 Ver1.1

작은 꿈좋은 기회입니다.

가벼운 구름이해가 됐어요, 감사합니다.

작은 꿈두 개의 거래소 객체를 추가합니다.