Type/to search
8
Follow
1369
Followers
バランスのとれた順序戦略(指導戦略)
Discussions
Created 2020-09-02 17:05:25  Updated 2024-12-10 10:09:34
 0
 2856

img

バランスのとれた順序戦略(指導戦略)

この記事で説明する戦略は、本質的には動的バランス戦略であり、コインの価値を常に決済通貨の価値と等しくなるようにバランスをとるというものです。ただし、事前注文として設計されており、戦略ロジックは非常にシンプルです。この戦略を記述する主な目的は、戦略設計のさまざまな側面を示すことです。

  • ポリシーロジックのカプセル化
    戦略ロジックと一部のランタイム データおよびタグ変数を一緒にカプセル化します (オブジェクトにカプセル化します)。

  • 戦略は初期化コードを処理する
    初回実行時には、利益計算のために初期アカウント情報が記録され、パラメータに基づいてデータを復元するかどうかが最初に決定されます。

  • ポリシーインタラクション処理のコード
    シンプルな一時停止と続行の対話プロセスが設計されています。

  • 戦略リターンを計算するコード
    通貨標準方式を使用して利益を計算します。

  • 戦略における重要なデータの永続化のメカニズム
    データを回復するメカニズムを設計する

  • ポリシー処理情報を表示するためのコード
    ステータスバーのデータ表示。

戦略コード

javascript
var Shannon = { // member e : exchanges[0], arrPlanOrders : [], distance : BalanceDistance, account : null, ticker : null, initAccount : null, isAskPending : false, isBidPending : false, // function CancelAllOrders : function (e) { while(true) { var orders = _C(e.GetOrders) if(orders.length == 0) { return } Sleep(500) for(var i = 0; i < orders.length; i++) { e.CancelOrder(orders[i].Id, orders[i]) Sleep(500) } } }, Balance : function () { if (this.arrPlanOrders.length == 0) { this.CancelAllOrders(this.e) var acc = _C(this.e.GetAccount) this.account = acc var askPendingPrice = (this.distance + acc.Balance) / acc.Stocks var bidPendingPrice = (acc.Balance - this.distance) / acc.Stocks var askPendingAmount = this.distance / 2 / askPendingPrice var bidPendingAmount = this.distance / 2 / bidPendingPrice this.arrPlanOrders.push({tradeType : "ask", price : askPendingPrice, amount : askPendingAmount}) this.arrPlanOrders.push({tradeType : "bid", price : bidPendingPrice, amount : bidPendingAmount}) } else if(this.isAskPending == false && this.isBidPending == false) { for(var i = 0; i < this.arrPlanOrders.length; i++) { var tradeFun = this.arrPlanOrders[i].tradeType == "ask" ? this.e.Sell : this.e.Buy var id = tradeFun(this.arrPlanOrders[i].price, this.arrPlanOrders[i].amount) if(id) { this.isAskPending = this.arrPlanOrders[i].tradeType == "ask" ? true : this.isAskPending this.isBidPending = this.arrPlanOrders[i].tradeType == "bid" ? true : this.isBidPending } else { Log("挂单失败,清理!") this.CancelAllOrders(this.e) return } } } if(this.isBidPending || this.isAskPending) { var orders = _C(this.e.GetOrders) Sleep(1000) var ticker = _C(this.e.GetTicker) this.ticker = ticker if(this.isAskPending) { var isFoundAsk = false for (var i = 0; i < orders.length; i++) { if(orders[i].Type == ORDER_TYPE_SELL) { isFoundAsk = true } } if(!isFoundAsk) { Log("卖单成交,撤销订单,重置") this.CancelAllOrders(this.e) this.arrPlanOrders = [] this.isAskPending = false this.isBidPending = false LogProfit(this.CalcProfit(ticker)) return } } if(this.isBidPending) { var isFoundBid = false for(var i = 0; i < orders.length; i++) { if(orders[i].Type == ORDER_TYPE_BUY) { isFoundBid = true } } if(!isFoundBid) { Log("买单成交,撤销订单,重置") this.CancelAllOrders(this.e) this.arrPlanOrders = [] this.isAskPending = false this.isBidPending = false LogProfit(this.CalcProfit(ticker)) return } } } }, ShowTab : function() { var tblPlanOrders = { type : "table", title : "计划挂单", cols : ["方向", "价格", "数量"], rows : [] } for(var i = 0; i < this.arrPlanOrders.length; i++) { tblPlanOrders.rows.push([this.arrPlanOrders[i].tradeType, this.arrPlanOrders[i].price, this.arrPlanOrders[i].amount]) } var tblAcc = { type : "table", title : "账户信息", cols : ["type", "Stocks", "FrozenStocks", "Balance", "FrozenBalance"], rows : [] } tblAcc.rows.push(["初始", this.initAccount.Stocks, this.initAccount.FrozenStocks, this.initAccount.Balance, this.initAccount.FrozenBalance]) tblAcc.rows.push(["当前", this.account.Stocks, this.account.FrozenStocks, this.account.Balance, this.account.FrozenBalance]) return "时间:" + _D() + "\n `" + JSON.stringify([tblPlanOrders, tblAcc]) + "`" + "\n" + "ticker:" + JSON.stringify(this.ticker) }, CalcProfit : function(ticker) { var acc = _C(this.e.GetAccount) this.account = acc return (this.account.Balance - this.initAccount.Balance) + (this.account.Stocks - this.initAccount.Stocks) * ticker.Last }, Init : function() { this.initAccount = _C(this.e.GetAccount) if(IsReset) { var acc = _G("account") if(acc) { this.initAccount = acc } else { Log("恢复初始账户信息失败!以初始状态运行!") _G("account", this.initAccount) } } else { _G("account", this.initAccount) LogReset(1) LogProfitReset() } }, Exit : function() { Log("停止前,取消所有挂单...") this.CancelAllOrders(this.e) } } function main() { // 初始化 Shannon.Init() // 主循环 while(true) { Shannon.Balance() LogStatus(Shannon.ShowTab()) // 交互 var cmd = GetCommand() if(cmd) { if(cmd == "stop") { while(true) { LogStatus("暂停", Shannon.ShowTab()) cmd = GetCommand() if(cmd) { if(cmd == "continue") { break } } Sleep(1000) } } } Sleep(5000) } } function onexit() { Shannon.Exit() }

バックテストの実行

img

img

img

拡張機能を最適化する

  • 仮想注文の仕組みを追加できます。取引所によっては注文制限を設けているため、実際に注文が出されない場合があります。実際の注文を出す前に、価格が近づくまで待つ必要があります。
  • 先物取引に参加する
  • 複数の品種と複数の取引所に拡大

この戦略は教育目的にのみ使用され、実際の取引では注意して使用する必要があります。
戦略アドレス: https://www.fmz.com/strategy/225746

Related Recommendations
Comment
All comments (0)
No data
No data
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)