In einem früheren Artikel haben wir gemeinsam eine einfache Hedging-Strategie implementiert, und in diesem werden wir lernen, wie wir diese aufwerten können. Die Änderung der Strategie ist nicht sehr groß, aber die Details der Änderungen müssen beachtet werden.
A交易所->B交易所
,B交易所->A交易所
Wir verwenden die horizontal Linie, die die Differenz auslöst. Wir verwenden direkt die Horizontal Linie, die die Differenz auslöst.画线类库
Wir lernen hier, wie man FMZ mit einem einfachen, einfachen und benutzerfreundlichen System verarbeitet.模版类库
Funktionen.Wir werden die Entwürfe dann einzeln umsetzen.
Code zum Umstieg in den Cash-Leverage-Modus mit dem Ein-Deal-Real-Time-Platzexchanges[i].IO
Einfügen von Parameterntrade_normal
Wechseln Sie zum Hebel und geben Sie eintrade_super_margin
Wechseln Sie zum vollen Hebelstand, Rückmessung nicht unterstützt.
In dermain
Die Vorbereitungsphase für den Beginn der Funktion wird erhöht:
// 切换杠杆模式
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")
}
}
}
Hier wird lediglich Code hinzugefügt, der den Leverage-Modus für den Umtausch von Binance-Kontostand in die Strategie einfügt, so dass der Umtausch in den Parametern der Strategie nur für Binance-Kontostand gültig ist.
Es ist sehr einfach, mit einer gepackten Bildermalerei zu arbeiten.画线类库
Über das Programm können Sie direkt auf der FMZ-Plattform Strategie Square suchen.
Oder klicken Sie direkt auf den Link:https://www.fmz.com/strategy/27293Sie können sich auf die Kopie-Seite dieser Vorlage umschalten.
Mit einem Klick auf die Schaltfläche können Sie diese Modellklasse in Ihre eigene Policy-Library kopieren.
Auf der Schablonenseite der Schablonen-Editing-Politik können Sie dann in der Schablonen-Tabelle die benötigte Schablonen-Klasse auswählen. Wenn Sie die Schablonen-Klasse auswählen, wird die Schablonen-Klasse auf der Schablonen-Editing-Seite angezeigt.画线类库
Ich bin der Ansicht, dass es eine gute Idee ist.
Wir lernen vor allem, wie man es benutzt.画线类库
Die Funktion, die ein Diagramm zeichnet.
Wir haben vor,A->B
Die Unterschiede zwischen den PreisenB->A
Die Differenz, die Differenz-Trigger-Line, wird gezeichnet. Zwei Kurven (die Differenz von A zu B und von B zu A) und zwei horizontale Linien (die Differenz-Trigger-Line) müssen wie im obigen Bild dargestellt werden.
Wir haben die Möglichkeit, die Risiken zu überwinden, weil wir eine einseitige Absicherung entwerfen.A->B
undB->A
Die Auslöser sind unterschiedlich. Sie können nicht mit dem Design aus dem vorherigen Artikel verwendet werden.
In einem früheren Artikel heißt es:
var targetDiffPrice = hedgeDiffPrice
if (diffAsPercentage) {
targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
}
Nur ein Auslöser der DifferenztargetDiffPrice
Das ist nicht wahr.
Also hier müssen wir den Code ändern, erst die Parameter ändern.
Das ist ein sehr schwieriger Fall.
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
}
Die Differenz wird dann von der vorherigen Differenz ausgelöst.targetDiffPrice
Einer wird zu zwei.targetDiffPriceA2B
、targetDiffPriceB2A
Das ist nicht wahr.
Dann kann man die Zeichenlinie-Funktion der Zeichenlinie-Klassenbibliothek verwenden, um diese Daten auf dem Diagramm zu zeichnen.
// 画图
$.PlotHLine(targetDiffPriceA2B, "A->B") // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
$.PlotHLine(targetDiffPriceB2A, "B->A")
Die Strategie funktioniert, wie ein Diagramm zeigt.
Man zeichnet dann eine Echtzeit-Differenz-Kurve, um zu vermeiden, dass die Kurve zu viel ist. Man legt den Code der Echtzeit-Differenz-Daten-Kurve in die Balance-Detection.
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轴方向上的值
}
Das bedeutet, dass Sie nur vier Zeilen Grafik-Code verwenden können, um eine Grafik beim Ausführen der Strategie zu zeigen.
Der Artikel erwähnt, dass die Differenz-Trigger-Linie in zwei Stücke umgewandelt wurde, die jeweils kontrolliert werden.A->B
Die Gefahr, dass sie sich nicht mehr aufhalten, ist groß.B->A
Die Annahme, dass die Preise der Anleger in einem anderen Markt als dem der Anleger in einem anderen ausgewählten Markt ausgewertet werden, ist nicht möglich.
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
}
}
Da der Kauf- und Verkaufspreis in zwei Daten gespalten ist, kann man die Hedge-Funktionhedge
Ich bin nicht derjenige, der das sagt.
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()
}
Es gibt auch einige kleine Anpassungen, die auf diesen Änderungen basieren, die hier nicht beschrieben werden können.
Die Strategie wird interagierbar gemacht, sodass die Strategie die Differenz-Triggerlinie in Echtzeit ändern kann. Dies ist ein Designbedarf für eine semi-automatische Strategie, die hier auch als Lehrbeispiel implementiert wird. Das Interaktionsdesign der Strategie ist auch sehr einfach, indem man zunächst die Interaktionssteuerung auf der Politikeditorseite hinzufügt.
Zwei neue Steuerelemente wurden hinzugefügt, eine A2B und eine B2A. Wenn Sie einen Wert in das Eingabefeld des Steuerelements eingeben, klicken Sie auf die Eingabe-Taste auf der rechten Seite des Eingabefelds.123
Klicken SieA2B
Der Button wird sofort an die Politik geschickt.
A2B:123
Interaktionserkennung und -verarbeitung in der Strategiecode.
// 交互
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])
}
}
}
Die Status-Tab-Daten sollen ordnungsgemäß und einfach zu beobachten sein.
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) + "`")
Die Rückmeldung ist nur eine Teststrategie, eine erste Detektionsfunktion, viele BUGs können in der Rückmeldungsphase tatsächlich getestet werden. Es ist nicht notwendig, sich um die Rückmeldung zu kümmern.
Die Strategie ist hier:https://www.fmz.com/strategy/302834
15570686905Die Strategie ist, die Funktion des Vertrages zu integrieren, und das ist gut, wenn man die dauerhaften Verträge und die Ratenverträge mit einbezieht.
Leichte WolkenTypfehler: Kann die Eigenschaft 'SetPrecision' von undefined nicht lesen Die aktuelle Hedging-Strategie für verschiedene Währungen Ver1.1
Die Erfinder quantifizieren - Kleine TräumeIch habe die Gelegenheit, eine Lektion zu geben.
Leichte WolkenIch verstehe, danke.
Die Erfinder quantifizieren - Kleine TräumeEs gibt zwei Objekte, die man hinzufügen muss.