kiteconnect-public
Version:
The official JS client library for the Kite Connect trading APIs
654 lines (581 loc) • 21.7 kB
JavaScript
const nock = require("nock");
const expect = require("chai").expect;
const path = require("path");
const fs = require("fs");
const KiteConnect = require("../lib/connect.js");
const mockDir = "./kiteconnect-mocks";
// run testsuite
testSuite();
function parseJson(fileName){
// read and parse mock json file
var rawdata = fs.readFileSync(path.join(__dirname, mockDir, fileName));
var mockData= JSON.parse(rawdata);
return mockData;
}
function testSuite(){
var kc = new KiteConnect({"api_key":"your api_key"});
// Chaining the mock requests
nock(kc.root)
// getProfile
.get("/user/profile")
.reply(200, parseJson("profile.json"))
// getMargins
.get("/user/margins")
.reply(200, parseJson("margins.json"))
// getMargins(segment)
.get("/user/margins/test")
.query({ segment: "test" })
.reply(200, parseJson("margins_equity.json"))
// placeOrder
.post("/orders/test")
.reply(200, parseJson("order_response.json"))
// modifyOrder
.put("/orders/test/100")
.reply(200, parseJson("order_modify.json"))
// cancelOrder
.delete("/orders/test/100")
.query({ variety: "test", order_id: 100 })
.reply(200, parseJson("order_cancel.json"))
// getOrders
.get("/orders")
.reply(200, parseJson("orders.json"))
// getOrderHistory
.get("/orders/100")
.query({ order_id: "100" })
.reply(200, parseJson("order_info.json"))
// getTrades
.get("/trades")
.reply(200, parseJson("trades.json"))
// getOrderTrades
.get("/orders/100/trades")
.query({ order_id: 100 })
.reply(200, parseJson("order_trades.json"))
// getHoldings
.get("/portfolio/holdings")
.reply(200, parseJson("holdings.json"))
// getPositions
.get("/portfolio/positions")
.reply(200, parseJson("positions.json"))
// convertPosition
.put("/portfolio/positions")
.reply(200, parseJson("convert_position.json"))
// placeMFOrder
.post("/mf/orders")
.reply(200, parseJson("mf_order_response.json"))
// cancelMFOrder
.delete("/mf/orders/100")
.query({ order_id: 100 })
.reply(200, parseJson("mf_order_cancel.json"))
// getMFOrders
.get("/mf/orders")
.reply(200, parseJson("mf_orders.json"))
// getMFOrders(order_id)
.get("/mf/orders/100")
.query({ order_id: 100 })
.reply(200, parseJson("mf_orders_info.json"))
// placeMFSIP
.post("/mf/sips")
.reply(200, parseJson("mf_sip_place.json"))
// modifyMFSIP
.put("/mf/sips/100")
.reply(200, parseJson("mf_sip_modify.json"))
// cancelMFSIP
.delete("/mf/sips/100")
.query({ sip_id: 100 })
.reply(200, parseJson("mf_sip_cancel.json"))
// getMFSIPS
.get("/mf/sips")
.reply(200, parseJson("mf_sips.json"))
// getMFSIPS(sip_id)
.get("/mf/sips/100")
.query({ sip_id: 100 })
.reply(200, parseJson("mf_sip_info.json"))
// getMFHoldings
.get("/mf/holdings")
.reply(200, parseJson("mf_holdings.json"))
// getHistoricalData
.get("/instruments/historical/100/minute")
.query({ instrument_token: "100" , interval: "minute",
from: "2022-06-01 09:15:00", to: "2022-06-01 15:30:00",
continuous: 0, oi:0})
.reply(200, parseJson("historical_minute.json"))
// getQuote
.get("/quote")
.query({ i:"NSE:INFY"})
.reply(200, parseJson("quote.json"))
// getLTP
.get("/quote/ltp")
.query({ i: "NSE:INFY" })
.reply(200, parseJson("ltp.json"))
// getOHLC
.get("/quote/ohlc")
.query({ i:"NSE:INFY"})
.reply(200, parseJson("quote.json"))
// placeGTT
.post("/gtt/triggers")
.reply(200, parseJson("gtt_place_order.json"))
// modifyGTT
.put("/gtt/triggers/100")
.reply(200, parseJson("gtt_modify_order.json"))
// deleteGTT
.delete("/gtt/triggers/100")
.query({ trigger_id: 100 })
.reply(200, parseJson("gtt_delete_order.json"))
// getGTTs
.get("/gtt/triggers")
.reply(200, parseJson("gtt_get_orders.json"))
// getGTT(trigger_id)
.get("/gtt/triggers/100")
.query({ trigger_id:100})
.reply(200, parseJson("gtt_get_order.json"))
// orderMargins
.post("/margins/orders")
.query({ mode: "compact" })
.reply(200, parseJson("order_margins.json"))
// fetch user profile detail
describe("getProfile", function() {
it("fetch user profile detail", (done) => {
kc.getProfile()
.then(function(response) {
expect(response).to.have.property("user_id");
expect(response).to.have.property("user_name");
return done();
}).catch(done);
})
});
// fetch user fund detail
describe("getMargins", function() {
it("fetch equity and commodity segment funds", (done) => {
kc.getMargins()
.then(function(response) {
expect(response).to.have.property("equity");
expect(response).to.have.property("commodity");
return done();
}).catch(done);
})
it("fetch equity specific segment funds", (done) => {
kc.getMargins("test")
.then(function(response) {
expect(response).to.have.property("enabled");
return done();
}).catch(done);
})
});
// Order APIs
// Place market and limit order
describe("placeOrder", function() {
it("Place market order", (done) => {
kc.placeOrder("test", {
"exchange": "NSE",
"tradingsymbol": "SBIN",
"transaction_type": "BUY",
"quantity": 1,
"product": "MIS",
"order_type": "MARKET"})
.then(function(response) {
expect(response).to.have.property("order_id");
return done();
}).catch(done);
})
});
// modify open pending order
describe("modifyOrder", function() {
it("Modify an open order", (done) => {
kc.modifyOrder("test", 100,{
"price":10})
.then(function(response) {
expect(response).to.have.property("order_id");
return done();
}).catch(done);
})
});
// cancel an open pending order
describe("cancelOrder", function() {
it("cancel an open pending order", (done) => {
kc.cancelOrder("test", 100)
.then(function(response) {
expect(response).to.have.property("order_id");
return done();
}).catch(done);
})
});
// Retrieve complete orderbook
describe("getOrders", function() {
it("Retrieve the list of all orders under orderbook", (done) => {
kc.getOrders()
.then(function(response) {
expect(response).to.be.an("array");
expect(response).to.have.nested.property("[0].order_id");
expect(response).to.have.nested.property("[0].status");
expect(response).to.have.nested.property("[0].tradingsymbol");
return done();
}).catch(done);
})
});
// Retrieve the history of a given order
describe("getOrderHistory", function() {
it("Retrieve the history of a given order", (done) => {
kc.getOrderHistory(100)
.then(function(response) {
expect(response).to.have.nested.property("[0].order_id");
expect(response).to.have.nested.property("[0].status");
return done();
}).catch(done);
})
});
// Retrieve the list of all executed trades
describe("getTrades", function() {
it("Retrieve the list of all executed trades for the day", (done) => {
kc.getTrades()
.then(function(response) {
expect(response).to.be.an("array");
expect(response).to.have.nested.property("[0].order_id");
expect(response).to.have.nested.property("[0].exchange_timestamp");
return done();
}).catch(done);
})
});
// Retrieve all the trades generated by an order
describe("getOrderTrades", function() {
it("Retrieve all the trades generated by an order", (done) => {
kc.getOrderTrades(100)
.then(function(response) {
expect(response).to.be.an("array");
return done();
}).catch(done);
})
});
// Portfolio APIs
// Retrieve the list of equity holdings
describe("getHoldings", function() {
it("Retrieve the list of equity holdings", (done) => {
kc.getHoldings()
.then(function(response) {
expect(response).to.be.an("array");
expect(response).to.have.nested.property("[0].tradingsymbol");
expect(response).to.have.nested.property("[0].average_price");
return done();
}).catch(done);
})
});
// Retrieve the list of positions
describe("getPositions", function() {
it("Retrieve the list of positions", (done) => {
kc.getPositions()
.then(function(response) {
expect(response).to.have.property("net");
expect(response).to.have.property("day");
return done();
}).catch(done);
})
});
// convert existing position
describe("convertPosition", function() {
it("convert existing position", (done) => {
kc.convertPosition ({
"tradingsymbol": "SBIN",
"exchange":"NSE",
"transaction_type":"BUY",
"position_type":"day",
"quantity":1,
"old_product":"CNC",
"new_product":"MIS"
})
.then(function(response) {
expect(response).to.equal(true);
return done();
}).catch(done);
})
});
// MF APIs
// Place MF Order
describe("placeMFOrder", function() {
it("Place MF order", (done) => {
kc.placeMFOrder({
"tradingsymbol": "INF174K01LS2",
"transaction_type": "BUY",
"amount" : 1000})
.then(function(response) {
expect(response).to.have.property("order_id");
return done();
}).catch(done);
})
});
// cancel an open pending MF order
describe("cancelMFOrder", function() {
it("cancel an open pending MF order", (done) => {
kc.cancelMFOrder(100)
.then(function(response) {
expect(response).to.have.property("order_id");
return done();
}).catch(done);
})
});
// Retrieve the list of all MF orders (open and executed) over the last 7 days
describe("getMFOrders", function() {
it("Retrieve the list of all MF orders from orderbook", (done) => {
kc.getMFOrders()
.then(function(response) {
expect(response).to.be.an("array")
return done();
}).catch(done);
})
});
// Retrieve the detail of a given MF order
describe("getMFOrders", function() {
it("Retrieve the detail of a given MF order", (done) => {
kc.getMFOrders(100)
.then(function(response) {
expect(response).to.have.property("order_timestamp");
expect(response).to.have.property("status");
return done();
}).catch(done);
})
});
// Place MF SIP Order
describe("placeMFSIP", function() {
it("Place MF SIP Order", (done) => {
kc.placeMFSIP({
"tradingsymbol": "INF174K01LS2",
"frequency" : "monthly",
"instalment_day": 1,
"instalments" : -1,
"initial_amount" : 5000,
"amount" : 1000
})
.then(function(response) {
expect(response).to.have.property("sip_id");
return done();
}).catch(done);
})
});
// modify open pending MF SIP order
describe("modifyMFSIP", function() {
it("modify open pending NF SIP order", (done) => {
kc.modifyMFSIP(100,{
"instalments":12})
.then(function(response) {
expect(response).to.have.property("sip_id");
return done();
}).catch(done);
})
});
// cancel an open pending MF SIP order
describe("cancelMFSIP", function() {
it("cancel an open pending MF SIP order", (done) => {
kc.cancelMFSIP(100)
.then(function(response) {
expect(response).to.have.property("sip_id");
return done();
}).catch(done);
})
});
// Retrieve complete SIP orderbook
describe("getMFSIPS", function() {
it("Retrieve complete SIP orderbook", (done) => {
kc.getMFSIPS()
.then(function(response) {
expect(response).to.be.an("array");
expect(response).to.have.nested.property("[0].status");
expect(response).to.have.nested.property("[0].created");
return done();
}).catch(done);
})
});
// Retrieve the detail of a given SIP order
describe("getMFSIPS", function() {
it("Retrieve the detail of a given SIP order", (done) => {
kc.getMFSIPS(100)
.then(function(response) {
expect(response).to.have.property("status");
expect(response).to.have.property("created");
return done();
}).catch(done);
})
});
// Retrieve complete MF holdings
describe("getMFHoldings", function() {
it("Retrieve complete MF holdings", (done) => {
kc.getMFHoldings()
.then(function(response) {
expect(response).to.be.an("array");
expect(response).to.have.nested.property("[0].folio");
expect(response).to.have.nested.property("[0].fund");
return done();
}).catch(done);
})
});
// Historical candle APIs
describe("getHistoricalData", function() {
// for intraday candle
it("Fetch historical data for minute(intraday) candle", (done) => {
kc.getHistoricalData(100, "minute",
"2022-06-01 09:15:00", "2022-06-01 15:30:00")
.then(function(response) {
expect(response).to.have.nested.property("[0].date");
expect(response).to.have.nested.property("[0].open");
expect(response).to.have.nested.property("[0].close");
expect(response).to.have.nested.property("[0].volume");
return done();
}).catch(done);
})
});
// Market quotes and instruments
// Retrieve full market quotes for instruments
describe("getQuote", function() {
it("Retrieve full market quotes for instruments", (done) => {
kc.getQuote("NSE:INFY")
.then(function(response) {
expect(response).to.have.property("NSE:INFY");
expect(response).to.have.nested.property("NSE:INFY.last_price");
expect(response).to.have.nested.property("NSE:INFY.depth");
expect(response).to.have.nested.property("NSE:INFY.ohlc");
return done();
}).catch(done);
})
});
// Retrieve LTP quotes for instruments
describe("getLTP", function() {
it("Retrieve LTP quotes for instruments", (done) => {
kc.getLTP("NSE:INFY")
.then(function(response) {
expect(response).to.have.property("NSE:INFY");
expect(response).to.have.nested.property("NSE:INFY.instrument_token");
expect(response).to.have.nested.property("NSE:INFY.last_price");
return done();
}).catch(done);
})
});
// Retrieve OHLC quotes for instruments
describe("getOHLC", function() {
it("Retrieve OHLC quotes for instruments", (done) => {
kc.getOHLC("NSE:INFY")
.then(function(response) {
expect(response).to.have.property("NSE:INFY");
expect(response).to.have.nested.property("NSE:INFY.last_price");
expect(response).to.have.nested.property("NSE:INFY.ohlc");
return done();
}).catch(done);
})
});
// GTT APIs
// Place a GTT
describe("placeGTT", function() {
it("Place an GTT OCO order", (done) => {
kc.placeGTT({
trigger_type: kc.GTT_TYPE_OCO,
tradingsymbol: "SBIN",
exchange: "NSE",
trigger_values: [350, 450],
last_price: 400,
orders: [{
transaction_type: kc.TRANSACTION_TYPE_SELL,
quantity: 1,
product: kc.PRODUCT_CNC,
order_type: kc.ORDER_TYPE_LIMIT,
price: 350
}, {
transaction_type: kc.TRANSACTION_TYPE_SELL,
quantity: 1,
product: kc.PRODUCT_CNC,
order_type: kc.ORDER_TYPE_LIMIT,
price: 450
}]
}
)
.then(function(response) {
expect(response).to.have.property("trigger_id");
return done();
}).catch(done);
})
});
//Retrieve a list of all GTTs visible in GTT order book
describe("getGTTs", function() {
it("Fetch list of all GTTs visible in GTT order book", (done) => {
kc.getGTTs()
.then(function(response) {
expect(response).to.have.nested.property("[0].id");
expect(response).to.have.nested.property("[0].created_at");
expect(response).to.have.nested.property("[0].user_id");
expect(response).to.have.nested.property("[0].status");
return done();
}).catch(done);
})
});
// Retrieve an individual trigger
describe("getGTT", function() {
it("Fetch specific gtt order detail using trigger_id", (done) => {
kc.getGTT(100)
.then(function(response) {
expect(response).to.have.property("id");
expect(response).to.have.property("type");
expect(response).to.have.property("status");
expect(response).to.have.property("condition");
return done();
}).catch(done);
})
});
// Modify an active GTT
describe("modifyGTT", function() {
it("Modify an open GTT order using trigger_id", (done) => {
kc.modifyGTT(100, {
trigger_type: kc.GTT_TYPE_OCO,
tradingsymbol: "SBIN",
exchange: "NSE",
trigger_values: [358, 458],
last_price: 400,
orders: [{
transaction_type: kc.TRANSACTION_TYPE_SELL,
quantity: 1,
product: kc.PRODUCT_CNC,
order_type: kc.ORDER_TYPE_LIMIT,
price: 358
}, {
transaction_type: kc.TRANSACTION_TYPE_SELL,
quantity: 1,
product: kc.PRODUCT_CNC,
order_type: kc.ORDER_TYPE_LIMIT,
price: 458
}]})
.then(function(response) {
expect(response).to.have.property("trigger_id");
return done();
}).catch(done);
})
});
// Delete an active GTT
describe("deleteGTT", function() {
it("Delete a GTT using trigger_id", (done) => {
kc.deleteGTT(100)
.then(function(response) {
expect(response).to.have.property("trigger_id");
return done();
}).catch(done);
})
});
// Margin APIs
// fetch order Margin detail
describe("orderMargins", function() {
it("Fetch order margin detail", (done) => {
kc.orderMargins([
{
"exchange": "NSE",
"tradingsymbol": "SBIN",
"transaction_type": "BUY",
"variety": "regular",
"product": "MIS",
"order_type": "MARKET",
"quantity": 1
}
], "compact")
.then(function(response) {
expect(response).to.have.nested.property("[0].type");
expect(response).to.have.nested.property("[0].var");
expect(response).to.have.nested.property("[0].span");
expect(response).to.have.nested.property("[0].exposure");
return done();
}).catch(done);
})
});
}
;