양배추 재배기 전략 분석 (2)

저자:작은 꿈, 2020-11-16 10:03:52, 업데이트: 2023-09-26 21:05:07

img

양배추 재배기 전략 분석 (2)

다음으로올라가는 내용이 글의 내용은

세 번째 추가 함수:

    self.balanceAccount = function() {
        var account = exchange.GetAccount()
        if (!account) {
            return
        }
        self.account = account
        var now = new Date().getTime()
        if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {
            self.preCalc = now
            var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))
            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }
        }
        self.btc = account.Stocks
        self.cny = account.Balance
        self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)
        var balanced = false
        
        if (self.p < 0.48) {
            Log("开始平衡", self.p)
            self.cny -= 300
            if (self.orderBook.Bids.length >0) {
                exchange.Buy(self.orderBook.Bids[0].Price + 0.00, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.01, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.02, 0.01)
            }
        } else if (self.p > 0.52) {
            Log("开始平衡", self.p)
            self.btc -= 0.03
            if (self.orderBook.Asks.length >0) {
                exchange.Sell(self.orderBook.Asks[0].Price - 0.00, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.01, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.02, 0.01)
            }
        }
        Sleep(BalanceTimeout)
        var orders = exchange.GetOrders()
        if (orders) {
            for (var i = 0; i < orders.length; i++) {
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)
                }
            }
        }
    }

구성 함수LeeksReaper()이 문서는 이 문장과 같은 문장입니다balanceAccount()기능의 역할은 계정 자산 정보를 업데이트하고 저장하는 것입니다.self.account이 문서는account속성: ◎ 적시수익을 계산하고 인쇄합니다. 다음으로 최신 계정 자산 정보에 따라 현금 통화 균형 비율을 계산합니다. (현금 거래소 균형) 이변 절감값을 유발할 때 소액 평형을 수행하여 동전을 균형 상태로 되돌려줍니다. 일정 시간 거래를 기다립니다. 그 다음 모든 트랜잭션을 취소하고 다음 라운드에서 해당 기능을 실행하여 균형을 다시 검사하고 그에 따른 처리를합니다.

이 함수의 코드를 문장별로 살펴봅시다. 첫 번째 문장부터var account = exchange.GetAccount()로컬 변수를 선언하는 것입니다.account그리고, 개발자 API를 호출합니다.exchange.GetAccount()현재 계정에 대한 최신 데이터를 얻을 수 있는 함수account변수. 그리고 판단account이 변수는null값 (예: 시간, 네트워크, 거래소 인터페이스 이상 등의 문제로 인해 획득 실패) 는 직접 반환됩니다.if (!account){...}여기) ᅳ

self.account = account이 문장은 로컬 변수를account이 문서는account속성은 생성된 객체에 최신 계정 정보를 기록하는 데 사용됩니다.

var now = new Date().getTime()이 문장은 로컬 변수를 선언합니다.now자바스크립트 언어의 시간 날짜 객체를 호출합니다.getTime()이 함수는 현재 시간 을 반환합니다.now변수.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}이 코드는 현재 시간표와 마지막 기록의 시간표의 차이를 판단합니다.CalcNetInterval * 1000이 글은 지난 업데이트 이후 현재보다 더 많았습니다.CalcNetInterval * 1000밀리초CalcNetInterval초), 시간 인쇄 수익 기능을 구현하기 위해, 수익을 계산할 때 매수 구매 가격을 사용해야 하기 때문에 조건은 또한 제한되어 있습니다.self.orderBook.Bids.length > 0이 조건은 ((depth data, payroll list must have valid ranking information) ). 이 if 문장 조건이 트리거될 때 실행됩니다.self.preCalc = now가장 최근에 인쇄된 수익의 시간표 변수를 업데이트합니다.self.preCalc현재 시간표now■ 이윤 통계는 순액을 계산하는 방법을 사용합니다.var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))즉, 현재 구매 가격에 따라 동전을 돈으로 바꾸고, 계좌의 돈 수와 함께 선언에 부여되는 로컬 변수를 더합니다.net■ 현재의 총액과 마지막으로 기록된 총액이 일치하는지 판단:

            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }

