avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

FMZ定量化に基づく注文同期管理システムの設計(2)

作成日:: 2022-02-16 12:11:36, 更新日:: 2023-09-15 20:46:46
comments   0
hits   1431

FMZ定量化に基づく注文同期管理システムの設計(2)

FMZ定量化に基づく注文同期管理システムの設計(2)

注文同期サーバー

前の記事に続きましょう:FMZ定量化に基づく注文同期管理システムの設計(1)専門家と話し合った後、同期コピー取引の戦略を設計し始めました。

次の設計上の問題を考慮してください。

  • 1. 当面は同期して注文に従いたくない場合は、一時停止できますか?一時停止すると、パスワード認証を使用して拡張 API からの起動が禁止されます。 この関数を実装するには、2 つのグローバル変数を追加します。
  var isStopFollow = false   // 用于标记当前是否跟单
  var reStartPwd = null      // 用于记录重启密码

FMZ定量化に基づく注文同期管理システムの設計(2)

次に、戦略編集ページにインタラクティブ コントロールを追加して、戦略を一時停止/再開します (実際の取引は停止しませんが、ロジックを一時停止し、注文のフォローを停止し、何も行いません)。一時停止時に一時停止パスワードを設定すると、拡張APIキーを持っていても订单同步管理系统类库(Single Server)実際の取引セッションでさえ、戦略を覚醒させることはできません。コピートレードを再開する場合は、事前に設定したパスワードを入力してコピートレード機能を起動します。 関連機能の実装コード:

  ...
            // 判断交互指令
            if (arr.length == 2) {
            	// 带控件的按钮
            	if (arr[0] == "stop/restart") {
            		// 暂停/重启跟单
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("已经重启跟单,", "清空重启密码。", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("重启密码错误!")
            		}
            	}
            	continue 
            }
  • 2. 注文数量を指定したり、増減したりできます 戦略にパラメータを追加します。

FMZ定量化に基づく注文同期管理システムの設計(2)

specifiedAmount: フォローアップ注文の金額を指定します。デフォルト値は -1 で、指定されていないことを意味します。 zoomAmountRatio : 送信されたシグナルの注文量に応じてズームします。たとえば、送信されたシグナルは次のようになります。ETH_USDT,swap,buy,1注文数量に zoomAmountRatio を掛けます。デフォルトは -1 で、スケーリングなしを意味します。

      var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
      amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio

ここでは、受信信号に従う必要がある注文数量を実​​装します。ズームまたは特定の値を指定する

  • 3. コードをできるだけ簡潔に保ち、注文処理には他のテンプレート ライブラリを使用します。

クラスライブラリを使用したスポット注文: https://www.fmz.com/strategy/10989 先物注文ライブラリ: https://www.fmz.com/strategy/203258

    function trade(action) {
        // 切换交易对,设置合约
        exchange.SetCurrency(action.symbol)
        if (action.ct != "spot") {
            exchange.SetContractType(action.ct)        
        }        

        var retTrade = null 
        var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
        amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio    

        if (action.direction == "buy") {
            retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
        } else if (action.direction == "sell") {
            retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
        } else if (action.direction == "closebuy") {
            retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
        } else if (action.direction == "closesell") {
            retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
        }
        return retTrade
    }

つまり、注文には 1 つの文だけが必要です。$.Sell(amount)$.Buy(amount)$.OpenLong(exchange, action.ct, amount) .. 待って。

戦略コード:

前の订单同步管理系统(Synchronous Server)一時的なコードは次のとおりです。

FMZ定量化に基づく注文同期管理システムの設計(2)

今すぐ再設計を始めましょう订单同步管理系统(Synchronous Server)

// 全局变量
var isStopFollow = false
var reStartPwd = null 

