pp
Главный пустой ((()
обмены[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());
}
Переключение на рыночный режим В настоящее время поддерживаемые биржи:
Обмен | Примечания |
---|---|
Huobi Spot | После поддержки протокола WebSocket, кодexchange.IO( |
exchange.IO("websocket")
Переключите протокол коммуникации наwebsocket
(по умолчанию - отдых), способ получения рыночных котировок изменится после переключения.exchange.GetTicker()
иexchange.GetDepth()
будет переключена наwebsocket
Протокол для обновления, от сырой активного приобретения рыночных данных пассивного приобретения рыночных данных, только Huobi Exchange поддерживается в настоящее время.
Когда рыночный режим - это механизм подталкивания, вы можете вызвать следующую функцию для настройки:
exchange.IO("mode", 0)
Мод немедленного возврата. Если текущие данные рынка не были получены от биржи, старые данные рынка будут возвращены немедленно. Если есть новые данные, новые данные будут возвращены.
exchange.IO("mode", 1)
Кэшевый режим (режим по умолчанию). Если последние рыночные данные биржи не были получены (по сравнению с данными, полученными с предыдущего интерфейса), ждите получения, а затем верните. Если последние рыночные данные были получены до вызова этой функции, последние данные будут возвращены немедленно.
exchange.IO("mode", 2)
Принудительный режим обновления. Введите и ждите, пока не будут получены последние данные обмена, а затем верните.
Если вы хотите получить самую свежую информацию о рынке в первый раз, вы можете перейти наwebsocket
и не зовитеSleep
В результате, они немедленно проверяют данные.exchange.GetTicker()
иexchange.GetDepth()
функции работают в режиме кэша, например:
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());
}
}
Режим счета биржевого рычага
Использованиеexchange.IO("trade_margin")
для перехода на режим учетного счета с использованием рычага, размещение ордеров и доступ к активам счета будут использовать интерфейс рычага биржи.
Использованиеexchange.IO("trade_normal")
чтобы вернуться в обычный режим учетной записи.
Поддерживаемые обмены:
Обмен | Особые замечания |
---|---|
ОКX | Торговые пары в режиме учетного счета с рычагом влияния отличаются от обычных, и некоторые торговые пары могут быть недоступны.exchange.IO("cross", true) перейти на полную позицию счета с кредитным плечом иexchange.IO("cross", false) перейти на изолированное положение. |
Хьюби | Торговые пары в режиме счета с рычагами отличаются от обычных, и некоторые торговые пары могут быть недоступны.trade_margin для перехода на изолированную позицию счета кредитования;trade_super_margin перейти на счет с использованием кредитного плеча;trade_normal перейти на обычный валютный режим |
ZB | Средства могут быть переведены только в QC. В секторе торговли с использованием рычага, средства между различными торговыми парами являются независимыми, то есть количество QC монет в торговой паре ETH_QC не видно в BTC_QC |
Binance | Учеты с рычагами распределяются на перекрестные позиции и изолированные позиции.trade_margin перейти в изолированное положение; использоватьtrade_super_margin перейти на перекрещенное положение; использоватьtrade_normal перейти на обычный валютный режим |
Ворота | Учеты с рычагами распределяются на перекрестные позиции и изолированные позиции.trade_margin перейти в изолированное положение; использоватьtrade_super_margin перейти на перекрещенное положение; использоватьtrade_normal перейти на обычный валютный режим |
AscendEx | Использованиеexchange.IO("trade_margin") перейти на режим счета с рычагом воздействия и использоватьexchange.IO("trade_normal") чтобы вернуться в обычный режим учетной записи. |
exchange.Log(LogType, Price, Amount)
не размещает ордера при вызове, и записывает только информацию о торговле для вывода информации о журнале обмена.
Примечание:
exchange
объекты, который отличается от глобальной функцииLog()
.LogType
Я могу взятьLOG_TYPE_BUY
, LOG_TYPE_SELL
, LOG_TYPE_CANCEL
иPrice
как цена, иAmount
как количество.LogType
этоLOG_TYPE_CANCEL
, Price
Параметр - это идентификатор заказа.Использованиеexchange.Log(LogType, Price, Amount)
осуществлять последующее тестирование торговли в режиме реального времени, моделировать размещение ордеров и оказывать содействие в записи ордеров.
Наиболее распространенным вариантом использования является:exchange.IO
Функция для доступа к интерфейсу создания условных заказов биржи для размещения условных заказов.exchange.IO
Функция не будет выводить информацию обмена в записи блока ботов.exchange.Log(LogType, Price, Amount)
для дополнения выпуска журнала с целью записи информации о размещении ордеров.
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)
поддерживаетHMACрасчет шифрованияmd5/ША256/ША512/ША1, и поддерживается только прямая торговля.
exchange.HMAC("sha256", "hex", "xxxxx", "{{secretkey}}")
Цитирую:accessKey
, использовать"{{accesskey}}"
- Да.
Цитирую:secretKey
, использовать"{{secretkey}}"
; или вы можете использовать простой текст"abc-123-xxxx"
. "{{accessKey}}","{{secretkey}}"
действителен только при использовании этой функции.OutputAlgo
поддержки:
Переключение на изменения позиции BitMEX (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...)
является поддерживаемой многопоточной асинхронной функцией, которая может превратить работу всех поддерживаемых функций в асинхронную одновременную (которая поддерживает только криптовалютные биржи). Значение параметра:Method
, типа строки, а именно название функции, вызванной одновременно.
Примечание:
exchange.Go
функция возвращает объект,wait
Функция вызвана для получения данных, возвращенных потоком через объект. Поток будет автоматически освобожден после получения данных, вызвавwait
Если указать параметр задержкиwait
, нить не будет освобождена даже при наступлении тайм-аута; таким образом, нить будет освобождена автоматически только путем получения результата нитки (независимо от того, вызван ли одновременно доступный интерфейс успешно или неудачно).wait
Функция, и ресурс нить применяетсяexchange.Go
функция автоматически освобождается докером.wait
функция не достигнута в конце, ресурсы нитей не будут автоматически высвобождаться, что приведет к накоплению примененных нитей; если количество нитей превышает 2000, будет сообщена ошибка:"too many routine wait, max is 2000"
.Поддерживаемые функции:GetTicker
, GetDepth
, GetTrades
, GetRecords
, GetAccount
, GetOrders
, GetOrder
, CancelOrder
, Buy
, Sell
, GetPosition
иIO
.
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);
}
Примечание:
undefined
, использоватьtypeof(xx)==="undefined"
, потому чтоnull == undefined
доступна в 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);
}
Разница междуPython
иJavaScript
Это так?Python
Это...wait
функция возвращает два параметра: первый - результат, возвращаемый асинхронным API; второй указывает, завершен ли асинхронный вызов.
Python
Пример:
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)
Одновременно получать котировки на нескольких биржах:
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);
}
}
Одновременные звонкиexchange.IO("api", ...)
Функция:
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()
возвращает информацию обменного счета.Account
structure.
Account
структураfunction 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);
}
Если объект обмена установлен на криптовалютную фьючерсную биржу и переключен на контракт сUSDT
в качестве маржи (см.exchange.SetContractType
В этом случае, если вы не знаете, как переключиться), активы принимаютUSDT
как маржа, которая записывается в атрибутеBalance
иFrozenBalance
.
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()
возвращает имя обмена. Возвращает значение: тип строки.exchange
илиexchanges[n]
объекты в коде стратегии.
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");
}
Для командования линейной версией Docker, вы можете использовать-1
команду для печати списка имен бирж.
exchange.GetLabel()
возвращает пользовательскую маркировку обмена.
Вexchange
илиexchanges[n]
Объекты в кодах стратегии обычно определяются этикетками, установленными при настройке обменных объектов.
exchange.GetCurrency()
возвращает название валютной пары, эксплуатируемой биржей, и криптовалютная платформа возвращает строку, такую какLTC_BTC
. Возвращается значение: тип строки.
Вexchange.SetCurrency(Symbol)
Используется для переключения текущей торговой пары обменного объекта.exchange.IO ("currency","BTC_USDT")
Он поддерживает переключение торговых пар в системе обратного тестирования, а также названиеpricing currency
не может быть изменено при переключении торговых пар в системе обратного тестирования (например,BTC_USDT
может быть переключена наLTC_USDT
, но его нельзя переключить наLTC_BTC
После переключения на торговую пару, изначально установленную на странице, не относящейся к обратному тестированию, количествоtrading coins
равен 0 (например, во время обратного теста начальное значение торговой пары на странице обратного тестаBTC_USDT
, количество BTC составляет 3, а количество USDT составляет 10 000.LTC_USDT
, количествоtrading coins
после переключения будет 0, что означает, что количество LTC на счете равняется 0, но общая сумма USDT переключенных торговых пар по-прежнему составляет 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());
}
Результат работы обратного испытания:
exchange.GetQuoteCurrency()
возвращает название базовой валюты, используемой обменником.BTC_CNY
доходыCNY
, иETH_BTC
доходыBTC
. Возвращается значение: тип строки.
Для криптовалютных фьючерсных обменных объектов код контракта должен быть указан до вызова егорынок, порядоки других интерфейсов, иexchange.SetContractType
При переключении текущей торговой пары обмена объекта, вы должны вызватьexchange.SetContractType
Для кодов контрактов обмена цифровой валюты, поддерживаемых платформой, обратитесь кexchange.SetContractType
function.
exchange.GetPosition()
получает информацию о текущей позиции.position
Если нет позиции, он возвращает пустой массив, а именно[]
.
Position
структураОбычно фьючерсные контракты на криптовалюты делятся на два типа:
Договор поставки
Когда договор установлен на контракт поставки, звонитеexchange.GetPosition()
и все позиции в договоре поставки по текущей торговой паре будут возвращены.
Вечный контракт
Когда контракт установлен на вечный контракт, называтьexchange.GetPosition()
и все позиции в вечном контракте по текущей торговой паре будут возвращены.
/*
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)
параметр: числовой тип.
Установите размер рычага для размещения фьючерсных ордеров на криптовалюты, например:
function main() {
exchange.SetMarginLevel(10)
}
def main():
exchange.SetMarginLevel(10)
void main() {
exchange.SetMarginLevel(10);
}
Для криптовалютных фьючерсов механизмы рычага использования криптовалютных фьючерсных бирж не являются едиными. На некоторых биржах значение рычага использования фьючерсов является параметром в интерфейсе размещения ордера.SetMarginLevel
Функция не может генерировать сетевой запрос, но только устанавливает переменную рычага в нижнем слое (используется для передачи параметров в интерфейсе размещения ордера). Фьючерсный рычаг некоторых бирж является настройкой биржи, которая должна быть установлена на странице веб-сайта биржи или с помощью интерфейса API.SetMarginLevel
функция будет генерировать сетевой запрос, и она может не установить рычаг воздействия по различным причинам. Например: если есть текущие позиции и ожидающие ордера, значение рычага воздействия может не устанавливаться для этой торговой пары и базового объекта.
Примечания к установлению рычага в стратегии:
exchange.SetDirection(Direction)
наборexchange.Buy
илиexchange.Sell
параметр: тип строки.
ВSetDirection
функция устанавливает соответствие между направлением торговли фьючерсами и функцией размещения ордеров:
Функция размещения заказов | Направление настройки параметров для функции |
Примечания |
---|---|---|
exchange.Buy | купить открытую длинную позицию | |
exchange.Buy | купить закрытую короткую позицию | |
exchange.Sell | продать открытую короткую позицию | |
exchange.Sell | продать закрытую длинную позицию |
ПараметрDirection
может принимать четыре параметра, в том числеbuy
, closebuy
, sell
иclosesell
.
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)
Укажите тип контракта. Значение параметра: тип строки. В криптовалютных стратегиях, возьмите exchange.SetCurrency("BTC_USDT")
илиexchange.IO("currency", "BTC_USDT")
, вам нужно использоватьexchange.SetContractType
Система определяет, является ли это новой торговой парой.currency-based contract
илиU-based contract
на основеторговые парыНапример, когда торговая пара установлена наBTC_ USDT
, использовать функциюexchange.SetContractType
установить код контрактаswap
, который устанавливается как USDT-основанный вечный контракт BTC.BTC_ USD
, использовать функциюexchange.SetContractType
установить код контрактаswap
, который устанавливается как валютный вечный контракт BTC.
Если не указано иное,договор поставкикод в фьючерсном контракте на криптовалюту, как правило, включает:
this_week
: еженедельный контрактnext_week
Контракт на следующей неделеquarter
: квартальный контрактnext_quarter
: контракт на следующий кварталЕсли не указано иное,Вечный контракткод в фьючерсном контракте на криптовалюту, как правило, включает:
swap
: вечный контрактУстановите текущий контракт на еженедельный контракт:
function main() {
// Set to weekly contract
exchange.SetContractType("this_week")
}
def main():
exchange.SetContractType("this_week")
void main() {
exchange.SetContractType("this_week");
}
Подробное описание названия контракта каждой поддерживаемой криптовалютной биржи приведено следующим образом:
ОКX
Установлено на постоянный контракт:exchange.SetContractType("swap")
Контракт на этой неделе:exchange.SetContractType("this_week")
Контракт на следующей неделе:exchange.SetContractType("next_week")
Установлено на квартальный контракт:exchange.SetContractType("quarter")
Контракт на следующий квартал:exchange.SetContractType("next_quarter")
Контракт с маржировкой в USDT может быть переведен на контракт с использованием расчетов в USDT, соответствующий текущему контракту, путем перехода наtrading pair
(или установить его непосредственно при добавлении обменных объектов).
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());
}
Фьючерсы_HuobiDM
Контракт на этой неделе:exchange.SetContractType("this_week")
Контракт на следующей неделе:exchange.SetContractType("next_week")
Установлено на квартальный контракт:exchange.SetContractType("quarter")
Контракт на следующий квартал:exchange.SetContractType("next_quarter")
Установлено на постоянный контракт:exchange.SetContractType("swap")
Платформа поддерживает контракты с маржинальной стоимостью в USDT. Возьмите контракт BTC в качестве примера. Вы можете перейти на контракт с маржинальной стоимостью в USDT только с помощьюexchange.SetCurrency("BTC_USDT")
, или установив текущую торговую пару наBTC_USDT
После переключения торговой пары, вы должны вызватьexchange.SetContractType
Функция снова установить контракт.
Фьючерсы_BitMEX
Установлено на постоянный контракт:exchange.SetContractType("XBTUSD")
, exchange.SetContractType("APTUSDT")
- Да.
Контракт рассчитывается в определенное время, и войти на официальный сайт BitMEX, чтобы проверить каждый код контракта для получения дополнительной информации.exchange.SetContractType("XBTM19")
.
Фьючерсы_GateIO
Контракт на этой неделе:exchange.SetContractType("this_week")
- Да.
Контракт на следующей неделе:exchange.SetContractType("next_week")
- Да.
Установлено на квартальный контракт:exchange.SetContractType("quarter")
- Да.
Контракт на следующий квартал:exchange.SetContractType("next_quarter")
- Да.
Установлено на постоянный контракт:exchange.SetContractType("swap")
- Да.
Биржа поддерживает контракты с маржинальной стоимостью в USDT. Возьмите контракт BTC в качестве примера. Вы можете перейти на контракт с маржинальной стоимостью в USDT только с помощьюexchange.SetCurrency("BTC_USDT")
, или установив текущую торговую пару наBTC_USDT
После переключения торговой пары, вы должны позвонитьexchange.SetContractType
Функция снова установить контракт.
Фьючерсы_Deribit
Установлено на постоянный контракт:exchange.SetContractType("BTC-PERPETUAL")
Поддержка контракта Deribit USDC;exchange.SetContractType("ADA_USDC-PERPETUAL")
для установления постоянного контракта с маржировкой ADA USDC.
Контракт расплачивается в определенное время, и войти на официальный сайт Deribit, чтобы проверить каждый код контракта для получения дополнительной информации, например:exchange.SetContractType("BTC-27APR18")
.
Фьючерсы_KuCoin
BTC_USD
, а затем установить код контракта, который называется крипто-маржинальный контракт.
Установлено на постоянный контракт:exchange.SetContractType("swap")
Установлено на квартальный контракт:exchange.SetContractType("quarter")
Контракт на следующий квартал:exchange.SetContractType("next_quarter")
BTC_USDT
, а затем установить код контракта, который является контрактом с маржировкой в USDT.
Установлено на постоянный контракт:exchange.SetContractType("swap")
.Фьючерсы_Binance
Binance Futures по умолчанию не устанавливает статус контракта, поэтому вам нужно сначала установить контракт.
Установлено на постоянный контракт:exchange.SetContractType("swap")
Бинанс фьючерсные вечные контракты могут быть контрактами с маржинальной стоимостью USDT.BTC
Контракт с маржинальной ставкой в USDT, торговая пара наBTC_USDT
. В бессрочные контракты Binance Futures также входят контракты с крипто-маржинальной защитой. Например, в контракте с крипто-маржинальной защитой установить торговую пару наBTC_USD
.
Установлено на квартальный контракт:exchange.SetContractType("quarter")
Контракты на поставку включают контракты с криптомаржировкой (например, используемые валюты в качестве маржи).BTC
, торговая пара установлена наBTC_USD
, а затем установить код контрактаexchange.SetContractType("quarter")
, который устанавливает квартальный контракт BTC с крипто-маржировкой.
Контракт на следующий квартал:exchange.SetContractType("next_quarter")
Например, в ежеквартальном контракте с крипто-маржинальнымBTC
, торговая пара установлена наBTC_USD
, а затем установить код контрактаexchange.SetContractType("next_quarter)
. Binance поддерживает часть контрактов на доставку с маржинальной ставкой USDT, например, установку торговой пары BTC наBTC_USDT
, а затем установить код контракта.
Фьючерсы_Бибокс
Код бессрочного контракта Bibox:swap
- Да.
Установлено на постоянный контракт:exchange.SetContractType("swap")
.
Фьючерсы_AOFEX
Код вечного контракта AOFEXswap
- Да.
Установлено на постоянный контракт:exchange.SetContractType("swap")
.
Фьючерсы_BFX
Код бессрочного контракта BFX:swap
- Да.
Установлено на постоянный контракт:exchange.SetContractType("swap")
.
Фьючерсы_Bybit
Bybit по умолчанию использует вечный контракт текущей торговой пары.swap
- Да.
Код квартального контракта:quarter
- Да.
Код контракта на следующий квартал:next_quarter
.
Фьючерс_Кракен
По умолчанию Kraken не устанавливает статус контракта, поэтому вам нужно установить код контракта.swap
- Вечный контракт.month
: месячный контракт.quarter
: квартальный контракт.next_quarter
Контракт на следующий квартал.
Фьючерсы_Bitfinex
Bitfinex не выполняет постоянный контракт текущей торговой пары.swap
.
Фьючерсы_Bitget
Bitget по умолчанию в вечном контракте текущей торговой пары.swap
Торговая пара установлена наBTC_USD
, обозначающий контракт с криптомаржировкой; пара торгового пара наBTC_USDT
, указывающий контракт с маржинальной ставкой USDT. Симулируемые контракты могут устанавливать торговые пары на:SBTC_USD
иBTC_SUSDT
.
Фьючерсы_dYdX
Контрактный код постоянного контракта dYdX:swap
- Да.
Установлено на постоянный контракт:exchange.SetContractType("swap")
. dYdX имеет только контракты с маржинальной ставкой в USDT.
Фьючерсы_MEXC
Код контракта на вечный контракт MEXC:swap
- Да.
Установлено на постоянный контракт:exchange.SetContractType("swap")
Торговая пара установлена наBTC_USD
, обозначающий контракт с криптомаржировкой; пара торгового пара наBTC_USDT
, указывающий контракт с маржировкой в USDT.
При написании криптовалютных стратегий, звонитеexchange.SetContractType(ContractType)
функция и подробная информация о контракте, установленная параметром контрактаContractType
будут возвращены.
Например, выполнение кода стратегии контракта OKX, установленного в качестве объекта обмена:
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);
}
Запустите стратегию вJavaScript
язык, и печатьret
данные, а именно подробная информация оthis_week
Договор:
{
"instrument":"BTC-USD-191101",
"InstrumentID":"BTC-USD-191101"
}
exchange.GetContractType()
возвращает в настоящее время установленный код контракта объекта обмена (exchange
), возвращается значение: строка.
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());
}
В следующей таблице описана информация об ошибках, связанных с объектами обмена фьючерсных контрактов на криптовалюты:
Стоимость | Ошибка отображения функции | Функция запуска | Описание |
---|---|---|---|
0 | Фьючерсы_ОП 0 | exchange.SetMarginLevel | Ошибка вызова функции рычага |
1 | Фьючерсы_ОП 1 | exchange.SetDirection | ошибка установки функции направления торговли фьючерсами |
2 | Фьючерсы_ОП 2 | exchange.SetContractType | ошибка установки контрактной функции |
3 | Фьючерсы_ОП 3 | exchange.GetPosition | Ошибка получения функции позиции |
4 | Фьючерсы_ОП 4 | exchange.IO | Ошибка вызова функции IO |
Использованиеexchange.SetContractType
Различные биржи имеют разные коды опционов.
Биржи криптовалютных опционов, поддерживаемые платформой FMZ Quant Trading
Дерибит
Для биржи Deribit необходимо только позвонитьexchange.SetContractType
После настройки контракта опционов, при вызове рыночного интерфейса, такого какGetTicker
, все рыночные данные о контракте опционов получены.exchange.Sell
иexchange.Buy
функции для размещения ордера, и обратить внимание на направление торговли при размещении ордера, и установить направление торговлиexchange.SetDirection
Используйтеexchange.Cancel
Функция отмены заказа;exchange.GetPosition
Функция для запроса позиций.
Код стратегии для ссылки:Стратегия тестирования опционов Deribit
ОКX
Создание контрактов, размещение заказов, отмена заказов, запрос заказов и получение рыночных котировок и т.д. являются одной и той же операцией, что иDeribit
, а формат кода контрактаBTC-USD-200626-4500-C
. Вы можете запросить информацию, связанную с контрактом через интерфейсhttps://www.okx.com/api/v5/public/instruments
.
Например, для запроса информации о контрактах на опционы на 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"));
}
Фьючерсы_HuobiDM
Например, код опционов Huobi:BTC-USDT-201225-P-13000
; договор являетсяBTC
контракт; дата осуществления - 25 декабря 2020 года; опционы - опционы Put (PUT); цена страйки $13,000.
При покупке опционов покупатель выплачивает премию в USDT, что указывает на то, что используется USDT в активах счета; маржа продавца - это валюта, которая гарантируется валютой в активах.
Для опционов продажи премия, выплачиваемая покупателем, составляет USDT, что указывает на то, что используется USDT в активах счета; маржа продавца составляет USDT, которая гарантируется USDT в активах.
Фьючерсы_Bybit
Он поддерживает вариант USDC биржи Bybit и устанавливает торговую пару наETH_USDC
, функция вызоваexchange.SetContractType
Пример кода опциона:ETH-25NOV22-1375-P
.
Вexchange.SetBase(Base)
Функция используется для переключения базового адреса API, записанного в объектах обмена; например, переключение наOKX
доменное имяhttps://aws.okx.com
, совместимы сexchange.IO("base","https://aws.okx.com")
система обратного тестирования не поддерживает переключение базового адреса API обмена (система обратного тестирования является средой песочницы, а не реальным интерфейсом для доступа к обмену).
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(...)
Эта функция не возвращает значение (полученное переменными, и то, что вы получаетеundefined
Если настройка прокси не работает, при вызове интерфейса будет возвращено значение NULL, только дляотдыхКаждый объект обменаexchanges[n]
После настройки прокси, через прокси будет доступ к интерфейсу обмена.
Возьмите первый добавленный обменный объектexchange
, а именно:exchanges[0]
, например:
exchange.SetProxy("socks5://127.0.0.1:8889")
exchange.SetProxy("socks5://username:password@127.0.0.1:8889")
(username
это имя пользователя,password
это пароль.)exchange.SetProxy("")
Поддержка установки IP-адреса, запрашиваемого объектом обмена.
windows
версия интерфейса системы может устанавливаться непосредственно, что показано на следующем изображении:Другие докеры, работающие по параметру использования командной строки-I
для указания IP-адресов:
Основываясь на обмене, уточнить:
function main(){
exchange.SetProxy("ip://10.0.3.15")
exchange.GetTicker() // The reque