Cuando un principiante diseña una estrategia de comercio cuantitativa de criptomonedas, a menudo hay varios requisitos de funciones. Independientemente de los lenguajes de programación y plataformas, todos ellos encontrarán varios requisitos de diseño. Por ejemplo, a veces se requieren múltiples variedades de rotación de operaciones, a veces se requiere cobertura multi-plataforma, y a veces se requiere que diferentes variedades de operaciones sean concurrentes.
La plataforma de aprendizaje sigue utilizando la plataforma de negociación FMZ Quant (https://www.fmz.com), y el mercado se selecciona como el mercado de criptomonedas.
La mayoría de estas situaciones de demanda están preparadas para las estrategias de tendencia y cuadrícula de criptomonedas múltiples, que deben ejecutarse en el mercado con diferentes métodos de iteración comercial.
Por lo general diseñado así:
function Process (symbol) {
exchange.IO("currency", symbol)
var ticker = _C(exchange.GetTicker)
Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
// ...
// ..
// .
}
function main(){
var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
while (true) {
for (var i = 0 ; i < symbols.length; i++) {
Process(symbols[i])
Sleep(500)
}
}
}
Configuraremos el robot:
Se puede ver que esto se da cuenta de que un objeto de intercambio se configura en el robot, y el par de operaciones se cambia; el mercado de diferentes pares de operaciones se obtiene, y el mercado de variedad multi-negociación se ejecuta; y se ejecuta bajo una lógica de estrategia.
Se puede ver que los tres pares de negociación que definimos: BTC_USDT, LTC_USDT, ETH_USDT, en el bucle, obtienen iterativamente la cotización del mercado, y después de obtener la información, puede detectar específicamente el mercado y activar la lógica de negociación diseñada por la estrategia.
Algunos lectores pueden preguntar:
De hecho, hay otras opciones de diseño, que presentaremos a continuación.
Los datos de mercado de diferentes pares de operaciones se obtienen a través de múltiples objetos de intercambio y se ejecutan en la lógica de estrategia iterativa.
Por ejemplo, configure el robot configurando tres objetos de intercambio para el robot. Los pares de negociación están configurados para BTC_USDT, LTC_USDT y ETH_USDT respectivamente.
El nombre es el objeto de intercambio
Ya está hecho.
Hemos cambiado un poco de este código, porque esta vez añadimos múltiples objetos de intercambio al robot, que son los objetos de intercambio del par de operaciones BTC_USDT, LTC_USDT, ETH_USDT.
function Process (e) {
var ticker = _C(e.GetTicker)
Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
// ...
// ..
// .
}
function main(){
while (true) {
for (var i = 0 ; i < exchanges.length; i++) {
Process(exchanges[i])
Sleep(500)
}
}
}
Enciende el robot:
El ejemplo que hemos descrito anteriormente, ya sea el cambio de pares de operaciones o la adición de un objeto de negociación para múltiples pares de operaciones diferentes de una cuenta de configuración.
Entonces, ¿cómo se utilizan varias cuentas de intercambio en una estrategia?
Algunas estrategias, como la cobertura de mercado entre múltiples bolsas, estrategias de múltiples cuentas dentro de una sola bolsa.
Por ejemplo, hemos configurado 2 intercambios en el panel -> Exchange -> Añadir Exchange página.
Podemos acceder a la información de activos de las cuentas configuradas por estos dos intercambios en la estrategia.
function main(){
Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}
Por supuesto, también puedo añadir una segunda y tercera configuración de intercambio de cuentas a un intercambio.
Por ejemplo, añadimos otra cuenta para Huobi Futures.
Como pueden ver, esto configura las cuentas de las dos bolsas
Cuando se crea la estrategia, un objeto Huobi Futures Exchange aparece en la opción Modificar configuración del Robot
Por ejemplo, esto permite que dos cuentas vendan primero y luego compren con una estrategia de red típica (hacia arriba) o compren primero y luego vendan (hacia abajo).
A través de los dos ejemplos anteriores
Aquí está la diferencia entre configurar múltiples objetos de intercambio en el robot y
Este ejemplo sorprendente y mencionado anteriormente de
La diferencia es que el ejemplo anterior es una configuración de intercambio, es decir:
Cuando el robot configura el objeto de intercambio, siempre utiliza:
Esta configuración.
Es sólo que cuando se agrega un objeto de intercambio, las configuraciones de los pares comerciales son diferentes.
Si se llama la función GetAccount, siempre se accede a la información del activo de la misma cuenta.
sin embargo:
Los dos objetos de intercambio de futuros huobi así configurados, aunque todos son futuros huobi, representan cuentas de intercambio diferentes.
A veces, en la estrategia de cobertura de contratos de criptomonedas, para aprovechar las oportunidades comerciales fugaces, muchos escenarios deben colocarse simultáneamente. Sin embargo, debido a que el contrato es diferente, debe cambiar al contrato correspondiente cuando obtenga la cotización del mercado y realice un pedido.exchange.Go
la función para ejecutar una función de orden de colocación o obtener la cotización, hay un problema con la sincronización, no muy rápido. y el diseño del contrato de cambio también hace que la lógica no sea tan simple.
Por supuesto que hay, podemos añadir dos objetos de intercambio al robot siguiendo el
Luego use esta configuración de intercambio para agregar otro objeto de intercambio.
¡Se abrirá una caja de aviso!
Una configuración de cuenta de intercambio, no se pueden añadir objetos de intercambio de la misma moneda o par de operaciones.
¿Qué debo hacer? Parece que el robot de estrategia no puede utilizar dos objetos de intercambio, y el objeto de intercambio está vinculado a un número de cuenta de intercambio?
¡Todavía hay una manera!
Vamos a ir a
Haga clic en Guardar cuando esté configurado.
De esta manera tenemos dos configuraciones de intercambio, pero se utiliza la misma información de configuración API KEY.
¿Cuáles son los beneficios de esto?
¡Cuando escriba una estrategia, el diseño será muy simple!
function main(){
exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
while (true) {
var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
var diff = tickerA.Last - tickerB.Last // calculate the difference
$.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
// Hedging
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
Sleep(500)
}
¿Es esta estrategia de diseño mucho más sencilla y clara?
Funcionamiento real del mercado:
Como pueden ver, sólo se necesitan unos 50 milisegundos para obtener el precio de dos contratos cada vez.