この記事では,簡単なヘッジ戦略を実装し,それをアップグレードする方法について学びました. 策略の変更は大きくないが,変更の細部には注意が必要である.コードのいくつかの場所の定義と,それ以前の変更は,重要な理解を必要としている.
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の戦略広場で直接検索できます.
ブログのページをクリックしてください.https://www.fmz.com/strategy/27293この模様のコピーページへジャンプします.
このタップをクリックすると,この模板クラスバックリを自分のポリシーバックリにコピーできます.
策略編集ページでは,模板欄で必要な模板庫をクリックします. 選択後,保存するポリシーをクリックすると,この策略がこの模板を参照します. これは模板庫の使い方についての簡単な説明に過ぎません. この策略は既にこの模板を参照しているため,操作を繰り返す必要はありません. 策略スクエアでこの策略をコピーした後,策略編集ページの模板欄で見ることができます.画线类库
この記事へのトラックバック一覧です.
コンピュータの使い方を学びました画线类库
グラフを描くには,
計画しています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
│ │
変数から変数に変換します. 変数から変数を変換します.
暗号を修正して:
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つになりましたtargetDiffPriceA2B
、targetDiffPriceB2A
│ │
図面の図面にこのデータを描くには,図面の図面関数を使うことができます.
// 画图
$.PlotHLine(targetDiffPriceA2B, "A->B") // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
$.PlotHLine(targetDiffPriceB2A, "B->A")
戦略が実行されると,このようなグラフが表示されます.
次に,リアルタイム・デファリエント・カーブを描く.過剰な線を避けるために.リアルタイム・デファリエント・データ・カーブを描くコードをバランス検査に置く.
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()
}
この変更によって引き起こされた細かな調整も,この記事では概要しておらず,コードを詳しく参照してください.
策略へのインタラクションを増やし,策略がリアルタイムで差値トリガーラインを修正できるようにします. これは半自動策略の設計ニーズであり,ここで教材のデモとして実装されています. 策略のインタラクションデザインも非常に簡単です. まず,策略編集ページで策略にインタラクションコントロールを追加します.
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) + "`")
復習は単なるテスト戦略であり,初期検出機能であり,多くのBUGは復習段階で実際にテストすることができます. 復習の結果をあまり気にする必要はありません. 最終戦略は,実際の環境で実際の銃弾を検知する必要があります.
戦略のソースコード:https://www.fmz.com/strategy/302834
15570686905この取引戦略は 契約の機能に組み込まれます 永続契約や 配当契約を組み込むだけでいいのです
軽い雲main:127:9 - TypeError: Cannot read property 'SetPrecision' of undefined 設定の精度が未定であるため,設定の精度が未定であるため
異なる通貨に対する現金ヘッジ戦略 Ver1.1
発明者 量化 - 微かな夢素晴らしい,レッスンをする機会です.
軽い雲分かりました,ありがとう.
発明者 量化 - 微かな夢取引所のオブジェクトを2つ追加します.