UNPKG

@sunrise1002/tats

Version:

Techincal Indicators written in javascript

69 lines (68 loc) 3.04 kB
import CandlestickFinder from './CandlestickFinder'; import { averageloss } from '../Utils/AverageLoss'; import { averagegain } from '../Utils/AverageGain'; import { bearishinvertedhammerstick } from './BearishInvertedHammerStick'; import { bullishinvertedhammerstick } from './BullishInvertedHammerStick'; export default class ShootingStar extends CandlestickFinder { constructor() { super(); this.name = 'ShootingStar'; this.requiredCount = 5; } logic(data) { let isPattern = this.upwardTrend(data); isPattern = isPattern && this.includesHammer(data); isPattern = isPattern && this.hasConfirmation(data); isPattern = isPattern && this.hammerShouldHasHighestOpenOrClose(data); // Hammer candlestick should has highest open or close price compare to previous candlesticks return isPattern; } upwardTrend(data, confirm = true) { let end = confirm ? 3 : 4; // Analyze trends in closing prices of the first three or four candlesticks let gains = averagegain({ values: data.close.slice(0, end), period: end - 1 }); let losses = averageloss({ values: data.close.slice(0, end), period: end - 1 }); // Upward trend, so more gains than losses return gains > losses; } includesHammer(data, confirm = true) { let start = confirm ? 3 : 4; let end = confirm ? 4 : undefined; let possibleHammerData = { open: data.open.slice(start, end), close: data.close.slice(start, end), low: data.low.slice(start, end), high: data.high.slice(start, end), }; let isPattern = bearishinvertedhammerstick(possibleHammerData); isPattern = isPattern || bullishinvertedhammerstick(possibleHammerData); return isPattern; } hammerShouldHasHighestOpenOrClose(data) { const dataLength = data.open.length; const openPrices = data.open.slice(0, dataLength - 1); // Except the last candlestick const closePrices = data.close.slice(0, dataLength - 1); // Except the last candlestick const hammerOpenPrice = openPrices[openPrices.length - 1]; const hammerClosePrice = closePrices[closePrices.length - 1]; return [hammerOpenPrice, hammerClosePrice].includes(Math.max(...openPrices, ...closePrices)); } hasConfirmation(data) { let possibleHammer = { open: data.open[3], close: data.close[3], low: data.low[3], high: data.high[3], }; let possibleConfirmation = { open: data.open[4], close: data.close[4], low: data.low[4], high: data.high[4], }; // Confirmation candlestick is bearish let isPattern = possibleConfirmation.open > possibleConfirmation.close; return isPattern && possibleHammer.close > possibleConfirmation.close; } } export function shootingstar(data) { return new ShootingStar().hasPattern(data); }