function trade(action) {
    // 切换交易对,设置合约
    exchange.SetCurrency(action.symbol)
    if (action.ct != "spot") {
        exchange.SetContractType(action.ct)        
    }    

    var retTrade = null 
    var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
    amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio

    if (action.direction == "buy") {
        retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
    } else if (action.direction == "sell") {
    	retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
    } else if (action.direction == "closebuy") {
    	retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
    } else if (action.direction == "closesell") {
    	retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
    }
    return retTrade
}

function parseCmd(cmd) {
	var objAction = {}
	// 解析cmd ,例如:ETH_USDT,swap,buy,1
    var arr = cmd.split(",")
    if (arr.length != 4) {
    	return null 
    }
    objAction.symbol = arr[0]
    objAction.ct = arr[1]
    objAction.direction = arr[2]
    objAction.amount = arr[3]
    return objAction
}

function main() {
	// 清除所有日志
    LogReset(1)  

    if (isSimulateOKEX) {
    	exchange.IO("simulate", true)
    	Log("切换到OKEX模拟盘!")
    }

    // 设置精度
    exchange.SetPrecision(pricePrecision, amountPrecision)

    // 检查缩放、指定不能同时设置
    if (specifiedAmount != -1 && zoomAmountRatio != -1) {
    	throw "不能同时指定同步量和缩放量"
    }

    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd: ", cmd)
            var arr = cmd.split(":")

            // 判断交互指令
            if (arr.length == 2) {
            	// 带控件的按钮
            	if (arr[0] == "stop/restart") {
            		// 暂停/重启跟单
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("已经重启跟单,", "清空重启密码。", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("重启密码错误!")
            		}
            	}
            	continue 
            }
            
            // 允许跟单
            if (!isStopFollow) {
                // 解析跟单信号交互指令
                var objAction = parseCmd(cmd)
                if (objAction) {
            	    // 解析正确
            	    var ret = trade(objAction)
                } else {
                	Log("错误的信号指令 cmd:", cmd)
                }
            }
        }
        
        // 显示跟单情况
        LogStatus(_D(), isStopFollow ? "停止同步" : "保持同步", "\n")

        Sleep(1000)
    }
}

テスト

今回、注文のあるアカウントはテスト用のBinanceリアルアカウントを使用し、注文をコピーするリアルアカウントはOKEXアカウントを使用します。前回の記事で使用したテスト関数を引き続き使用します(订单同步管理系统类库(Single Server)テンプレート内main関数)。

FMZ定量化に基づく注文同期管理システムの設計(2)

取引方向を空売りに、取引量を 0.003 に変更しました (Binance USDT ベースの契約では小数で注文を出すことができます)。ただし、OKEXアカウントは整数である必要があります(OKEX取引所の注文は整数でなければなりません)ので、戦略パラメータを指定します。specifiedAmount1です。

FMZ定量化に基づく注文同期管理システムの設計(2)

订单同步管理系统类库(Single Server)テスト関数は実際のトランザクションをトリガーします。

FMZ定量化に基づく注文同期管理システムの設計(2)

注文をコピーするリアルタイム戦略は、シグナルを受信して​​コピーアクションを実行します。

FMZ定量化に基づく注文同期管理システムの設計(2)

取引所は対応する注文を開いた。

FMZ定量化に基づく注文同期管理システムの設計(2)

次に、ポジションのクローズをテストし、テストメイン関数で注文方向を変更して、0.003 契約のショートポジションをクローズします。

FMZ定量化に基づく注文同期管理システムの設計(2)

次に、注文を受けるための実際のディスクを再度実行します(订单同步管理系统类库(Single Server))。

FMZ定量化に基づく注文同期管理システムの設計(2)

実際の注文をコピーすることによっても同じ操作がトリガーされます。

FMZ定量化に基づく注文同期管理システムの設計(2)

ポリシーアドレス: 注文同期管理システムクラスライブラリ(シングルサーバー) 注文同期サーバー

戦略設計はコミュニケーションと学習のみを目的としています。実際の生産ニーズに応じて修正、調整、最適化してください。