All
필터링 기준:
현금을 내 계정으로 입금하려면 어떻게 하나요?
계정 인증에 대한 도움이 필요합니다
왜 내 계정에 접근할 수 없나요?
암호화폐 출금 수수료가 있나요?
계정에 로그인하는 데 도움이 필요합니다
저희 REST API의 의도된 용도 중 하나는 저희 시장 및 계정과 상호 작용하는 자동화된 트레이딩 봇을 생성하는 것입니다.
트레이딩 봇은 거의 무한한 종류가 있지만, 모두 유사한 API 통합 특성을 공유하며 다음 공통 작업을 수행합니다.
시장 데이터 검색 (티커, 오더북 등)
(시장 데이터, 시장 데이터에서 파생된 지표 또는 기타 가능한 기준에 따라) 트레이딩 결정 내리기
주문 체결/취소
저희 REST API는 모든 기능을 갖춘 트레이딩 봇을 구현하는 데 필요한 모든 기능을 제공하지만, 저희 API의 다양한 측면을 결합하는 방법을 아는 것은 어려울 수 있으므로 다음 트레이딩 봇 코드를 예시로 제공합니다.
예시 코드는 지표 기반 트레이딩 봇(특히 1분 기울기 변화에 기반한 트레이딩 결정을 내리는 80/20 과매수/과매도 RSI)을 구현하며, 트레이딩 봇의 시장 데이터, 의사 결정 및 트레이딩 측면을 성공적으로 통합하는 방법을 보여줍니다.
예시 코드 (Node.js)
트레이딩 봇 코드는 단일 Node.js 파일이며 저희 API와 직접 통합됩니다. 모든 구성(API 키, 통화 쌍, 지표, 주문 유형, 레버리지 등)은 참조 편의를 위해 코드 내에 포함되어 있습니다.
예시 코드는 아래에서 볼 수 있으며 다운로드할 수도 있습니다.
Bash
const axios = require('axios');
const sleep = require('sleep-promise');
const crypto = require("crypto");
const fs = require("fs");
const main = async () => {
const api_key_public = ""; // public api key
const api_key_private = ""; // private api key
// Configure market/orders/trades
const trade_symbol = 'XXBTZUSD';
const trade_interval = 1; // OHLC interval in minutes
const trade_size = 0.0001; // trade volume in base currency
const trade_leverage = 2;
// Initial indicator/trade variables
let trade_direction = 0;
let sma_values = [0.0, 0.0, 0.0];
let api_data = "";
let make_trade = 0;
let jsonData = "";
try {
while (true) {
console.log("Retrieving OHLC data...");
try {
const baseDomain = "https://api.kraken.com";
const publicPath = "/0/public/OHLC";
const inputParameters = `pair=${trade_symbol}&interval=${trade_interval}`;
const apiEndpointFullURL = `${baseDomain}${publicPath}?${inputParameters}`;
await axios.get(apiEndpointFullURL)
.then((res) => {
jsonData = res;
})
.catch((error) => {
jsonData = error;
});
api_data = jsonData.data;
} catch (error) {
console.log('Failed' + error);
}
if (jsonData.data.error.length == 0) {
console.log("Done..");
} else {
console.log(api_data.error);
}
// Calculating SMA
console.log('Calculating SMA 20...');
let api_ohlc = api_data.result[trade_symbol];
let api_ohlc_length = api_ohlc.length - 1;
let sma_temp = 0.0;
for (let count = 0; count < 20; count++) {
sma_temp += parseFloat(api_ohlc[api_ohlc_length - count][4]);
}
sma_temp = sma_temp / 20;
// Update SMA values
sma_values[2] = sma_values[1];
sma_values[1] = sma_values[0];
sma_values[0] = sma_temp;
console.log(sma_values[2]);
console.log(sma_values[1]);
console.log(sma_values[0]);
if (sma_values[2] == 0) {
console.log("Waiting " + trade_interval * 60 + ' seconds');
await sleep(trade_interval * 60 * 1000);
continue;
} else {
console.log("SMA 20 values...." + sma_values[2] + "/" + sma_values[1] + "/" + sma_values[0]);
}
// Trading Decision (Change in slope of SMA)
console.log("Trading decision ......");
if (sma_values[0] > sma_values[1] && sma_values[1] < sma_values[2]) {
make_trade = 1;
console.log("Long");
} else if (sma_values[0] < sma_values[1] && sma_values[1] > sma_values[2]) {
make_trade = -1;
console.log("Short");
} else {
make_trade = 0;
console.log("No Trade");
}
// Place Order
if (make_trade != 0) {
console.log('Placing Order/trade....');
try {
const api_path = '/0/private/AddOrder';
const api_nonce = (Date.now() * 1000).toString();
const api_post = `nonce=${api_nonce}&pair=${trade_symbol}&type=${make_trade == 1 ? 'buy' : 'sell'}&ordertype=market&volume=${trade_direction == 0 ? trade_size : trade_size * 2}&leverage=${trade_leverage > 0 ? trade_leverage : 'none'}`;
const signature = CreateAuthenticationSignature(api_key_private, api_path, api_nonce, api_post);
const api_data = await QueryAddOrder(api_post, api_path, signature, api_key_public);
const final = api_data.error.length == 0 ? api_data.result : api_data.error;
console.log("Done");
console.log(final);
} catch (err) {
console.log(err);
}
}
// Wait until next OHLC interval
console.log("Waiting " + trade_interval * 60 + ' seconds');
await sleep(trade_interval * 60 * 1000);
}
} catch (err) {
console.log(err);
}
};
function CreateAuthenticationSignature(apiPrivateKey, api_path, nonce, apiPostBodyData) {
const apiPost = nonce + apiPostBodyData;
const secret = Buffer.from(apiPrivateKey, "base64");
const sha256 = crypto.createHash("sha256");
const hash256 = sha256.update(apiPost).digest("binary");
const hmac512 = crypto.createHmac("sha512", secret);
const signatureString = hmac512
.update(api_path + hash256, "binary")
.digest("base64");
return signatureString;
}
async function QueryAddOrder(api_post, api_path, signature, api_key_public) {
const baseDomain = "https://api.kraken.com";
const apiEndpointFullURL = `${baseDomain}${api_path}`;
console.log(apiEndpointFullURL);
const httpOptions = {
headers: {
"API-Key": api_key_public,
"API-Sign": signature
}
};
await axios.post(apiEndpointFullURL, api_post, httpOptions)
.then((res) => {
jsonData = res;
})
.catch((err) => {
jsonData = err;
});
return jsonData.data;
}
main();