#!/bin/bash #set -x set -e IFS=$'\0' myPID=$$ . helpers.sh marketOpen=$([[ $(./getMarketHours.sh | jq '.option[].isOpen' | grep true | wc -l) -ne 0 ]] && echo true || echo false) if [[ ${marketOpen} == false ]]; then throw "The market is closed, exiting." info 2 fi inputFile="$1" if [[ "" == "$inputFile" ]]; then inputFile=temp/orderInputFile.$$.json ./getOptionChain.sh '$SPX' fromDate $(date "+%Y-%m-%d" -d "+40 days") toDate $(date "+%Y-%m-%d" -d "+46 days") > "${inputFile}" fi if [[ ! -f "${inputFile}" ]]; then throw "ERROR: Input file _${inputFile}_ does not exist." err 1 fi dateKey=$(jq -r '.putExpDateMap | keys | .[]' "${inputFile}" | head -n 1) log "Date-Key: _${dateKey}_" debug jq '.putExpDateMap."'${dateKey}'"[]|map({symbol,delta,strikePrice,bid,ask,optionRoot}) |.[] | select(.delta >= -0.30 and .delta <= -0.25) ' "${inputFile}" | tail -n 8 > temp/shortLeg.json shortStrike=$(jq -r '.strikePrice' < temp/shortLeg.json) shortBid=$(jq -r '.bid' < temp/shortLeg.json) shortAsk=$(jq -r '.ask' < temp/shortLeg.json) shortSymbol=$(jq -r '.symbol' < temp/shortLeg.json) shortOptionRoot=$(jq -r '.optionRoot' < temp/shortLeg.json) log "Short Symbol: _${shortSymbol}_ Strike: _${shortStrike}_ Bid: _${shortBid}_ Ask: _${shortAsk}_" info jq '.putExpDateMap."'${dateKey}'"[]|map({symbol,delta,strikePrice,bid,ask,optionRoot}) | .[] | select(.optionRoot == "'${shortOptionRoot}'" and .strikePrice >= '${shortStrike}'-50 and .strikePrice < '${shortStrike}')' "${inputFile}" | head -n 8 > temp/longLeg.json longStrike=$(jq -r '.strikePrice' < temp/longLeg.json) longBid=$(jq -r '.bid' < temp/longLeg.json) longAsk=$(jq -r '.ask' < temp/longLeg.json) longSymbol=$(jq -r '.symbol' < temp/longLeg.json) log "Long Symbol: _${longSymbol}_ Strike: _${longStrike}_ Bid: _${longBid}_ Ask: _${longAsk}_" info #Check if this order has already been submitted. ./getOrders.sh | (grep '\(WORKING\|FILLED\),'${longSymbol:0:12} || true) > temp/existingOrders.${myPID} if [[ $(wc -l < temp/existingOrders.${myPID}) -eq 0 ]];then log "Not Yet traded, continuing" info else throw "Already traded, exiting" info fi priceOffset=0.1 # try to get $10 more in premium... price=$(echo "scale=2; ((${shortBid}+${shortAsk})/2 - (${longBid}+${longAsk})/2) + ${priceOffset}" | bc) orderJson=$(jq -c <<-EOM { "orderType": "NET_CREDIT", "session": "NORMAL", "price": ${price}, "duration": "DAY", "orderStrategyType": "SINGLE", "quantity": 1, "orderLegCollection": [ { "instruction": "SELL_TO_OPEN", "quantity": 1, "instrument": { "symbol": "${shortSymbol}", "assetType": "OPTION" } }, { "instruction": "BUY_TO_OPEN", "quantity": 1, "instrument": { "symbol": "${longSymbol}", "assetType": "OPTION" } } ] } EOM ) log "Order: _${orderJson}_" debug if [[ "${noconfirm}" != "true" ]]; then echo Enter to continue, Ctrl+C to cancel _${noconfirm}_ read fi curl -s -X POST \ "https://api.schwabapi.com/trader/v1/accounts/$(./getAccountNumbers.sh IRA)/orders" \ -H "Authorization: Bearer $(./getNewAccessToken.sh)" \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d "${orderJson}"