P.p.
No hay nada en la caja principal.
Las operaciones de intercambio[0].IO(
The ZB exchange is special. There are two addresses: one is the market data interface address, and the other is the trading interface address. Switch the address:
```js
function main() {
// The second parameter of exchange.IO is the trading interface address, and the third parameter is the market interface address, which is switched to an address that can be accessed domestically
exchange.IO("base", "https://trade.zb.plus", "http://api.zb.plus")
// Print the account information
Log(exchange.GetAccount())
}
def main():
exchange.IO("base", "https://trade.zb.plus", "http://api.zb.plus")
Log(exchange.GetAccount())
void main() {
exchange.IO("base", "https://trade.zb.plus", "http://api.zb.plus");
Log(exchange.GetAccount());
}
Cambiar el modo de mercado Intercambios actualmente admitidos:
Intercambio | Las observaciones |
---|---|
Huobi Spot es un juego de cartas. | Después de soportar el protocolo WebSocket, el códigoexchange.IO( |
exchange.IO("websocket")
Cambiar el protocolo de comunicación de mercado awebsocket
(default is rest), la forma de obtener las cotizaciones de mercado cambiará después del cambio.exchange.GetTicker()
yexchange.GetDepth()
se cambiará awebsocket
El protocolo para actualizar, desde la adquisición activa en bruto de datos de mercado hasta la adquisición pasiva de datos de mercado, solo Huobi Exchange es compatible actualmente.
Cuando el modo de mercado es el mecanismo de empuje, se puede llamar a la siguiente función para establecer:
exchange.IO("mode", 0)
Modo de retorno inmediato. Si no se ha recibido el impulso de datos de mercado actual del intercambio, los datos de mercado antiguos se devolverán inmediatamente. Si hay nuevos datos, los nuevos datos se devolverán.
exchange.IO("mode", 1)
Modo caché (modo predeterminado). Si los últimos datos de mercado del intercambio no se han recibido (en comparación con los datos obtenidos de la interfaz anterior), espere a recibirlos y luego regrese. Si los últimos datos de mercado se han recibido antes de llamar a esta función, los últimos datos se devolverán inmediatamente.
exchange.IO("mode", 2)
Modo de actualización forzada. Introduzca y espere hasta que se reciba el siguiente último dato de empuje del intercambio y luego regrese.
Si desea obtener la información de mercado más reciente por primera vez, puede cambiar awebsocket
y no llamenSleep
El estudio de la calidad de los datos de laexchange.GetTicker()
yexchange.GetDepth()
las funciones funcionan en modo caché, tales como:
function main () {
exchange.IO("websocket")
while (true) {
Log(exchange.GetTicker())
}
}
def main():
exchange.IO("websocket")
while True:
Log(exchange.GetTicker())
void main() {
exchange.IO("websocket");
while(true) {
Log(exchange.GetTicker());
}
}
Modo de la cuenta de apalancamiento de bolsa
Utilizaciónexchange.IO("trade_margin")
para cambiar al modo de cuenta de apalancamiento, la colocación de órdenes y el acceso a los activos de la cuenta utilizarán la interfaz de apalancamiento de la bolsa.
Utilizaciónexchange.IO("trade_normal")
para volver al modo de cuenta normal.
Intercambios admitidos:
Intercambio | Observaciones especiales |
---|---|
No hay problema. | Los pares de operaciones del modo de cuenta de apalancamiento son diferentes de los ordinarios, y algunos pares de operaciones pueden no estar disponibles.exchange.IO("cross", true) cambiar a la posición completa de la cuenta apalancada yexchange.IO("cross", false) para cambiar a una posición aislada. |
- ¿ Qué? | Los pares de operaciones del modo de cuenta de apalancamiento son diferentes de los ordinarios, y algunos pares de operaciones pueden no estar disponibles.trade_margin para cambiar a una posición aislada de una cuenta de apalancamiento;trade_super_margin para cambiar a una posición cruzada en una cuenta de apalancamiento;trade_normal para cambiar a un modo de moneda normal |
ZB | Los fondos solo se pueden transferir en QC. En el sector de negociación de apalancamiento, los fondos entre diferentes pares comerciales son independientes, es decir, el número de monedas QC bajo el par de negociación ETH_QC no es visible en BTC_QC |
Binance | Las cuentas de apalancamiento se dividen en posición cruzada y posición aislada.trade_margin para cambiar a una posición aislada; utilizartrade_super_margin para cambiar a posición cruzada; utilizartrade_normal para cambiar a un modo de moneda normal |
Puerta de entrada | Las cuentas de apalancamiento se dividen en posición cruzada y posición aislada.trade_margin para cambiar a una posición aislada; utilizartrade_super_margin para cambiar a posición cruzada; utilizartrade_normal para cambiar a un modo de moneda normal |
AscendEx es el nombre de la aplicación. | Utilizaciónexchange.IO("trade_margin") para cambiar al modo de cuenta de apalancamiento y utilizarexchange.IO("trade_normal") para volver al modo de cuenta normal. |
exchange.Log(LogType, Price, Amount)
no realiza una orden cuando se llama, y sólo registra la información de negociación para emitir la información del registro de intercambio.
Nota:
exchange
objetos, que es diferente de la función globalLog()
.LogType
puede tomarLOG_TYPE_BUY
, LOG_TYPE_SELL
, LOG_TYPE_CANCEL
yPrice
como precio, yAmount
En cuanto a la cantidad.LogType
esLOG_TYPE_CANCEL
, Price
el parámetro es el ID del pedido.Utilizaciónexchange.Log(LogType, Price, Amount)
llevar a cabo las pruebas de seguimiento de operaciones en vivo, la simulación de la colocación de órdenes y ayudar a registrar las órdenes.
El caso de uso más común es:exchange.IO
Sin embargo, el uso de la interfaz de orden condicional de la bolsa para colocar órdenes condicionales.exchange.IO
la función no emitirá la información del registro de intercambio en la grabación del registro del bot.exchange.Log(LogType, Price, Amount)
para complementar la salida del registro con el fin de registrar la información relativa a las órdenes de colocación.
var id = 123
function main() {
// Order type: buy; price: 999; quantity: 0.1
exchange.Log(LOG_TYPE_BUY, 999, 0.1)
// Cancel the order
exchange.Log(LOG_TYPE_CANCEL, id)
}
id = 123
def main():
exchange.Log(LOG_TYPE_BUY, 999, 0.1)
exchange.Log(LOG_TYPE_CANCEL, id)
void main() {
auto id = 123;
exchange.Log(LOG_TYPE_BUY, 999, 0.1);
exchange.Log(LOG_TYPE_CANCEL, id);
}
exchange.HMAC(Algo, OutputAlgo, Data, Key)
apoya elHMACel cálculo del cifrado deMd5/SHA256/SHA512/el 1, y sólo se admite la operación en vivo.
exchange.HMAC("sha256", "hex", "xxxxx", "{{secretkey}}")
Para citaraccessKey
, el uso"{{accesskey}}"
¿ Qué pasa?
Para citarsecretKey
, el uso"{{secretkey}}"
; o puede utilizar texto plano"abc-123-xxxx"
. "{{accessKey}}","{{secretkey}}"
sólo es válido cuando se utiliza esta función.OutputAlgo
soportes:
Push cambios de posición BitMEX (protocolo wss)
function main() {
var APIKEY = "your Access Key(Bitmex API ID)"
var expires = parseInt(Date.now() / 1000) + 10
var signature = exchange.HMAC("sha256", "hex", "GET/realtime" + expires, "{{secretkey}}")
var client = Dial("wss://www.bitmex.com/realtime", 60)
var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})
var pos = 0
client.write(auth)
client.write('{"op": "subscribe", "args": "position"}')
while (true) {
bitmexData = client.read()
if(bitmexData.table == 'position' && pos != parseInt(bitmexData.data[0].currentQty)){
Log('position change', pos, parseInt(bitmexData.data[0].currentQty), '@')
pos = parseInt(bitmexData.data[0].currentQty)
}
}
}
import time
def main():
APIKEY = "your Access Key(Bitmex API ID)"
expires = int(time.time() + 10)
signature = exchange.HMAC("sha256", "hex", "GET/realtime" + str(expires), "{{secretkey}}")
client = Dial("wss://www.bitmex.com/realtime", 60)
auth = json.dumps({"args": [APIKEY, expires, signature], "op": "authKeyExpires"})
pos = 0
client.write(auth)
client.write('{"op": "subscribe", "args": "position"}')
while True:
bitmexData = json.loads(client.read())
if "table" in bitmexData and bitmexData["table"] == "position" and len(bitmexData["data"]) != 0 and pos != bitmexData["data"][0]["currentQty"]:
Log("position change", pos, bitmexData["data"][0]["currentQty"], "@")
pos = bitmexData["data"][0]["currentQty"]
void main() {
auto APIKEY = "your Access Key(Bitmex API ID)";
auto expires = Unix() + 10;
auto signature = exchange.HMAC("sha256", "hex", format("GET/realtime%d", expires), "{{secretkey}}");
auto client = Dial("wss://www.bitmex.com/realtime", 60);
json auth = R"({"args": [], "op": "authKeyExpires"})"_json;
auth["args"].push_back(APIKEY);
auth["args"].push_back(expires);
auth["args"].push_back(signature);
auto pos = 0;
client.write(auth.dump());
client.write("{\"op\": \"subscribe\", \"args\": \"position\"}");
while(true) {
auto bitmexData = json::parse(client.read());
if(bitmexData["table"] == "position" && bitmexData["data"][0].find("currentQty") != bitmexData["data"][0].end() && pos != bitmexData["data"][0]["currentQty"]) {
Log("Test");
Log("position change", pos, bitmexData["data"][0]["currentQty"], "@");
pos = bitmexData["data"][0]["currentQty"];
}
}
}
exchange.Go(Method, Args...)
es la función asíncrona soportada con múltiples hilos, que puede convertir el funcionamiento de todas las funciones soportadas en simultánea asíncrona (que solo soporta intercambios de criptomonedas). Valor del parámetro:Method
, de tipo de cadena, es decir, el nombre de la función llamada simultáneamente.
Nota:
exchange.Go
función devuelve un objeto, elwait
La función se llama para recuperar los datos devueltos por el hilo a través del objeto. El hilo se liberará automáticamente después de la adquisición de datos llamandowait
Si se especifica el parámetro de tiempo de espera dewait
, el hilo no se liberará incluso si ocurre el tiempo de espera; de esta manera, el hilo se liberará automáticamente solo al obtener el resultado del hilo (sin importar si la interfaz a la que se accede simultáneamente se llama con éxito o sin éxito).wait
Función, y el recurso de hilo aplicado por elexchange.Go
la función es liberada automáticamente por el docker.wait
Si la función no se obtiene al final, los recursos de hilo no se liberarán automáticamente, lo que causará la acumulación de hilos aplicados; si el número de hilos supera los 2000, se informará de un error:"too many routine wait, max is 2000"
.Funciones soportadas:GetTicker
, GetDepth
, GetTrades
, GetRecords
, GetAccount
, GetOrders
, GetOrder
, CancelOrder
, Buy
, Sell
, GetPosition
yIO
.
function main(){
// The following four operations are executed concurrently and asynchronously by multiple threads, without time-consuming, but with immediate return.
var a = exchange.Go("GetTicker")
var b = exchange.Go("GetDepth")
var c = exchange.Go("Buy", 1000, 0.1)
var d = exchange.Go("GetRecords", PERIOD_H1)
// Call the "wait" method, to wait for the return of the asynchronously obtained "ticker" result
var ticker = a.wait()
// Return the depth; it is possible to return null, if the acquisition fails
var depth = b.wait()
// Return the order number; limit the timeout in 1 second; the timeout returns "undefined"; this object can continue to call "wait" to wait if the last "wait" is timeout
var orderId = c.wait(1000)
if(typeof(orderId) == "undefined") {
// Timeout, reacquire
orderId = c.wait()
}
var records = d.wait()
}
def main():
a = exchange.Go("GetTicker")
b = exchange.Go("GetDepth")
c = exchange.Go("Buy", 1000, 0.1)
d = exchange.Go("GetRecords", PERIOD_H1)
ticker, ok = a.wait()
depth, ok = b.wait()
orderId, ok = c.wait(1000)
if ok == False:
orderId, ok = c.wait()
records, ok = d.wait()
void main() {
auto a = exchange.Go("GetTicker");
auto b = exchange.Go("GetDepth");
auto c = exchange.Go("Buy", 1000, 0.1);
auto d = exchange.Go("GetRecords", PERIOD_H1);
Ticker ticker;
Depth depth;
Records records;
TId orderId;
a.wait(ticker);
b.wait(depth);
if(!c.wait(orderId, 300)) {
c.wait(orderId);
}
d.wait(records);
}
Nota:
undefined
, el usotypeof(xx)==="undefined"
, porquenull == undefined
está disponible en JavaScript.function main() {
var d = exchange.Go("GetRecords", PERIOD_H1)
// Wait for K-line result
var records = d.wait()
// Here we wait for an asynchronous operation that has been waited and ended; it will return null, and record the error
var ret = d.wait()
}
def main():
d = exchange.Go("GetRecords", PERIOD_H1)
records, ok = d.wait()
ret, ok = d.wait()
void main() {
auto d = exchange.Go("GetRecords", PERIOD_H1);
Records records;
d.wait(records);
Records ret;
d.wait(ret);
}
La diferencia entrePython
yJavaScript
¿Es eso?Python
¿ Qué?wait
La función devuelve dos parámetros: el primero es el resultado devuelto por la API asíncrona; el segundo indica si la llamada asíncrona se ha completado.
Python
Ejemplo:
def main():
d = exchange.Go("GetRecords", PERIOD_D1)
# "ok" must return "True", unless the strategy is stopped
ret, ok = d.wait()
# If the waiting times out, or "wait" for an ended instance, "ok" returns "False"
ret, ok = d.wait(100)
ret, ok = d.wait(100)
Adquirir cotizaciones de varias bolsas simultáneamente:
function main() {
while(true) {
var beginTS = new Date().getTime()
var arrRoutine = []
var arrTicker = []
var arrName = []
for(var i = 0; i < exchanges.length; i++) {
arrRoutine.push(exchanges[i].Go("GetTicker"))
arrName.push(exchanges[i].GetName())
}
for(var i = 0; i < arrRoutine.length; i++) {
arrTicker.push(arrRoutine[i].wait())
}
var endTS = new Date().getTime()
var tbl = {
type: "table",
title: "Market Quotes",
cols: ["Index", "Name", "Latest Executed Price"],
rows: []
}
for(var i = 0; i < arrTicker.length; i++) {
tbl.rows.push([i, arrName[i], arrTicker[i].Last])
}
LogStatus(_D(), "The total time to acquire multiple platforms concurrently is:", endTS - beginTS, "millisecond", "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(500)
}
}
import time
import json
def main():
while True:
beginTS = time.time()
arrRoutine = []
arrTicker = []
arrName = []
for i in range(len(exchanges)):
arrRoutine.append(exchanges[i].Go("GetTicker"))
arrName.append(exchanges[i].GetName())
for i in range(len(exchanges)):
ticker, ok = arrRoutine[i].wait()
arrTicker.append(ticker)
endTS = time.time()
tbl = {
"type": "table",
"title": "Market Quote",
"cols": ["Index", "Name", "Latest Executed Price"],
"rows": []
}
for i in range(len(arrTicker)):
tbl["rows"].append([i, arrName[i], arrTicker[i]["Last"]])
LogStatus(_D(), "The total time to acquire multiple platforms concurrently is:", endTS - beginTS, "second", "\n", "`" + json.dumps(tbl) + "`")
Sleep(500)
void main() {
while(true) {
int length = exchanges.size();
auto beginTS = UnixNano() / 1000000;
Ticker arrTicker[length] = {};
string arrName[length] = {};
// Note that to add a few exchange objects, here we need to execute the "exchanges[n].Go" function several times. In this example, we need to add four exchange objects, which can be modified in details
auto r0 = exchanges[0].Go("GetTicker");
auto r1 = exchanges[1].Go("GetTicker");
auto r2 = exchanges[2].Go("GetTicker");
auto r3 = exchanges[3].Go("GetTicker");
GoObj *arrRoutine[length] = {&r0, &r1, &r2, &r3};
for(int i = 0; i < length; i++) {
arrName[i] = exchanges[i].GetName();
}
for(int i = 0; i < length; i++) {
Ticker ticker;
arrRoutine[i]->wait(ticker);
arrTicker[i] = ticker;
}
auto endTS = UnixNano() / 1000000;
json tbl = R"({
"type": "table",
"title": "Market Quote",
"cols": ["Index", "Name", "Latest Executed Price"],
"rows": []
})"_json;
for(int i = 0; i < length; i++) {
json arr = R"(["", "", ""])"_json;
arr[0] = format("%d", i);
arr[1] = arrName[i];
arr[2] = format("%f", arrTicker[i].Last);
tbl["rows"].push_back(arr);
}
LogStatus(_D(), "The total time to acquire multiple platforms concurrently is:", format("%d", endTS - beginTS), "millisecond", "\n", "`" + tbl.dump() + "`");
Sleep(500);
}
}
Las llamadas simultáneas a laexchange.IO("api", ...)
Función:
function main() {
/*
Use the OKX placing order interface to test
POST /api/v5/trade/order
*/
var beginTS = new Date().getTime()
var param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
var ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
var ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
var ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
var id1 = ret1.wait()
var id2 = ret2.wait()
var id3 = ret3.wait()
var endTS = new Date().getTime()
Log("id1:", id1)
Log("id2:", id2)
Log("id3:", id3)
Log("Time for placing orders concurrently:", endTS - beginTS, "millisecond")
}
import time
import json
def main():
beginTS = time.time()
param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
id1, ok1 = ret1.wait()
id2, ok2 = ret2.wait()
id3, ok3 = ret3.wait()
endTS = time.time()
Log("id1:", id1)
Log("id2:", id2)
Log("id3:", id3)
Log("Time for placing orders concurrently:", endTS - beginTS, "second")
void main() {
auto beginTS = UnixNano() / 1000000;
json param = R"({"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"})"_json;
auto ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
auto ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
auto ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
json id1 = R"({})"_json;
json id2 = R"({})"_json;
json id3 = R"({})"_json;
ret1.wait(id1);
ret2.wait(id2);
ret3.wait(id3);
auto endTS = UnixNano() / 1000000;
Log("id1:", id1);
Log("id2:", id2);
Log("id3:", id3);
Log("Time for placing orders concurrently:", endTS - beginTS, "millisecond");
}
exchange.GetAccount()
devuelve la información de la cuenta de cambio.Account
structure.
Account
estructurafunction main(){
var account = exchange.GetAccount()
Log("Account information, Balance:", account.Balance, "FrozenBalance:", account.FrozenBalance, "Stocks:",
account.Stocks, "FrozenStocks:", account.FrozenStocks)
}
def main():
account = exchange.GetAccount()
Log("Account information, Balance", account["Balance"], "FrozenBalance:", account["FrozenBalance"], "Stocks:",
account["Stocks"], "FrozenStocks:", account["FrozenStocks"])
void main() {
auto account = exchange.GetAccount();
Log("Account information, Balance", account.Balance, "FrozenBalance:", account.FrozenBalance, "Stocks:",
account.Stocks, "FrozenStocks:", account.FrozenStocks);
}
Si el objeto de intercambio está configurado para un intercambio de futuros de criptomonedas y cambiado a un contrato conUSDT
En el caso de las empresas, el margen de interés es el margen de interés.exchange.SetContractType
En la actualidad, la mayoría de las empresas tienen una función deUSDT
como margen, que se registra en el atributo deBalance
yFrozenBalance
.
function main(){
// Switch the trading pair
exchange.IO("currency", "BTC_USDT")
// Take OKX futures as an example; set the contract as the contract of the week, and the current trading pair is BTC_USDT, so the current contract is BTC USDT-margined contract of this week
exchange.SetContractType("this_week")
// Acquire the data of the current account assets
var account = exchange.GetAccount()
// The available balance of USDT as margin
Log(account.Balance)
// The frozen amount of USDT as margin
Log(account.FrozenBalance)
}
def main():
exchange.IO("currency", "BTC_USDT")
exchange.SetContractType("this_week")
account = exchange.GetAccount()
Log(account["Balance"])
Log(account["FrozenBalance"])
void main() {
exchange.IO("currency", "BTC_USDT");
exchange.SetContractType("this_week");
auto account = exchange.GetAccount();
Log(account.Balance);
Log(account.FrozenBalance);
}
exchange.GetName()
Devuelve el valor: tipo de cadena. Generalmente se utiliza para determinar elexchange
o bienexchanges[n]
objetos en el código de estrategia.
function main() {
Log("Determine the exchange object to be OKX:", exchange.GetName() == "OKEX")
}
def main():
Log("Determine the exchange object to be OKX:", exchange.GetName() == "OKEX")
void main() {
Log("Determine the exchange object to be OKX:", exchange.GetName() == "OKEX");
}
Para ordenar la versión de línea de Docker, se puede utilizar el-1
comando para imprimir una lista de nombres de intercambio.
exchange.GetLabel()
devuelve la etiqueta personalizada del intercambio.
Elexchange
o bienexchanges[n]
Los objetos en los códigos de estrategia se determinan normalmente por las etiquetas establecidas al configurar los objetos de intercambio.
exchange.GetCurrency()
devuelve el nombre del par de divisas operado por el intercambio, y la plataforma de criptomonedas devuelve una cadena, comoLTC_BTC
. Devuelve el valor: tipo de cadena.
Elexchange.SetCurrency(Symbol)
Compatible con el método de conmutación deexchange.IO ("currency","BTC_USDT")
Apoya el cambio de pares de operaciones en el sistema de backtesting, y el nombre de lapricing currency
No se puede cambiar cuando se cambian los pares de operaciones en el sistema de backtesting (por ejemplo,BTC_USDT
puede ser cambiado aLTC_USDT
, pero no se puede cambiar aLTC_BTC
En el caso de las transacciones con pares de valores, el número de pares de valores de las transacciones con pares de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores.trading coins
es 0 (por ejemplo, durante el backtest, el valor inicial del par de operaciones en la página de backtest esBTC_USDT
, el número de BTC es 3, y el número de USDT es 10.000.LTC_USDT
, el número detrading coins
después del cambio será 0, lo que significa que el número de LTC en la cuenta es 0, pero el importe compartido de USDT de los pares de negociación cambiados sigue siendo 10000).
function main() {
var ticker = exchange.GetTicker()
Log(ticker)
Log(exchange.GetAccount())
// Switch trading pairs, and pay attention to changes in market quote data and account information after switching
Log("Switch LTC_USDT: ", exchange.SetCurrency("LTC_USDT"))
ticker = exchange.GetTicker()
Log(ticker)
Log(exchange.GetAccount())
}
def main():
ticker = exchange.GetTicker()
Log(ticker)
Log(exchange.GetAccount())
Log(" Switch LTC_USDT: ", exchange.SetCurrency("LTC_USDT"))
ticker = exchange.GetTicker()
Log(ticker)
Log(exchange.GetAccount())
void main() {
auto ticker = exchange.GetTicker();
Log(ticker);
Log(exchange.GetAccount());
exchange.SetCurrency("LTC_USDT");
Log(" Switch LTC_USDT: ");
ticker = exchange.GetTicker();
Log(ticker);
Log(exchange.GetAccount());
}
Resultado de la operación de la prueba posterior:
exchange.GetQuoteCurrency()
devuelve el nombre de la moneda base operada por el centro de cambio.BTC_CNY
las devolucionesCNY
, yETH_BTC
las devolucionesBTC
. Devuelve el valor: tipo de cadena.
Para los objetos de intercambio de futuros de criptomonedas, el código del contrato debe especificarse antes de llamar a suel mercado, el ordeny otras interfaces, y elexchange.SetContractType
Cuando se cambia el par de operaciones actual del objeto de intercambio, es necesario llamar a laexchange.SetContractType
Para los códigos de contrato de cambio de moneda digital compatibles con la plataforma, consulte elexchange.SetContractType
function.
exchange.GetPosition()
Obtiene la información de la posición actual. Valor de retorno:position
Si no hay posición, devuelve una matriz vacía, es decir[]
.
Position
estructuraNormalmente, los contratos de futuros de criptomonedas se dividen en dos tipos:
Contrato de entrega
Cuando un contrato está establecido en un contrato de entrega, llame alexchange.GetPosition()
En el caso de las operaciones de negociación de pares de valores, las posiciones en el contrato de entrega en el par de negociación actual serán devueltas.
Contrato perpetuo
Cuando un contrato está establecido en un contrato perpetuo, llamar a laexchange.GetPosition()
En el caso de las operaciones de negociación de pares de valores, las posiciones en el contrato perpetuo en el par de operaciones en curso serán devueltas.
/*
Note: if there is no position, it will returns an empty array, so you should judge whether the data returned by the interface is a null array, before you use the returned data
For example:
When the exchange is set to OKX futures, if the contract is set to be a delivery contract, when the position data of the current week, the next week, and the quarter is obtained, the data type will be an array of position structure.
When the exchange is set to OKX futures, if the contract is set to a perpetual contract, the array of position structure containing the position data of the perpetual contract will be obtained.
*/
function main(){
exchange.SetContractType("this_week")
exchange.SetMarginLevel(10)
exchange.SetDirection("buy")
exchange.Buy(10000, 2)
var position = exchange.GetPosition()
if(position.length > 0){
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,
"ContractType:", position[0].ContractType)
}
}
def main():
exchange.SetContractType("this_week")
exchange.SetMarginLevel(10)
exchange.SetDirection("buy")
exchange.Buy(10000, 2)
position = exchange.GetPosition()
if len(position) > 0:
Log("Amount:", position[0]["Amount"], "FrozenAmount:", position[0]["FrozenAmount"], "Price:",
position[0]["Price"], "Profit:", position[0]["Profit"], "Type:", position[0]["Type"],
"ContractType:", position[0]["ContractType"])
void main() {
exchange.SetContractType("this_week");
exchange.SetMarginLevel(10);
exchange.SetDirection("buy");
exchange.Buy(10000, 2);
auto position = exchange.GetPosition();
if(position.size() > 0) {
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,
"ContractType:", position[0].ContractType);
}
}
exchange.SetMarginLevel(MarginLevel)
El valor del parámetro: tipo numérico.
Establecer el tamaño del apalancamiento para la colocación de órdenes de futuros de criptomonedas, por ejemplo:
function main() {
exchange.SetMarginLevel(10)
}
def main():
exchange.SetMarginLevel(10)
void main() {
exchange.SetMarginLevel(10);
}
Para los futuros de criptomonedas, los mecanismos de apalancamiento de los intercambios de futuros de criptomonedas no son uniformes. En algunos intercambios, el valor de apalancamiento de los futuros es un parámetro en la interfaz de orden de colocación.SetMarginLevel
La función no puede generar una solicitud de red, sino que solo establece la variable de apalancamiento en la capa inferior (utilizada para pasar parámetros en la interfaz de la orden de colocación).SetMarginLevel
La función generará una solicitud de red, y puede no establecer el apalancamiento por varias razones. Por ejemplo: si hay posiciones actuales y órdenes pendientes, el valor de apalancamiento puede no ser establecido para este par de operaciones y el objeto subyacente.
Notas para establecer el apalancamiento en el diseño de la estrategia:
exchange.SetDirection(Direction)
conjuntoexchange.Buy
o bienexchange.Sell
Para hacer instrucciones para la colocación de órdenes de futuros.
ElSetDirection
la función establece la correspondencia entre la dirección de negociación de futuros y la función de colocación de órdenes:
Función de colocación de órdenes | Dirección de ajuste de parámetros para |
Las observaciones |
---|---|---|
exchange.Buy | comprar una posición larga abierta | |
exchange.Buy | Comprar posición corta cerrada | |
exchange.Sell | Vender una posición corta abierta | |
exchange.Sell | Vender la posición larga cerrada |
El parámetroDirection
puede tomar los cuatro parámetros, incluyendobuy
, closebuy
, sell
yclosesell
.
function main(){
// Make an example for setting OKX futures weekly contract
exchange.SetContractType("this_week")
// Set 5 times of leverage
exchange.SetMarginLevel(5)
// Set the order placing type into placing long order
exchange.SetDirection("buy")
// Place an order with the contract quantity of 2, at the price of 10,000
exchange.Buy(10000, 2)
exchange.SetMarginLevel(5)
exchange.SetDirection("closebuy")
exchange.Sell(1000, 2)
}
def main():
exchange.SetContractType("this_week")
exchange.SetMarginLevel(5)
exchange.SetDirection("buy")
exchange.Buy(10000, 2)
exchange.SetMarginLevel(5)
exchange.SetDirection("closebuy")
exchange.Sell(1000, 2)
void main() {
exchange.SetContractType("this_week");
exchange.SetMarginLevel(5);
exchange.SetDirection("buy");
exchange.Buy(10000, 2);
exchange.SetMarginLevel(5);
exchange.SetDirection("closebuy");
exchange.Sell(1000, 2);
}
exchange.SetContractType(ContractType)
Establezca el tipo de contrato. Valor del parámetro: tipo de cadena. En las estrategias de criptomonedas, tome exchange.SetCurrency("BTC_USDT")
o bienexchange.IO("currency", "BTC_USDT")
, usted necesita para utilizar elexchange.SetContractType
La función de restablecimiento del contrato para determinar el contrato actual que debe operarse bajo el nuevo par de operaciones.currency-based contract
o unaU-based contract
Basado en elPares de negociaciónPor ejemplo, cuando el par de operaciones está configurado paraBTC_ USDT
, la función de usoexchange.SetContractType
para establecer el código del contratoswap
, que se establece como el contrato perpetuo de BTC basado en USDT.BTC_ USD
, la función de usoexchange.SetContractType
para establecer el código del contratoswap
, que se establece como el contrato perpetuo basado en moneda de BTC.
A menos que se especifique lo contrario, elcontrato de entregael código en un contrato de futuros de criptomonedas incluye generalmente:
this_week
: contrato semanalnext_week
Contrato de la próxima semanaquarter
: contrato trimestralnext_quarter
: contrato del próximo trimestreA menos que se especifique lo contrario, elcontrato perpetuoel código en un contrato de futuros de criptomonedas incluye generalmente:
swap
: contrato perpetuoEstablezca el contrato actual en un contrato semanal:
function main() {
// Set to weekly contract
exchange.SetContractType("this_week")
}
def main():
exchange.SetContractType("this_week")
void main() {
exchange.SetContractType("this_week");
}
La descripción detallada del nombre del contrato de cada intercambio de criptomonedas soportado se muestra de la siguiente manera:
No hay problema.
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
En el contrato de esta semana:exchange.SetContractType("this_week")
Contrato para la próxima semana:exchange.SetContractType("next_week")
Contrato trimestral:exchange.SetContractType("quarter")
Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")
El contrato con margen en USDT de OKX se puede cambiar al contrato que utiliza la liquidación en USDT correspondiente al contrato actual cambiandotrading pair
(o establecerlo directamente al añadir los objetos de intercambio).
function main() {
// The default trading pair is BTC_USD, the contract is set to the weekly contract, and the contract is the crypto-margined contract
exchange.SetContractType("this_week")
Log("ticker:", exchange.GetTicker())
// Switch trading pairs, and then set a contract to a USDT-margined contract, which is different from the crypto-margined contract
exchange.IO("currency", "BTC_USDT")
exchange.SetContractType("swap")
Log("ticker:", exchange.GetTicker())
}
def main():
exchange.SetContractType("this_week")
Log("ticker:", exchange.GetTicker())
exchange.IO("currency", "BTC_USDT")
exchange.SetContractType("swap")
Log("ticker:", exchange.GetTicker())
void main() {
exchange.SetContractType("this_week");
Log("ticker:", exchange.GetTicker());
exchange.IO("currency", "BTC_USDT");
exchange.SetContractType("swap");
Log("ticker:", exchange.GetTicker());
}
Futures_HuobiDM
En el contrato de esta semana:exchange.SetContractType("this_week")
Contrato para la próxima semana:exchange.SetContractType("next_week")
Contrato trimestral:exchange.SetContractType("quarter")
Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
La plataforma admite los contratos con margen USDT. Tome el contrato BTC como ejemplo.exchange.SetCurrency("BTC_USDT")
, o estableciendo el par de negociación actual enBTC_USDT
directamente cuando configure los parámetros del bot y agregue objetos de intercambio.exchange.SetContractType
La función de nuevo para establecer el contrato.
Las entidades que no cumplen los requisitos de la letra a) del presente artículo no podrán optar por el tipo de garantía de la entidad.
Se ha establecido un contrato perpetuo:exchange.SetContractType("XBTUSD")
, exchange.SetContractType("APTUSDT")
- ¿ Por qué?
El contrato se liquida en un momento específico, y inicie sesión en el sitio web oficial de BitMEX para verificar cada código de contrato para obtener más detalles.exchange.SetContractType("XBTM19")
.
Los futuros_GateIO
En el contrato de esta semana:exchange.SetContractType("this_week")
¿ Qué pasa?
Contrato para la próxima semana:exchange.SetContractType("next_week")
¿ Qué pasa?
Contrato trimestral:exchange.SetContractType("quarter")
¿ Qué pasa?
Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")
¿ Qué pasa?
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
- ¿ Por qué?
El intercambio admite los contratos con margen USDT. Tome el contrato BTC como ejemplo.exchange.SetCurrency("BTC_USDT")
, o estableciendo el par de negociación actual enBTC_USDT
directamente cuando configure los parámetros de negociación en vivo y agregue objetos de intercambio.exchange.SetContractType
La función de nuevo para establecer el contrato.
Los futuros_Deribit
Se ha establecido un contrato perpetuo:exchange.SetContractType("BTC-PERPETUAL")
Apoyo al contrato Deribit USDC; convocatoriaexchange.SetContractType("ADA_USDC-PERPETUAL")
establecer un contrato perpetuo con margen de ADA USDC.
El contrato se liquida en un momento específico, y inicie sesión en el sitio web oficial de Deribit para consultar cada código de contrato para obtener más detalles, como:exchange.SetContractType("BTC-27APR18")
.
Los futuros_KuCoin
BTC_USD
, y luego establecer el código del contrato, que se llama contrato cripto-marginado.
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
Contrato trimestral:exchange.SetContractType("quarter")
Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")
BTC_USDT
, y luego establecer el código del contrato, que es el contrato con margen USDT.
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
.Los futuros de Binance
Binance Futures por defecto no establece el estado del contrato, por lo que necesita establecer el contrato primero.
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
Los contratos perpetuos de Binance Futures pueden ser contratos con margen de USDT.BTC
Contrato con margen USDT, el par de operaciones está establecido enBTC_USDT
. Los contratos perpetuos de Binance Futures también incluyen contratos con cripto margen. Por ejemplo, en el contrato con cripto margen, establece el par de operaciones enBTC_USD
.
Contrato trimestral:exchange.SetContractType("quarter")
Los contratos de entrega incluyen contratos de criptomonedas con margen (es decir, tomando la moneda utilizada como margen).BTC
, el par de negociación está configurado paraBTC_USD
, y luego establecer el código del contratoexchange.SetContractType("quarter")
, que está estableciendo el contrato trimestral de criptomonedas BTC.
Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")
Por ejemplo, en el contrato trimestral de criptomonedas con margen deBTC
, el par de negociación está configurado paraBTC_USD
, y luego establecer el código del contratoexchange.SetContractType("next_quarter)
Binance admite parte de los contratos de entrega con margen USDT, como establecer el par de operaciones de BTC aBTC_USDT
, y luego establecer el código del contrato.
El valor de la inversión se calcula de acuerdo con el método de cálculo.
Código del contrato perpetuo de Bibox:swap
¿ Qué pasa?
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
.
Las operaciones de garantía de los bancos centrales
Código del contrato perpetuo de AOFEX:swap
¿ Qué pasa?
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
.
Los futuros_BFX
Código del contrato perpetuo BFX:swap
¿ Qué pasa?
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
.
El valor de las acciones de la entidad
Bybit está por defecto en el contrato perpetuo del par de operaciones actual.swap
¿ Qué pasa?
Código del contrato trimestral:quarter
¿ Qué pasa?
Código del contrato del próximo trimestre:next_quarter
.
Los futuros_Kraken
Kraken por defecto no establece el estado del contrato, así que necesitas establecer el código del contrato.swap
Contrato perpetuo.month
: contrato mensual.quarter
: contrato trimestral.next_quarter
El próximo trimestre.
Las acciones de los bancos centrales de la Unión
Bitfinex no cumple con el contrato perpetuo del par de operaciones actual.swap
.
Los futuros_Bitget
Bitget está por defecto en el contrato perpetuo del par de operaciones actual. Código del contrato:swap
. El par de operaciones está configurado paraBTC_USD
, que indica el contrato de criptomonedas con margen; el par de operaciones está configurado enBTC_USDT
Los contratos simulados pueden establecer los pares de negociación en:SBTC_USD
yBTC_SUSDT
.
Los futuros_dYdX
El código del contrato del contrato perpetuo dYdX:swap
¿ Qué pasa?
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
. dYdX sólo tiene contratos con margen USDT.
Los futuros_MEXC
El código del contrato del contrato perpetuo MEXC:swap
¿ Qué pasa?
Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")
. El par de operaciones está configurado paraBTC_USD
, que indica el contrato de criptomonedas con margen; el par de operaciones está configurado enBTC_USDT
, indicando el contrato con margen en USDT.
Al escribir estrategias de criptomonedas, llameexchange.SetContractType(ContractType)
función y la información detallada del contrato establecida por el parámetro del contratoContractType
será devuelto.
Por ejemplo, ejecutando el código de estrategia del contrato OKX establecido como objeto de intercambio:
function main(){
// Set to weekly contract
var ret = exchange.SetContractType("this_week")
// Return the information of the weekly contract
Log(ret)
}
def main():
ret = exchange.SetContractType("this_week")
Log(ret)
void main() {
auto ret = exchange.SetContractType("this_week");
Log(ret);
}
Ejecute la estrategia enJavaScript
lengua, y la impresiónret
datos, es decir, la información detallada dethis_week
el contrato:
{
"instrument":"BTC-USD-191101",
"InstrumentID":"BTC-USD-191101"
}
exchange.GetContractType()
devuelve el código del contrato establecido actualmente del objeto de intercambio (exchange
), devuelve el valor: cadena.
function main () {
Log(exchange.SetContractType("this_week"))
Log(exchange.GetContractType())
}
def main():
Log(exchange.SetContractType("this_week"))
Log(exchange.GetContractType())
void main() {
Log(exchange.SetContractType("this_week"));
Log(exchange.GetContractType());
}
La siguiente tabla describe la información de error relacionada con los objetos de intercambio de los contratos de futuros de criptomonedas:
Valor | Error de visualización de la función | Función de disparo | Descripción |
---|---|---|---|
0 | Futuros_OP 0 | exchange.SetMarginLevel | error de llamada de la función de apalancamiento |
1 | Futuros_OP 1 | exchange.SetDirection | error de configuración de la función de dirección de negociación de futuros |
2 | Futuros_OP 2 | exchange.SetContractType | error de configuración de la función del contrato |
3 | Futuros_OP 3 | exchange.GetPosition | Error de obtener la función de posición |
4 | Futuros_OP 4 | exchange.IO | error de llamada de la función IO |
Utilizaciónexchange.SetContractType
Las diferentes bolsas tienen diferentes códigos de contratos de opciones.
Intercambios de opciones de criptomonedas apoyados por la plataforma de negociación FMZ Quant
El deribit
Para el intercambio de Deribit, sólo es necesario llamar a laexchange.SetContractType
La función de establecer el contrato como un contrato de opciones.GetTicker
, se obtienen todos los datos de mercado del contrato de opciones.exchange.Sell
yexchange.Buy
Las funciones para colocar una orden, y prestar atención a la dirección de negociación al colocar una orden, y establecer la dirección de negociación porexchange.SetDirection
. Utilizar elexchange.Cancel
La función para cancelar un pedido;exchange.GetPosition
Función para consultar posiciones.
El código de referencia de la estrategia:La estrategia de prueba de las opciones de Deribit
No hay problema.
El establecimiento de contratos, la colocación de órdenes, la cancelación de órdenes, la consulta de órdenes y la obtención de cotizaciones de mercado, etc., son de la misma operación queDeribit
, y el formato del código del contrato esBTC-USD-200626-4500-C
Puede consultar la información relacionada con el contrato a través de la interfazhttps://www.okx.com/api/v5/public/instruments
.
Por ejemplo, para consultar la información de los contratos de opciones de BTC:
function main() {
Log(HttpQuery("https://www.okx.com/api/v5/public/instruments?instType=OPTION&uly=BTC-USD"))
}
import json
import urllib.request
def main():
ret = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/public/instruments?instType=OPTION&uly=BTC-USD").read().decode('utf-8'))
Log(ret)
void main() {
Log(HttpQuery("https://www.okx.com/api/v5/public/instruments?instType=OPTION&uly=BTC-USD"));
}
Futures_HuobiDM
Por ejemplo, el código del contrato de opciones de Huobi:BTC-USDT-201225-P-13000
; el contrato es unBTC
contrato; la fecha de ejercicio es el 25 de diciembre de 2020; las opciones son Put Options (PUT); el precio de ejercicio es de $13,000.
Para las opciones de compra, la prima pagada por el comprador es USDT, lo que indica que se utiliza el USDT en los activos de la cuenta; el margen del vendedor es moneda, que está garantizada por la moneda de los activos.
Para las opciones de venta, la prima pagada por el comprador es USDT, lo que indica que se utiliza el USDT en los activos de la cuenta; el margen del vendedor es USDT, que está garantizado por el USDT en los activos.
El valor de las acciones de la entidad
Apoya la opción USDC del intercambio Bybit, y establece el par de operaciones aETH_USDC
, función de llamadaexchange.SetContractType
Ejemplo de código del contrato de opción:ETH-25NOV22-1375-P
.
Elexchange.SetBase(Base)
La función se utiliza para cambiar la dirección de base de API registrada en los objetos de intercambio; por ejemplo, cambiar aOKX
nombre de dominiohttps://aws.okx.com
, compatible conexchange.IO("base","https://aws.okx.com")
El sistema de backtest no admite el cambio de la dirección de base API del intercambio (el sistema de backtest es un entorno de sandbox, no una interfaz real para acceder al intercambio).
function main() {
// Use the default base address
Log(exchange.GetTicker())
// Switch to https://aws.okx.com
exchange.SetBase("https://aws.okx.com")
Log(exchange.GetTicker())
}
def main():
Log(exchange.GetTicker())
exchange.SetBase("https://aws.okx.com")
Log(exchange.GetTicker())
void main() {
Log(exchange.GetTicker());
exchange.SetBase("https://aws.okx.com");
Log(exchange.GetTicker());
}
exchange.SetProxy(...)
Esta función no tiene valor de retorno (obtenido por variables, y lo que obtiene esundefined
Si la configuración de proxy falla, un valor nulo será devuelto cuando se llame a la interfaz, sólo para elDescansoCada objeto de intercambioexchanges[n]
Después de configurar el proxy, se accederá a la interfaz de intercambio a través del proxy.
Tome el primer objeto de intercambio añadidoexchange
, a saber:exchanges[0]
, por ejemplo:
exchange.SetProxy("socks5://127.0.0.1:8889")
exchange.SetProxy("socks5://username:password@127.0.0.1:8889")
(username
es el nombre del usuario,password
es la contraseña.)exchange.SetProxy("")
Apoyo para establecer la dirección IP solicitada por el objeto de intercambio.
windows
la versión de la interfaz del sistema se puede establecer directamente, que se muestra como la siguiente imagen:Otros muelles operados por el parámetro de uso del comando-I
para especificar las direcciones IP:
Basado en el intercambio para especificar:
function main(){
exchange.SetProxy("ip://10.0.3.15")
exchange.GetTicker() // The reque