· 6 years ago · Sep 10, 2019, 02:04 PM
1const MarketOrderIntentHandler = {
2 // Triggers when user invokes a market order
3 canHandle(handlerInput) {
4 return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
5 && Alexa.getIntentName(handlerInput.requestEnvelope) === 'MarketOrderIntent';
6 },
7 async handle(handlerInput) {
8 // Get user inputs and declare the Alpaca object
9 const slots = handlerInput.requestEnvelope.request.intent.slots;
10 const api = new Alpaca({
11 keyId: keyId,
12 secretKey: secretKey,
13 paper: true
14 });
15
16
17 let input_stock = slots['stock'].value.toLowerCase()
18 let stock = ""
19 for(let i = 0; i < stock_dict.length; i++) {
20 if(stock_dict[i][input_stock]) {
21 stock = stock_dict[i][input_stock]
22 }
23 }
24 if(stock == "") {
25 stock = input_stock.split(" ").join("").split(".").join("").toUpperCase()
26 }
27
28 let valid_stock = false
29 for(let j = 0; j < stock_dict.length; j++) {
30 for(let key in stock_dict[j]) {
31 if(stock_dict[j][key] == stock) {
32 valid_stock = true
33 break
34 }
35 }
36 }
37 if(!valid_stock) {
38 return handlerInput.responseBuilder
39 .speak(`Error: Invalid stock. Stock ${stock} is not able to be traded.`)
40 .getResponse();
41 }
42 if(slots['side'].value == "by") slots['side'].value = "buy";
43
44
45 // Submit the market order using the Alpaca trading api
46 let resp = await api.createOrder({
47 symbol: stock,
48 qty: parseInt(slots['quantity'].value),
49 side: slots['side'].value,
50 type: 'market',
51 time_in_force: "day",
52 }).then((resp) => {
53 return `Market order of ${slots['side'].value}, ${slots['quantity'].value}, ${stock.split("").join(", ")}, day, sent.`;
54 }).catch((err) => {
55 return `Error: ${err.error.message}`;
56 }).then((resp) => {
57 return handlerInput.responseBuilder
58 .speak(resp)
59 .getResponse();
60 });
61
62 // Send verbal response back to user
63 return resp;
64 }
65};