Проектирование системы синхронного управления на основе FMZ (2)

Автор:Нинабадасс., Создано: 2022-04-06 17:12:00, Обновлено: 2022-04-06 17:20:08

Проектирование системы синхронного управления на основе FMZ (2)

Система синхронного управления заказами (синхронный сервер)

Давайте продолжим обсуждение в предыдущей статье:Проектирование системы синхронного управления на основе FMZ (1), чтобы разработать стратегию синхронного надзора за заказами. Пожалуйста, рассмотрите следующие вопросы проектирования:

  • 1.Если вы не хотите синхронно контролировать заказы в течение некоторого времени, можно ли остановить его? Чтобы реализовать эту функцию, добавьте 2 глобальных переменных:
    
    var isStopFollow = false   // used to mark whether to currently supervise orders or not 
    var reStartPwd = null      // used to record the restart password 
    

FMZ Based Order Synchronous Management System Design (2)

Затем добавьте интерактивные элементы управления на странице редактирования стратегии, чтобы остановить / перезапустить стратегию (это не остановить бота, просто остановить логику, не следовать и контролировать приказы, ничего не делая).Order Synchronous Management System Library (Single Server)При перезагрузке для контроля за заказами введите предварительно установленный пароль для вызова функции контроля за заказами. Код реализации соответствующей функции:

  ...
            // Judge the interactive command
            if (arr.length == 2) {
            	// Buttons with controls
            	if (arr[0] == "stop/restart") {
            		// Stop/restart to supervise orders 
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("stopped to supervise orders,", "the set restart password is:", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("restarted to supervise orders,", "clear the restart password.", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("Wrong restart password!")
            		}
            	}
            	continue 
            }
  • 2.Объем поручения под надзором может быть определен или увеличен по соотношению:

FMZ Based Order Synchronous Management System Design (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) {
        // Switch the trading pair, and set contract 
        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
    }

Таким образом, можно увидеть, что для размещения заказа требуется только одно заявление:$.Sell(amount), $.Buy(amount), $.OpenLong(exchange, action.ct, amount), и т.д.

Код стратегии:

Временный код в предыдущемOrder Synchronous Management System (Synchronous Server)составляет следующее:

FMZ Based Order Synchronous Management System Design (2)

Теперь, давайте спроектируемOrder Synchronous Management System (Synchronous Server)Повторяю:

// Global variables
var isStopFollow = false
var reStartPwd = null 

function trade(action) {
    // Switch the trading pair, and set contract
    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 = {}
	// Parse cmd, such as: 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() {
	// Clear all logs 
    LogReset(1)  

    if (isSimulateOKEX) {
    	exchange.IO("simulate", true)
    	Log("Switch to OKEX simulated bot!")
    }

    // set precision 
    exchange.SetPrecision(pricePrecision, amountPrecision)

    // Check specifiedAmount and zoomAmountRatio, for they cannot be set at the same time 
    if (specifiedAmount != -1 && zoomAmountRatio != -1) {
    	throw "cannot set specifiedAmount and zoomAmountRatio at the same time"
    }

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

            // Judge the interactive command 
            if (arr.length == 2) {
            	// Buttons with controls 
            	if (arr[0] == "stop/restart") {
            		// Stop/restart to supervise orders 
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("stopped to supervise orders,", "the set restart password is:", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("restarted to supervise orders,", "Clear the restart password", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("Wrong restart password!")
            		}
            	}
            	continue 
            }
            
            // Allow to supervise orders 
            if (!isStopFollow) {
                // Parse the interactive command of the order supervising signal
                var objAction = parseCmd(cmd)
                if (objAction) {
            	    // Parse correctly 
            	    var ret = trade(objAction)
                } else {
                	Log("Wrong signal cmd:", cmd)
                }
            }
        }
        
        // Display the order supervising status 
        LogStatus(_D(), isStopFollow ? "Stop synchronization" : "Maintain synchronization", "\n")

        Sleep(1000)
    }
}

Испытание

На этот раз, Binance реальный тест клетка используется для учетной записи с ордерами, и OKEX учетная запись используется для ордера надзора бота.mainФункция вOrder Synchronous Management System Library (Single Server)шаблон).

FMZ Based Order Synchronous Management System Design (2)

Это просто то, что мы изменили направление торговли на короткий, и объем торговли был изменен на 0,003 (Binance USDT-маржинальные контракты могут быть размещены в десятичных знаках).specifiedAmountкак 1.

FMZ Based Order Synchronous Management System Design (2)

Бот функции тестирования вOrder Synchronous Management System Library (Single Server)запустил обмен.

FMZ Based Order Synchronous Management System Design (2)

Ордер, контролирующий стратегию бота, получил сигнал и выполняет действие контроля:

FMZ Based Order Synchronous Management System Design (2)

Платформа открыла соответствующий заказ.

FMZ Based Order Synchronous Management System Design (2)

Далее, проверьте позиции закрытия, и измените направление ордера в основной функции, чтобы закрыть короткую позицию, 0,003.

FMZ Based Order Synchronous Management System Design (2)

Затем перезапустите бота, который отвечает за выполнение заказов (Order Synchronous Management System Library (Single Server)).

FMZ Based Order Synchronous Management System Design (2)

Эта же операция также запускается в упорядоченном боте:

FMZ Based Order Synchronous Management System Design (2)

Адрес стратегии:Заказать библиотеку синхронной системы управления (один сервер) Система синхронного управления заказами (синхронный сервер)

Эти стратегии используются только для общения и изучения; для фактического использования вам нужно модифицировать, корректировать и оптимизировать их самостоятельно.


Больше информации