В процессе загрузки ресурсов... загрузка...

Проектирование системы синхронного управления на основе 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 
    

img

Затем добавьте интерактивные элементы управления на странице редактирования стратегии, чтобы остановить / перезапустить стратегию (это не остановить бота, просто остановить логику, не следовать и контролировать приказы, ничего не делая).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.Объем поручения под надзором может быть определен или увеличен по соотношению:

    img

    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)составляет следующее:

img

Теперь, давайте спроектируем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)шаблон).

img

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

img

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

img

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

img

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

img

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

img

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

img

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

img

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

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


Больше