리소스 로딩... 로딩...

디지털 화폐 정량화 거래 전략 거래소 구성 세부 사항

저자:발명가들의 수량화 - 작은 꿈, 2019-09-02 09:39:59, 업데이트: 2023-10-19 21:07:41

img

디지털 화폐 정량화 거래 전략 거래소 구성 세부 사항

초보자 디지털 화폐 정량 거래 전략을 설계할 때, 종종 다양한 전략 요구 사항이 있습니다. 어떤 언어나 플랫폼을 사용하더라도 다양한 상황의 전략 설계 요구 사항이 발생합니다. 예를 들어, 때로는 여러 종류의 회전이 필요하고, 때로는 여러 플랫폼 헤지킹이 필요하며, 때로는 다양한 종류의 거래가 필요하며, 다음과 같습니다. 아래와 같이 전략 요구 사항을 구현하는 데 몇 가지 디자인 경험을 공유합니다. 이 교육 플랫폼은 여전히 발명가의 양적 거래 플랫폼을 사용하고 있습니다.https://www.fmz.com), 시장은 디지털 통화 시장으로 선택합니다.

  • "다화폐" 전략 설계

    이러한 요구 상황들은 다종류의 트렌드 전략, 다종류의 격자 전략 등을 작성해야 하며, 전략 논리를 대상으로 다른 거래로 시장을 반복적으로 실행해야 한다. 보통은 이렇게 디자인됩니다.

    function Process (symbol) {
        exchange.IO("currency", symbol)
        var ticker = _C(exchange.GetTicker)
        Log("已经切换交易对,按照策略逻辑处理交易对 :", symbol, "行情:", ticker)
        // ...
        // ..
        // .
    }  
    
    function main(){
        var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
        while (true) {
            for (var i = 0 ; i < symbols.length; i++) {
                Process(symbols[i])
                Sleep(500)
            }
        }
    }
    

    우리는 로봇을 구성합니다:img

    img

    보시다시피, 이것은 로봇에 거래소 객체를 구성하고 거래 쌍을 전환하고 다른 거래 쌍의 시장을 확보하고 다양한 시장을 수행하여 전략적 논리 아래 실행하는 것을 구현합니다. 보시다시피, 우리가 정의한 세 개의 거래 쌍: BTC_USDT, LTC_USDT, ETH_USDT는 순환에서 순차적으로 반복하여 시장을 획득하고 시장을 획득한 후 시장을 검출하고 전략적으로 설계된 거래 논리를 유발할 수 있습니다.

    어떤 학생들은 이렇게 말할 수도 있습니다. "나는 거래 쌍을 바꾸기를 좋아하지 않아, 조금 곤란해, 전략이 명확하지 않다". 그러나 다른 디자인 방법도 있습니다. 아래에서 소개하는 다른 방법입니다.

  • 동일한 거래소 계정에서 로봇에 여러 거래소 개체를 구성합니다.

    여러 거래소 객체를 통해 다른 거래 쌍의 시장 데이터를 획득하고 반복 전략 논리에서 실행합니다. 예를 들어, 로봇을 이렇게 구성합니다: 로봇에 세 개의 거래소 객체를 구성하고 거래 쌍을 각각 BTC_USDT, LTC_USDT, ETH_USDT로 설정합니다.img

    "OKEX 현금 V3 테스트"라는 이름의 거래소 객체, 제어 센터, 거래소 구성 페이지:img이 모든 것은 이미 구성되어 있습니다.

    코드를 수정하세요, 왜냐하면 이번에는 로봇에 BTC_USDT, LTC_USDT, ETH_USDT에 대한 거래 대상을 추가했기 때문입니다.

    function Process (e) {
        var ticker = _C(e.GetTicker)
        Log("交易所", e.GetName(), "按照策略逻辑处理交易对 :", e.GetCurrency(), "行情:", ticker)
        // ...
        // ..
        // .
    }  
    
    function main(){
        while (true) {
            for (var i = 0 ; i < exchanges.length; i++) {
                Process(exchanges[i])
                Sleep(500)
            }
        }
    }
    

    로봇을 조종하는 것:img

    위의 예는 거래 쌍을 전환하거나 하나의 계정 구성에 여러 개의 다른 거래 쌍을 추가하는 거래소 객체이다. 모든 것이 하나의 거래소 계정을 사용하는 것입니다. 그렇다면 하나의 전략에서 여러 거래소 계정을 사용하는 것은 어떨까요?

  • 여러 거래소 계정을 사용하는 전략

    일부 전략은, 예를 들어, 여러 거래소 간 시장을 헤딩, 단일 거래소 내 여러 계정 전략 등이다.

    • 여러 거래소가 구성되어 있지만 서로 다른 거래소입니다.img예를 들어, 저는 컨트롤 센터 -> 거래소 -> 거래소를 추가하는 페이지에서 2개의 거래소를 구성했습니다. 저는 이 두 거래소에서 구성된 계정의 자산 정보를 접근할 수 있습니다.

      img

      function main(){
          Log(exchanges[0].GetAccount())    // 打印第一个 交易所对象的账户资产信息,即火币期货 这个交易所的资产信息。
          Log(exchanges[1].GetAccount())    // ... 打印Bit-Z这个交易所的资产信息
      }
      

      물론, 저는 두 번째 또는 세 번째 계정을 하나에 추가할 수 있습니다.

    • 여러 거래소가 동일한 거래소로 구성되어 있습니다.

      예를 들어, 우리는 토큰 선물 계좌를 추가합니다.img

      보시다시피, 이것은 두 개의 "토큰 선물" 거래소의 계정을 구성합니다.

      img

      정책 생성 시, 로봇의 "변경 설정" 옵션에서 또 하나의 토큰 선물 거래소 객체가 선택하도록 나타납니다.

      img

      예를 들어 두 개의 계정이 하나의 구매자 먼저 판매자 다음 매장 전략 (상향) 과 하나의 구매자 먼저 매장자 다음 매장 전략 (하향) 을 가질 수 있습니다.

      이 두 가지 예로

      로봇이 여러 거래소 개체를 구성하는 것과 "동일한 거래소 계정에서 로봇이 여러 거래소 개체를 구성한다"는 차이점을 설명합니다.

      이 급격한 예는 앞서 설명한 "동일한 거래소 계정에서 로봇에 여러 거래소 객체를 구성한다"는 예와 비슷하지만, 차이가 있다. 상위 예제와 다른 것은 거래소 구성입니다.

      img

      로봇이 거래소를 구성할 때 항상 사용되는 것은 다음과 같습니다.img이 구성은.

      거래는 단지 거래소 객체를 추가하면 설정이 다릅니다. GetAccount 함수를 호출하면 항상 동일한 계정의 자산 정보가 액세스됩니다.

      하지만:img이렇게 구성된 두 개의 토큰 선물 거래소 객체는 토큰 선물이지만 서로 다른 거래소 계좌를 대표한다.

  • 디지털 화폐 선물 전략 설계가 더 간단하도록 거래소를 잘 구성합니다.

    때로는 디지털 통화 계약의 헤딩 전략을 수행할 때, 순간적으로 사라지는 거래 기회를 잡기 위해 많은 시나리오에서 동시에 주문을 발송해야 합니다. 그러나 계약이 다르기 때문에, 시장을 획득할 때 해당 계약에 전환해야 합니다. 교환.Go 기능을 사용하여 단일 기능을 동시에 실행하거나 시장을 획득할 때 동기화 문제가 있기 때문에 빠르지 않습니다. 그리고 이러한 스위치 계약의 디자인은 논리적으로 그렇게 간결하지 않습니다. 더 나은 방법이 있습니까?

    물론 방법이 있습니다! 우리는 "동일한 거래소 계정에서 로봇에 여러 거래소 객체를 구성하십시오"와 같은 방법으로 로봇에 두 개의 거래소 객체를 추가 할 수 있습니다.img그리고 이 거래소 구성을 사용하여 거래소 개체를 추가합니다. 이 문서는 이 모든 것을 설명합니다.img하나의 거래소 계정 구성은 동일한 통화, 거래 쌍의 거래소 개체를 추가할 수 없습니다.

    어떻게 할 수 있을까요? 전략 로봇이 두 개의 거래소 객체를 사용하고 거래소 객체에 연결된 하나의 거래소 계정 코드를 가질 수 없나요? 이 모든 것은 우리가 할 수 있는 일입니다.

    우리는 "컨트롤 센터"> "거래소"에서 OKEX 선물 거래소 설정을 추가했습니다.

    img

    설정 후 저장 버튼을 클릭합니다.

    img

    "중점점화"는 두 개의 거래소 구성을 가지고 있지만 동일한 API KEY 구성 정보를 사용합니다.

    img

    이 모든 것이 어떤 장점을 가져오는가? 물론, 전략 작성을 할 때 디자인은 간단합니다.

    function main(){
        exchanges[0].SetContractType("quarter")        // 设置第一个添加的交易所对象 当前的合约为季度合约
        exchanges[1].SetContractType("this_week")      // 设置第二个添加的交易所对象,当前的合约为当周合约
        
        while (true) {
            var beginTime = new Date().getTime()       // 记录这次获取行情时起始的时间戳。
            var rA = exchanges[0].Go("GetTicker")      // 创建并发 线程去获取 第一个交易所对象,也就是季度合约的行情数据。
            var rB = exchanges[1].Go("GetTicker")      // 创建并发 线程去获取 第二个交易所对象,也就是当周合约的行情数据。
            
            var tickerA = rA.wait()                    // 并发的两个线程各自执行自己的任务,这里等待获取数据,A 等待时,B任务也在执行。
            var tickerB = rB.wait()                    // 所以这里看似是顺序执行,实际在底层是并发的。只不过获取的时候是顺序先获取A,在获取B。
            var endTime = new Date().getTime()         // 记录并发获取两个合约行情结束时的时间戳。
            
            if (tickerA && tickerB) {                  // 如果获取的数据没有问题,执行以下逻辑。
                var diff = tickerA.Last - tickerB.Last // 计算差价
                $.PlotLine("diff", diff)               // 使用画线类库把差价画在图表上。
                if (diff > 500) {                      // 如果差价大于500, 对冲套利(当然设置500 的差价是比较大的,很少见。)
                    // 对冲
                    rA = exchanges[0].Go("Sell", tickerA.Buy, 1)     // 并发线程创建 季度合约下卖单
                    rB = exchanges[1].Go("Buy", tickerB.Sell, 1)     // 并发线程创建 当周合约下买单
                    
                    var idA = rA.wait()           // 等待 返回下单结果,返回的是订单ID
                    var idB = rB.wait()           // ...
                }
                
                // ...
            }
            
            LogStatus(_D(), "并发获取两个合约行情耗时:", endTime - beginTime, "毫秒。")    // 显示在状态栏上时间,以便知道程序在执行。
            Sleep(500)
        }
    }
    

    이런 디자인의 전략은 더 많은 것을 단순하게 느끼고 더 많은 것을 명확하게 만듭니다.

    실제 디스크 실행:img

    두 개의 계약을 동시에 획득하는 매번은 약 50 밀리 초 정도 걸린다는 것을 알 수 있습니다.


관련

더 많은

노력하는 양성마지막 방법은 정말 좋았습니다.

정말 도움이 되네요!