이 모든 것은net != self.preNet정말, 사용하세요.net변수를 업데이트하여 순값을 기록하는 속성self.preNet그리고 이것을 인쇄합니다.net발명가 양적 거래 플랫폼 로봇의 수익 곡선 그래프에 대한 전체 순자 데이터 (FMZ API 문서에서 검색 할 수 있습니다)LogProfit이 함수)

만약 타이밍 프린트 수익이 발생하지 않는다면, 다음 프로세스를 계속하면,account.Stocks현재 현금 계좌에 사용 가능한 동전 수account.Balance현재 계좌의 사용 가능한 금액은self.btcself.cny◎ 오차 비율을 계산하고self.p

self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)

이 알고리즘은 또한 매우 간단합니다. 현재 코인의 가치를 전체 계좌의 순자금의 비율로 계산합니다.

그렇다면, 동전 (주식) 평형이 언제 발생하는지 판단하는 것은 어떨까요? 저자는 여기 50% 위 아래로 2 퍼센트 포인트로 버퍼로, 버퍼 영역의 실행 균형을 초과합니다.self.p < 0.48동전 균형 편차가 발생하여 동전이 부족하다고 생각하여 거래소에서 한 지점을 구입하여 가격 0.01을 증가시키는 것을 시작하여 세 장을 배치합니다. 동전 균형.self.p > 0.52, 원이 더 많다고 생각하면 거래소에서 한 장을 팔고 놓습니다. 마지막으로 매개 변수 설정에 따라 일정 시간을 기다립니다.Sleep(BalanceTimeout)그리고 모든 주문을 취소합니다.

        var orders = exchange.GetOrders()                  # 获取当前所有挂单,存在orders变量
        if (orders) {                                      # 如果获取当前挂单数据的变量orders不为null
            for (var i = 0; i < orders.length; i++) {      # 循环遍历orders,逐个取消订单
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)     # 调用exchange.CancelOrder,根据orders[i].Id取消订单
                }
            }
        }

네 번째 추가 함수:

이 모든 것은 우리가 할 수 있는 일입니다.self.poll = function() {...}함수는 전체 전략의 주요 논리입니다.main()이 함수가 실행되기 시작하면while그리고 우리는 이 세포들을var reaper = LeeksReaper()그리고 그 결과로,main()함수에서 루킹 호출reaper.poll()이 함수들은

self.poll이 함수는 실행을 시작하고, 각 루프에 대한 준비 작업을 수행합니다.self.numTick++이 모든 것은 우리가 할 수 있는 일입니다.self.updateTrades()최근 시장 거래 기록을 업데이트하고 관련 사용 데이터를 계산합니다.self.updateOrderBook()이 자료를 이용하면 고객들의 고객에 대한 정보를 얻을 수 있습니다.self.balanceAccount()이 자리에서, 우리는 모든 것을 확인하고 있습니다.

        var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct   # 计算爆发价格
        var bull = false             # 声明牛市标记的变量,初始为假
        var bear = false             # 声明熊市标记的变量,初始为假
        var tradeAmount = 0          # 声明交易数量变量,初始为0

그리고 그 다음에는 현재 단기 시장이 쇠고기인지 곰인지 판단하는 것입니다.

        if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -1)) > burstPrice ||
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length-1] > self.prices[self.prices.length-2]
            )) {
            bull = true
            tradeAmount = self.cny / self.bidPrice * 0.99
        } else if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -1)) < -burstPrice ||
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length-1] < self.prices[self.prices.length-2]
            )) {
            bear = true
            tradeAmount = self.btc
        }

