菜食機の策略解剖 (2)

作者: リン・ハーン小さな夢, 作成日:2020年11月16日 10:03:52, 更新日:2023年9月26日 21:05:07

img

菜食機の策略解剖 (2)

そして上回り内容ブログに投稿された

追加された3番目の関数:

    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ミリ秒CalcNetInterval2秒),定時印刷収益の機能を実現する.収益を計算する際には,取引先の購入価格を使用するため,条件は制限されている.self.orderBook.Bids.length > 0この条件 (深度データ,支払リストには有効な格付け情報が必要です) は,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発明者によるQTTOの収益曲線グラフ (FZ 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コインバランス偏移が引き起こす. コインが少ないと考えて,取引所で1つのポジションを購入し,毎回0.01値上昇を開始し,3つの小切手を配置する. 同様のコインバランス.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取消订单
                }
            }
        }

追加された4つ目の関数は,

戦略の核心部分,重点がここにあります.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数列.このコードでは3つの新しい関数が使用されています._.min_.maxsliceこの3つの関数は,非常によく理解されています.

  • _.min:関数は,参数行列の中で最小の値を求めます.

  • _.max:関数は,参数行列の最大値を求めます.

  • slice: この関数は,JavaScriptの配列オブジェクトのメンバー関数で,配列の部分をインデックスで切断して返します.例:

    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 は true です. (もし注文が失敗し,注文IDを返さない場合は,if 条件を起動しません) true は true です.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
                        }
                    }
                }

このビデオは,Skype.comで公開されました.

                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通貨と貨幣のバランスを保つ必要がある理由が少し不明である.バランスが取れなければ,買い売り操作を行う.その後,バランスタイムアウトが終わって,再び注文をキャンセルし,バランスが取れず,次の爆破環に移行します.

デマシアの力この命令は,次の命令です.

エディこの戦略のアイデアは,次のとおりです. 基本的には,この戦略は,FBZで,FBZで,FBZで, 取引先価格変動を監視し,価格の爆発を発見し,トレンドの方向に沿って,取引量の大きさに基づいてヒップの割合を基準として計算し,ヒップ取引を行います.ヒップ取引が終了した後は,持たないため,長期にわたってコイン・マネーバランスの状態を維持します. 村の村長に言わせると,

クキティこの機能は何のために使われますか? balanceAccountを削除すると,このプログラムはどのように発展しますか?

クキティありがとうございました.FMZは本当に宝庫です.

printbtc について知らないのか

ココンBurstThresholdVolのパラメータは何のために使われますか?

エヴァン1987詳細は1時間ほど見ても理解できないほどです.

ルーツメ666の夢,研究して,プリントマネーのような菜刈り機を作れるのか?

小さな夢草神 (草神) の記事では,高周波は市場環境が必要です. 戦略的には,菜刈り機と草神 (草神) の高周波ロボットの考えが共通している.

小さな夢この記事では,まずは初心者向けに,実行手順について説明しています. 冗談はたくさんあります.

小さな夢すごい!

小さな夢原作の菜刈機にはバランスモジュールがあり,削除を検討することができる.具体的な影響は不明である.

小さな夢礼儀正しくない

小さな夢ほら

小さな夢発作量,これは策略パラメータで,人工的に設定されています. 策略や記事を詳しく見ると,この変数が制御していることがわかります.

小さな夢基本的には同じです.