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

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

Автор:FMZ~Lydia, Создано: 2022-11-08 11:34:20, Обновлено: 2023-09-15 20:48:46

Design of Order Synchronization Management System Based on FMZ Quant (2)

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

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

Давайте продолжим обсуждение из предыдущей статьи: "Проектирование системы управления синхронизацией заказов на основе квантификации FMZ" (1) (https://www.fmz.com/digest-topic/9729) и начать разработку стратегии синхронизированного выполнения заказов.

Подумайте о нескольких таких вопросах:

  • Если вы не хотите выполнять синхронное выполнение заказа временно, можно ли его приостановить? Используйте эту функцию, добавив 2 глобальных переменных:
var isStopFollow = false   // Used to mark whether the current order is being followed
var reStartPwd = null      // Used to record the restart password

Design of Order Synchronization Management System Based on FMZ Quant (2)

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

...
          // Judge the interaction command
          if (arr.length == 2) {
          	// Buttons with controls
          	if (arr[0] == "stop/restart") {
          		// Pause/restart order-following
          		if (!isStopFollow) {
          		    isStopFollow = true
          		    reStartPwd = arr[1]
          		    Log("it has stopped the order-following,", "Set the restart password as:", reStartPwd, "#FF0000")
          		} else if (isStopFollow && arr[1] == reStartPwd) {
          			isStopFollow = false 
          			reStartPwd = null 
          			Log("it has restarted the order-following, ", "Clear the restart password.", "#FF0000")
          		} else if (isStopFollow && arr[1] != reStartPwd) {
          			Log("Restart password error!")
          		}
          	}
          	continue 
          }
  • 2. Вы можете указать количество заказов, которые должны быть выполнены или могут быть масштабированы в многократных Добавить параметры в стратегию:

Design of Order Synchronization Management System Based on FMZ Quant (2)

specifiedAmount: Укажите количество последовательных заказов, по умолчанию -1, т.е. не указано. zoomAmountRatio: масштабирование в зависимости от количества отправленных заказов, например, если отправленный сигнал: ETH_USDT,swap,buy,1, умножьте значение суммы заказов на zoomAmountRatio.

    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 trading pairs and set up contracts
      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)была следующей:

Design of Order Synchronization Management System Based on FMZ Quant (2)

Теперь мы начинаем перепроектировать систему управления синхронизацией заказов (синхронный сервер):

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

function trade(action) {
    // Switch trading pairs and set up contracts
    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 demo!")
    }

    // Set accuracy
    exchange.SetPrecision(pricePrecision, amountPrecision)

    // Check zoom and specify it cannot be set at the same time
    if (specifiedAmount != -1 && zoomAmountRatio != -1) {
    	throw "it cannot specify simultaneous volume and scaling volume at the same time"
    }

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

            // Judge interaction commands
            if (arr.length == 2) {
            	// Buttons with controls
            	if (arr[0] == "stop/restart") {
            		// Pause/restart order-following
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("it has stopped the order-following.", "Set the restart password as.", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("it has restarted the order-following", "Clear the restart password.", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("Restart password error!")
            		}
            	}
            	continue 
            }
            
            // Permission to follow orders
            if (!isStopFollow) {
                // Resolve the interaction instructions of order-following signal
                var objAction = parseCmd(cmd)
                if (objAction) {
            	    // The analysis is correct
            	    var ret = trade(objAction)
                } else {
                	Log("Wrong signal command cmd:", cmd)
                }
            }
        }
        
        // Display order-following status
        LogStatus(_D(), isStopFollow ? "Stop Synchronization" : "Keep Synchronization", "\n")

        Sleep(1000)
    }
}

Испытание

Мы тестируем учетную запись, ведущую заказ, используя реальный бот Binance для этого времени, и мы используем учетную запись OKEX для реального бота, следующего за заказом.mainфункция в испытательной функции(Order Synchronization Management System Class Library (Single Server)в шаблоне), использованном в предыдущей статье.

Design of Order Synchronization Management System Based on FMZ Quant (2)

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

Design of Order Synchronization Management System Based on FMZ Quant (2)

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

Design of Order Synchronization Management System Based on FMZ Quant (2)

Затем мы запускаем его снова, который отвечает за руководство заказами (библиотека классов системы управления синхронизацией заказа (один сервер)).

Та же операция была инициирована настоящим ботом, следующим за командой.

Адрес стратегии: Библиотека классов системы управления синхронизацией заказов (один сервер) (https://www.fmz.com/strategy/345171) Система управления синхронизацией заказов (синхронный сервер) (https://www.fmz.com/strategy/345172)

Стратегия предназначена только для общения и обучения, пожалуйста, приспособите и оптимизируйте в соответствии с реальными потребностями.


Содержание

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