이 모든 것이 우리 삶에 영향을 미치고 있습니다.self.updateOrderBook()이 함수들은 어떻게 될까요? 여기서 우리는 가중평균 알고리즘을 사용하여prices집계. 이 코드는 세 개의 새로운 함수를 사용합니다._.min_.maxslice이 세 가지 함수는 매우 잘 이해됩니다.

  • _.min: 함수는 변수 배열 중 가장 작은 값을 구하는 것이다.

  • _.max: 함수는 변수 배열 중 가장 큰 값을 구하는 것이다.

  • slice: () 는 자바스크립트 배열 개체의 멤버 함수이며, 배열의 일부를 인덱스에 따라 절단하여 반환하는 역할을 합니다. 예를 들어:

    function main() {
        // index     .. -8 -7 -6 -5 -4 -3 -2 -1
        var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
        Log(arr.slice(-5, -1))    // 会截取 4 ~ 1 这几个元素,返回一个新数组:[4,3,2,1]
    }
    

    img

여기서는 곰이나 소를 판단하는 조건이 다음과 같습니다.

  • self.numTick > 2즉, 새로운 테스트 라운드가 발생했을 때 최소 3 라운드를 통과하여 시작에서 트리거를 피하는 것입니다.
  • 가격 순서self.prices이 자료의 마지막 부분은self.prices매개 변수에서 이전 범위에 있는 최대 또는 최소 가격의 차이를 돌파해야 합니다burstPrice이 폭발의 대가는

모든 조건이 충족되면 표시합니다bull또는bear그리고true그리고tradeAmount변수 부여, 힙합 거래를 계획합니다.

그리고 다시 말씀드리자면self.updateTrades()함수에서 업데이트, 계산self.vol변수에 대해BurstThresholdVol거래량을 줄이려는 것 (예정 거래량을 줄이는 것) 을 결정한다.

        if (self.vol < BurstThresholdVol) {
            tradeAmount *= self.vol / BurstThresholdVol   // 缩减计划交易量,缩减为之前量的self.vol / BurstThresholdVol 倍
        }
        
        if (self.numTick < 5) {
            tradeAmount *= 0.8      // 缩减为计划的80%
        }
        
        if (self.numTick < 10) {    // 缩减为计划的80%
            tradeAmount *= 0.8
        }

다음으로 거래 신호와 거래량이 요구 사항을 충족하는지 판단합니다.

        if ((!bull && !bear) || tradeAmount < MinStock) {   # 如果非牛市并且也非熊市,或者计划交易的量tradeAmount小于参数设置的最小交易量MinStock,poll函数直接返回,不做交易操作
            return
        }

이 판결을 받은 후, 실행var tradePrice = bull ? self.bidPrice : self.askPrice이 경우, 거래 가격을 설정하고, 그에 따른 요금 가격을 부여합니다.

그리고 마침내while이 순환의 유일한 정지 조건은tradeAmount >= MinStock계획된 거래량은 최소 거래량보다 작습니다. 루프에서 현재가 쇠시장 또는 곰시장 상태에 따라 다음 순서를 실행한다. 그리고 변수에 단일 ID를 기록한다.orderId◎ 순환마다 주문을 마친 후Sleep(200)200 밀리초를 기다립니다.orderIdtrue (예: 주문이 실패하면 주문 ID를 반환하지 않으면 if 조건이 발생하지 않습니다) true (예: 주문 ID가 반환되지 않으면 if 조건이 발생하지 않습니다)self.tradeOrderId

주문 데이터를 저장하는 변수를 선언합니다order초기 값은null그리고 순환은 이 ID의 주문 데이터를 얻으며, 주문이 대기 상태인지 판단하고, 만약 대기 상태라면, 이 ID의 주문을 취소하고, 그렇지 않다면 이 검출 순환을 건너뛰는다.

                var order = null           // 声明一个变量用于保存订单数据
                while (true) {             // 一个while循环
                    order = exchange.GetOrder(orderId)    // 调用GetOrder查询订单ID为 orderId的订单数据
                    if (order) {                          // 如果查询到订单数据,查询失败order为null,不会触发当前if条件
                        if (order.Status == ORDER_STATE_PENDING) {   // 判断订单状态是不是正在挂单中
                            exchange.CancelOrder(orderId)            // 如果当前正在挂单,取消该订单
                            Sleep(200)
                        } else {                                     // 否则执行break跳出当前while循环
                            break
                        }
                    }
                }

