最近FMZの公式グループでは,マルティン型戦略が比較的に多く議論されているが,プラットフォームではデジタル通貨契約に関するマルティン型戦略がほとんどない.したがって,この機会を利用して,簡単なデジタル通貨フューチャー型マルティン型戦略を設計した.なぜマルティン型戦略と呼ぶのか,マルティン型戦略は潜在的リスクが本当に小さいので,マルティン型戦略を完全に設計していない.しかし,このタイプの戦略は依然としてリスクが大きいし,マルティン型戦略のパラメータ設定とリスク利息は関連しており,リスクは無視することはできません.
この記事では,マルティンのような戦略のデザインから学ぶことが主に説明されています. 戦略の考えは既に明らかです. FMZのユーザーとして,私たちは戦略のデザインについてもっと考えています.
デジタル通貨の先物戦略を設計する際には,しばしば総利益というデータを使用する. 収益を計算する際,特に浮動収益を計算する際. 担保金が保有されているため,掛金も占める. このとき,FMZプラットフォームのAPIインターフェースを呼び出す.exchange.GetAccount()
入手可能な資産と挂牌凍結資産です. 実際,ほとんどのデジタル通貨先物取引所は,総権益のデータを提供していますが,FMZではこの属性が統一されていない.
異なる取引所のデザイン関数によって このデータを得ました
// OKEX V5 获取总权益
function getTotalEquity_OKEX_V5() {
var totalEquity = null
var ret = exchange.IO("api", "GET", "/api/v5/account/balance", "ccy=USDT")
if (ret) {
try {
totalEquity = parseFloat(ret.data[0].details[0].eq)
} catch(e) {
Log("获取账户总权益失败!")
return null
}
}
return totalEquity
}
// 币安期货
function getTotalEquity_Binance() {
var totalEquity = null
var ret = exchange.GetAccount()
if (ret) {
try {
totalEquity = parseFloat(ret.Info.totalWalletBalance)
} catch(e) {
Log("获取账户总权益失败!")
return null
}
}
return totalEquity
}
コードの中でtotalEquity
そして,関数を入力として書き,その関数を交換名に基づいて呼び出す.
function getTotalEquity() {
var exName = exchange.GetName()
if (exName == "Futures_OKCoin") {
return getTotalEquity_OKEX_V5()
} else if (exName == "Futures_Binance") {
return getTotalEquity_Binance()
} else {
throw "不支持该交易所"
}
}
主関数,主論理を設計する前に,いくつかの準備をし,いくつかの補助関数を設計する必要があります.
削除する
function cancelAll() {
while (1) {
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
break
}
for (var i = 0 ; i < orders.length ; i++) {
exchange.CancelOrder(orders[i].Id, orders[i])
Sleep(500)
}
Sleep(500)
}
}
この関数は,FMZの戦略スクアで頻繁に戦略例文コードを閲覧している方々に馴染みがあると思いますが,多くの戦略が同様のデザインを使用しています. その役割は,現在の掲示板のリストを取得し,それを一つずつ撤回することです.
フューチャーへの下注操作
function trade(distance, price, amount) {
var tradeFunc = null
if (distance == "buy") {
tradeFunc = exchange.Buy
} else if (distance == "sell") {
tradeFunc = exchange.Sell
} else if (distance == "closebuy") {
tradeFunc = exchange.Sell
} else {
tradeFunc = exchange.Buy
}
exchange.SetDirection(distance)
return tradeFunc(price, amount)
}
function openLong(price, amount) {
return trade("buy", price, amount)
}
function openShort(price, amount) {
return trade("sell", price, amount)
}
function coverLong(price, amount) {
return trade("closebuy", price, amount)
}
function coverShort(price, amount) {
return trade("closesell", price, amount)
}
フューチャー取引には4つの方向性があります. オープンロング,オープンショート,カバーロング,カバーショート. だから,これらの操作に対応する4つの下令関数を設計しました.
このプロジェクトでは,多くのプロジェクトが実施されています.trade
この関数は,方向(distance)
、下单价格(price)
、下单量(amount)
明らかに,操作は行われています.
オープンロング,オープンショート,カバーロング,カバーショートなど,これらの関数の呼び出しは,最終的にtrade
機能は,既定の方向性,価格,数量に基づいてフューチャー取引所で注文する実際の機能を完了します.
戦略は単純である.現在の価格をベースラインの下にある一定距離に吊るして売る (空売り),購入する (多買い).取引が完了すると,残ったすべての注文をキャンセルし,その後,保有価格に基づいて一定距離に新しい平衡注文を吊るし,更新後の現在の価格に増量注文を吊るすが,追加された注文は2倍にならない.
初期の仕事 注文IDを記録する2つのグローバル変数が必要です.
var buyOrderId = null
var sellOrderId = null
OKEX_V5 の模擬ディスクを使用するオプションを策略インターフェースのパラメータで設計したので,コードでいくつかの処理を行います:
var exName = exchange.GetName()
// 切换OKEX V5模拟盘
if (isSimulate && exName == "Futures_OKCoin") {
exchange.IO("simulate", true)
}
インタフェースのパラメータでは,すべての情報をリセットするオプションも設計されているので,コードには対応する処理も含まれます:
if (isReset) {
_G(null)
LogReset(1)
LogProfitReset()
LogVacuum()
Log("重置所有数据", "#FF0000")
}
永続的な契約のみで走っているので,ここで死んだと書かれていますが,永続的な契約として設定されています.
exchange.SetContractType("swap")
次に,下注価格精度,下注量精度の問題も考慮する必要があります. 精度が正しく設定されていない場合,戦略計算の過程で精度が失われ,データの小数位が多くなった場合,下注時に取引所のインターフェースによって拒否される可能性があります.
exchange.SetPrecision(pricePrecision, amountPrecision)
Log("设置精度", pricePrecision, amountPrecision)
デザインがシンプルなデータ復元機能
if (totalEq == -1 && !IsVirtual()) {
var recoverTotalEq = _G("totalEq")
if (!recoverTotalEq) {
var currTotalEq = getTotalEquity()
if (currTotalEq) {
totalEq = currTotalEq
_G("totalEq", currTotalEq)
} else {
throw "获取初始权益失败"
}
} else {
totalEq = recoverTotalEq
}
}
実行する際に最初のアカウントの総利息を指定する場合は,パラメータを設定できます.totalEq
このパラメータを-1に設定すると,策略は保存された総利得データを読み取る.保存されていない総利得データは,現在の読み取りの総利得を策略の実行進行として最初の総利得として,総利得の増加が負の表示,総利得減少が負の表示である.総利得データを読み取ると,このデータを使用し続けます.
主な論理 初期作業が完了した後,戦略の主要な論理部分にたどり着きました. 簡単に説明するために,私はコード注釈に直接説明書を書きました.
while (1) { // 策略主要逻辑设计为一个死循环
var ticker = _C(exchange.GetTicker) // 首先读取当前行情信息,主要用到最新成交价
var pos = _C(exchange.GetPosition) // 读取当前持仓数据
if (pos.length > 1) { // 判断持仓数据,由于这个策略的逻辑,是不太可能同时出现多空持仓的,所以发现同时出现多空持仓就抛出错误
Log(pos)
throw "同时有多空持仓" // 抛出错误,让策略停止
}
// 根据状态而定
if (pos.length == 0) { // 根据持仓状态做出不同操作,pos.length == 0是当没有持仓时
// 未持仓了,统计一次收益
if (!IsVirtual()) {
var currTotalEq = getTotalEquity()
if (currTotalEq) {
LogProfit(currTotalEq - totalEq, "当前总权益:", currTotalEq)
}
}
buyOrderId = openLong(ticker.Last - targetProfit, amount) // 挂开多仓的买单
sellOrderId = openShort(ticker.Last + targetProfit, amount) // 挂开空仓的卖单
} else if (pos[0].Type == PD_LONG) { // 有多头持仓,挂单位置、数量有所不同
var n = 1
var price = ticker.Last
buyOrderId = openLong(price - targetProfit * n, amount)
sellOrderId = coverLong(pos[0].Price + targetProfit, pos[0].Amount)
} else if (pos[0].Type == PD_SHORT) { // 有空头持仓,挂单位置、数量有所不同
var n = 1
var price = ticker.Last
buyOrderId = coverShort(pos[0].Price - targetProfit, pos[0].Amount)
sellOrderId = openShort(price + targetProfit * n, amount)
}
if (!sellOrderId || !buyOrderId) { // 如果有一边挂单失败就取消所有挂单,重来
cancelAll()
buyOrderId = null
sellOrderId = null
continue
}
while (1) { // 挂单完成,开始监控订单
var isFindBuyId = false
var isFindSellId = false
var orders = _C(exchange.GetOrders)
for (var i = 0 ; i < orders.length ; i++) {
if (buyOrderId == orders[i].Id) {
isFindBuyId = true
}
if (sellOrderId == orders[i].Id) {
isFindSellId = true
}
}
if (!isFindSellId && !isFindBuyId) { // 检测到买卖单都成交了
cancelAll()
break
} else if (!isFindBuyId) { // 检测到买单成交
Log("买单成交")
cancelAll()
break
} else if (!isFindSellId) { // 检测到卖单成交
Log("卖单成交")
cancelAll()
break
}
LogStatus(_D())
Sleep(3000)
}
Sleep(500)
}
論理とデザインは全て解明された.
戦略が5月19日の行事を繰り返すようにしましょう.
マルチンのような戦略には,ある程度のリスクがあることがわかります.
戦略アドレスは:https://www.fmz.com/strategy/294957
戦略は主に学習のためのもので,真金銀は慎重に使う~!
リサ20231ダンダは,この質問をする. if (!isFindSellId &&!isFindBuyId) { // 購入・売却の注文がすべて取引されていることを確認します 注文の検出には,急いでプラグを上下に押しながら購入・販売の請求書を処理すると,誤りが出てくるのでしょうか?
ネオ1898また,契約のモデルは,全株型か,一株型か,どのように設定されているのか?
ネオ1898契約は開かれていたのに 契約額は2倍にならなかったのか? 売買額は2倍になってるのか?
軽い雲ありがとう,私はついに,すべてを理解しました. 2日間で580行を書きました. そして,私は580行を書きました. [拳を握る]
hk 量/upload/asset/1a9ebf427c4e2cbf1c327.png /upload/asset/1a9ebf427c4e2cbf1c327.png /upload/asset/1a9ebf427c4e2cbf1c327.png /upload/asset/1a9ebf427c4e2cbf1c327.png /upload/asset/1a9ebf427c4e2cbf1c327.png 偽の真実の交換で?
夢は8桁の数字でもし
夢は8桁の数字で所有者の権利と利益の総額
ゼロ被害を止める必要があるのか?
btcrobot について計算が完了しました.
はいこの n は常に 1 に等しいです.
イヴダレー戦略は,多空白で2つ開いているか,それとも1つ開いているか.
発明者 量化 - 微かな夢間違いを投げ出さない.すべての契約をキャンセルし,現在のサイクルを飛び出して,契約を継続する.すぐに取引が完了すると,価格差の利益を食べる.
発明者 量化 - 微かな夢一般的には全倉を使います.
発明者 量化 - 微かな夢利息は,取引所によって設定され,自分のリスク優先順位に応じて設定することができます.
発明者 量化 - 微かな夢雲の合計 666!
発明者 量化 - 微かな夢isNotFindBuyId と呼ばれるべきだった.
発明者 量化 - 微かな夢この戦略は停止損失を設計していない. だから,走った曲線は上向きに見える.
発明者 量化 - 微かな夢マルチンの帰り道. この記事では,教育戦略をデザインし,あまり注意を払わないようにしています.
発明者 量化 - 微かな夢そのNは,後の変更のために使われます.例えば,n倍距離を積むと,一時的に1を設定できます.
発明者 量化 - 微かな夢公開された.