資源の読み込みに... 荷物...

デジタル通貨の現金ヘッジ戦略の設計 (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差の引き金線は2つの曲線 (現在のAからBへの差,BからAへの差) と2つの水平線 (引き金線) を描く必要があります.

投資家は,投資のコストを削減するために,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
      }

価格の差は1つだけ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"つで2つになりました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 行のコードで図を描くことで,実行時に図が表示されるようにします.

片側ヘッジ機能

この記事では,格差の引き金線が2つに分けられ,それぞれが制御されていることを言及しています.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

2つのコントロールが追加され,一つは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

発明者 量化 - 微かな夢素晴らしい,レッスンをする機会です.

軽い雲分かりました,ありがとう.

発明者 量化 - 微かな夢取引所のオブジェクトを2つ追加します.