다음으로 다음 과정을 수행합니다:

                self.tradeOrderId = 0              // 重置self.tradeOrderId
                tradeAmount -= order.DealAmount    // 更新tradeAmount,减去提单的订单已经成交的数量
                tradeAmount *= 0.9                 // 减小下单力度
                if (order.Status == ORDER_STATE_CANCELED) {     // 如果订单已经是取消了
                    self.updateOrderBook()                      // 更新订单薄等数据
                    while (bull && self.bidPrice - tradePrice > 0.1) {   // 牛市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    while (bear && self.askPrice - tradePrice < -0.1) {  // 熊市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice -= 0.1
                    }
                }

프로그램 프로세스가 뛰면while (tradeAmount >= MinStock) {...}이 순환은 이 가격 폭발 거래 과정의 실행이 완료되었다는 것을 나타냅니다. 실행self.numTick = 0다시 설정합니다self.numTick0와 같습니다.

LeeksReaper()이 함수들은self다시 돌아오는 것은var reaper = LeeksReaper()그리고 그 다음에는reaper

지금까지LeeksReaper()구성 함수는 어떻게 구성되는지, 그리고 각 방법, 주요 논리 함수의 실행 프로세스가 어떻게 구성되는지, 우리는 다시 해독했습니다.


더 많은

키티드림 총장님 감사합니다. 드림 총장님, 양배추 수확기와 풀 신의 고기동 로봇을 결합하는 아이디어는 미쳤나요?

매트 1988이 문장은 '무슨 말도 안 된다'라는 내용의 문장입니다.

신디YY1024왜 동전과 돈의 균형을 유지해야 하는지 이해가 안되는데, 만약 균형을 이루지 못한다면 구매와 판매를 해야 한다.

데마시아의 힘다음 명령어는 어디에 있나요?

에디전까진 봤던 구름 안개에서, FMZ를 한 번 사용해서 다시 봤습니다. 거래소 가격 변동을 모니터링하고 가격 폭발을 발견하고, 트렌드 방향에 따라 거래량 크기를 기준으로 계산하는 하프 비율을 계산하여 하프 거래를 수행합니다. 하프 거래가 끝난 후 보유하지 않고 장기적으로 동전 균형 상태를 유지합니다. 제가 말했던 건 맞죠, 꿈의 총장님?

키티이 기능은 어떻게 작동하는지 설명해 주시기 바랍니다. balanceAccount을 제거하면 어떻게 진행될까요?

키티드림 총님 감사합니다, FMZ는 정말 보물입니다.

printbtc이 모든 것은

소康BurstThresholdVol는 어떻게 설정할 수 있을까요?

에반1987이 글은 한 시간 동안 보고도 제대로 이해가 되지 않는 내용으로 가득합니다.

로트메666의 꿈, 연구 결과 인쇄금과 같은 재배기를 만들 수 있을까?

작은 꿈그라신의 한 기사는 높은 주파수의 시장 환경이 필요하다고 말했습니다. 전략적으로 비닐 수확기와 그라신의 높은 주파수의 로봇은 공통점을 가지고 있습니다.

작은 꿈죄송합니다. 이 글은 초보자에게 실행 과정을 설명하는 것이 대부분입니다. 많은 헛소리들이 눈에 띄고 있습니다.

작은 꿈멋지네요!

작은 꿈원본 콩나뭇잎 재배기는 균형 모듈을 가지고 있으며 제거하는 것을 고려할 수 있습니다. 구체적인 영향은 명확하지 않습니다.

작은 꿈무례한 것

작은 꿈♪ 오, 오 ♪

작은 꿈발발량, 이것은 정책 파라미터이며, 인공적으로 설정되어 있으며, 정책이나 기사를 자세히 살펴보면 이 변수가 무엇을 제어하는지 알 수 있습니다.

작은 꿈그 원리는 거의 같아야 합니다.