| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666 |
- /**
- * @license Highstock JS v9.0.1 (2021-02-16)
- *
- * All technical indicators for Highstock
- *
- * (c) 2010-2021 Pawel Fus
- *
- * License: www.highcharts.com/license
- */
- 'use strict';
- (function (factory) {
- if (typeof module === 'object' && module.exports) {
- factory['default'] = factory;
- module.exports = factory;
- } else if (typeof define === 'function' && define.amd) {
- define('highcharts/indicators/indicators-all', ['highcharts', 'highcharts/modules/stock'], function (Highcharts) {
- factory(Highcharts);
- factory.Highcharts = Highcharts;
- return factory;
- });
- } else {
- factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);
- }
- }(function (Highcharts) {
- var _modules = Highcharts ? Highcharts._modules : {};
- function _registerModule(obj, path, args, fn) {
- if (!obj.hasOwnProperty(path)) {
- obj[path] = fn.apply(null, args);
- }
- }
- _registerModule(_modules, 'Mixins/IndicatorRequired.js', [_modules['Core/Utilities.js']], function (U) {
- /**
- *
- * (c) 2010-2021 Daniel Studencki
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var error = U.error;
- /* eslint-disable no-invalid-this, valid-jsdoc */
- var requiredIndicatorMixin = {
- /**
- * Check whether given indicator is loaded,
- else throw error.
- * @private
- * @param {Highcharts.Indicator} indicator
- * Indicator constructor function.
- * @param {string} requiredIndicator
- * Required indicator type.
- * @param {string} type
- * Type of indicator where function was called (parent).
- * @param {Highcharts.IndicatorCallbackFunction} callback
- * Callback which is triggered if the given indicator is loaded.
- * Takes indicator as an argument.
- * @param {string} errMessage
- * Error message that will be logged in console.
- * @return {boolean}
- * Returns false when there is no required indicator loaded.
- */
- isParentLoaded: function (indicator,
- requiredIndicator,
- type,
- callback,
- errMessage) {
- if (indicator) {
- return callback ? callback(indicator) : true;
- }
- error(errMessage || this.generateMessage(type, requiredIndicator));
- return false;
- },
- /**
- * @private
- * @param {string} indicatorType
- * Indicator type
- * @param {string} required
- * Required indicator
- * @return {string}
- * Error message
- */
- generateMessage: function (indicatorType, required) {
- return 'Error: "' + indicatorType +
- '" indicator type requires "' + required +
- '" indicator loaded before. Please read docs: ' +
- 'https://api.highcharts.com/highstock/plotOptions.' +
- indicatorType;
- }
- };
- return requiredIndicatorMixin;
- });
- _registerModule(_modules, 'Stock/Indicators/SMA/SMAComposition.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var Series = SeriesRegistry.series,
- ohlcProto = SeriesRegistry.seriesTypes.ohlc.prototype;
- var addEvent = U.addEvent,
- extend = U.extend;
- /* *
- *
- * Composition
- *
- * */
- addEvent(Series, 'init', function (eventOptions) {
- // eslint-disable-next-line no-invalid-this
- var series = this,
- options = eventOptions.options;
- if (options.useOhlcData &&
- options.id !== 'highcharts-navigator-series') {
- extend(series, {
- pointValKey: ohlcProto.pointValKey,
- keys: ohlcProto.keys,
- pointArrayMap: ohlcProto.pointArrayMap,
- toYData: ohlcProto.toYData
- });
- }
- });
- addEvent(Series, 'afterSetOptions', function (e) {
- var options = e.options,
- dataGrouping = options.dataGrouping;
- if (dataGrouping &&
- options.useOhlcData &&
- options.id !== 'highcharts-navigator-series') {
- dataGrouping.approximation = 'ohlc';
- }
- });
- });
- _registerModule(_modules, 'Stock/Indicators/SMA/SMAIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var LineSeries = SeriesRegistry.seriesTypes.line;
- var addEvent = U.addEvent,
- error = U.error,
- extend = U.extend,
- isArray = U.isArray,
- merge = U.merge,
- pick = U.pick,
- splat = U.splat;
- var generateMessage = RequiredIndicatorMixin.generateMessage;
- /* *
- *
- * Class
- *
- * */
- /**
- * The SMA series type.
- *
- * @private
- */
- var SMAIndicator = /** @class */ (function (_super) {
- __extends(SMAIndicator, _super);
- function SMAIndicator() {
- /* *
- *
- * Static Properties
- *
- * */
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.dataEventsToUnbind = void 0;
- _this.linkedParent = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- /* eslint-enable valid-jsdoc */
- }
- /* *
- *
- * Functions
- *
- * */
- /* eslint-disable valid-jsdoc */
- /**
- * @private
- */
- SMAIndicator.prototype.destroy = function () {
- this.dataEventsToUnbind.forEach(function (unbinder) {
- unbinder();
- });
- _super.prototype.destroy.apply(this, arguments);
- };
- /**
- * @private
- */
- SMAIndicator.prototype.getName = function () {
- var name = this.name,
- params = [];
- if (!name) {
- (this.nameComponents || []).forEach(function (component, index) {
- params.push(this.options.params[component] +
- pick(this.nameSuffixes[index], ''));
- }, this);
- name = (this.nameBase || this.type.toUpperCase()) +
- (this.nameComponents ? ' (' + params.join(', ') + ')' : '');
- }
- return name;
- };
- /**
- * @private
- */
- SMAIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal.length,
- range = 0,
- sum = 0,
- SMA = [],
- xData = [],
- yData = [],
- index = -1,
- i,
- SMAPoint;
- if (xVal.length < period) {
- return;
- }
- // Switch index for OHLC / Candlestick / Arearange
- if (isArray(yVal[0])) {
- index = params.index ? params.index : 0;
- }
- // Accumulate first N-points
- while (range < period - 1) {
- sum += index < 0 ? yVal[range] : yVal[range][index];
- range++;
- }
- // Calculate value one-by-one for each period in visible data
- for (i = range; i < yValLen; i++) {
- sum += index < 0 ? yVal[i] : yVal[i][index];
- SMAPoint = [xVal[i], sum / period];
- SMA.push(SMAPoint);
- xData.push(SMAPoint[0]);
- yData.push(SMAPoint[1]);
- sum -= (index < 0 ?
- yVal[i - range] :
- yVal[i - range][index]);
- }
- return {
- values: SMA,
- xData: xData,
- yData: yData
- };
- };
- /**
- * @private
- */
- SMAIndicator.prototype.init = function (chart, options) {
- var indicator = this,
- requiredIndicators = indicator.requireIndicators();
- // Check whether all required indicators are loaded.
- if (!requiredIndicators.allLoaded) {
- return error(generateMessage(indicator.type, requiredIndicators.needed));
- }
- _super.prototype.init.call(indicator, chart, options);
- // Make sure we find series which is a base for an indicator
- chart.linkSeries();
- indicator.dataEventsToUnbind = [];
- /**
- * @private
- * @return {void}
- */
- function recalculateValues() {
- var oldData = indicator.points || [],
- oldDataLength = (indicator.xData || []).length,
- processedData = (indicator.getValues(indicator.linkedParent,
- indicator.options.params) || {
- values: [],
- xData: [],
- yData: []
- }),
- croppedDataValues = [],
- overwriteData = true,
- oldFirstPointIndex,
- oldLastPointIndex,
- croppedData,
- min,
- max,
- i;
- // We need to update points to reflect changes in all,
- // x and y's, values. However, do it only for non-grouped
- // data - grouping does it for us (#8572)
- if (oldDataLength &&
- !indicator.hasGroupedData &&
- indicator.visible &&
- indicator.points) {
- // When data is cropped update only avaliable points (#9493)
- if (indicator.cropped) {
- if (indicator.xAxis) {
- min = indicator.xAxis.min;
- max = indicator.xAxis.max;
- }
- croppedData = indicator.cropData(processedData.xData, processedData.yData, min, max);
- for (i = 0; i < croppedData.xData.length; i++) {
- // (#10774)
- croppedDataValues.push([
- croppedData.xData[i]
- ].concat(splat(croppedData.yData[i])));
- }
- oldFirstPointIndex = processedData.xData.indexOf(indicator.xData[0]);
- oldLastPointIndex = processedData.xData.indexOf(indicator.xData[indicator.xData.length - 1]);
- // Check if indicator points should be shifted (#8572)
- if (oldFirstPointIndex === -1 &&
- oldLastPointIndex === processedData.xData.length - 2) {
- if (croppedDataValues[0][0] === oldData[0].x) {
- croppedDataValues.shift();
- }
- }
- indicator.updateData(croppedDataValues);
- // Omit addPoint() and removePoint() cases
- }
- else if (processedData.xData.length !== oldDataLength - 1 &&
- processedData.xData.length !== oldDataLength + 1) {
- overwriteData = false;
- indicator.updateData(processedData.values);
- }
- }
- if (overwriteData) {
- indicator.xData = processedData.xData;
- indicator.yData = processedData.yData;
- indicator.options.data = processedData.values;
- }
- // Removal of processedXData property is required because on
- // first translate processedXData array is empty
- if (indicator.bindTo.series === false) {
- delete indicator.processedXData;
- indicator.isDirty = true;
- indicator.redraw();
- }
- indicator.isDirtyData = false;
- }
- if (!indicator.linkedParent) {
- return error('Series ' +
- indicator.options.linkedTo +
- ' not found! Check `linkedTo`.', false, chart);
- }
- indicator.dataEventsToUnbind.push(addEvent(indicator.bindTo.series ?
- indicator.linkedParent :
- indicator.linkedParent.xAxis, indicator.bindTo.eventName, recalculateValues));
- if (indicator.calculateOn === 'init') {
- recalculateValues();
- }
- else {
- var unbinder = addEvent(indicator.chart,
- indicator.calculateOn,
- function () {
- recalculateValues();
- // Call this just once, on init
- unbinder();
- });
- }
- // return indicator;
- };
- /**
- * @private
- */
- SMAIndicator.prototype.processData = function () {
- var series = this,
- compareToMain = series.options.compareToMain,
- linkedParent = series.linkedParent;
- _super.prototype.processData.apply(series, arguments);
- if (linkedParent && linkedParent.compareValue && compareToMain) {
- series.compareValue = linkedParent.compareValue;
- }
- return;
- };
- /**
- * @private
- */
- SMAIndicator.prototype.requireIndicators = function () {
- var obj = {
- allLoaded: true
- };
- // Check whether all required indicators are loaded, else return
- // the object with missing indicator's name.
- this.requiredIndicators.forEach(function (indicator) {
- if (SeriesRegistry.seriesTypes[indicator]) {
- SeriesRegistry.seriesTypes[indicator].prototype.requireIndicators();
- }
- else {
- obj.allLoaded = false;
- obj.needed = indicator;
- }
- });
- return obj;
- };
- /**
- * The parameter allows setting line series type and use OHLC indicators.
- * Data in OHLC format is required.
- *
- * @sample {highstock} stock/indicators/use-ohlc-data
- * Plot line on Y axis
- *
- * @type {boolean}
- * @product highstock
- * @apioption plotOptions.line.useOhlcData
- */
- /**
- * Simple moving average indicator (SMA). This series requires `linkedTo`
- * option to be set.
- *
- * @sample stock/indicators/sma
- * Simple moving average indicator
- *
- * @extends plotOptions.line
- * @since 6.0.0
- * @excluding allAreas, colorAxis, dragDrop, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking, useOhlcData
- * @product highstock
- * @requires stock/indicators/indicators
- * @optionparent plotOptions.sma
- */
- SMAIndicator.defaultOptions = merge(LineSeries.defaultOptions, {
- /**
- * The name of the series as shown in the legend, tooltip etc. If not
- * set, it will be based on a technical indicator type and default
- * params.
- *
- * @type {string}
- */
- name: void 0,
- tooltip: {
- /**
- * Number of decimals in indicator series.
- */
- valueDecimals: 4
- },
- /**
- * The main series ID that indicator will be based on. Required for this
- * indicator.
- *
- * @type {string}
- */
- linkedTo: void 0,
- /**
- * Whether to compare indicator to the main series values
- * or indicator values.
- *
- * @sample {highstock} stock/plotoptions/series-comparetomain/
- * Difference between comparing SMA values to the main series
- * and its own values.
- *
- * @type {boolean}
- */
- compareToMain: false,
- /**
- * Paramters used in calculation of regression series' points.
- */
- params: {
- /**
- * The point index which indicator calculations will base. For
- * example using OHLC data, index=2 means the indicator will be
- * calculated using Low values.
- */
- index: 0,
- /**
- * The base period for indicator calculations. This is the number of
- * data points which are taken into account for the indicator
- * calculations.
- */
- period: 14
- }
- });
- return SMAIndicator;
- }(LineSeries));
- extend(SMAIndicator.prototype, {
- bindTo: {
- series: true,
- eventName: 'updatedData'
- },
- calculateOn: 'init',
- hasDerivedData: true,
- nameComponents: ['period'],
- nameSuffixes: [],
- // Defines on which other indicators is this indicator based on.
- requiredIndicators: [],
- useCommonDataGrouping: true
- });
- SeriesRegistry.registerSeriesType('sma', SMAIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /* *
- *
- * API Options
- *
- * */
- /**
- * A `SMA` series. If the [type](#series.sma.type) option is not specified, it
- * is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL, useOhlcData
- * @requires stock/indicators/indicators
- * @apioption series.sma
- */
- ''; // adds doclet above to the transpiled file
- return SMAIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/AD/ADIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var error = U.error,
- extend = U.extend,
- merge = U.merge;
- /**
- * The AD series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.ad
- *
- * @augments Highcharts.Series
- */
- var ADIndicator = /** @class */ (function (_super) {
- __extends(ADIndicator, _super);
- function ADIndicator() {
- /* *
- *
- * Static Properties
- *
- * */
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Static Functions
- *
- * */
- ADIndicator.populateAverage = function (xVal, yVal, yValVolume, i, _period) {
- var high = yVal[i][1],
- low = yVal[i][2],
- close = yVal[i][3],
- volume = yValVolume[i],
- adY = close === high && close === low || high === low ?
- 0 :
- ((2 * close - low - high) / (high - low)) * volume,
- adX = xVal[i];
- return [adX, adY];
- };
- /* *
- *
- * Functions
- *
- * */
- ADIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- volumeSeriesID = params.volumeSeriesID,
- volumeSeries = series.chart.get(volumeSeriesID),
- yValVolume = volumeSeries && volumeSeries.yData,
- yValLen = yVal ? yVal.length : 0,
- AD = [],
- xData = [],
- yData = [],
- len,
- i,
- ADPoint;
- if (xVal.length <= period &&
- yValLen &&
- yVal[0].length !== 4) {
- return;
- }
- if (!volumeSeries) {
- error('Series ' +
- volumeSeriesID +
- ' not found! Check `volumeSeriesID`.', true, series.chart);
- return;
- }
- // i = period <-- skip first N-points
- // Calculate value one-by-one for each period in visible data
- for (i = period; i < yValLen; i++) {
- len = AD.length;
- ADPoint = ADIndicator.populateAverage(xVal, yVal, yValVolume, i, period);
- if (len > 0) {
- ADPoint[1] += AD[len - 1][1];
- }
- AD.push(ADPoint);
- xData.push(ADPoint[0]);
- yData.push(ADPoint[1]);
- }
- return {
- values: AD,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Accumulation Distribution (AD). This series requires `linkedTo` option to
- * be set.
- *
- * @sample stock/indicators/accumulation-distribution
- * Accumulation/Distribution indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/accumulation-distribution
- * @optionparent plotOptions.ad
- */
- ADIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- /**
- * The id of volume series which is mandatory.
- * For example using OHLC data, volumeSeriesID='volume' means
- * the indicator will be calculated using OHLC and volume values.
- *
- * @since 6.0.0
- */
- volumeSeriesID: 'volume'
- }
- });
- return ADIndicator;
- }(SMAIndicator));
- extend(ADIndicator.prototype, {
- nameComponents: false,
- nameBase: 'Accumulation/Distribution'
- });
- SeriesRegistry.registerSeriesType('ad', ADIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /* *
- *
- * API Options
- *
- * */
- /**
- * A `AD` series. If the [type](#series.ad.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.ad
- * @since 6.0.0
- * @excluding dataParser, dataURL
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/accumulation-distribution
- * @apioption series.ad
- */
- ''; // add doclet above to transpiled file
- return ADIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/AO/AOIndicator.js', [_modules['Core/Globals.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (H, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var noop = H.noop;
- var _a = SeriesRegistry.seriesTypes,
- SMAIndicator = _a.sma,
- ColumnSeries = _a.column;
- var extend = U.extend,
- merge = U.merge,
- correctFloat = U.correctFloat,
- isArray = U.isArray;
- /* *
- *
- * Class
- *
- * */
- /**
- * The AO series type
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.ao
- *
- * @augments Highcharts.Series
- */
- var AOIndicator = /** @class */ (function (_super) {
- __extends(AOIndicator, _super);
- function AOIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /**
- *
- * Properties
- *
- */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /**
- *
- * Functions
- *
- */
- AOIndicator.prototype.drawGraph = function () {
- var indicator = this,
- options = indicator.options,
- points = indicator.points,
- userColor = indicator.userOptions.color,
- positiveColor = options.greaterBarColor,
- negativeColor = options.lowerBarColor,
- firstPoint = points[0],
- i;
- if (!userColor && firstPoint) {
- firstPoint.color = positiveColor;
- for (i = 1; i < points.length; i++) {
- if (points[i].y > points[i - 1].y) {
- points[i].color = positiveColor;
- }
- else if (points[i].y < points[i - 1].y) {
- points[i].color = negativeColor;
- }
- else {
- points[i].color = points[i - 1].color;
- }
- }
- }
- };
- AOIndicator.prototype.getValues = function (series) {
- var shortPeriod = 5,
- longPeriod = 34,
- xVal = series.xData || [],
- yVal = series.yData || [],
- yValLen = yVal.length,
- AO = [], // 0- date, 1- Awesome Oscillator
- xData = [],
- yData = [],
- high = 1,
- low = 2,
- shortSum = 0,
- longSum = 0,
- shortSMA, // Shorter Period SMA
- longSMA, // Longer Period SMA
- awesome,
- shortLastIndex,
- longLastIndex,
- price,
- i,
- j;
- if (xVal.length <= longPeriod ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- for (i = 0; i < longPeriod - 1; i++) {
- price = (yVal[i][high] + yVal[i][low]) / 2;
- if (i >= longPeriod - shortPeriod) {
- shortSum = correctFloat(shortSum + price);
- }
- longSum = correctFloat(longSum + price);
- }
- for (j = longPeriod - 1; j < yValLen; j++) {
- price = (yVal[j][high] + yVal[j][low]) / 2;
- shortSum = correctFloat(shortSum + price);
- longSum = correctFloat(longSum + price);
- shortSMA = shortSum / shortPeriod;
- longSMA = longSum / longPeriod;
- awesome = correctFloat(shortSMA - longSMA);
- AO.push([xVal[j], awesome]);
- xData.push(xVal[j]);
- yData.push(awesome);
- shortLastIndex = j + 1 - shortPeriod;
- longLastIndex = j + 1 - longPeriod;
- shortSum = correctFloat(shortSum -
- (yVal[shortLastIndex][high] +
- yVal[shortLastIndex][low]) / 2);
- longSum = correctFloat(longSum -
- (yVal[longLastIndex][high] +
- yVal[longLastIndex][low]) / 2);
- }
- return {
- values: AO,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Awesome Oscillator. This series requires the `linkedTo` option to
- * be set and should be loaded after the `stock/indicators/indicators.js`
- *
- * @sample {highstock} stock/indicators/ao
- * Awesome
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, joinBy, keys, navigatorOptions,
- * params, pointInterval, pointIntervalUnit, pointPlacement,
- * pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ao
- * @optionparent plotOptions.ao
- */
- AOIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * Color of the Awesome oscillator series bar that is greater than the
- * previous one. Note that if a `color` is defined, the `color`
- * takes precedence and the `greaterBarColor` is ignored.
- *
- * @sample {highstock} stock/indicators/ao/
- * greaterBarColor
- *
- * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
- * @since 7.0.0
- */
- greaterBarColor: '#06B535',
- /**
- * Color of the Awesome oscillator series bar that is lower than the
- * previous one. Note that if a `color` is defined, the `color`
- * takes precedence and the `lowerBarColor` is ignored.
- *
- * @sample {highstock} stock/indicators/ao/
- * lowerBarColor
- *
- * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
- * @since 7.0.0
- */
- lowerBarColor: '#F21313',
- threshold: 0,
- groupPadding: 0.2,
- pointPadding: 0.2,
- crisp: false,
- states: {
- hover: {
- halo: {
- size: 0
- }
- }
- }
- });
- return AOIndicator;
- }(SMAIndicator));
- extend(AOIndicator.prototype, {
- nameBase: 'AO',
- nameComponents: false,
- // Columns support:
- markerAttribs: noop,
- getColumnMetrics: ColumnSeries.prototype.getColumnMetrics,
- crispCol: ColumnSeries.prototype.crispCol,
- translate: ColumnSeries.prototype.translate,
- drawPoints: ColumnSeries.prototype.drawPoints
- });
- SeriesRegistry.registerSeriesType('ao', AOIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * An `AO` series. If the [type](#series.ao.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.ao
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, dataParser, dataURL, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ao
- * @apioption series.ao
- */
- ''; // for including the above in the doclets
- return AOIndicator;
- });
- _registerModule(_modules, 'Mixins/MultipleLines.js', [_modules['Core/Globals.js'], _modules['Core/Utilities.js']], function (H, U) {
- /**
- *
- * (c) 2010-2021 Wojciech Chmiel
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var defined = U.defined,
- error = U.error,
- merge = U.merge;
- var SMA = H.seriesTypes.sma;
- /**
- * Mixin useful for all indicators that have more than one line.
- * Merge it with your implementation where you will provide
- * getValues method appropriate to your indicator and pointArrayMap,
- * pointValKey, linesApiNames properites. Notice that pointArrayMap
- * should be consistent with amount of lines calculated in getValues method.
- *
- * @private
- * @mixin multipleLinesMixin
- */
- var multipleLinesMixin = {
- /* eslint-disable valid-jsdoc */
- /**
- * Lines ids. Required to plot appropriate amount of lines.
- * Notice that pointArrayMap should have more elements than
- * linesApiNames, because it contains main line and additional lines ids.
- * Also it should be consistent with amount of lines calculated in
- * getValues method from your implementation.
- *
- * @private
- * @name multipleLinesMixin.pointArrayMap
- * @type {Array<string>}
- */
- pointArrayMap: ['top', 'bottom'],
- /**
- * Main line id.
- *
- * @private
- * @name multipleLinesMixin.pointValKey
- * @type {string}
- */
- pointValKey: 'top',
- /**
- * Additional lines DOCS names. Elements of linesApiNames array should
- * be consistent with DOCS line names defined in your implementation.
- * Notice that linesApiNames should have decreased amount of elements
- * relative to pointArrayMap (without pointValKey).
- *
- * @private
- * @name multipleLinesMixin.linesApiNames
- * @type {Array<string>}
- */
- linesApiNames: ['bottomLine'],
- /**
- * Create translatedLines Collection based on pointArrayMap.
- *
- * @private
- * @function multipleLinesMixin.getTranslatedLinesNames
- * @param {string} [excludedValue]
- * Main line id
- * @return {Array<string>}
- * Returns translated lines names without excluded value.
- */
- getTranslatedLinesNames: function (excludedValue) {
- var translatedLines = [];
- (this.pointArrayMap || []).forEach(function (propertyName) {
- if (propertyName !== excludedValue) {
- translatedLines.push('plot' +
- propertyName.charAt(0).toUpperCase() +
- propertyName.slice(1));
- }
- });
- return translatedLines;
- },
- /**
- * @private
- * @function multipleLinesMixin.toYData
- * @param {Highcharts.Point} point
- * Indicator point
- * @return {Array<number>}
- * Returns point Y value for all lines
- */
- toYData: function (point) {
- var pointColl = [];
- (this.pointArrayMap || []).forEach(function (propertyName) {
- pointColl.push(point[propertyName]);
- });
- return pointColl;
- },
- /**
- * Add lines plot pixel values.
- *
- * @private
- * @function multipleLinesMixin.translate
- * @return {void}
- */
- translate: function () {
- var indicator = this,
- pointArrayMap = indicator.pointArrayMap,
- LinesNames = [],
- value;
- LinesNames = indicator.getTranslatedLinesNames();
- SMA.prototype.translate.apply(indicator, arguments);
- indicator.points.forEach(function (point) {
- pointArrayMap.forEach(function (propertyName, i) {
- value = point[propertyName];
- if (value !== null) {
- point[LinesNames[i]] = indicator.yAxis.toPixels(value, true);
- }
- });
- });
- },
- /**
- * Draw main and additional lines.
- *
- * @private
- * @function multipleLinesMixin.drawGraph
- * @return {void}
- */
- drawGraph: function () {
- var indicator = this,
- pointValKey = indicator.pointValKey,
- linesApiNames = indicator.linesApiNames,
- mainLinePoints = indicator.points,
- pointsLength = mainLinePoints.length,
- mainLineOptions = indicator.options,
- mainLinePath = indicator.graph,
- gappedExtend = {
- options: {
- gapSize: mainLineOptions.gapSize
- }
- },
- // additional lines point place holders:
- secondaryLines = [],
- secondaryLinesNames = indicator.getTranslatedLinesNames(pointValKey),
- point;
- // Generate points for additional lines:
- secondaryLinesNames.forEach(function (plotLine, index) {
- // create additional lines point place holders
- secondaryLines[index] = [];
- while (pointsLength--) {
- point = mainLinePoints[pointsLength];
- secondaryLines[index].push({
- x: point.x,
- plotX: point.plotX,
- plotY: point[plotLine],
- isNull: !defined(point[plotLine])
- });
- }
- pointsLength = mainLinePoints.length;
- });
- // Modify options and generate additional lines:
- linesApiNames.forEach(function (lineName, i) {
- if (secondaryLines[i]) {
- indicator.points = secondaryLines[i];
- if (mainLineOptions[lineName]) {
- indicator.options = merge(mainLineOptions[lineName].styles, gappedExtend);
- }
- else {
- error('Error: "There is no ' + lineName +
- ' in DOCS options declared. Check if linesApiNames' +
- ' are consistent with your DOCS line names."' +
- ' at mixin/multiple-line.js:34');
- }
- indicator.graph = indicator['graph' + lineName];
- SMA.prototype.drawGraph.call(indicator);
- // Now save lines:
- indicator['graph' + lineName] = indicator.graph;
- }
- else {
- error('Error: "' + lineName + ' doesn\'t have equivalent ' +
- 'in pointArrayMap. To many elements in linesApiNames ' +
- 'relative to pointArrayMap."');
- }
- });
- // Restore options and draw a main line:
- indicator.points = mainLinePoints;
- indicator.options = mainLineOptions;
- indicator.graph = mainLinePath;
- SMA.prototype.drawGraph.call(indicator);
- }
- };
- return multipleLinesMixin;
- });
- _registerModule(_modules, 'Stock/Indicators/Aroon/AroonIndicator.js', [_modules['Mixins/MultipleLines.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (MultipleLinesMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- merge = U.merge,
- pick = U.pick;
- /* eslint-disable valid-jsdoc */
- // Utils
- // Index of element with extreme value from array (min or max)
- /**
- * @private
- */
- function getExtremeIndexInArray(arr, extreme) {
- var extremeValue = arr[0],
- valueIndex = 0,
- i;
- for (i = 1; i < arr.length; i++) {
- if (extreme === 'max' && arr[i] >= extremeValue ||
- extreme === 'min' && arr[i] <= extremeValue) {
- extremeValue = arr[i];
- valueIndex = i;
- }
- }
- return valueIndex;
- }
- /* eslint-enable valid-jsdoc */
- /* *
- *
- * Class
- *
- * */
- /**
- * The Aroon series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.aroon
- *
- * @augments Highcharts.Series
- */
- var AroonIndicator = /** @class */ (function (_super) {
- __extends(AroonIndicator, _super);
- function AroonIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- AroonIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- // 0- date, 1- Aroon Up, 2- Aroon Down
- AR = [],
- xData = [],
- yData = [],
- slicedY,
- low = 2,
- high = 1,
- aroonUp,
- aroonDown,
- xLow,
- xHigh,
- i;
- // For a N-period, we start from N-1 point, to calculate Nth point
- // That is why we later need to comprehend slice() elements list
- // with (+1)
- for (i = period - 1; i < yValLen; i++) {
- slicedY = yVal.slice(i - period + 1, i + 2);
- xLow = getExtremeIndexInArray(slicedY.map(function (elem) {
- return pick(elem[low], elem);
- }), 'min');
- xHigh = getExtremeIndexInArray(slicedY.map(function (elem) {
- return pick(elem[high], elem);
- }), 'max');
- aroonUp = (xHigh / period) * 100;
- aroonDown = (xLow / period) * 100;
- if (xVal[i + 1]) {
- AR.push([xVal[i + 1], aroonUp, aroonDown]);
- xData.push(xVal[i + 1]);
- yData.push([aroonUp, aroonDown]);
- }
- }
- return {
- values: AR,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Aroon. This series requires the `linkedTo` option to be
- * set and should be loaded after the `stock/indicators/indicators.js`.
- *
- * @sample {highstock} stock/indicators/aroon
- * Aroon
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/aroon
- * @optionparent plotOptions.aroon
- */
- AroonIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * Paramters used in calculation of aroon series points.
- *
- * @excluding periods, index
- */
- params: {
- /**
- * Period for Aroon indicator
- */
- period: 25
- },
- marker: {
- enabled: false
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span><b> {series.name}</b><br/>Aroon Up: {point.y}<br/>Aroon Down: {point.aroonDown}<br/>'
- },
- /**
- * aroonDown line options.
- */
- aroonDown: {
- /**
- * Styles for an aroonDown line.
- */
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line. If not set, it's inherited from
- * [plotOptions.aroon.color](#plotOptions.aroon.color).
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- dataGrouping: {
- approximation: 'averages'
- }
- });
- return AroonIndicator;
- }(SMAIndicator));
- extend(AroonIndicator.prototype, {
- linesApiNames: ['aroonDown'],
- nameBase: 'Aroon',
- pointArrayMap: ['y', 'aroonDown'],
- pointValKey: 'y',
- drawGraph: MultipleLinesMixin.drawGraph,
- getTranslatedLinesNames: MultipleLinesMixin.getTranslatedLinesNames,
- toYData: MultipleLinesMixin.toYData,
- translate: MultipleLinesMixin.translate
- });
- SeriesRegistry.registerSeriesType('aroon', AroonIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A Aroon indicator. If the [type](#series.aroon.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.aroon
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/aroon
- * @apioption series.aroon
- */
- ''; // to avoid removal of the above jsdoc
- return AroonIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/AroonOscillator/AroonOscillatorIndicator.js', [_modules['Mixins/MultipleLines.js'], _modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (multipleLinesMixin, requiredIndicator, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var AroonIndicator = SeriesRegistry.seriesTypes.aroon;
- var extend = U.extend,
- merge = U.merge;
- var AROON = SeriesRegistry.seriesTypes.aroon;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Aroon Oscillator series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.aroonoscillator
- *
- * @augments Highcharts.Series
- */
- var AroonOscillatorIndicator = /** @class */ (function (_super) {
- __extends(AroonOscillatorIndicator, _super);
- function AroonOscillatorIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- AroonOscillatorIndicator.prototype.getValues = function (series, params) {
- // 0- date, 1- Aroon Oscillator
- var ARO = [],
- xData = [],
- yData = [],
- aroon,
- aroonUp,
- aroonDown,
- oscillator,
- i;
- aroon = AROON.prototype.getValues.call(this, series, params);
- for (i = 0; i < aroon.yData.length; i++) {
- aroonUp = aroon.yData[i][0];
- aroonDown = aroon.yData[i][1];
- oscillator = aroonUp - aroonDown;
- ARO.push([aroon.xData[i], oscillator]);
- xData.push(aroon.xData[i]);
- yData.push(oscillator);
- }
- return {
- values: ARO,
- xData: xData,
- yData: yData
- };
- };
- AroonOscillatorIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- requiredIndicator.isParentLoaded(AROON, 'aroon', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- /**
- * Aroon Oscillator. This series requires the `linkedTo` option to be set
- * and should be loaded after the `stock/indicators/indicators.js` and
- * `stock/indicators/aroon.js`.
- *
- * @sample {highstock} stock/indicators/aroon-oscillator
- * Aroon Oscillator
- *
- * @extends plotOptions.aroon
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, aroonDown, colorAxis, compare, compareBase,
- * joinBy, keys, navigatorOptions, pointInterval,
- * pointIntervalUnit, pointPlacement, pointRange, pointStart,
- * showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/aroon
- * @requires stock/indicators/aroon-oscillator
- * @optionparent plotOptions.aroonoscillator
- */
- AroonOscillatorIndicator.defaultOptions = merge(AroonIndicator.defaultOptions, {
- /**
- * Paramters used in calculation of aroon oscillator series points.
- *
- * @excluding periods, index
- */
- params: {
- /**
- * Period for Aroon Oscillator
- *
- * @since 7.0.0
- * @product highstock
- */
- period: 25
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span><b> {series.name}</b>: {point.y}'
- }
- });
- return AroonOscillatorIndicator;
- }(AroonIndicator));
- extend(AroonOscillatorIndicator.prototype, merge(multipleLinesMixin, {
- nameBase: 'Aroon Oscillator',
- pointArrayMap: ['y'],
- pointValKey: 'y',
- linesApiNames: []
- }));
- SeriesRegistry.registerSeriesType('aroonoscillator', AroonOscillatorIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * An `Aroon Oscillator` series. If the [type](#series.aroonoscillator.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.aroonoscillator
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, aroonDown, colorAxis, compare, compareBase, dataParser,
- * dataURL, joinBy, keys, navigatorOptions, pointInterval,
- * pointIntervalUnit, pointPlacement, pointRange, pointStart,
- * showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/aroon
- * @requires stock/indicators/aroon-oscillator
- * @apioption series.aroonoscillator
- */
- ''; // adds doclet above to the transpiled file
- return AroonOscillatorIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/ATR/ATRIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var isArray = U.isArray,
- merge = U.merge;
- /* eslint-disable valid-jsdoc */
- // Utils:
- /**
- * @private
- */
- function accumulateAverage(points, xVal, yVal, i) {
- var xValue = xVal[i],
- yValue = yVal[i];
- points.push([xValue, yValue]);
- }
- /**
- * @private
- */
- function getTR(currentPoint, prevPoint) {
- var pointY = currentPoint, prevY = prevPoint, HL = pointY[1] - pointY[2], HCp = typeof prevY === 'undefined' ? 0 : Math.abs(pointY[1] - prevY[3]), LCp = typeof prevY === 'undefined' ? 0 : Math.abs(pointY[2] - prevY[3]), TR = Math.max(HL, HCp, LCp);
- return TR;
- }
- /**
- * @private
- */
- function populateAverage(points, xVal, yVal, i, period, prevATR) {
- var x = xVal[i - 1],
- TR = getTR(yVal[i - 1],
- yVal[i - 2]),
- y;
- y = (((prevATR * (period - 1)) + TR) / period);
- return [x, y];
- }
- /* eslint-enable valid-jsdoc */
- /* *
- *
- * Class
- *
- * */
- /**
- * The ATR series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.atr
- *
- * @augments Highcharts.Series
- */
- var ATRIndicator = /** @class */ (function (_super) {
- __extends(ATRIndicator, _super);
- function ATRIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.points = void 0;
- _this.options = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- ATRIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- xValue = xVal[0],
- yValue = yVal[0],
- range = 1,
- prevATR = 0,
- TR = 0,
- ATR = [],
- xData = [],
- yData = [],
- point,
- i,
- points;
- points = [[xValue, yValue]];
- if ((xVal.length <= period) ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- for (i = 1; i <= yValLen; i++) {
- accumulateAverage(points, xVal, yVal, i);
- if (period < range) {
- point = populateAverage(points, xVal, yVal, i, period, prevATR);
- prevATR = point[1];
- ATR.push(point);
- xData.push(point[0]);
- yData.push(point[1]);
- }
- else if (period === range) {
- prevATR = TR / (i - 1);
- ATR.push([xVal[i - 1], prevATR]);
- xData.push(xVal[i - 1]);
- yData.push(prevATR);
- range++;
- }
- else {
- TR += getTR(yVal[i - 1], yVal[i - 2]);
- range++;
- }
- }
- return {
- values: ATR,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Average true range indicator (ATR). This series requires `linkedTo`
- * option to be set.
- *
- * @sample stock/indicators/atr
- * ATR indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/atr
- * @optionparent plotOptions.atr
- */
- ATRIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 14
- }
- });
- return ATRIndicator;
- }(SMAIndicator));
- SeriesRegistry.registerSeriesType('atr', ATRIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `ATR` series. If the [type](#series.atr.type) option is not specified, it
- * is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.atr
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/atr
- * @apioption series.atr
- */
- ''; // to include the above in the js output
- return ATRIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/BB/BBIndicator.js', [_modules['Mixins/MultipleLines.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (MultipleLinesMixin, SeriesRegistry, U) {
- /**
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- isArray = U.isArray,
- merge = U.merge;
- /* eslint-disable valid-jsdoc */
- // Utils:
- /**
- * @private
- */
- function getStandardDeviation(arr, index, isOHLC, mean) {
- var variance = 0,
- arrLen = arr.length,
- std = 0,
- i = 0,
- value;
- for (; i < arrLen; i++) {
- value = (isOHLC ? arr[i][index] : arr[i]) - mean;
- variance += value * value;
- }
- variance = variance / (arrLen - 1);
- std = Math.sqrt(variance);
- return std;
- }
- /* eslint-enable valid-jsdoc */
- /**
- * Bollinger Bands series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.bb
- *
- * @augments Highcharts.Series
- */
- var BBIndicator = /** @class */ (function (_super) {
- __extends(BBIndicator, _super);
- function BBIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Prototype Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- BBIndicator.prototype.init = function () {
- SeriesRegistry.seriesTypes.sma.prototype.init.apply(this, arguments);
- // Set default color for lines:
- this.options = merge({
- topLine: {
- styles: {
- lineColor: this.color
- }
- },
- bottomLine: {
- styles: {
- lineColor: this.color
- }
- }
- }, this.options);
- };
- BBIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- standardDeviation = params.standardDeviation,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- // 0- date, 1-middle line, 2-top line, 3-bottom line
- BB = [],
- // middle line, top line and bottom line
- ML,
- TL,
- BL,
- date,
- xData = [],
- yData = [],
- slicedX,
- slicedY,
- stdDev,
- isOHLC,
- point,
- i;
- if (xVal.length < period) {
- return;
- }
- isOHLC = isArray(yVal[0]);
- for (i = period; i <= yValLen; i++) {
- slicedX = xVal.slice(i - period, i);
- slicedY = yVal.slice(i - period, i);
- point = SeriesRegistry.seriesTypes.sma.prototype.getValues.call(this, {
- xData: slicedX,
- yData: slicedY
- }, params);
- date = point.xData[0];
- ML = point.yData[0];
- stdDev = getStandardDeviation(slicedY, params.index, isOHLC, ML);
- TL = ML + standardDeviation * stdDev;
- BL = ML - standardDeviation * stdDev;
- BB.push([date, TL, ML, BL]);
- xData.push(date);
- yData.push([TL, ML, BL]);
- }
- return {
- values: BB,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Bollinger bands (BB). This series requires the `linkedTo` option to be
- * set and should be loaded after the `stock/indicators/indicators.js` file.
- *
- * @sample stock/indicators/bollinger-bands
- * Bollinger bands
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/bollinger-bands
- * @optionparent plotOptions.bb
- */
- BBIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 20,
- /**
- * Standard deviation for top and bottom bands.
- */
- standardDeviation: 2,
- index: 3
- },
- /**
- * Bottom line options.
- */
- bottomLine: {
- /**
- * Styles for a bottom line.
- */
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line. If not set, it's inherited from
- * [plotOptions.bb.color](#plotOptions.bb.color).
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * Top line options.
- *
- * @extends plotOptions.bb.bottomLine
- */
- topLine: {
- styles: {
- lineWidth: 1,
- /**
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span><b> {series.name}</b><br/>Top: {point.top}<br/>Middle: {point.middle}<br/>Bottom: {point.bottom}<br/>'
- },
- marker: {
- enabled: false
- },
- dataGrouping: {
- approximation: 'averages'
- }
- });
- return BBIndicator;
- }(SMAIndicator));
- extend(BBIndicator.prototype, {
- pointArrayMap: ['top', 'middle', 'bottom'],
- pointValKey: 'middle',
- nameComponents: ['period', 'standardDeviation'],
- linesApiNames: ['topLine', 'bottomLine'],
- drawGraph: MultipleLinesMixin.drawGraph,
- getTranslatedLinesNames: MultipleLinesMixin.getTranslatedLinesNames,
- translate: MultipleLinesMixin.translate,
- toYData: MultipleLinesMixin.toYData
- });
- SeriesRegistry.registerSeriesType('bb', BBIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A bollinger bands indicator. If the [type](#series.bb.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.bb
- * @since 6.0.0
- * @excluding dataParser, dataURL
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/bollinger-bands
- * @apioption series.bb
- */
- ''; // to include the above in the js output
- return BBIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/CCI/CCIIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var isArray = U.isArray,
- merge = U.merge;
- /* eslint-disable valid-jsdoc */
- // Utils:
- /**
- * @private
- */
- function sumArray(array) {
- return array.reduce(function (prev, cur) {
- return prev + cur;
- }, 0);
- }
- /**
- * @private
- */
- function meanDeviation(arr, sma) {
- var len = arr.length,
- sum = 0,
- i;
- for (i = 0; i < len; i++) {
- sum += Math.abs(sma - (arr[i]));
- }
- return sum;
- }
- /* eslint-enable valid-jsdoc */
- /* *
- *
- * Class
- *
- * */
- /**
- * The CCI series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.cci
- *
- * @augments Highcharts.Series
- */
- var CCIIndicator = /** @class */ (function (_super) {
- __extends(CCIIndicator, _super);
- function CCIIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.points = void 0;
- _this.options = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- CCIIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- TP = [],
- periodTP = [],
- range = 1,
- CCI = [],
- xData = [],
- yData = [],
- CCIPoint,
- p,
- len,
- smaTP,
- TPtemp,
- meanDev,
- i;
- // CCI requires close value
- if (xVal.length <= period ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- // accumulate first N-points
- while (range < period) {
- p = yVal[range - 1];
- TP.push((p[1] + p[2] + p[3]) / 3);
- range++;
- }
- for (i = period; i <= yValLen; i++) {
- p = yVal[i - 1];
- TPtemp = (p[1] + p[2] + p[3]) / 3;
- len = TP.push(TPtemp);
- periodTP = TP.slice(len - period);
- smaTP = sumArray(periodTP) / period;
- meanDev = meanDeviation(periodTP, smaTP) / period;
- CCIPoint = ((TPtemp - smaTP) / (0.015 * meanDev));
- CCI.push([xVal[i - 1], CCIPoint]);
- xData.push(xVal[i - 1]);
- yData.push(CCIPoint);
- }
- return {
- values: CCI,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Commodity Channel Index (CCI). This series requires `linkedTo` option to
- * be set.
- *
- * @sample stock/indicators/cci
- * CCI indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/cci
- * @optionparent plotOptions.cci
- */
- CCIIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 14
- }
- });
- return CCIIndicator;
- }(SMAIndicator));
- SeriesRegistry.registerSeriesType('cci', CCIIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `CCI` series. If the [type](#series.cci.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.cci
- * @since 6.0.0
- * @excluding dataParser, dataURL
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/cci
- * @apioption series.cci
- */
- ''; // to include the above in the js output
- return CCIIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/CMF/CMFIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * (c) 2010-2021 Highsoft AS
- *
- * Author: Sebastian Domas
- *
- * Chaikin Money Flow indicator for Highstock
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var merge = U.merge;
- /**
- * The CMF series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.cmf
- *
- * @augments Highcharts.Series
- */
- var CMFIndicator = /** @class */ (function (_super) {
- __extends(CMFIndicator, _super);
- function CMFIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- _this.volumeSeries = void 0;
- _this.linkedParent = void 0;
- _this.yData = void 0;
- _this.nameBase = 'Chaikin Money Flow';
- return _this;
- }
- /**
- * Checks if the series and volumeSeries are accessible, number of
- * points.x is longer than period, is series has OHLC data
- * @private
- * @param {Highcharts.CMFIndicator} this indicator to use.
- * @return {boolean} True if series is valid and can be computed,
- * otherwise false.
- */
- CMFIndicator.prototype.isValid = function () {
- var chart = this.chart,
- options = this.options,
- series = this.linkedParent,
- volumeSeries = (this.volumeSeries ||
- (this.volumeSeries =
- chart.get(options.params.volumeSeriesID))),
- isSeriesOHLC = (series &&
- series.yData &&
- series.yData[0].length === 4);
- /**
- * @private
- * @param {Highcharts.Series} serie to check length validity on.
- * @return {boolean|undefined} true if length is valid.
- */
- function isLengthValid(serie) {
- return serie.xData &&
- serie.xData.length >= options.params.period;
- }
- return !!(series &&
- volumeSeries &&
- isLengthValid(series) &&
- isLengthValid(volumeSeries) && isSeriesOHLC);
- };
- /**
- * Returns indicator's data.
- * @private
- * @param {Highcharts.CMFIndicator} this indicator to use.
- * @param {Highcharts.Series} series to calculate values from
- * @param {Highcharts.CMFIndicatorParamsOptions} params to pass
- * @return {boolean|Highcharts.IndicatorNullableValuesObject} Returns false if the
- * indicator is not valid, otherwise returns Values object.
- */
- CMFIndicator.prototype.getValues = function (series, params) {
- if (!this.isValid()) {
- return;
- }
- return this.getMoneyFlow(series.xData, series.yData, this.volumeSeries.yData, params.period);
- };
- /**
- * @private
- * @param {Array<number>} xData - x timestamp values
- * @param {Array<number>} seriesYData - yData of basic series
- * @param {Array<number>} volumeSeriesYData - yData of volume series
- * @param {number} period - indicator's param
- * @return {Highcharts.IndicatorNullableValuesObject} object containing computed money
- * flow data
- */
- CMFIndicator.prototype.getMoneyFlow = function (xData, seriesYData, volumeSeriesYData, period) {
- var len = seriesYData.length,
- moneyFlowVolume = [],
- sumVolume = 0,
- sumMoneyFlowVolume = 0,
- moneyFlowXData = [],
- moneyFlowYData = [],
- values = [],
- i,
- point,
- nullIndex = -1;
- /**
- * Calculates money flow volume, changes i, nullIndex vars from
- * upper scope!
- * @private
- * @param {Array<number>} ohlc - OHLC point
- * @param {number} volume - Volume point's y value
- * @return {number|null} - volume * moneyFlowMultiplier
- **/
- function getMoneyFlowVolume(ohlc, volume) {
- var high = ohlc[1],
- low = ohlc[2],
- close = ohlc[3],
- isValid = volume !== null &&
- high !== null &&
- low !== null &&
- close !== null &&
- high !== low;
- /**
- * @private
- * @param {number} h - High value
- * @param {number} l - Low value
- * @param {number} c - Close value
- * @return {number} calculated multiplier for the point
- **/
- function getMoneyFlowMultiplier(h, l, c) {
- return ((c - l) - (h - c)) / (h - l);
- }
- return isValid ?
- getMoneyFlowMultiplier(high, low, close) * volume :
- ((nullIndex = i), null);
- }
- if (period > 0 && period <= len) {
- for (i = 0; i < period; i++) {
- moneyFlowVolume[i] = getMoneyFlowVolume(seriesYData[i], volumeSeriesYData[i]);
- sumVolume += volumeSeriesYData[i];
- sumMoneyFlowVolume += moneyFlowVolume[i];
- }
- moneyFlowXData.push(xData[i - 1]);
- moneyFlowYData.push(i - nullIndex >= period && sumVolume !== 0 ?
- sumMoneyFlowVolume / sumVolume :
- null);
- values.push([moneyFlowXData[0], moneyFlowYData[0]]);
- for (; i < len; i++) {
- moneyFlowVolume[i] = getMoneyFlowVolume(seriesYData[i], volumeSeriesYData[i]);
- sumVolume -= volumeSeriesYData[i - period];
- sumVolume += volumeSeriesYData[i];
- sumMoneyFlowVolume -= moneyFlowVolume[i - period];
- sumMoneyFlowVolume += moneyFlowVolume[i];
- point = [
- xData[i],
- i - nullIndex >= period ?
- sumMoneyFlowVolume / sumVolume :
- null
- ];
- moneyFlowXData.push(point[0]);
- moneyFlowYData.push(point[1]);
- values.push([point[0], point[1]]);
- }
- }
- return {
- values: values,
- xData: moneyFlowXData,
- yData: moneyFlowYData
- };
- };
- /**
- * Chaikin Money Flow indicator (cmf).
- *
- * @sample stock/indicators/cmf/
- * Chaikin Money Flow indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @excluding animationLimit
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/cmf
- * @optionparent plotOptions.cmf
- */
- CMFIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 14,
- /**
- * The id of another series to use its data as volume data for the
- * indiator calculation.
- */
- volumeSeriesID: 'volume'
- }
- });
- return CMFIndicator;
- }(SMAIndicator));
- SeriesRegistry.registerSeriesType('cmf', CMFIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `CMF` series. If the [type](#series.cmf.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.cmf
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/cmf
- * @apioption series.cmf
- */
- ''; // adds doclet above to the transpiled file
- return CMFIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/DPO/DPOIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- merge = U.merge,
- correctFloat = U.correctFloat,
- pick = U.pick;
- /* eslint-disable valid-jsdoc */
- // Utils:
- /**
- * @private
- */
- function accumulatePoints(sum, yVal, i, index, subtract) {
- var price = pick(yVal[i][index],
- yVal[i]);
- if (subtract) {
- return correctFloat(sum - price);
- }
- return correctFloat(sum + price);
- }
- /* *
- *
- * Class
- *
- * */
- /**
- * The DPO series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.dpo
- *
- * @augments Highcharts.Series
- */
- var DPOIndicator = /** @class */ (function (_super) {
- __extends(DPOIndicator, _super);
- function DPOIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.options = void 0;
- _this.data = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- /**
- * @lends Highcharts.Series#
- */
- DPOIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- index = params.index,
- offset = Math.floor(period / 2 + 1),
- range = period + offset,
- xVal = series.xData || [],
- yVal = series.yData || [],
- yValLen = yVal.length,
- // 0- date, 1- Detrended Price Oscillator
- DPO = [],
- xData = [],
- yData = [],
- sum = 0,
- oscillator,
- periodIndex,
- rangeIndex,
- price,
- i,
- j;
- if (xVal.length <= range) {
- return;
- }
- // Accumulate first N-points for SMA
- for (i = 0; i < period - 1; i++) {
- sum = accumulatePoints(sum, yVal, i, index);
- }
- // Detrended Price Oscillator formula:
- // DPO = Price - Simple moving average [from (n / 2 + 1) days ago]
- for (j = 0; j <= yValLen - range; j++) {
- periodIndex = j + period - 1;
- rangeIndex = j + range - 1;
- // adding the last period point
- sum = accumulatePoints(sum, yVal, periodIndex, index);
- price = pick(yVal[rangeIndex][index], yVal[rangeIndex]);
- oscillator = price - sum / period;
- // substracting the first period point
- sum = accumulatePoints(sum, yVal, j, index, true);
- DPO.push([xVal[rangeIndex], oscillator]);
- xData.push(xVal[rangeIndex]);
- yData.push(oscillator);
- }
- return {
- values: DPO,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Detrended Price Oscillator. This series requires the `linkedTo` option to
- * be set and should be loaded after the `stock/indicators/indicators.js`.
- *
- * @sample {highstock} stock/indicators/dpo
- * Detrended Price Oscillator
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/dpo
- * @optionparent plotOptions.dpo
- */
- DPOIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * Parameters used in calculation of Detrended Price Oscillator series
- * points.
- */
- params: {
- /**
- * Period for Detrended Price Oscillator
- */
- period: 21
- }
- });
- return DPOIndicator;
- }(SMAIndicator));
- extend(DPOIndicator.prototype, {
- nameBase: 'DPO'
- });
- SeriesRegistry.registerSeriesType('dpo', DPOIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A Detrended Price Oscillator. If the [type](#series.dpo.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.dpo
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/dpo
- * @apioption series.dpo
- */
- ''; // to include the above in the js output'
- return DPOIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/EMA/EMAIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var correctFloat = U.correctFloat,
- isArray = U.isArray,
- merge = U.merge;
- /* *
- *
- * Class
- *
- * */
- /**
- * The EMA series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.ema
- *
- * @augments Highcharts.Series
- */
- var EMAIndicator = /** @class */ (function (_super) {
- __extends(EMAIndicator, _super);
- function EMAIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- EMAIndicator.prototype.accumulatePeriodPoints = function (period, index, yVal) {
- var sum = 0,
- i = 0,
- y = 0;
- while (i < period) {
- y = index < 0 ? yVal[i] : yVal[i][index];
- sum = sum + y;
- i++;
- }
- return sum;
- };
- EMAIndicator.prototype.calculateEma = function (xVal, yVal, i, EMApercent, calEMA, index, SMA) {
- var x = xVal[i - 1],
- yValue = index < 0 ?
- yVal[i - 1] :
- yVal[i - 1][index],
- y;
- y = typeof calEMA === 'undefined' ?
- SMA : correctFloat((yValue * EMApercent) +
- (calEMA * (1 - EMApercent)));
- return [x, y];
- };
- EMAIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- EMApercent = 2 / (period + 1),
- sum = 0,
- EMA = [],
- xData = [],
- yData = [],
- index = -1,
- SMA = 0,
- calEMA,
- EMAPoint,
- i;
- // Check period, if bigger than points length, skip
- if (yValLen < period) {
- return;
- }
- // Switch index for OHLC / Candlestick / Arearange
- if (isArray(yVal[0])) {
- index = params.index ? params.index : 0;
- }
- // Accumulate first N-points
- sum = this.accumulatePeriodPoints(period, index, yVal);
- // first point
- SMA = sum / period;
- // Calculate value one-by-one for each period in visible data
- for (i = period; i < yValLen + 1; i++) {
- EMAPoint = this.calculateEma(xVal, yVal, i, EMApercent, calEMA, index, SMA);
- EMA.push(EMAPoint);
- xData.push(EMAPoint[0]);
- yData.push(EMAPoint[1]);
- calEMA = EMAPoint[1];
- }
- return {
- values: EMA,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Exponential moving average indicator (EMA). This series requires the
- * `linkedTo` option to be set.
- *
- * @sample stock/indicators/ema
- * Exponential moving average indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @optionparent plotOptions.ema
- */
- EMAIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- /**
- * The point index which indicator calculations will base. For
- * example using OHLC data, index=2 means the indicator will be
- * calculated using Low values.
- *
- * By default index value used to be set to 0. Since Highstock 7
- * by default index is set to 3 which means that the ema
- * indicator will be calculated using Close values.
- */
- index: 3,
- period: 9 // @merge 14 in v6.2
- }
- });
- return EMAIndicator;
- }(SMAIndicator));
- SeriesRegistry.registerSeriesType('ema', EMAIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `EMA` series. If the [type](#series.ema.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.ema
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @apioption series.ema
- */
- ''; // adds doclet above to the transpiled file
- return EMAIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/Chaikin/ChaikinIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var _a = SeriesRegistry.seriesTypes,
- AD = _a.ad,
- EMAIndicator = _a.ema;
- var correctFloat = U.correctFloat,
- extend = U.extend,
- merge = U.merge,
- error = U.error;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Chaikin series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.chaikin
- *
- * @augments Highcharts.Series
- */
- var ChaikinIndicator = /** @class */ (function (_super) {
- __extends(ChaikinIndicator, _super);
- function ChaikinIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- ChaikinIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- RequiredIndicatorMixin.isParentLoaded(EMAIndicator, 'ema', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- ChaikinIndicator.prototype.getValues = function (series, params) {
- var periods = params.periods,
- period = params.period,
- // Accumulation Distribution Line data
- ADL,
- // 0- date, 1- Chaikin Oscillator
- CHA = [],
- xData = [],
- yData = [],
- periodsOffset,
- // Shorter Period EMA
- SPE,
- // Longer Period EMA
- LPE,
- oscillator,
- i;
- // Check if periods are correct
- if (periods.length !== 2 || periods[1] <= periods[0]) {
- error('Error: "Chaikin requires two periods. Notice, first ' +
- 'period should be lower than the second one."');
- return;
- }
- ADL = AD.prototype.getValues.call(this, series, {
- volumeSeriesID: params.volumeSeriesID,
- period: period
- });
- // Check if adl is calculated properly, if not skip
- if (!ADL) {
- return;
- }
- SPE = EMAIndicator.prototype.getValues.call(this, ADL, {
- period: periods[0]
- });
- LPE = EMAIndicator.prototype.getValues.call(this, ADL, {
- period: periods[1]
- });
- // Check if ema is calculated properly, if not skip
- if (!SPE || !LPE) {
- return;
- }
- periodsOffset = periods[1] - periods[0];
- for (i = 0; i < LPE.yData.length; i++) {
- oscillator = correctFloat(SPE.yData[i + periodsOffset] -
- LPE.yData[i]);
- CHA.push([LPE.xData[i], oscillator]);
- xData.push(LPE.xData[i]);
- yData.push(oscillator);
- }
- return {
- values: CHA,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Chaikin Oscillator. This series requires the `linkedTo` option to
- * be set and should be loaded after the `stock/indicators/indicators.js`
- * and `stock/indicators/ema.js`.
- *
- * @sample {highstock} stock/indicators/chaikin
- * Chaikin Oscillator
- *
- * @extends plotOptions.ema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, joinBy, keys, navigatorOptions,
- * pointInterval, pointIntervalUnit, pointPlacement,
- * pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/chaikin
- * @optionparent plotOptions.chaikin
- */
- ChaikinIndicator.defaultOptions = merge(EMAIndicator.defaultOptions, {
- /**
- * Paramters used in calculation of Chaikin Oscillator
- * series points.
- *
- * @excluding index, period
- */
- params: {
- /**
- * The id of volume series which is mandatory.
- * For example using OHLC data, volumeSeriesID='volume' means
- * the indicator will be calculated using OHLC and volume values.
- */
- volumeSeriesID: 'volume',
- /**
- * Periods for Chaikin Oscillator calculations.
- *
- * @type {Array<number>}
- * @default [3, 10]
- */
- periods: [3, 10]
- }
- });
- return ChaikinIndicator;
- }(EMAIndicator));
- extend(ChaikinIndicator.prototype, {
- nameBase: 'Chaikin Osc',
- nameComponents: ['periods']
- });
- SeriesRegistry.registerSeriesType('chaikin', ChaikinIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Chaikin Oscillator` series. If the [type](#series.chaikin.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.chaikin
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, dataParser, dataURL, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, stacking, showInNavigator
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/chaikin
- * @apioption series.chaikin
- */
- ''; // to include the above in the js output
- return ChaikinIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/DEMA/DEMAIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var EMAIndicator = SeriesRegistry.seriesTypes.ema;
- var correctFloat = U.correctFloat,
- isArray = U.isArray,
- merge = U.merge;
- /**
- * The DEMA series Type
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.dema
- *
- * @augments Highcharts.Series
- */
- var DEMAIndicator = /** @class */ (function (_super) {
- __extends(DEMAIndicator, _super);
- function DEMAIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.EMApercent = void 0;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- DEMAIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- RequiredIndicatorMixin.isParentLoaded(EMAIndicator, 'ema', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- DEMAIndicator.prototype.getEMA = function (yVal, prevEMA, SMA, index, i, xVal) {
- return EMAIndicator.prototype.calculateEma(xVal || [], yVal, typeof i === 'undefined' ? 1 : i, this.EMApercent, prevEMA, typeof index === 'undefined' ? -1 : index, SMA);
- };
- DEMAIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- doubledPeriod = 2 * period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- index = -1,
- accumulatePeriodPoints = 0,
- SMA = 0,
- DEMA = [],
- xDataDema = [],
- yDataDema = [],
- EMA = 0,
- // EMA(EMA)
- EMAlevel2,
- // EMA of previous point
- prevEMA,
- prevEMAlevel2,
- // EMA values array
- EMAvalues = [],
- i,
- DEMAPoint;
- this.EMApercent = (2 / (period + 1));
- // Check period, if bigger than EMA points length, skip
- if (yValLen < 2 * period - 1) {
- return;
- }
- // Switch index for OHLC / Candlestick / Arearange
- if (isArray(yVal[0])) {
- index = params.index ? params.index : 0;
- }
- // Accumulate first N-points
- accumulatePeriodPoints =
- EMAIndicator.prototype.accumulatePeriodPoints(period, index, yVal);
- // first point
- SMA = accumulatePeriodPoints / period;
- accumulatePeriodPoints = 0;
- // Calculate value one-by-one for each period in visible data
- for (i = period; i < yValLen + 2; i++) {
- if (i < yValLen + 1) {
- EMA = this.getEMA(yVal, prevEMA, SMA, index, i)[1];
- EMAvalues.push(EMA);
- }
- prevEMA = EMA;
- // Summing first period points for EMA(EMA)
- if (i < doubledPeriod) {
- accumulatePeriodPoints += EMA;
- }
- else {
- // Calculate DEMA
- // First DEMA point
- if (i === doubledPeriod) {
- SMA = accumulatePeriodPoints / period;
- }
- EMA = EMAvalues[i - period - 1];
- EMAlevel2 = this.getEMA([EMA], prevEMAlevel2, SMA)[1];
- DEMAPoint = [
- xVal[i - 2],
- correctFloat(2 * EMA - EMAlevel2)
- ];
- DEMA.push(DEMAPoint);
- xDataDema.push(DEMAPoint[0]);
- yDataDema.push(DEMAPoint[1]);
- prevEMAlevel2 = EMAlevel2;
- }
- }
- return {
- values: DEMA,
- xData: xDataDema,
- yData: yDataDema
- };
- };
- /**
- * Double exponential moving average (DEMA) indicator. This series requires
- * `linkedTo` option to be set and should be loaded after the
- * `stock/indicators/indicators.js` and `stock/indicators/ema.js`.
- *
- * @sample {highstock} stock/indicators/dema
- * DEMA indicator
- *
- * @extends plotOptions.ema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/dema
- * @optionparent plotOptions.dema
- */
- DEMAIndicator.defaultOptions = merge(EMAIndicator.defaultOptions);
- return DEMAIndicator;
- }(EMAIndicator));
- SeriesRegistry.registerSeriesType('dema', DEMAIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `DEMA` series. If the [type](#series.ema.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.ema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/dema
- * @apioption series.dema
- */
- ''; // adds doclet above to the transpiled file
- return DEMAIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/TEMA/TEMAIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var EMAIndicator = SeriesRegistry.seriesTypes.ema;
- var correctFloat = U.correctFloat,
- isArray = U.isArray,
- merge = U.merge;
- /**
- * The TEMA series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.tema
- *
- * @augments Highcharts.Series
- */
- var TEMAIndicator = /** @class */ (function (_super) {
- __extends(TEMAIndicator, _super);
- function TEMAIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.EMApercent = void 0;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- TEMAIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- RequiredIndicatorMixin.isParentLoaded(EMAIndicator, 'ema', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- TEMAIndicator.prototype.getEMA = function (yVal, prevEMA, SMA, index, i, xVal) {
- return EMAIndicator.prototype.calculateEma(xVal || [], yVal, typeof i === 'undefined' ? 1 : i, this.EMApercent, prevEMA, typeof index === 'undefined' ? -1 : index, SMA);
- };
- TEMAIndicator.prototype.getTemaPoint = function (xVal, tripledPeriod, EMAlevels, i) {
- var TEMAPoint = [
- xVal[i - 3],
- correctFloat(3 * EMAlevels.level1 -
- 3 * EMAlevels.level2 + EMAlevels.level3)
- ];
- return TEMAPoint;
- };
- TEMAIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- doubledPeriod = 2 * period,
- tripledPeriod = 3 * period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- index = -1,
- accumulatePeriodPoints = 0,
- SMA = 0,
- TEMA = [],
- xDataTema = [],
- yDataTema = [],
- // EMA of previous point
- prevEMA,
- prevEMAlevel2,
- // EMA values array
- EMAvalues = [],
- EMAlevel2values = [],
- i,
- TEMAPoint,
- // This object contains all EMA EMAlevels calculated like below
- // EMA = level1
- // EMA(EMA) = level2,
- // EMA(EMA(EMA)) = level3,
- EMAlevels = {};
- this.EMApercent = (2 / (period + 1));
- // Check period, if bigger than EMA points length, skip
- if (yValLen < 3 * period - 2) {
- return;
- }
- // Switch index for OHLC / Candlestick / Arearange
- if (isArray(yVal[0])) {
- index = params.index ? params.index : 0;
- }
- // Accumulate first N-points
- accumulatePeriodPoints =
- EMAIndicator.prototype.accumulatePeriodPoints(period, index, yVal);
- // first point
- SMA = accumulatePeriodPoints / period;
- accumulatePeriodPoints = 0;
- // Calculate value one-by-one for each period in visible data
- for (i = period; i < yValLen + 3; i++) {
- if (i < yValLen + 1) {
- EMAlevels.level1 = this.getEMA(yVal, prevEMA, SMA, index, i)[1];
- EMAvalues.push(EMAlevels.level1);
- }
- prevEMA = EMAlevels.level1;
- // Summing first period points for ema(ema)
- if (i < doubledPeriod) {
- accumulatePeriodPoints += EMAlevels.level1;
- }
- else {
- // Calculate dema
- // First dema point
- if (i === doubledPeriod) {
- SMA = accumulatePeriodPoints / period;
- accumulatePeriodPoints = 0;
- }
- EMAlevels.level1 = EMAvalues[i - period - 1];
- EMAlevels.level2 = this.getEMA([EMAlevels.level1], prevEMAlevel2, SMA)[1];
- EMAlevel2values.push(EMAlevels.level2);
- prevEMAlevel2 = EMAlevels.level2;
- // Summing first period points for ema(ema(ema))
- if (i < tripledPeriod) {
- accumulatePeriodPoints += EMAlevels.level2;
- }
- else {
- // Calculate tema
- // First tema point
- if (i === tripledPeriod) {
- SMA = accumulatePeriodPoints / period;
- }
- if (i === yValLen + 1) {
- // Calculate the last ema and emaEMA points
- EMAlevels.level1 = EMAvalues[i - period - 1];
- EMAlevels.level2 = this.getEMA([EMAlevels.level1], prevEMAlevel2, SMA)[1];
- EMAlevel2values.push(EMAlevels.level2);
- }
- EMAlevels.level1 = EMAvalues[i - period - 2];
- EMAlevels.level2 = EMAlevel2values[i - 2 * period - 1];
- EMAlevels.level3 = this.getEMA([EMAlevels.level2], EMAlevels.prevLevel3, SMA)[1];
- TEMAPoint = this.getTemaPoint(xVal, tripledPeriod, EMAlevels, i);
- // Make sure that point exists (for TRIX oscillator)
- if (TEMAPoint) {
- TEMA.push(TEMAPoint);
- xDataTema.push(TEMAPoint[0]);
- yDataTema.push(TEMAPoint[1]);
- }
- EMAlevels.prevLevel3 = EMAlevels.level3;
- }
- }
- }
- return {
- values: TEMA,
- xData: xDataTema,
- yData: yDataTema
- };
- };
- /**
- * Triple exponential moving average (TEMA) indicator. This series requires
- * `linkedTo` option to be set and should be loaded after the
- * `stock/indicators/indicators.js` and `stock/indicators/ema.js`.
- *
- * @sample {highstock} stock/indicators/tema
- * TEMA indicator
- *
- * @extends plotOptions.ema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/tema
- * @optionparent plotOptions.tema
- */
- TEMAIndicator.defaultOptions = merge(EMAIndicator.defaultOptions);
- return TEMAIndicator;
- }(EMAIndicator));
- SeriesRegistry.registerSeriesType('tema', TEMAIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `TEMA` series. If the [type](#series.ema.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.ema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/tema
- * @apioption series.tema
- */
- ''; // to include the above in the js output
- return TEMAIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/TRIX/TRIXIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var TEMAIndicator = SeriesRegistry.seriesTypes.tema;
- var correctFloat = U.correctFloat,
- merge = U.merge;
- /**
- * The TRIX series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.trix
- *
- * @augments Highcharts.Series
- */
- var TRIXIndicator = /** @class */ (function (_super) {
- __extends(TRIXIndicator, _super);
- function TRIXIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- TRIXIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- RequiredIndicatorMixin.isParentLoaded(SeriesRegistry.seriesTypes.tema, 'tema', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- // TRIX is calculated using TEMA so we just extend getTemaPoint method.
- TRIXIndicator.prototype.getTemaPoint = function (xVal, tripledPeriod, EMAlevels, i) {
- if (i > tripledPeriod) {
- var TRIXPoint = [
- xVal[i - 3],
- EMAlevels.prevLevel3 !== 0 ?
- correctFloat(EMAlevels.level3 - EMAlevels.prevLevel3) /
- EMAlevels.prevLevel3 * 100 : null
- ];
- }
- return TRIXPoint;
- };
- /**
- * Triple exponential average (TRIX) oscillator. This series requires
- * `linkedTo` option to be set.
- *
- * Requires https://code.highcharts.com/stock/indicators/ema.js
- * and https://code.highcharts.com/stock/indicators/tema.js.
- *
- * @sample {highstock} stock/indicators/trix
- * TRIX indicator
- *
- * @extends plotOptions.tema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking
- * @optionparent plotOptions.trix
- */
- TRIXIndicator.defaultOptions = merge(TEMAIndicator.defaultOptions);
- return TRIXIndicator;
- }(TEMAIndicator));
- SeriesRegistry.registerSeriesType('trix', TRIXIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `TRIX` series. If the [type](#series.tema.type) option is not specified, it
- * is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.tema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @apioption series.trix
- */
- ''; // to include the above in the js output
- return TRIXIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/APO/APOIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var EMAIndicator = SeriesRegistry.seriesTypes.ema;
- var extend = U.extend,
- merge = U.merge,
- error = U.error;
- /* *
- *
- * Class
- *
- * */
- /**
- * The APO series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.apo
- *
- * @augments Highcharts.Series
- */
- var APOIndicator = /** @class */ (function (_super) {
- __extends(APOIndicator, _super);
- function APOIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- APOIndicator.prototype.getValues = function (series, params) {
- var periods = params.periods,
- index = params.index,
- // 0- date, 1- Absolute price oscillator
- APO = [],
- xData = [],
- yData = [],
- periodsOffset,
- // Shorter Period EMA
- SPE,
- // Longer Period EMA
- LPE,
- oscillator,
- i;
- // Check if periods are correct
- if (periods.length !== 2 || periods[1] <= periods[0]) {
- error('Error: "APO requires two periods. Notice, first period ' +
- 'should be lower than the second one."');
- return;
- }
- SPE = EMAIndicator.prototype.getValues.call(this, series, {
- index: index,
- period: periods[0]
- });
- LPE = EMAIndicator.prototype.getValues.call(this, series, {
- index: index,
- period: periods[1]
- });
- // Check if ema is calculated properly, if not skip
- if (!SPE || !LPE) {
- return;
- }
- periodsOffset = periods[1] - periods[0];
- for (i = 0; i < LPE.yData.length; i++) {
- oscillator = (SPE.yData[i + periodsOffset] -
- LPE.yData[i]);
- APO.push([LPE.xData[i], oscillator]);
- xData.push(LPE.xData[i]);
- yData.push(oscillator);
- }
- return {
- values: APO,
- xData: xData,
- yData: yData
- };
- };
- APOIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- RequiredIndicatorMixin.isParentLoaded(EMAIndicator, 'ema', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- /**
- * Absolute Price Oscillator. This series requires the `linkedTo` option to
- * be set and should be loaded after the `stock/indicators/indicators.js`
- * and `stock/indicators/ema.js`.
- *
- * @sample {highstock} stock/indicators/apo
- * Absolute Price Oscillator
- *
- * @extends plotOptions.ema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, joinBy, keys, navigatorOptions,
- * pointInterval, pointIntervalUnit, pointPlacement,
- * pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/apo
- * @optionparent plotOptions.apo
- */
- APOIndicator.defaultOptions = merge(EMAIndicator.defaultOptions, {
- /**
- * Paramters used in calculation of Absolute Price Oscillator
- * series points.
- *
- * @excluding period
- */
- params: {
- /**
- * Periods for Absolute Price Oscillator calculations.
- *
- * @type {Array<number>}
- * @default [10, 20]
- * @since 7.0.0
- */
- periods: [10, 20]
- }
- });
- return APOIndicator;
- }(EMAIndicator));
- extend(APOIndicator.prototype, {
- nameBase: 'APO',
- nameComponents: ['periods']
- });
- SeriesRegistry.registerSeriesType('apo', APOIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * An `Absolute Price Oscillator` series. If the [type](#series.apo.type) option
- * is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.apo
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, dataParser, dataURL, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/apo
- * @apioption series.apo
- */
- ''; // to include the above in the js output
- return APOIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/IKH/IKHIndicator.js', [_modules['Core/Color/Color.js'], _modules['Core/Globals.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (Color, H, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var color = Color.parse;
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var defined = U.defined,
- extend = U.extend,
- isArray = U.isArray,
- merge = U.merge,
- objectEach = U.objectEach;
- /* eslint-disable require-jsdoc */
- // Utils:
- function maxHigh(arr) {
- return arr.reduce(function (max, res) {
- return Math.max(max, res[1]);
- }, -Infinity);
- }
- function minLow(arr) {
- return arr.reduce(function (min, res) {
- return Math.min(min, res[2]);
- }, Infinity);
- }
- function highlowLevel(arr) {
- return {
- high: maxHigh(arr),
- low: minLow(arr)
- };
- }
- function getClosestPointRange(axis) {
- var closestDataRange,
- loopLength,
- distance,
- xData,
- i;
- axis.series.forEach(function (series) {
- if (series.xData) {
- xData = series.xData;
- loopLength = series.xIncrement ? 1 : xData.length - 1;
- for (i = loopLength; i > 0; i--) {
- distance = xData[i] - xData[i - 1];
- if (typeof closestDataRange === 'undefined' ||
- distance < closestDataRange) {
- closestDataRange = distance;
- }
- }
- }
- });
- return closestDataRange;
- }
- // Check two lines intersection (line a1-a2 and b1-b2)
- // Source: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
- function checkLineIntersection(a1, a2, b1, b2) {
- if (a1 && a2 && b1 && b2) {
- var saX = a2.plotX - a1.plotX, // Auxiliary section a2-a1 X
- saY = a2.plotY - a1.plotY, // Auxiliary section a2-a1 Y
- sbX = b2.plotX - b1.plotX, // Auxiliary section b2-b1 X
- sbY = b2.plotY - b1.plotY, // Auxiliary section b2-b1 Y
- sabX = a1.plotX - b1.plotX, // Auxiliary section a1-b1 X
- sabY = a1.plotY - b1.plotY, // Auxiliary section a1-b1 Y
- // First degree Bézier parameters
- u,
- t;
- u = (-saY * sabX + saX * sabY) / (-sbX * saY + saX * sbY);
- t = (sbX * sabY - sbY * sabX) / (-sbX * saY + saX * sbY);
- if (u >= 0 && u <= 1 && t >= 0 && t <= 1) {
- return {
- plotX: a1.plotX + t * saX,
- plotY: a1.plotY + t * saY
- };
- }
- }
- return false;
- }
- // Parameter opt (indicator options object) include indicator, points,
- // nextPoints, color, options, gappedExtend and graph properties
- function drawSenkouSpan(opt) {
- var indicator = opt.indicator;
- indicator.points = opt.points;
- indicator.nextPoints = opt.nextPoints;
- indicator.color = opt.color;
- indicator.options = merge(opt.options.senkouSpan.styles, opt.gap);
- indicator.graph = opt.graph;
- indicator.fillGraph = true;
- SeriesRegistry.seriesTypes.sma.prototype.drawGraph.call(indicator);
- }
- // Data integrity in Ichimoku is different than default 'averages':
- // Point: [undefined, value, value, ...] is correct
- // Point: [undefined, undefined, undefined, ...] is incorrect
- H.approximations['ichimoku-averages'] = function () {
- var ret = [],
- isEmptyRange;
- [].forEach.call(arguments, function (arr, i) {
- ret.push(H.approximations.average(arr));
- isEmptyRange = !isEmptyRange && typeof ret[i] === 'undefined';
- });
- // Return undefined when first elem. is undefined and let
- // sum method handle null (#7377)
- return isEmptyRange ? void 0 : ret;
- };
- /* eslint-enable require-jsdoc */
- /**
- * The IKH series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.ikh
- *
- * @augments Highcharts.Series
- */
- /* *
- *
- * Class
- *
- * */
- var IKHIndicator = /** @class */ (function (_super) {
- __extends(IKHIndicator, _super);
- function IKHIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- _this.graphCollection = void 0;
- _this.graphsenkouSpan = void 0;
- _this.ikhMap = void 0;
- _this.nextPoints = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- IKHIndicator.prototype.init = function () {
- SeriesRegistry.seriesTypes.sma.prototype.init.apply(this, arguments);
- // Set default color for lines:
- this.options = merge({
- tenkanLine: {
- styles: {
- lineColor: this.color
- }
- },
- kijunLine: {
- styles: {
- lineColor: this.color
- }
- },
- chikouLine: {
- styles: {
- lineColor: this.color
- }
- },
- senkouSpanA: {
- styles: {
- lineColor: this.color,
- fill: color(this.color).setOpacity(0.5).get()
- }
- },
- senkouSpanB: {
- styles: {
- lineColor: this.color,
- fill: color(this.color).setOpacity(0.5).get()
- }
- },
- senkouSpan: {
- styles: {
- fill: color(this.color).setOpacity(0.2).get()
- }
- }
- }, this.options);
- };
- IKHIndicator.prototype.toYData = function (point) {
- return [
- point.tenkanSen,
- point.kijunSen,
- point.chikouSpan,
- point.senkouSpanA,
- point.senkouSpanB
- ];
- };
- IKHIndicator.prototype.translate = function () {
- var indicator = this;
- SeriesRegistry.seriesTypes.sma.prototype.translate.apply(indicator);
- indicator.points.forEach(function (point) {
- indicator.pointArrayMap.forEach(function (value) {
- if (defined(point[value])) {
- point['plot' + value] = indicator.yAxis.toPixels(point[value], true);
- // Add extra parameters for support tooltip in moved
- // lines
- point.plotY = point['plot' + value];
- point.tooltipPos = [
- point.plotX,
- point['plot' + value]
- ];
- point.isNull = false;
- }
- });
- });
- };
- IKHIndicator.prototype.drawGraph = function () {
- var indicator = this,
- mainLinePoints = indicator.points,
- pointsLength = mainLinePoints.length,
- mainLineOptions = indicator.options,
- mainLinePath = indicator.graph,
- mainColor = indicator.color,
- gappedExtend = {
- options: {
- gapSize: mainLineOptions.gapSize
- }
- },
- pointArrayMapLength = indicator.pointArrayMap.length,
- allIchimokuPoints = [
- [],
- [],
- [],
- [],
- [],
- []
- ],
- ikhMap = {
- tenkanLine: allIchimokuPoints[0],
- kijunLine: allIchimokuPoints[1],
- chikouLine: allIchimokuPoints[2],
- senkouSpanA: allIchimokuPoints[3],
- senkouSpanB: allIchimokuPoints[4],
- senkouSpan: allIchimokuPoints[5]
- },
- intersectIndexColl = [],
- senkouSpanOptions = indicator
- .options.senkouSpan,
- color = senkouSpanOptions.color ||
- senkouSpanOptions.styles.fill,
- negativeColor = senkouSpanOptions.negativeColor,
- // Points to create color and negativeColor senkouSpan
- points = [
- [],
- [] // Points negative color
- ],
- // For span, we need an access to the next points, used in
- // getGraphPath()
- nextPoints = [
- [],
- [] // NextPoints negative color
- ],
- lineIndex = 0,
- position,
- point,
- i,
- startIntersect,
- endIntersect,
- sectionPoints,
- sectionNextPoints,
- pointsPlotYSum,
- nextPointsPlotYSum,
- senkouSpanTempColor,
- concatArrIndex,
- j,
- k;
- indicator.ikhMap = ikhMap;
- // Generate points for all lines and spans lines:
- while (pointsLength--) {
- point = mainLinePoints[pointsLength];
- for (i = 0; i < pointArrayMapLength; i++) {
- position = indicator.pointArrayMap[i];
- if (defined(point[position])) {
- allIchimokuPoints[i].push({
- plotX: point.plotX,
- plotY: point['plot' + position],
- isNull: false
- });
- }
- }
- if (negativeColor && pointsLength !== mainLinePoints.length - 1) {
- // Check if lines intersect
- var index = ikhMap.senkouSpanB.length - 1,
- intersect = checkLineIntersection(ikhMap.senkouSpanA[index - 1],
- ikhMap.senkouSpanA[index],
- ikhMap.senkouSpanB[index - 1],
- ikhMap.senkouSpanB[index]),
- intersectPointObj = {
- plotX: intersect.plotX,
- plotY: intersect.plotY,
- isNull: false,
- intersectPoint: true
- };
- if (intersect) {
- // Add intersect point to ichimoku points collection
- // Create senkouSpan sections
- ikhMap.senkouSpanA.splice(index, 0, intersectPointObj);
- ikhMap.senkouSpanB.splice(index, 0, intersectPointObj);
- intersectIndexColl.push(index);
- }
- }
- }
- // Modify options and generate lines:
- objectEach(ikhMap, function (values, lineName) {
- if (mainLineOptions[lineName] &&
- lineName !== 'senkouSpan') {
- // First line is rendered by default option
- indicator.points = allIchimokuPoints[lineIndex];
- indicator.options = merge(mainLineOptions[lineName].styles, gappedExtend);
- indicator.graph = indicator['graph' + lineName];
- indicator.fillGraph = false;
- indicator.color = mainColor;
- SeriesRegistry.seriesTypes.sma.prototype.drawGraph.call(indicator);
- // Now save line
- indicator['graph' + lineName] = indicator.graph;
- }
- lineIndex++;
- });
- // Generate senkouSpan area:
- // If graphColection exist then remove svg
- // element and indicator property
- if (indicator.graphCollection) {
- indicator.graphCollection.forEach(function (graphName) {
- indicator[graphName].destroy();
- delete indicator[graphName];
- });
- }
- // Clean grapCollection or initialize it
- indicator.graphCollection = [];
- // When user set negativeColor property
- if (negativeColor && ikhMap.senkouSpanA[0] && ikhMap.senkouSpanB[0]) {
- // Add first and last point to senkouSpan area sections
- intersectIndexColl.unshift(0);
- intersectIndexColl.push(ikhMap.senkouSpanA.length - 1);
- // Populate points and nextPoints arrays
- for (j = 0; j < intersectIndexColl.length - 1; j++) {
- startIntersect = intersectIndexColl[j];
- endIntersect = intersectIndexColl[j + 1];
- sectionPoints = ikhMap.senkouSpanB.slice(startIntersect, endIntersect + 1);
- sectionNextPoints = ikhMap.senkouSpanA.slice(startIntersect, endIntersect + 1);
- // Add points to color or negativeColor arrays
- // Check the middle point (if exist)
- if (Math.floor(sectionPoints.length / 2) >= 1) {
- var x = Math.floor(sectionPoints.length / 2);
- // When middle points has equal values
- // Compare all ponints plotY value sum
- if (sectionPoints[x].plotY === sectionNextPoints[x].plotY) {
- pointsPlotYSum = 0;
- nextPointsPlotYSum = 0;
- for (k = 0; k < sectionPoints.length; k++) {
- pointsPlotYSum += sectionPoints[k].plotY;
- nextPointsPlotYSum += sectionNextPoints[k].plotY;
- }
- concatArrIndex =
- pointsPlotYSum > nextPointsPlotYSum ? 0 : 1;
- points[concatArrIndex] = points[concatArrIndex].concat(sectionPoints);
- nextPoints[concatArrIndex] = nextPoints[concatArrIndex].concat(sectionNextPoints);
- }
- else {
- // Compare middle point of the section
- concatArrIndex =
- sectionPoints[x].plotY > sectionNextPoints[x].plotY ? 0 : 1;
- points[concatArrIndex] = points[concatArrIndex].concat(sectionPoints);
- nextPoints[concatArrIndex] = nextPoints[concatArrIndex].concat(sectionNextPoints);
- }
- }
- else {
- // Compare first point of the section
- concatArrIndex =
- sectionPoints[0].plotY > sectionNextPoints[0].plotY ? 0 : 1;
- points[concatArrIndex] = points[concatArrIndex].concat(sectionPoints);
- nextPoints[concatArrIndex] = nextPoints[concatArrIndex].concat(sectionNextPoints);
- }
- }
- // Render color and negativeColor paths
- ['graphsenkouSpanColor', 'graphsenkouSpanNegativeColor'].forEach(function (areaName, i) {
- if (points[i].length && nextPoints[i].length) {
- senkouSpanTempColor = i === 0 ? color : negativeColor;
- drawSenkouSpan({
- indicator: indicator,
- points: points[i],
- nextPoints: nextPoints[i],
- color: senkouSpanTempColor,
- options: mainLineOptions,
- gap: gappedExtend,
- graph: indicator[areaName]
- });
- // Now save line
- indicator[areaName] = indicator.graph;
- indicator.graphCollection.push(areaName);
- }
- });
- }
- else {
- // When user set only senkouSpan style.fill property
- drawSenkouSpan({
- indicator: indicator,
- points: ikhMap.senkouSpanB,
- nextPoints: ikhMap.senkouSpanA,
- color: color,
- options: mainLineOptions,
- gap: gappedExtend,
- graph: indicator.graphsenkouSpan
- });
- // Now save line
- indicator.graphsenkouSpan = indicator.graph;
- }
- // Clean temporary properties:
- delete indicator.nextPoints;
- delete indicator.fillGraph;
- // Restore options and draw the Tenkan line:
- indicator.points = mainLinePoints;
- indicator.options = mainLineOptions;
- indicator.graph = mainLinePath;
- indicator.color = mainColor;
- };
- IKHIndicator.prototype.getGraphPath = function (points) {
- var indicator = this,
- path = [],
- spanA,
- spanAarr = [];
- points = points || this.points;
- // Render Senkou Span
- if (indicator.fillGraph && indicator.nextPoints) {
- spanA = SeriesRegistry.seriesTypes.sma.prototype.getGraphPath.call(indicator,
- // Reverse points, so Senkou Span A will start from the end:
- indicator.nextPoints);
- if (spanA && spanA.length) {
- spanA[0][0] = 'L';
- path = SeriesRegistry.seriesTypes.sma.prototype.getGraphPath.call(indicator, points);
- spanAarr = spanA.slice(0, path.length);
- for (var i = spanAarr.length - 1; i >= 0; i--) {
- path.push(spanAarr[i]);
- }
- }
- }
- else {
- path = SeriesRegistry.seriesTypes.sma.prototype.getGraphPath.apply(indicator, arguments);
- }
- return path;
- };
- IKHIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- periodTenkan = params.periodTenkan,
- periodSenkouSpanB = params.periodSenkouSpanB,
- xVal = series.xData,
- yVal = series.yData,
- xAxis = series.xAxis,
- yValLen = (yVal && yVal.length) || 0,
- closestPointRange = getClosestPointRange(xAxis),
- IKH = [],
- xData = [],
- dateStart,
- date,
- slicedTSY,
- slicedKSY,
- slicedSSBY,
- pointTS,
- pointKS,
- pointSSB,
- i,
- TS,
- KS,
- CS,
- SSA,
- SSB;
- // Ikh requires close value
- if (xVal.length <= period ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- // Add timestamps at the beginning
- dateStart = xVal[0] - period * closestPointRange;
- for (i = 0; i < period; i++) {
- xData.push(dateStart + i * closestPointRange);
- }
- for (i = 0; i < yValLen; i++) {
- // Tenkan Sen
- if (i >= periodTenkan) {
- slicedTSY = yVal.slice(i - periodTenkan, i);
- pointTS = highlowLevel(slicedTSY);
- TS = (pointTS.high + pointTS.low) / 2;
- }
- if (i >= period) {
- slicedKSY = yVal.slice(i - period, i);
- pointKS = highlowLevel(slicedKSY);
- KS = (pointKS.high + pointKS.low) / 2;
- SSA = (TS + KS) / 2;
- }
- if (i >= periodSenkouSpanB) {
- slicedSSBY = yVal.slice(i - periodSenkouSpanB, i);
- pointSSB = highlowLevel(slicedSSBY);
- SSB = (pointSSB.high + pointSSB.low) / 2;
- }
- CS = yVal[i][3];
- date = xVal[i];
- if (typeof IKH[i] === 'undefined') {
- IKH[i] = [];
- }
- if (typeof IKH[i + period] === 'undefined') {
- IKH[i + period] = [];
- }
- IKH[i + period][0] = TS;
- IKH[i + period][1] = KS;
- IKH[i + period][2] = void 0;
- IKH[i][2] = CS;
- if (i <= period) {
- IKH[i + period][3] = void 0;
- IKH[i + period][4] = void 0;
- }
- if (typeof IKH[i + 2 * period] === 'undefined') {
- IKH[i + 2 * period] = [];
- }
- IKH[i + 2 * period][3] = SSA;
- IKH[i + 2 * period][4] = SSB;
- xData.push(date);
- }
- // Add timestamps for further points
- for (i = 1; i <= period; i++) {
- xData.push(date + i * closestPointRange);
- }
- return {
- values: IKH,
- xData: xData,
- yData: IKH
- };
- };
- /**
- * Ichimoku Kinko Hyo (IKH). This series requires `linkedTo` option to be
- * set.
- *
- * @sample stock/indicators/ichimoku-kinko-hyo
- * Ichimoku Kinko Hyo indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ichimoku-kinko-hyo
- * @optionparent plotOptions.ikh
- */
- IKHIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 26,
- /**
- * The base period for Tenkan calculations.
- */
- periodTenkan: 9,
- /**
- * The base period for Senkou Span B calculations
- */
- periodSenkouSpanB: 52
- },
- marker: {
- enabled: false
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
- 'TENKAN SEN: {point.tenkanSen:.3f}<br/>' +
- 'KIJUN SEN: {point.kijunSen:.3f}<br/>' +
- 'CHIKOU SPAN: {point.chikouSpan:.3f}<br/>' +
- 'SENKOU SPAN A: {point.senkouSpanA:.3f}<br/>' +
- 'SENKOU SPAN B: {point.senkouSpanB:.3f}<br/>'
- },
- /**
- * The styles for Tenkan line
- */
- tenkanLine: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * The styles for Kijun line
- */
- kijunLine: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * The styles for Chikou line
- */
- chikouLine: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * The styles for Senkou Span A line
- */
- senkouSpanA: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * The styles for Senkou Span B line
- */
- senkouSpanB: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * The styles for area between Senkou Span A and B.
- */
- senkouSpan: {
- /**
- * Color of the area between Senkou Span A and B,
- * when Senkou Span A is above Senkou Span B. Note that if
- * a `style.fill` is defined, the `color` takes precedence and
- * the `style.fill` is ignored.
- *
- * @see [senkouSpan.styles.fill](#series.ikh.senkouSpan.styles.fill)
- *
- * @sample stock/indicators/ichimoku-kinko-hyo
- * Ichimoku Kinko Hyo color
- *
- * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
- * @since 7.0.0
- * @apioption plotOptions.ikh.senkouSpan.color
- */
- /**
- * Color of the area between Senkou Span A and B,
- * when Senkou Span A is under Senkou Span B.
- *
- * @sample stock/indicators/ikh-negative-color
- * Ichimoku Kinko Hyo negativeColor
- *
- * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
- * @since 7.0.0
- * @apioption plotOptions.ikh.senkouSpan.negativeColor
- */
- styles: {
- /**
- * Color of the area between Senkou Span A and B.
- *
- * @deprecated
- * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
- */
- fill: 'rgba(255, 0, 0, 0.5)'
- }
- },
- dataGrouping: {
- approximation: 'ichimoku-averages'
- }
- });
- return IKHIndicator;
- }(SMAIndicator));
- extend(IKHIndicator.prototype, {
- pointArrayMap: [
- 'tenkanSen',
- 'kijunSen',
- 'chikouSpan',
- 'senkouSpanA',
- 'senkouSpanB'
- ],
- pointValKey: 'tenkanSen',
- nameComponents: ['periodSenkouSpanB', 'period', 'periodTenkan']
- });
- SeriesRegistry.registerSeriesType('ikh', IKHIndicator);
- /**
- * A `IKH` series. If the [type](#series.ikh.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.ikh
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ichimoku-kinko-hyo
- * @apioption series.ikh
- */
- (''); // add doclet above to transpiled file
- return IKHIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/KeltnerChannels/KeltnerChannelsIndicator.js', [_modules['Mixins/MultipleLines.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (MultipleLinesMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var _a = SeriesRegistry.seriesTypes,
- SMAIndicator = _a.sma,
- EMAIndicator = _a.ema,
- ATRIndicator = _a.atr;
- var correctFloat = U.correctFloat,
- extend = U.extend,
- merge = U.merge;
- /**
- * The Keltner Channels series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.keltnerchannels
- *
- * @augments Highcharts.Series
- */
- var KeltnerChannelsIndicator = /** @class */ (function (_super) {
- __extends(KeltnerChannelsIndicator, _super);
- function KeltnerChannelsIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- KeltnerChannelsIndicator.prototype.init = function () {
- SeriesRegistry.seriesTypes.sma.prototype.init.apply(this, arguments);
- // Set default color for lines:
- this.options = merge({
- topLine: {
- styles: {
- lineColor: this.color
- }
- },
- bottomLine: {
- styles: {
- lineColor: this.color
- }
- }
- }, this.options);
- };
- KeltnerChannelsIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- periodATR = params.periodATR,
- multiplierATR = params.multiplierATR,
- index = params.index,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- // Keltner Channels array structure:
- // 0-date, 1-top line, 2-middle line, 3-bottom line
- KC = [],
- // middle line, top line and bottom lineI
- ML,
- TL,
- BL,
- date,
- seriesEMA = SeriesRegistry.seriesTypes.ema.prototype.getValues(series, {
- period: period,
- index: index
- }),
- seriesATR = SeriesRegistry.seriesTypes.atr.prototype.getValues(series, {
- period: periodATR
- }),
- pointEMA,
- pointATR,
- xData = [],
- yData = [],
- i;
- if (yValLen < period) {
- return;
- }
- for (i = period; i <= yValLen; i++) {
- pointEMA = seriesEMA.values[i - period];
- pointATR = seriesATR.values[i - periodATR];
- date = pointEMA[0];
- TL = correctFloat(pointEMA[1] + (multiplierATR * pointATR[1]));
- BL = correctFloat(pointEMA[1] - (multiplierATR * pointATR[1]));
- ML = pointEMA[1];
- KC.push([date, TL, ML, BL]);
- xData.push(date);
- yData.push([TL, ML, BL]);
- }
- return {
- values: KC,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Keltner Channels. This series requires the `linkedTo` option to be set
- * and should be loaded after the `stock/indicators/indicators.js`,
- * `stock/indicators/atr.js`, and `stock/ema/.js`.
- *
- * @sample {highstock} stock/indicators/keltner-channels
- * Keltner Channels
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart,showInNavigator,
- * stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/keltner-channels
- * @optionparent plotOptions.keltnerchannels
- */
- KeltnerChannelsIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 20,
- /**
- * The ATR period.
- */
- periodATR: 10,
- /**
- * The ATR multiplier.
- */
- multiplierATR: 2
- },
- /**
- * Bottom line options.
- *
- */
- bottomLine: {
- /**
- * Styles for a bottom line.
- *
- */
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line. If not set, it's inherited from
- * `plotOptions.keltnerchannels.color`
- */
- lineColor: void 0
- }
- },
- /**
- * Top line options.
- *
- * @extends plotOptions.keltnerchannels.bottomLine
- */
- topLine: {
- styles: {
- lineWidth: 1,
- lineColor: void 0
- }
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span><b> {series.name}</b><br/>Upper Channel: {point.top}<br/>EMA({series.options.params.period}): {point.middle}<br/>Lower Channel: {point.bottom}<br/>'
- },
- marker: {
- enabled: false
- },
- dataGrouping: {
- approximation: 'averages'
- },
- lineWidth: 1
- });
- return KeltnerChannelsIndicator;
- }(SMAIndicator));
- extend(KeltnerChannelsIndicator.prototype, {
- pointArrayMap: ['top', 'middle', 'bottom'],
- pointValKey: 'middle',
- nameBase: 'Keltner Channels',
- nameComponents: ['period', 'periodATR', 'multiplierATR'],
- linesApiNames: ['topLine', 'bottomLine'],
- requiredIndicators: ['ema', 'atr'],
- drawGraph: MultipleLinesMixin.drawGraph,
- getTranslatedLinesNames: MultipleLinesMixin.getTranslatedLinesNames,
- translate: MultipleLinesMixin.translate,
- toYData: MultipleLinesMixin.toYData
- });
- SeriesRegistry.registerSeriesType('keltnerchannels', KeltnerChannelsIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A Keltner Channels indicator. If the [type](#series.keltnerchannels.type)
- * option is not specified, it is inherited from[chart.type](#chart.type).
- *
- * @extends series,plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval,
- * pointIntervalUnit, pointPlacement, pointRange, pointStart,
- * stacking, showInNavigator
- * @requires stock/indicators/indicators
- * @requires stock/indicators/keltner-channels
- * @apioption series.keltnerchannels
- */
- ''; // to include the above in the js output
- return KeltnerChannelsIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/MACD/MACDIndicator.js', [_modules['Core/Globals.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (H, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var noop = H.noop;
- var _a = SeriesRegistry.seriesTypes,
- SMAIndicator = _a.sma,
- EMAIndicator = _a.ema,
- ColumnSeries = _a.column;
- var extend = U.extend,
- correctFloat = U.correctFloat,
- defined = U.defined,
- merge = U.merge;
- /**
- *
- * Class
- *
- */
- /**
- * The MACD series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.macd
- *
- * @augments Highcharts.Series
- */
- var MACDIndicator = /** @class */ (function (_super) {
- __extends(MACDIndicator, _super);
- function MACDIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /**
- *
- * Properties
- *
- */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- _this.currentLineZone = void 0;
- _this.graphmacd = void 0;
- _this.graphsignal = void 0;
- _this.macdZones = void 0;
- _this.signalZones = void 0;
- return _this;
- }
- /**
- *
- * Functions
- *
- */
- MACDIndicator.prototype.init = function () {
- SeriesRegistry.seriesTypes.sma.prototype.init.apply(this, arguments);
- // Check whether series is initialized. It may be not initialized,
- // when any of required indicators is missing.
- if (this.options) {
- // Set default color for a signal line and the histogram:
- this.options = merge({
- signalLine: {
- styles: {
- lineColor: this.color
- }
- },
- macdLine: {
- styles: {
- color: this.color
- }
- }
- }, this.options);
- // Zones have indexes automatically calculated, we need to
- // translate them to support multiple lines within one indicator
- this.macdZones = {
- zones: this.options.macdLine.zones,
- startIndex: 0
- };
- this.signalZones = {
- zones: this.macdZones.zones.concat(this.options.signalLine.zones),
- startIndex: this.macdZones.zones.length
- };
- this.resetZones = true;
- }
- };
- MACDIndicator.prototype.toYData = function (point) {
- return [point.y, point.signal, point.MACD];
- };
- MACDIndicator.prototype.translate = function () {
- var indicator = this, plotNames = ['plotSignal', 'plotMACD'];
- H.seriesTypes.column.prototype.translate.apply(indicator);
- indicator.points.forEach(function (point) {
- [point.signal, point.MACD].forEach(function (value, i) {
- if (value !== null) {
- point[plotNames[i]] =
- indicator.yAxis.toPixels(value, true);
- }
- });
- });
- };
- MACDIndicator.prototype.destroy = function () {
- // this.graph is null due to removing two times the same SVG element
- this.graph = null;
- this.graphmacd = this.graphmacd && this.graphmacd.destroy();
- this.graphsignal = this.graphsignal && this.graphsignal.destroy();
- SeriesRegistry.seriesTypes.sma.prototype.destroy.apply(this, arguments);
- };
- MACDIndicator.prototype.drawGraph = function () {
- var indicator = this,
- mainLinePoints = indicator.points,
- pointsLength = mainLinePoints.length,
- mainLineOptions = indicator.options,
- histogramZones = indicator.zones,
- gappedExtend = {
- options: {
- gapSize: mainLineOptions.gapSize
- }
- },
- otherSignals = [[],
- []],
- point;
- // Generate points for top and bottom lines:
- while (pointsLength--) {
- point = mainLinePoints[pointsLength];
- if (defined(point.plotMACD)) {
- otherSignals[0].push({
- plotX: point.plotX,
- plotY: point.plotMACD,
- isNull: !defined(point.plotMACD)
- });
- }
- if (defined(point.plotSignal)) {
- otherSignals[1].push({
- plotX: point.plotX,
- plotY: point.plotSignal,
- isNull: !defined(point.plotMACD)
- });
- }
- }
- // Modify options and generate smoothing line:
- ['macd', 'signal'].forEach(function (lineName, i) {
- indicator.points = otherSignals[i];
- indicator.options = merge(mainLineOptions[lineName + 'Line'].styles, gappedExtend);
- indicator.graph = indicator['graph' + lineName];
- // Zones extension:
- indicator.currentLineZone = lineName + 'Zones';
- indicator.zones =
- indicator[indicator.currentLineZone].zones;
- SeriesRegistry.seriesTypes.sma.prototype.drawGraph.call(indicator);
- indicator['graph' + lineName] = indicator.graph;
- });
- // Restore options:
- indicator.points = mainLinePoints;
- indicator.options = mainLineOptions;
- indicator.zones = histogramZones;
- indicator.currentLineZone = null;
- // indicator.graph = null;
- };
- MACDIndicator.prototype.getZonesGraphs = function (props) {
- var allZones = _super.prototype.getZonesGraphs.call(this,
- props),
- currentZones = allZones;
- if (this.currentLineZone) {
- currentZones = allZones.splice(this[this.currentLineZone].startIndex + 1);
- if (!currentZones.length) {
- // Line has no zones, return basic graph "zone"
- currentZones = [props[0]];
- }
- else {
- // Add back basic prop:
- currentZones.splice(0, 0, props[0]);
- }
- }
- return currentZones;
- };
- MACDIndicator.prototype.applyZones = function () {
- // Histogram zones are handled by drawPoints method
- // Here we need to apply zones for all lines
- var histogramZones = this.zones;
- // signalZones.zones contains all zones:
- this.zones = this.signalZones.zones;
- SeriesRegistry.seriesTypes.sma.prototype.applyZones.call(this);
- // applyZones hides only main series.graph, hide macd line manually
- if (this.graphmacd && this.options.macdLine.zones.length) {
- this.graphmacd.hide();
- }
- this.zones = histogramZones;
- };
- MACDIndicator.prototype.getValues = function (series, params) {
- var j = 0,
- MACD = [],
- xMACD = [],
- yMACD = [],
- signalLine = [],
- shortEMA,
- longEMA,
- i;
- if (series.xData.length <
- params.longPeriod + params.signalPeriod) {
- return;
- }
- // Calculating the short and long EMA used when calculating the MACD
- shortEMA = SeriesRegistry.seriesTypes.ema.prototype.getValues(series, {
- period: params.shortPeriod,
- index: params.index
- });
- longEMA = SeriesRegistry.seriesTypes.ema.prototype.getValues(series, {
- period: params.longPeriod,
- index: params.index
- });
- shortEMA = shortEMA.values;
- longEMA = longEMA.values;
- // Subtract each Y value from the EMA's and create the new dataset
- // (MACD)
- for (i = 1; i <= shortEMA.length; i++) {
- if (defined(longEMA[i - 1]) &&
- defined(longEMA[i - 1][1]) &&
- defined(shortEMA[i + params.shortPeriod + 1]) &&
- defined(shortEMA[i + params.shortPeriod + 1][0])) {
- MACD.push([
- shortEMA[i + params.shortPeriod + 1][0],
- 0,
- null,
- shortEMA[i + params.shortPeriod + 1][1] -
- longEMA[i - 1][1]
- ]);
- }
- }
- // Set the Y and X data of the MACD. This is used in calculating the
- // signal line.
- for (i = 0; i < MACD.length; i++) {
- xMACD.push(MACD[i][0]);
- yMACD.push([0, null, MACD[i][3]]);
- }
- // Setting the signalline (Signal Line: X-day EMA of MACD line).
- signalLine = SeriesRegistry.seriesTypes.ema.prototype.getValues({
- xData: xMACD,
- yData: yMACD
- }, {
- period: params.signalPeriod,
- index: 2
- });
- signalLine = signalLine.values;
- // Setting the MACD Histogram. In comparison to the loop with pure
- // MACD this loop uses MACD x value not xData.
- for (i = 0; i < MACD.length; i++) {
- // detect the first point
- if (MACD[i][0] >= signalLine[0][0]) {
- MACD[i][2] = signalLine[j][1];
- yMACD[i] = [0, signalLine[j][1], MACD[i][3]];
- if (MACD[i][3] === null) {
- MACD[i][1] = 0;
- yMACD[i][0] = 0;
- }
- else {
- MACD[i][1] = correctFloat(MACD[i][3] -
- signalLine[j][1]);
- yMACD[i][0] = correctFloat(MACD[i][3] -
- signalLine[j][1]);
- }
- j++;
- }
- }
- return {
- values: MACD,
- xData: xMACD,
- yData: yMACD
- };
- };
- /**
- * Moving Average Convergence Divergence (MACD). This series requires
- * `linkedTo` option to be set and should be loaded after the
- * `stock/indicators/indicators.js` and `stock/indicators/ema.js`.
- *
- * @sample stock/indicators/macd
- * MACD indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/macd
- * @optionparent plotOptions.macd
- */
- MACDIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- /**
- * The short period for indicator calculations.
- */
- shortPeriod: 12,
- /**
- * The long period for indicator calculations.
- */
- longPeriod: 26,
- /**
- * The base period for signal calculations.
- */
- signalPeriod: 9,
- period: 26
- },
- /**
- * The styles for signal line
- */
- signalLine: {
- /**
- * @sample stock/indicators/macd-zones
- * Zones in MACD
- *
- * @extends plotOptions.macd.zones
- */
- zones: [],
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * The styles for macd line
- */
- macdLine: {
- /**
- * @sample stock/indicators/macd-zones
- * Zones in MACD
- *
- * @extends plotOptions.macd.zones
- */
- zones: [],
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * @type {number|null}
- */
- threshold: 0,
- groupPadding: 0.1,
- pointPadding: 0.1,
- crisp: false,
- states: {
- hover: {
- halo: {
- size: 0
- }
- }
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
- 'Value: {point.MACD}<br/>' +
- 'Signal: {point.signal}<br/>' +
- 'Histogram: {point.y}<br/>'
- },
- dataGrouping: {
- approximation: 'averages'
- },
- minPointLength: 0
- });
- return MACDIndicator;
- }(SMAIndicator));
- extend(MACDIndicator.prototype, {
- nameComponents: ['longPeriod', 'shortPeriod', 'signalPeriod'],
- requiredIndicators: ['ema'],
- // "y" value is treated as Histogram data
- pointArrayMap: ['y', 'signal', 'MACD'],
- parallelArrays: ['x', 'y', 'signal', 'MACD'],
- pointValKey: 'y',
- // Columns support:
- markerAttribs: noop,
- getColumnMetrics: H.seriesTypes.column.prototype.getColumnMetrics,
- crispCol: H.seriesTypes.column.prototype.crispCol,
- drawPoints: H.seriesTypes.column.prototype.drawPoints
- });
- SeriesRegistry.registerSeriesType('macd', MACDIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `MACD` series. If the [type](#series.macd.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.macd
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/macd
- * @apioption series.macd
- */
- ''; // to include the above in the js output
- return MACDIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/MFI/MFIIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * Money Flow Index indicator for Highstock
- *
- * (c) 2010-2021 Grzegorz Blachliński
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- merge = U.merge,
- error = U.error,
- isArray = U.isArray;
- /* eslint-disable require-jsdoc */
- // Utils:
- function sumArray(array) {
- return array.reduce(function (prev, cur) {
- return prev + cur;
- });
- }
- function toFixed(a, n) {
- return parseFloat(a.toFixed(n));
- }
- function calculateTypicalPrice(point) {
- return (point[1] + point[2] + point[3]) / 3;
- }
- function calculateRawMoneyFlow(typicalPrice, volume) {
- return typicalPrice * volume;
- }
- /* eslint-enable require-jsdoc */
- /* *
- *
- * Class
- *
- * */
- /**
- * The MFI series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.mfi
- *
- * @augments Highcharts.Series
- */
- var MFIIndicator = /** @class */ (function (_super) {
- __extends(MFIIndicator, _super);
- function MFIIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- MFIIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- decimals = params.decimals,
- // MFI starts calculations from the second point
- // Cause we need to calculate change between two points
- range = 1,
- volumeSeries = series.chart.get(params.volumeSeriesID),
- yValVolume = (volumeSeries && volumeSeries.yData),
- MFI = [],
- isUp = false,
- xData = [],
- yData = [],
- positiveMoneyFlow = [],
- negativeMoneyFlow = [],
- newTypicalPrice,
- oldTypicalPrice,
- rawMoneyFlow,
- negativeMoneyFlowSum,
- positiveMoneyFlowSum,
- moneyFlowRatio,
- MFIPoint,
- i;
- if (!volumeSeries) {
- error('Series ' +
- params.volumeSeriesID +
- ' not found! Check `volumeSeriesID`.', true, series.chart);
- return;
- }
- // MFI requires high low and close values
- if ((xVal.length <= period) || !isArray(yVal[0]) ||
- yVal[0].length !== 4 ||
- !yValVolume) {
- return;
- }
- // Calculate first typical price
- newTypicalPrice = calculateTypicalPrice(yVal[range]);
- // Accumulate first N-points
- while (range < period + 1) {
- // Calculate if up or down
- oldTypicalPrice = newTypicalPrice;
- newTypicalPrice = calculateTypicalPrice(yVal[range]);
- isUp = newTypicalPrice >= oldTypicalPrice;
- // Calculate raw money flow
- rawMoneyFlow = calculateRawMoneyFlow(newTypicalPrice, yValVolume[range]);
- // Add to array
- positiveMoneyFlow.push(isUp ? rawMoneyFlow : 0);
- negativeMoneyFlow.push(isUp ? 0 : rawMoneyFlow);
- range++;
- }
- for (i = range - 1; i < yValLen; i++) {
- if (i > range - 1) {
- // Remove first point from array
- positiveMoneyFlow.shift();
- negativeMoneyFlow.shift();
- // Calculate if up or down
- oldTypicalPrice = newTypicalPrice;
- newTypicalPrice = calculateTypicalPrice(yVal[i]);
- isUp = newTypicalPrice > oldTypicalPrice;
- // Calculate raw money flow
- rawMoneyFlow = calculateRawMoneyFlow(newTypicalPrice, yValVolume[i]);
- // Add to array
- positiveMoneyFlow.push(isUp ? rawMoneyFlow : 0);
- negativeMoneyFlow.push(isUp ? 0 : rawMoneyFlow);
- }
- // Calculate sum of negative and positive money flow:
- negativeMoneyFlowSum = sumArray(negativeMoneyFlow);
- positiveMoneyFlowSum = sumArray(positiveMoneyFlow);
- moneyFlowRatio = positiveMoneyFlowSum / negativeMoneyFlowSum;
- MFIPoint = toFixed(100 - (100 / (1 + moneyFlowRatio)), decimals);
- MFI.push([xVal[i], MFIPoint]);
- xData.push(xVal[i]);
- yData.push(MFIPoint);
- }
- return {
- values: MFI,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Money Flow Index. This series requires `linkedTo` option to be set and
- * should be loaded after the `stock/indicators/indicators.js` file.
- *
- * @sample stock/indicators/mfi
- * Money Flow Index Indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/mfi
- * @optionparent plotOptions.mfi
- */
- MFIIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding index
- */
- params: {
- period: 14,
- /**
- * The id of volume series which is mandatory.
- * For example using OHLC data, volumeSeriesID='volume' means
- * the indicator will be calculated using OHLC and volume values.
- */
- volumeSeriesID: 'volume',
- /**
- * Number of maximum decimals that are used in MFI calculations.
- */
- decimals: 4
- }
- });
- return MFIIndicator;
- }(SMAIndicator));
- extend(MFIIndicator.prototype, {
- nameBase: 'Money Flow Index'
- });
- SeriesRegistry.registerSeriesType('mfi', MFIIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `MFI` series. If the [type](#series.mfi.type) option is not specified, it
- * is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.mfi
- * @since 6.0.0
- * @excluding dataParser, dataURL
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/mfi
- * @apioption series.mfi
- */
- ''; // to include the above in the js output
- return MFIIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/Momentum/MomentumIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- isArray = U.isArray,
- merge = U.merge;
- /* eslint-disable require-jsdoc */
- function populateAverage(points, xVal, yVal, i, period) {
- var mmY = yVal[i - 1][3] - yVal[i - period - 1][3],
- mmX = xVal[i - 1];
- points.shift(); // remove point until range < period
- return [mmX, mmY];
- }
- /* eslint-enable require-jsdoc */
- /**
- * The Momentum series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.momentum
- *
- * @augments Highcharts.Series
- */
- var MomentumIndicator = /** @class */ (function (_super) {
- __extends(MomentumIndicator, _super);
- function MomentumIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- MomentumIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- xValue = xVal[0],
- yValue = yVal[0],
- MM = [],
- xData = [],
- yData = [],
- index,
- i,
- points,
- MMPoint;
- if (xVal.length <= period) {
- return;
- }
- // Switch index for OHLC / Candlestick / Arearange
- if (isArray(yVal[0])) {
- yValue = yVal[0][3];
- }
- else {
- return;
- }
- // Starting point
- points = [
- [xValue, yValue]
- ];
- // Calculate value one-by-one for each period in visible data
- for (i = (period + 1); i < yValLen; i++) {
- MMPoint = populateAverage(points, xVal, yVal, i, period, index);
- MM.push(MMPoint);
- xData.push(MMPoint[0]);
- yData.push(MMPoint[1]);
- }
- MMPoint = populateAverage(points, xVal, yVal, i, period, index);
- MM.push(MMPoint);
- xData.push(MMPoint[0]);
- yData.push(MMPoint[1]);
- return {
- values: MM,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Momentum. This series requires `linkedTo` option to be set.
- *
- * @sample stock/indicators/momentum
- * Momentum indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/momentum
- * @optionparent plotOptions.momentum
- */
- MomentumIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 14
- }
- });
- return MomentumIndicator;
- }(SMAIndicator));
- extend(MomentumIndicator.prototype, {
- nameBase: 'Momentum'
- });
- SeriesRegistry.registerSeriesType('momentum', MomentumIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Momentum` series. If the [type](#series.momentum.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.momentum
- * @since 6.0.0
- * @excluding dataParser, dataURL
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/momentum
- * @apioption series.momentum
- */
- ''; // to include the above in the js output
- return MomentumIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/NATR/NATRIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var ATRIndicator = SeriesRegistry.seriesTypes.atr;
- var merge = U.merge,
- extend = U.extend;
- /**
- * The NATR series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.natr
- *
- * @augments Highcharts.Series
- */
- var NATRIndicator = /** @class */ (function (_super) {
- __extends(NATRIndicator, _super);
- function NATRIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /**
- * @lends Highcharts.Series#
- */
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.points = void 0;
- _this.options = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- NATRIndicator.prototype.getValues = function (series, params) {
- var atrData = (ATRIndicator.prototype.getValues.apply(this,
- arguments)),
- atrLength = atrData.values.length,
- period = params.period - 1,
- yVal = series.yData,
- i = 0;
- if (!atrData) {
- return;
- }
- for (; i < atrLength; i++) {
- atrData.yData[i] = (atrData.values[i][1] / yVal[period][3] * 100);
- atrData.values[i][1] = atrData.yData[i];
- period++;
- }
- return atrData;
- };
- /**
- * Normalized average true range indicator (NATR). This series requires
- * `linkedTo` option to be set and should be loaded after the
- * `stock/indicators/indicators.js` and `stock/indicators/atr.js`.
- *
- * @sample {highstock} stock/indicators/natr
- * NATR indicator
- *
- * @extends plotOptions.atr
- * @since 7.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/natr
- * @optionparent plotOptions.natr
- */
- NATRIndicator.defaultOptions = merge(ATRIndicator.defaultOptions, {
- tooltip: {
- valueSuffix: '%'
- }
- });
- return NATRIndicator;
- }(ATRIndicator));
- extend(NATRIndicator.prototype, {
- requiredIndicators: ['atr']
- });
- SeriesRegistry.registerSeriesType('natr', NATRIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `NATR` series. If the [type](#series.natr.type) option is not specified, it
- * is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.natr
- * @since 7.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/natr
- * @apioption series.natr
- */
- ''; // to include the above in the js output'
- return NATRIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/PivotPoints/PivotPointsPoint.js', [_modules['Core/Series/SeriesRegistry.js']], function (SeriesRegistry) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- /* eslint-disable valid-jsdoc */
- /**
- * @private
- */
- function destroyExtraLabels(point, functionName) {
- var props = point.series.pointArrayMap,
- prop,
- i = props.length;
- SeriesRegistry.seriesTypes.sma.prototype.pointClass.prototype[functionName].call(point);
- while (i--) {
- prop = 'dataLabel' + props[i];
- // S4 dataLabel could be removed by parent method:
- if (point[prop] && point[prop].element) {
- point[prop].destroy();
- }
- point[prop] = null;
- }
- }
- /* eslint-enable valid-jsdoc */
- /* *
- *
- * Class
- *
- * */
- var PivotPointsPoint = /** @class */ (function (_super) {
- __extends(PivotPointsPoint, _super);
- function PivotPointsPoint() {
- /**
- *
- * Properties
- *
- */
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.P = void 0;
- _this.pivotLine = void 0;
- _this.series = void 0;
- return _this;
- }
- /**
- *
- * Functions
- *
- */
- PivotPointsPoint.prototype.destroyElements = function () {
- destroyExtraLabels(this, 'destroyElements');
- };
- // This method is called when removing points, e.g. series.update()
- PivotPointsPoint.prototype.destroy = function () {
- destroyExtraLabels(this, 'destroyElements');
- };
- return PivotPointsPoint;
- }(SMAIndicator.prototype.pointClass));
- /* *
- *
- * Default Export
- *
- * */
- return PivotPointsPoint;
- });
- _registerModule(_modules, 'Stock/Indicators/PivotPoints/PivotPointsIndicator.js', [_modules['Stock/Indicators/PivotPoints/PivotPointsPoint.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (PivotPointsPoint, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var merge = U.merge,
- extend = U.extend,
- defined = U.defined,
- isArray = U.isArray;
- /**
- *
- * Class
- *
- **/
- /**
- * The Pivot Points series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.pivotpoints
- *
- * @augments Highcharts.Series
- */
- var PivotPointsIndicator = /** @class */ (function (_super) {
- __extends(PivotPointsIndicator, _super);
- function PivotPointsIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /**
- *
- * Properties
- *
- */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- _this.endPoint = void 0;
- _this.plotEndPoint = void 0;
- return _this;
- }
- /**
- *
- * Functions
- *
- */
- PivotPointsIndicator.prototype.toYData = function (point) {
- return [point.P]; // The rest should not affect extremes
- };
- PivotPointsIndicator.prototype.translate = function () {
- var indicator = this;
- SeriesRegistry.seriesTypes.sma.prototype.translate.apply(indicator);
- indicator.points.forEach(function (point) {
- indicator.pointArrayMap.forEach(function (value) {
- if (defined(point[value])) {
- point['plot' + value] = (indicator.yAxis.toPixels(point[value], true));
- }
- });
- });
- // Pivot points are rendered as horizontal lines
- // And last point start not from the next one (as it's the last one)
- // But from the approximated last position in a given range
- indicator.plotEndPoint = indicator.xAxis.toPixels(indicator.endPoint, true);
- };
- PivotPointsIndicator.prototype.getGraphPath = function (points) {
- var indicator = this,
- pointsLength = points.length,
- allPivotPoints = ([[],
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- []]),
- path = [],
- endPoint = indicator.plotEndPoint,
- pointArrayMapLength = indicator.pointArrayMap.length,
- position,
- point,
- i;
- while (pointsLength--) {
- point = points[pointsLength];
- for (i = 0; i < pointArrayMapLength; i++) {
- position = indicator.pointArrayMap[i];
- if (defined(point[position])) {
- allPivotPoints[i].push({
- // Start left:
- plotX: point.plotX,
- plotY: point['plot' + position],
- isNull: false
- }, {
- // Go to right:
- plotX: endPoint,
- plotY: point['plot' + position],
- isNull: false
- }, {
- // And add null points in path to generate breaks:
- plotX: endPoint,
- plotY: null,
- isNull: true
- });
- }
- }
- endPoint = point.plotX;
- }
- allPivotPoints.forEach(function (pivotPoints) {
- path = path.concat(SeriesRegistry.seriesTypes.sma.prototype.getGraphPath.call(indicator, pivotPoints));
- });
- return path;
- };
- // TODO: Rewrite this logic to use multiple datalabels
- PivotPointsIndicator.prototype.drawDataLabels = function () {
- var indicator = this,
- pointMapping = indicator.pointArrayMap,
- currentLabel,
- pointsLength,
- point,
- i;
- if (indicator.options.dataLabels.enabled) {
- pointsLength = indicator.points.length;
- // For every Ressitance/Support group we need to render labels.
- // Add one more item, which will just store dataLabels from
- // previous iteration
- pointMapping.concat([false]).forEach(function (position, k) {
- i = pointsLength;
- while (i--) {
- point = indicator.points[i];
- if (!position) {
- // Store S4 dataLabel too:
- point['dataLabel' + pointMapping[k - 1]] =
- point.dataLabel;
- }
- else {
- point.y = point[position];
- point.pivotLine = position;
- point.plotY = point['plot' + position];
- currentLabel = point['dataLabel' + position];
- // Store previous label
- if (k) {
- point['dataLabel' + pointMapping[k - 1]] = point.dataLabel;
- }
- if (!point.dataLabels) {
- point.dataLabels = [];
- }
- point.dataLabels[0] = point.dataLabel =
- currentLabel =
- currentLabel && currentLabel.element ?
- currentLabel :
- null;
- }
- }
- SeriesRegistry.seriesTypes.sma.prototype.drawDataLabels.apply(indicator, arguments);
- });
- }
- };
- PivotPointsIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- placement = this[params.algorithm + 'Placement'],
- // 0- from, 1- to, 2- R1, 3- R2, 4- pivot, 5- S1 etc.
- PP = [],
- endTimestamp,
- xData = [],
- yData = [],
- slicedXLen,
- slicedX,
- slicedY,
- lastPP,
- pivot,
- avg,
- i;
- // Pivot Points requires high, low and close values
- if (xVal.length < period ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- for (i = period + 1; i <= yValLen + period; i += period) {
- slicedX = xVal.slice(i - period - 1, i);
- slicedY = yVal.slice(i - period - 1, i);
- slicedXLen = slicedX.length;
- endTimestamp = slicedX[slicedXLen - 1];
- pivot = this.getPivotAndHLC(slicedY);
- avg = placement(pivot);
- lastPP = PP.push([endTimestamp]
- .concat(avg));
- xData.push(endTimestamp);
- yData.push(PP[lastPP - 1].slice(1));
- }
- // We don't know exact position in ordinal axis
- // So we use simple logic:
- // Get first point in last range, calculate visible average range
- // and multiply by period
- this.endPoint = slicedX[0] + ((endTimestamp - slicedX[0]) /
- slicedXLen) * period;
- return {
- values: PP,
- xData: xData,
- yData: yData
- };
- };
- PivotPointsIndicator.prototype.getPivotAndHLC = function (values) {
- var high = -Infinity,
- low = Infinity,
- close = values[values.length - 1][3],
- pivot;
- values.forEach(function (p) {
- high = Math.max(high, p[1]);
- low = Math.min(low, p[2]);
- });
- pivot = (high + low + close) / 3;
- return [pivot, high, low, close];
- };
- PivotPointsIndicator.prototype.standardPlacement = function (values) {
- var diff = values[1] - values[2],
- avg = [
- null,
- null,
- values[0] + diff,
- values[0] * 2 - values[2],
- values[0],
- values[0] * 2 - values[1],
- values[0] - diff,
- null,
- null
- ];
- return avg;
- };
- PivotPointsIndicator.prototype.camarillaPlacement = function (values) {
- var diff = values[1] - values[2],
- avg = [
- values[3] + diff * 1.5,
- values[3] + diff * 1.25,
- values[3] + diff * 1.1666,
- values[3] + diff * 1.0833,
- values[0],
- values[3] - diff * 1.0833,
- values[3] - diff * 1.1666,
- values[3] - diff * 1.25,
- values[3] - diff * 1.5
- ];
- return avg;
- };
- PivotPointsIndicator.prototype.fibonacciPlacement = function (values) {
- var diff = values[1] - values[2],
- avg = [
- null,
- values[0] + diff,
- values[0] + diff * 0.618,
- values[0] + diff * 0.382,
- values[0],
- values[0] - diff * 0.382,
- values[0] - diff * 0.618,
- values[0] - diff,
- null
- ];
- return avg;
- };
- /**
- * Pivot points indicator. This series requires the `linkedTo` option to be
- * set and should be loaded after `stock/indicators/indicators.js` file.
- *
- * @sample stock/indicators/pivot-points
- * Pivot points
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/pivotpoints
- * @optionparent plotOptions.pivotpoints
- */
- PivotPointsIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding index
- */
- params: {
- period: 28,
- /**
- * Algorithm used to calculate ressistance and support lines based
- * on pivot points. Implemented algorithms: `'standard'`,
- * `'fibonacci'` and `'camarilla'`
- */
- algorithm: 'standard'
- },
- marker: {
- enabled: false
- },
- enableMouseTracking: false,
- dataLabels: {
- enabled: true,
- format: '{point.pivotLine}'
- },
- dataGrouping: {
- approximation: 'averages'
- }
- });
- return PivotPointsIndicator;
- }(SMAIndicator));
- extend(PivotPointsIndicator.prototype, {
- nameBase: 'Pivot Points',
- pointArrayMap: ['R4', 'R3', 'R2', 'R1', 'P', 'S1', 'S2', 'S3', 'S4'],
- pointValKey: 'P',
- pointClass: PivotPointsPoint
- });
- /* *
- *
- * Registry
- *
- * */
- SeriesRegistry.registerSeriesType('pivotpoints', PivotPointsIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A pivot points indicator. If the [type](#series.pivotpoints.type) option is
- * not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.pivotpoints
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/pivotpoints
- * @apioption series.pivotpoints
- */
- ''; // to include the above in the js output'
- return PivotPointsIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/PPO/PPOIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var EMAIndicator = SeriesRegistry.seriesTypes.ema;
- var correctFloat = U.correctFloat,
- extend = U.extend,
- merge = U.merge,
- error = U.error;
- /* *
- *
- * Class
- *
- * */
- /**
- * The PPO series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.ppo
- *
- * @augments Highcharts.Series
- */
- var PPOIndicator = /** @class */ (function (_super) {
- __extends(PPOIndicator, _super);
- function PPOIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- PPOIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- RequiredIndicatorMixin.isParentLoaded(EMAIndicator, 'ema', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- PPOIndicator.prototype.getValues = function (series, params) {
- var periods = params.periods,
- index = params.index,
- // 0- date, 1- Percentage Price Oscillator
- PPO = [],
- xData = [],
- yData = [],
- periodsOffset,
- // Shorter Period EMA
- SPE,
- // Longer Period EMA
- LPE,
- oscillator,
- i;
- // Check if periods are correct
- if (periods.length !== 2 || periods[1] <= periods[0]) {
- error('Error: "PPO requires two periods. Notice, first period ' +
- 'should be lower than the second one."');
- return;
- }
- SPE = EMAIndicator.prototype.getValues.call(this, series, {
- index: index,
- period: periods[0]
- });
- LPE = EMAIndicator.prototype.getValues.call(this, series, {
- index: index,
- period: periods[1]
- });
- // Check if ema is calculated properly, if not skip
- if (!SPE || !LPE) {
- return;
- }
- periodsOffset = periods[1] - periods[0];
- for (i = 0; i < LPE.yData.length; i++) {
- oscillator = correctFloat((SPE.yData[i + periodsOffset] -
- LPE.yData[i]) /
- LPE.yData[i] *
- 100);
- PPO.push([LPE.xData[i], oscillator]);
- xData.push(LPE.xData[i]);
- yData.push(oscillator);
- }
- return {
- values: PPO,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Percentage Price Oscillator. This series requires the
- * `linkedTo` option to be set and should be loaded after the
- * `stock/indicators/indicators.js` and `stock/indicators/ema.js`.
- *
- * @sample {highstock} stock/indicators/ppo
- * Percentage Price Oscillator
- *
- * @extends plotOptions.ema
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, joinBy, keys, navigatorOptions,
- * pointInterval, pointIntervalUnit, pointPlacement,
- * pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/ppo
- * @optionparent plotOptions.ppo
- */
- PPOIndicator.defaultOptions = merge(EMAIndicator.defaultOptions, {
- /**
- * Paramters used in calculation of Percentage Price Oscillator series
- * points.
- *
- * @excluding period
- */
- params: {
- /**
- * Periods for Percentage Price Oscillator calculations.
- *
- * @type {Array<number>}
- * @default [12, 26]
- */
- periods: [12, 26]
- }
- });
- return PPOIndicator;
- }(EMAIndicator));
- extend(PPOIndicator.prototype, {
- nameBase: 'PPO',
- nameComponents: ['periods']
- });
- SeriesRegistry.registerSeriesType('ppo', PPOIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Percentage Price Oscillator` series. If the [type](#series.ppo.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.ppo
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, dataParser, dataURL, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/ema
- * @requires stock/indicators/ppo
- * @apioption series.ppo
- */
- ''; // to include the above in the js output
- return PPOIndicator;
- });
- _registerModule(_modules, 'Mixins/ReduceArray.js', [], function () {
- /**
- *
- * (c) 2010-2021 Pawel Fus & Daniel Studencki
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var reduceArrayMixin = {
- /**
- * Get min value of array filled by OHLC data.
- * @private
- * @param {Array<*>} arr Array of OHLC points (arrays).
- * @param {string} index Index of "low" value in point array.
- * @return {number} Returns min value.
- */
- minInArray: function (arr,
- index) {
- return arr.reduce(function (min,
- target) {
- return Math.min(min,
- target[index]);
- }, Number.MAX_VALUE);
- },
- /**
- * Get max value of array filled by OHLC data.
- * @private
- * @param {Array<*>} arr Array of OHLC points (arrays).
- * @param {string} index Index of "high" value in point array.
- * @return {number} Returns max value.
- */
- maxInArray: function (arr, index) {
- return arr.reduce(function (max, target) {
- return Math.max(max, target[index]);
- }, -Number.MAX_VALUE);
- },
- /**
- * Get extremes of array filled by OHLC data.
- * @private
- * @param {Array<*>} arr Array of OHLC points (arrays).
- * @param {string} minIndex Index of "low" value in point array.
- * @param {string} maxIndex Index of "high" value in point array.
- * @return {Array<number,number>} Returns array with min and max value.
- */
- getArrayExtremes: function (arr, minIndex, maxIndex) {
- return arr.reduce(function (prev, target) {
- return [
- Math.min(prev[0], target[minIndex]),
- Math.max(prev[1], target[maxIndex])
- ];
- }, [Number.MAX_VALUE, -Number.MAX_VALUE]);
- }
- };
- return reduceArrayMixin;
- });
- _registerModule(_modules, 'Stock/Indicators/PC/PCIndicator.js', [_modules['Core/Color/Palette.js'], _modules['Mixins/MultipleLines.js'], _modules['Mixins/ReduceArray.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (palette, MultipleLinesMixin, ReduceArrayMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var merge = U.merge,
- extend = U.extend;
- var getArrayExtremes = ReduceArrayMixin.getArrayExtremes;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Price Channel series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.pc
- *
- * @augments Highcharts.Series
- */
- var PCIndicator = /** @class */ (function (_super) {
- __extends(PCIndicator, _super);
- function PCIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- PCIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- // 0- date, 1-top line, 2-middle line, 3-bottom line
- PC = [],
- // middle line, top line and bottom line
- ML,
- TL,
- BL,
- date,
- low = 2,
- high = 1,
- xData = [],
- yData = [],
- slicedY,
- extremes,
- i;
- if (yValLen < period) {
- return;
- }
- for (i = period; i <= yValLen; i++) {
- date = xVal[i - 1];
- slicedY = yVal.slice(i - period, i);
- extremes = getArrayExtremes(slicedY, low, high);
- TL = extremes[1];
- BL = extremes[0];
- ML = (TL + BL) / 2;
- PC.push([date, TL, ML, BL]);
- xData.push(date);
- yData.push([TL, ML, BL]);
- }
- return {
- values: PC,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Price channel (PC). This series requires the `linkedTo` option to be
- * set and should be loaded after the `stock/indicators/indicators.js`.
- *
- * @sample {highstock} stock/indicators/price-channel
- * Price Channel
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/price-channel
- * @optionparent plotOptions.pc
- */
- PCIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding index
- */
- params: {
- period: 20
- },
- lineWidth: 1,
- topLine: {
- styles: {
- /**
- * Color of the top line. If not set, it's inherited from
- * [plotOptions.pc.color](#plotOptions.pc.color).
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: palette.colors[2],
- /**
- * Pixel width of the line.
- */
- lineWidth: 1
- }
- },
- bottomLine: {
- styles: {
- /**
- * Color of the bottom line. If not set, it's inherited from
- * [plotOptions.pc.color](#plotOptions.pc.color).
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: palette.colors[8],
- /**
- * Pixel width of the line.
- */
- lineWidth: 1
- }
- },
- dataGrouping: {
- approximation: 'averages'
- }
- });
- return PCIndicator;
- }(SMAIndicator));
- extend(PCIndicator.prototype, {
- getTranslatedLinesNames: MultipleLinesMixin.getTranslatedLinesNames,
- drawGraph: MultipleLinesMixin.drawGraph,
- toYData: MultipleLinesMixin.toYData,
- pointArrayMap: ['top', 'middle', 'bottom'],
- pointValKey: 'middle',
- nameBase: 'Price Channel',
- nameComponents: ['period'],
- linesApiNames: ['topLine', 'bottomLine'],
- translate: MultipleLinesMixin.translate
- });
- SeriesRegistry.registerSeriesType('pc', PCIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A Price channel indicator. If the [type](#series.pc.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.pc
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval,
- * pointIntervalUnit, pointPlacement, pointRange, pointStart,
- * showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/price-channel
- * @apioption series.pc
- */
- ''; // to include the above in the js output
- return PCIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/PriceEnvelopes/PriceEnvelopesIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- isArray = U.isArray,
- merge = U.merge;
- /**
- * The Price Envelopes series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.priceenvelopes
- *
- * @augments Highcharts.Series
- */
- var PriceEnvelopesIndicator = /** @class */ (function (_super) {
- __extends(PriceEnvelopesIndicator, _super);
- function PriceEnvelopesIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- PriceEnvelopesIndicator.prototype.init = function () {
- SeriesRegistry.seriesTypes.sma.prototype.init.apply(this, arguments);
- // Set default color for lines:
- this.options = merge({
- topLine: {
- styles: {
- lineColor: this.color
- }
- },
- bottomLine: {
- styles: {
- lineColor: this.color
- }
- }
- }, this.options);
- };
- PriceEnvelopesIndicator.prototype.toYData = function (point) {
- return [point.top, point.middle, point.bottom];
- };
- PriceEnvelopesIndicator.prototype.translate = function () {
- var indicator = this, translatedEnvelopes = ['plotTop', 'plotMiddle', 'plotBottom'];
- SeriesRegistry.seriesTypes.sma.prototype.translate.apply(indicator);
- indicator.points.forEach(function (point) {
- [point.top, point.middle, point.bottom].forEach(function (value, i) {
- if (value !== null) {
- point[translatedEnvelopes[i]] =
- indicator.yAxis.toPixels(value, true);
- }
- });
- });
- };
- PriceEnvelopesIndicator.prototype.drawGraph = function () {
- var indicator = this,
- middleLinePoints = indicator.points,
- pointsLength = middleLinePoints.length,
- middleLineOptions = (indicator.options),
- middleLinePath = indicator.graph,
- gappedExtend = {
- options: {
- gapSize: middleLineOptions.gapSize
- }
- },
- deviations = [[],
- []], // top and bottom point place holders
- point;
- // Generate points for top and bottom lines:
- while (pointsLength--) {
- point = middleLinePoints[pointsLength];
- deviations[0].push({
- plotX: point.plotX,
- plotY: point.plotTop,
- isNull: point.isNull
- });
- deviations[1].push({
- plotX: point.plotX,
- plotY: point.plotBottom,
- isNull: point.isNull
- });
- }
- // Modify options and generate lines:
- ['topLine', 'bottomLine'].forEach(function (lineName, i) {
- indicator.points = deviations[i];
- indicator.options = merge(middleLineOptions[lineName].styles, gappedExtend);
- indicator.graph = indicator['graph' + lineName];
- SeriesRegistry.seriesTypes.sma.prototype.drawGraph.call(indicator);
- // Now save lines:
- indicator['graph' + lineName] = indicator.graph;
- });
- // Restore options and draw a middle line:
- indicator.points = middleLinePoints;
- indicator.options = middleLineOptions;
- indicator.graph = middleLinePath;
- SeriesRegistry.seriesTypes.sma.prototype.drawGraph.call(indicator);
- };
- PriceEnvelopesIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- topPercent = params.topBand,
- botPercent = params.bottomBand,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- // 0- date, 1-top line, 2-middle line, 3-bottom line
- PE = [],
- // middle line, top line and bottom line
- ML,
- TL,
- BL,
- date,
- xData = [],
- yData = [],
- slicedX,
- slicedY,
- point,
- i;
- // Price envelopes requires close value
- if (xVal.length < period ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- for (i = period; i <= yValLen; i++) {
- slicedX = xVal.slice(i - period, i);
- slicedY = yVal.slice(i - period, i);
- point = SeriesRegistry.seriesTypes.sma.prototype.getValues.call(this, {
- xData: slicedX,
- yData: slicedY
- }, params);
- date = point.xData[0];
- ML = point.yData[0];
- TL = ML * (1 + topPercent);
- BL = ML * (1 - botPercent);
- PE.push([date, TL, ML, BL]);
- xData.push(date);
- yData.push([TL, ML, BL]);
- }
- return {
- values: PE,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Price envelopes indicator based on [SMA](#plotOptions.sma) calculations.
- * This series requires the `linkedTo` option to be set and should be loaded
- * after the `stock/indicators/indicators.js` file.
- *
- * @sample stock/indicators/price-envelopes
- * Price envelopes
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/price-envelopes
- * @optionparent plotOptions.priceenvelopes
- */
- PriceEnvelopesIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- marker: {
- enabled: false
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span><b> {series.name}</b><br/>Top: {point.top}<br/>Middle: {point.middle}<br/>Bottom: {point.bottom}<br/>'
- },
- params: {
- period: 20,
- /**
- * Percentage above the moving average that should be displayed.
- * 0.1 means 110%. Relative to the calculated value.
- */
- topBand: 0.1,
- /**
- * Percentage below the moving average that should be displayed.
- * 0.1 means 90%. Relative to the calculated value.
- */
- bottomBand: 0.1
- },
- /**
- * Bottom line options.
- */
- bottomLine: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line. If not set, it's inherited from
- * [plotOptions.priceenvelopes.color](
- * #plotOptions.priceenvelopes.color).
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- /**
- * Top line options.
- *
- * @extends plotOptions.priceenvelopes.bottomLine
- */
- topLine: {
- styles: {
- lineWidth: 1
- }
- },
- dataGrouping: {
- approximation: 'averages'
- }
- });
- return PriceEnvelopesIndicator;
- }(SMAIndicator));
- extend(PriceEnvelopesIndicator.prototype, {
- nameComponents: ['period', 'topBand', 'bottomBand'],
- nameBase: 'Price envelopes',
- pointArrayMap: ['top', 'middle', 'bottom'],
- parallelArrays: ['x', 'y', 'top', 'bottom'],
- pointValKey: 'middle'
- });
- SeriesRegistry.registerSeriesType('priceenvelopes', PriceEnvelopesIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A price envelopes indicator. If the [type](#series.priceenvelopes.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.priceenvelopes
- * @since 6.0.0
- * @excluding dataParser, dataURL
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/price-envelopes
- * @apioption series.priceenvelopes
- */
- ''; // to include the above in the js output
- return PriceEnvelopesIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/PSAR/PSARIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * Parabolic SAR indicator for Highstock
- *
- * (c) 2010-2021 Grzegorz Blachliński
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var merge = U.merge,
- extend = U.extend;
- /* eslint-disable require-jsdoc */
- // Utils:
- function toFixed(a, n) {
- return parseFloat(a.toFixed(n));
- }
- function calculateDirection(previousDirection, low, high, PSAR) {
- if ((previousDirection === 1 && low > PSAR) ||
- (previousDirection === -1 && high > PSAR)) {
- return 1;
- }
- return -1;
- }
- /* *
- * Method for calculating acceleration factor
- * dir - direction
- * pDir - previous Direction
- * eP - extreme point
- * pEP - previous extreme point
- * inc - increment for acceleration factor
- * maxAcc - maximum acceleration factor
- * initAcc - initial acceleration factor
- */
- function getAccelerationFactor(dir, pDir, eP, pEP, pAcc, inc, maxAcc, initAcc) {
- if (dir === pDir) {
- if (dir === 1 && (eP > pEP)) {
- return (pAcc === maxAcc) ? maxAcc : toFixed(pAcc + inc, 2);
- }
- if (dir === -1 && (eP < pEP)) {
- return (pAcc === maxAcc) ? maxAcc : toFixed(pAcc + inc, 2);
- }
- return pAcc;
- }
- return initAcc;
- }
- function getExtremePoint(high, low, previousDirection, previousExtremePoint) {
- if (previousDirection === 1) {
- return (high > previousExtremePoint) ? high : previousExtremePoint;
- }
- return (low < previousExtremePoint) ? low : previousExtremePoint;
- }
- function getEPMinusPSAR(EP, PSAR) {
- return EP - PSAR;
- }
- function getAccelerationFactorMultiply(accelerationFactor, EPMinusSAR) {
- return accelerationFactor * EPMinusSAR;
- }
- /* *
- * Method for calculating PSAR
- * pdir - previous direction
- * sDir - second previous Direction
- * PSAR - previous PSAR
- * pACCMultiply - previous acceleration factor multiply
- * sLow - second previous low
- * pLow - previous low
- * sHigh - second previous high
- * pHigh - previous high
- * pEP - previous extreme point
- */
- function getPSAR(pdir, sDir, PSAR, pACCMulti, sLow, pLow, pHigh, sHigh, pEP) {
- if (pdir === sDir) {
- if (pdir === 1) {
- return (PSAR + pACCMulti < Math.min(sLow, pLow)) ?
- PSAR + pACCMulti :
- Math.min(sLow, pLow);
- }
- return (PSAR + pACCMulti > Math.max(sHigh, pHigh)) ?
- PSAR + pACCMulti :
- Math.max(sHigh, pHigh);
- }
- return pEP;
- }
- /* eslint-enable require-jsdoc */
- /* *
- *
- * Class
- *
- * */
- /**
- * The Parabolic SAR series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.psar
- *
- * @augments Highcharts.Series
- */
- var PSARIndicator = /** @class */ (function (_super) {
- __extends(PSARIndicator, _super);
- function PSARIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.points = void 0;
- _this.options = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- PSARIndicator.prototype.getValues = function (series, params) {
- var xVal = series.xData,
- yVal = series.yData,
- // Extreme point is the lowest low for falling and highest high
- // for rising psar - and we are starting with falling
- extremePoint = yVal[0][1],
- accelerationFactor = params.initialAccelerationFactor,
- maxAccelerationFactor = params.maxAccelerationFactor,
- increment = params.increment,
- // Set initial acc factor (for every new trend!)
- initialAccelerationFactor = params.initialAccelerationFactor,
- PSAR = yVal[0][2],
- decimals = params.decimals,
- index = params.index,
- PSARArr = [],
- xData = [],
- yData = [],
- previousDirection = 1,
- direction,
- EPMinusPSAR,
- accelerationFactorMultiply,
- newDirection,
- prevLow,
- prevPrevLow,
- prevHigh,
- prevPrevHigh,
- newExtremePoint,
- high,
- low,
- ind;
- if (index >= yVal.length) {
- return;
- }
- for (ind = 0; ind < index; ind++) {
- extremePoint = Math.max(yVal[ind][1], extremePoint);
- PSAR = Math.min(yVal[ind][2], toFixed(PSAR, decimals));
- }
- direction = (yVal[ind][1] > PSAR) ? 1 : -1;
- EPMinusPSAR = getEPMinusPSAR(extremePoint, PSAR);
- accelerationFactor = params.initialAccelerationFactor;
- accelerationFactorMultiply = getAccelerationFactorMultiply(accelerationFactor, EPMinusPSAR);
- PSARArr.push([xVal[index], PSAR]);
- xData.push(xVal[index]);
- yData.push(toFixed(PSAR, decimals));
- for (ind = index + 1; ind < yVal.length; ind++) {
- prevLow = yVal[ind - 1][2];
- prevPrevLow = yVal[ind - 2][2];
- prevHigh = yVal[ind - 1][1];
- prevPrevHigh = yVal[ind - 2][1];
- high = yVal[ind][1];
- low = yVal[ind][2];
- // Null points break PSAR
- if (prevPrevLow !== null &&
- prevPrevHigh !== null &&
- prevLow !== null &&
- prevHigh !== null &&
- high !== null &&
- low !== null) {
- PSAR = getPSAR(direction, previousDirection, PSAR, accelerationFactorMultiply, prevPrevLow, prevLow, prevHigh, prevPrevHigh, extremePoint);
- newExtremePoint = getExtremePoint(high, low, direction, extremePoint);
- newDirection = calculateDirection(previousDirection, low, high, PSAR);
- accelerationFactor = getAccelerationFactor(newDirection, direction, newExtremePoint, extremePoint, accelerationFactor, increment, maxAccelerationFactor, initialAccelerationFactor);
- EPMinusPSAR = getEPMinusPSAR(newExtremePoint, PSAR);
- accelerationFactorMultiply = getAccelerationFactorMultiply(accelerationFactor, EPMinusPSAR);
- PSARArr.push([xVal[ind], toFixed(PSAR, decimals)]);
- xData.push(xVal[ind]);
- yData.push(toFixed(PSAR, decimals));
- previousDirection = direction;
- direction = newDirection;
- extremePoint = newExtremePoint;
- }
- }
- return {
- values: PSARArr,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Parabolic SAR. This series requires `linkedTo`
- * option to be set and should be loaded
- * after `stock/indicators/indicators.js` file.
- *
- * @sample stock/indicators/psar
- * Parabolic SAR Indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/psar
- * @optionparent plotOptions.psar
- */
- PSARIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- lineWidth: 0,
- marker: {
- enabled: true
- },
- states: {
- hover: {
- lineWidthPlus: 0
- }
- },
- /**
- * @excluding period
- */
- params: {
- /**
- * The initial value for acceleration factor.
- * Acceleration factor is starting with this value
- * and increases by specified increment each time
- * the extreme point makes a new high.
- * AF can reach a maximum of maxAccelerationFactor,
- * no matter how long the uptrend extends.
- */
- initialAccelerationFactor: 0.02,
- /**
- * The Maximum value for acceleration factor.
- * AF can reach a maximum of maxAccelerationFactor,
- * no matter how long the uptrend extends.
- */
- maxAccelerationFactor: 0.2,
- /**
- * Acceleration factor increases by increment each time
- * the extreme point makes a new high.
- *
- * @since 6.0.0
- */
- increment: 0.02,
- /**
- * Index from which PSAR is starting calculation
- *
- * @since 6.0.0
- */
- index: 2,
- /**
- * Number of maximum decimals that are used in PSAR calculations.
- *
- * @since 6.0.0
- */
- decimals: 4
- }
- });
- return PSARIndicator;
- }(SMAIndicator));
- extend(PSARIndicator.prototype, {
- nameComponents: false
- });
- SeriesRegistry.registerSeriesType('psar', PSARIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `PSAR` series. If the [type](#series.psar.type) option is not specified, it
- * is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.psar
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/psar
- * @apioption series.psar
- */
- ''; // to include the above in the js output
- return PSARIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/ROC/ROCIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * (c) 2010-2021 Kacper Madej
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var isArray = U.isArray,
- merge = U.merge,
- extend = U.extend;
- /* eslint-disable require-jsdoc */
- // Utils:
- function populateAverage(xVal, yVal, i, period, index) {
- /* Calculated as:
- (Closing Price [today] - Closing Price [n days ago]) /
- Closing Price [n days ago] * 100
- Return y as null when avoiding division by zero */
- var nDaysAgoY,
- rocY;
- if (index < 0) {
- // y data given as an array of values
- nDaysAgoY = yVal[i - period];
- rocY = nDaysAgoY ?
- (yVal[i] - nDaysAgoY) / nDaysAgoY * 100 :
- null;
- }
- else {
- // y data given as an array of arrays and the index should be used
- nDaysAgoY = yVal[i - period][index];
- rocY = nDaysAgoY ?
- (yVal[i][index] - nDaysAgoY) / nDaysAgoY * 100 :
- null;
- }
- return [xVal[i], rocY];
- }
- /* eslint-enable require-jsdoc */
- /* *
- *
- * Class
- *
- * */
- /**
- * The ROC series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.roc
- *
- * @augments Highcharts.Series
- */
- var ROCIndicator = /** @class */ (function (_super) {
- __extends(ROCIndicator, _super);
- function ROCIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- ROCIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- ROC = [],
- xData = [],
- yData = [],
- i,
- index = -1,
- ROCPoint;
- // Period is used as a number of time periods ago, so we need more
- // (at least 1 more) data than the period value
- if (xVal.length <= period) {
- return;
- }
- // Switch index for OHLC / Candlestick / Arearange
- if (isArray(yVal[0])) {
- index = params.index;
- }
- // i = period <-- skip first N-points
- // Calculate value one-by-one for each period in visible data
- for (i = period; i < yValLen; i++) {
- ROCPoint = populateAverage(xVal, yVal, i, period, index);
- ROC.push(ROCPoint);
- xData.push(ROCPoint[0]);
- yData.push(ROCPoint[1]);
- }
- return {
- values: ROC,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Rate of change indicator (ROC). The indicator value for each point
- * is defined as:
- *
- * `(C - Cn) / Cn * 100`
- *
- * where: `C` is the close value of the point of the same x in the
- * linked series and `Cn` is the close value of the point `n` periods
- * ago. `n` is set through [period](#plotOptions.roc.params.period).
- *
- * This series requires `linkedTo` option to be set.
- *
- * @sample stock/indicators/roc
- * Rate of change indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/roc
- * @optionparent plotOptions.roc
- */
- ROCIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- index: 3,
- period: 9
- }
- });
- return ROCIndicator;
- }(SMAIndicator));
- extend(ROCIndicator.prototype, {
- nameBase: 'Rate of Change'
- });
- SeriesRegistry.registerSeriesType('roc', ROCIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `ROC` series. If the [type](#series.wma.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * Rate of change indicator (ROC). The indicator value for each point
- * is defined as:
- *
- * `(C - Cn) / Cn * 100`
- *
- * where: `C` is the close value of the point of the same x in the
- * linked series and `Cn` is the close value of the point `n` periods
- * ago. `n` is set through [period](#series.roc.params.period).
- *
- * This series requires `linkedTo` option to be set.
- *
- * @extends series,plotOptions.roc
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/roc
- * @apioption series.roc
- */
- ''; // to include the above in the js output
- return ROCIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/RSI/RSIIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var isArray = U.isArray,
- merge = U.merge;
- /* eslint-disable require-jsdoc */
- // Utils:
- function toFixed(a, n) {
- return parseFloat(a.toFixed(n));
- }
- /* eslint-enable require-jsdoc */
- /**
- * The RSI series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.rsi
- *
- * @augments Highcharts.Series
- */
- var RSIIndicator = /** @class */ (function (_super) {
- __extends(RSIIndicator, _super);
- function RSIIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.points = void 0;
- _this.options = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- RSIIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- decimals = params.decimals,
- // RSI starts calculations from the second point
- // Cause we need to calculate change between two points
- range = 1,
- RSI = [],
- xData = [],
- yData = [],
- index = 3,
- gain = 0,
- loss = 0,
- RSIPoint,
- change,
- avgGain,
- avgLoss,
- i;
- // RSI requires close value
- if ((xVal.length < period) || !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- // Calculate changes for first N points
- while (range < period) {
- change = toFixed(yVal[range][index] - yVal[range - 1][index], decimals);
- if (change > 0) {
- gain += change;
- }
- else {
- loss += Math.abs(change);
- }
- range++;
- }
- // Average for first n-1 points:
- avgGain = toFixed(gain / (period - 1), decimals);
- avgLoss = toFixed(loss / (period - 1), decimals);
- for (i = range; i < yValLen; i++) {
- change = toFixed(yVal[i][index] - yVal[i - 1][index], decimals);
- if (change > 0) {
- gain = change;
- loss = 0;
- }
- else {
- gain = 0;
- loss = Math.abs(change);
- }
- // Calculate smoothed averages, RS, RSI values:
- avgGain = toFixed((avgGain * (period - 1) + gain) / period, decimals);
- avgLoss = toFixed((avgLoss * (period - 1) + loss) / period, decimals);
- // If average-loss is equal zero, then by definition RSI is set
- // to 100:
- if (avgLoss === 0) {
- RSIPoint = 100;
- // If average-gain is equal zero, then by definition RSI is set
- // to 0:
- }
- else if (avgGain === 0) {
- RSIPoint = 0;
- }
- else {
- RSIPoint = toFixed(100 - (100 / (1 + (avgGain / avgLoss))), decimals);
- }
- RSI.push([xVal[i], RSIPoint]);
- xData.push(xVal[i]);
- yData.push(RSIPoint);
- }
- return {
- values: RSI,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Relative strength index (RSI) technical indicator. This series
- * requires the `linkedTo` option to be set and should be loaded after
- * the `stock/indicators/indicators.js` file.
- *
- * @sample stock/indicators/rsi
- * RSI indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/rsi
- * @optionparent plotOptions.rsi
- */
- RSIIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 14,
- decimals: 4
- }
- });
- return RSIIndicator;
- }(SMAIndicator));
- SeriesRegistry.registerSeriesType('rsi', RSIIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `RSI` series. If the [type](#series.rsi.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.rsi
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/rsi
- * @apioption series.rsi
- */
- ''; // to include the above in the js output
- return RSIIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/Stochastic/StochasticIndicator.js', [_modules['Mixins/MultipleLines.js'], _modules['Mixins/ReduceArray.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (MultipleLinesMixin, ReduceArrayMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- isArray = U.isArray,
- merge = U.merge;
- /**
- * The Stochastic series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.stochastic
- *
- * @augments Highcharts.Series
- */
- var StochasticIndicator = /** @class */ (function (_super) {
- __extends(StochasticIndicator, _super);
- function StochasticIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- StochasticIndicator.prototype.init = function () {
- SeriesRegistry.seriesTypes.sma.prototype.init.apply(this, arguments);
- // Set default color for lines:
- this.options = merge({
- smoothedLine: {
- styles: {
- lineColor: this.color
- }
- }
- }, this.options);
- };
- StochasticIndicator.prototype.getValues = function (series, params) {
- var periodK = params.periods[0],
- periodD = params.periods[1],
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- // 0- date, 1-%K, 2-%D
- SO = [],
- xData = [],
- yData = [],
- slicedY,
- close = 3,
- low = 2,
- high = 1,
- CL,
- HL,
- LL,
- K,
- D = null,
- points,
- extremes,
- i;
- // Stochastic requires close value
- if (yValLen < periodK ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- // For a N-period, we start from N-1 point, to calculate Nth point
- // That is why we later need to comprehend slice() elements list
- // with (+1)
- for (i = periodK - 1; i < yValLen; i++) {
- slicedY = yVal.slice(i - periodK + 1, i + 1);
- // Calculate %K
- extremes = ReduceArrayMixin.getArrayExtremes(slicedY, low, high);
- LL = extremes[0]; // Lowest low in %K periods
- CL = yVal[i][close] - LL;
- HL = extremes[1] - LL;
- K = CL / HL * 100;
- xData.push(xVal[i]);
- yData.push([K, null]);
- // Calculate smoothed %D, which is SMA of %K
- if (i >= (periodK - 1) + (periodD - 1)) {
- points = SeriesRegistry.seriesTypes.sma.prototype.getValues.call(this, {
- xData: xData.slice(-periodD),
- yData: yData.slice(-periodD)
- }, {
- period: periodD
- });
- D = points.yData[0];
- }
- SO.push([xVal[i], K, D]);
- yData[yData.length - 1][1] = D;
- }
- return {
- values: SO,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Stochastic oscillator. This series requires the `linkedTo` option to be
- * set and should be loaded after the `stock/indicators/indicators.js` file.
- *
- * @sample stock/indicators/stochastic
- * Stochastic oscillator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, joinBy, keys, navigatorOptions,
- * pointInterval, pointIntervalUnit, pointPlacement,
- * pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/stochastic
- * @optionparent plotOptions.stochastic
- */
- StochasticIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding index, period
- */
- params: {
- /**
- * Periods for Stochastic oscillator: [%K, %D].
- *
- * @type {Array<number,number>}
- * @default [14, 3]
- */
- periods: [14, 3]
- },
- marker: {
- enabled: false
- },
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span><b> {series.name}</b><br/>%K: {point.y}<br/>%D: {point.smoothed}<br/>'
- },
- /**
- * Smoothed line options.
- */
- smoothedLine: {
- /**
- * Styles for a smoothed line.
- */
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line. If not set, it's inherited from
- * [plotOptions.stochastic.color
- * ](#plotOptions.stochastic.color).
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: void 0
- }
- },
- dataGrouping: {
- approximation: 'averages'
- }
- });
- return StochasticIndicator;
- }(SMAIndicator));
- extend(StochasticIndicator.prototype, {
- nameComponents: ['periods'],
- nameBase: 'Stochastic',
- pointArrayMap: ['y', 'smoothed'],
- parallelArrays: ['x', 'y', 'smoothed'],
- pointValKey: 'y',
- linesApiNames: ['smoothedLine'],
- drawGraph: MultipleLinesMixin.drawGraph,
- getTranslatedLinesNames: MultipleLinesMixin.getTranslatedLinesNames,
- translate: MultipleLinesMixin.translate,
- toYData: MultipleLinesMixin.toYData
- });
- SeriesRegistry.registerSeriesType('stochastic', StochasticIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A Stochastic indicator. If the [type](#series.stochastic.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.stochastic
- * @since 6.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, dataParser, dataURL, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/stochastic
- * @apioption series.stochastic
- */
- ''; // to include the above in the js output
- return StochasticIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/SlowStochastic/SlowStochasticIndicator.js', [_modules['Mixins/IndicatorRequired.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (RequiredIndicatorMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var StochasticIndicator = SeriesRegistry.seriesTypes.stochastic;
- var seriesTypes = SeriesRegistry.seriesTypes;
- var extend = U.extend,
- merge = U.merge;
- /**
- * The Slow Stochastic series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.slowstochastic
- *
- * @augments Highcharts.Series
- */
- var SlowStochasticIndicator = /** @class */ (function (_super) {
- __extends(SlowStochasticIndicator, _super);
- function SlowStochasticIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- SlowStochasticIndicator.prototype.init = function () {
- var args = arguments,
- ctx = this;
- RequiredIndicatorMixin.isParentLoaded(seriesTypes.stochastic, 'stochastic', ctx.type, function (indicator) {
- indicator.prototype.init.apply(ctx, args);
- return;
- });
- };
- SlowStochasticIndicator.prototype.getValues = function (series, params) {
- var periods = params.periods,
- fastValues = seriesTypes.stochastic.prototype.getValues.call(this,
- series,
- params),
- slowValues = {
- values: [],
- xData: [],
- yData: []
- };
- var i = 0;
- if (!fastValues) {
- return;
- }
- slowValues.xData = fastValues.xData.slice(periods[1] - 1);
- var fastYData = fastValues.yData.slice(periods[1] - 1);
- // Get SMA(%D)
- var smoothedValues = seriesTypes.sma.prototype.getValues.call(this, {
- xData: slowValues.xData,
- yData: fastYData
- }, {
- index: 1,
- period: periods[2]
- });
- if (!smoothedValues) {
- return;
- }
- var xDataLen = slowValues.xData.length;
- // Format data
- for (; i < xDataLen; i++) {
- slowValues.yData[i] = [
- fastYData[i][1],
- smoothedValues.yData[i - periods[2] + 1] || null
- ];
- slowValues.values[i] = [
- slowValues.xData[i],
- fastYData[i][1],
- smoothedValues.yData[i - periods[2] + 1] || null
- ];
- }
- return slowValues;
- };
- /**
- * Slow Stochastic oscillator. This series requires the `linkedTo` option
- * to be set and should be loaded after `stock/indicators/indicators.js`
- * and `stock/indicators/stochastic.js` files.
- *
- * @sample stock/indicators/slow-stochastic
- * Slow Stochastic oscillator
- *
- * @extends plotOptions.stochastic
- * @since 8.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/stochastic
- * @requires stock/indicators/slowstochastic
- * @optionparent plotOptions.slowstochastic
- */
- SlowStochasticIndicator.defaultOptions = merge(StochasticIndicator.defaultOptions, {
- params: {
- /**
- * Periods for Slow Stochastic oscillator: [%K, %D, SMA(%D)].
- *
- * @type {Array<number,number,number>}
- * @default [14, 3, 3]
- */
- periods: [14, 3, 3]
- }
- });
- return SlowStochasticIndicator;
- }(StochasticIndicator));
- extend(SlowStochasticIndicator.prototype, {
- nameBase: 'Slow Stochastic'
- });
- SeriesRegistry.registerSeriesType('slowstochastic', SlowStochasticIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A Slow Stochastic indicator. If the [type](#series.slowstochastic.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.slowstochastic
- * @since 8.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/stochastic
- * @requires stock/indicators/slowstochastic
- * @apioption series.slowstochastic
- */
- ''; // to include the above in the js output
- return SlowStochasticIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/Supertrend/SupertrendIndicator.js', [_modules['Core/Color/Palette.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (palette, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var _a = SeriesRegistry.seriesTypes,
- ATRIndicator = _a.atr,
- SMAIndicator = _a.sma;
- var correctFloat = U.correctFloat,
- isArray = U.isArray,
- extend = U.extend,
- merge = U.merge,
- objectEach = U.objectEach;
- /* eslint-disable require-jsdoc */
- // Utils:
- function createPointObj(mainSeries, index, close) {
- return {
- index: index,
- close: mainSeries.yData[index][close],
- x: mainSeries.xData[index]
- };
- }
- /* eslint-enable require-jsdoc */
- /* *
- *
- * Class
- *
- * */
- /**
- * The Supertrend series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.supertrend
- *
- * @augments Highcharts.Series
- */
- var SupertrendIndicator = /** @class */ (function (_super) {
- __extends(SupertrendIndicator, _super);
- function SupertrendIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.linkedParent = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- SupertrendIndicator.prototype.init = function () {
- var options,
- parentOptions;
- SMAIndicator.prototype.init.apply(this, arguments);
- options = this.options;
- parentOptions = this.linkedParent.options;
- // Indicator cropThreshold has to be equal linked series one
- // reduced by period due to points comparison in drawGraph method
- // (#9787)
- options.cropThreshold = (parentOptions.cropThreshold -
- (options.params.period - 1));
- };
- SupertrendIndicator.prototype.drawGraph = function () {
- var indicator = this,
- indicOptions = indicator.options,
- // Series that indicator is linked to
- mainSeries = indicator.linkedParent,
- mainLinePoints = (mainSeries ? mainSeries.points : []),
- indicPoints = indicator.points,
- indicPath = indicator.graph,
- indicPointsLen = indicPoints.length,
- // Points offset between lines
- tempOffset = mainLinePoints.length - indicPointsLen,
- offset = tempOffset > 0 ? tempOffset : 0,
- // @todo: fix when ichi-moku indicator is merged to master.
- gappedExtend = {
- options: {
- gapSize: indicOptions.gapSize
- }
- },
- // Sorted supertrend points array
- groupedPoitns = {
- top: [],
- bottom: [],
- intersect: [] // Change trend line points
- },
- // Options for trend lines
- supertrendLineOptions = {
- top: {
- styles: {
- lineWidth: indicOptions.lineWidth,
- lineColor: (indicOptions.fallingTrendColor ||
- indicOptions.color),
- dashStyle: indicOptions.dashStyle
- }
- },
- bottom: {
- styles: {
- lineWidth: indicOptions.lineWidth,
- lineColor: (indicOptions.risingTrendColor ||
- indicOptions.color),
- dashStyle: indicOptions.dashStyle
- }
- },
- intersect: indicOptions.changeTrendLine
- },
- close = 3,
- // Supertrend line point
- point,
- // Supertrend line next point (has smaller x pos than point)
- nextPoint,
- // Main series points
- mainPoint,
- nextMainPoint,
- // Used when supertrend and main points are shifted
- // relative to each other
- prevMainPoint,
- prevPrevMainPoint,
- // Used when particular point color is set
- pointColor,
- // Temporary points that fill groupedPoitns array
- newPoint,
- newNextPoint;
- // Loop which sort supertrend points
- while (indicPointsLen--) {
- point = indicPoints[indicPointsLen];
- nextPoint = indicPoints[indicPointsLen - 1];
- mainPoint = mainLinePoints[indicPointsLen - 1 + offset];
- nextMainPoint = mainLinePoints[indicPointsLen - 2 + offset];
- prevMainPoint = mainLinePoints[indicPointsLen + offset];
- prevPrevMainPoint = mainLinePoints[indicPointsLen + offset + 1];
- pointColor = point.options.color;
- newPoint = {
- x: point.x,
- plotX: point.plotX,
- plotY: point.plotY,
- isNull: false
- };
- // When mainPoint is the last one (left plot area edge)
- // but supertrend has additional one
- if (!nextMainPoint &&
- mainPoint && mainSeries.yData[mainPoint.index - 1]) {
- nextMainPoint = createPointObj(mainSeries, mainPoint.index - 1, close);
- }
- // When prevMainPoint is the last one (right plot area edge)
- // but supertrend has additional one (and points are shifted)
- if (!prevPrevMainPoint &&
- prevMainPoint && mainSeries.yData[prevMainPoint.index + 1]) {
- prevPrevMainPoint = createPointObj(mainSeries, prevMainPoint.index + 1, close);
- }
- // When points are shifted (right or left plot area edge)
- if (!mainPoint &&
- nextMainPoint && mainSeries.yData[nextMainPoint.index + 1]) {
- mainPoint = createPointObj(mainSeries, nextMainPoint.index + 1, close);
- }
- else if (!mainPoint &&
- prevMainPoint && mainSeries.yData[prevMainPoint.index - 1]) {
- mainPoint = createPointObj(mainSeries, prevMainPoint.index - 1, close);
- }
- // Check if points are shifted relative to each other
- if (point &&
- mainPoint &&
- prevMainPoint &&
- nextMainPoint &&
- point.x !== mainPoint.x) {
- if (point.x === prevMainPoint.x) {
- nextMainPoint = mainPoint;
- mainPoint = prevMainPoint;
- }
- else if (point.x === nextMainPoint.x) {
- mainPoint = nextMainPoint;
- nextMainPoint = {
- close: mainSeries.yData[mainPoint.index - 1][close],
- x: mainSeries.xData[mainPoint.index - 1]
- };
- }
- else if (prevPrevMainPoint && point.x === prevPrevMainPoint.x) {
- mainPoint = prevPrevMainPoint;
- nextMainPoint = prevMainPoint;
- }
- }
- if (nextPoint && nextMainPoint && mainPoint) {
- newNextPoint = {
- x: nextPoint.x,
- plotX: nextPoint.plotX,
- plotY: nextPoint.plotY,
- isNull: false
- };
- if (point.y >= mainPoint.close &&
- nextPoint.y >= nextMainPoint.close) {
- point.color = (pointColor || indicOptions.fallingTrendColor ||
- indicOptions.color);
- groupedPoitns.top.push(newPoint);
- }
- else if (point.y < mainPoint.close &&
- nextPoint.y < nextMainPoint.close) {
- point.color = (pointColor || indicOptions.risingTrendColor ||
- indicOptions.color);
- groupedPoitns.bottom.push(newPoint);
- }
- else {
- groupedPoitns.intersect.push(newPoint);
- groupedPoitns.intersect.push(newNextPoint);
- // Additional null point to make a gap in line
- groupedPoitns.intersect.push(merge(newNextPoint, {
- isNull: true
- }));
- if (point.y >= mainPoint.close &&
- nextPoint.y < nextMainPoint.close) {
- point.color = (pointColor || indicOptions.fallingTrendColor ||
- indicOptions.color);
- nextPoint.color = (pointColor || indicOptions.risingTrendColor ||
- indicOptions.color);
- groupedPoitns.top.push(newPoint);
- groupedPoitns.top.push(merge(newNextPoint, {
- isNull: true
- }));
- }
- else if (point.y < mainPoint.close &&
- nextPoint.y >= nextMainPoint.close) {
- point.color = (pointColor || indicOptions.risingTrendColor ||
- indicOptions.color);
- nextPoint.color = (pointColor || indicOptions.fallingTrendColor ||
- indicOptions.color);
- groupedPoitns.bottom.push(newPoint);
- groupedPoitns.bottom.push(merge(newNextPoint, {
- isNull: true
- }));
- }
- }
- }
- else if (mainPoint) {
- if (point.y >= mainPoint.close) {
- point.color = (pointColor || indicOptions.fallingTrendColor ||
- indicOptions.color);
- groupedPoitns.top.push(newPoint);
- }
- else {
- point.color = (pointColor || indicOptions.risingTrendColor ||
- indicOptions.color);
- groupedPoitns.bottom.push(newPoint);
- }
- }
- }
- // Generate lines:
- objectEach(groupedPoitns, function (values, lineName) {
- indicator.points = values;
- indicator.options = merge(supertrendLineOptions[lineName].styles, gappedExtend);
- indicator.graph = indicator['graph' + lineName + 'Line'];
- SMAIndicator.prototype.drawGraph.call(indicator);
- // Now save line
- indicator['graph' + lineName + 'Line'] = indicator.graph;
- });
- // Restore options:
- indicator.points = indicPoints;
- indicator.options = indicOptions;
- indicator.graph = indicPath;
- };
- // Supertrend (Multiplier, Period) Formula:
- // BASIC UPPERBAND = (HIGH + LOW) / 2 + Multiplier * ATR(Period)
- // BASIC LOWERBAND = (HIGH + LOW) / 2 - Multiplier * ATR(Period)
- // FINAL UPPERBAND =
- // IF(
- // Current BASICUPPERBAND < Previous FINAL UPPERBAND AND
- // Previous Close > Previous FINAL UPPERBAND
- // ) THEN (Current BASIC UPPERBAND)
- // ELSE (Previous FINALUPPERBAND)
- // FINAL LOWERBAND =
- // IF(
- // Current BASIC LOWERBAND > Previous FINAL LOWERBAND AND
- // Previous Close < Previous FINAL LOWERBAND
- // ) THEN (Current BASIC LOWERBAND)
- // ELSE (Previous FINAL LOWERBAND)
- // SUPERTREND =
- // IF(
- // Previous Supertrend == Previous FINAL UPPERBAND AND
- // Current Close < Current FINAL UPPERBAND
- // ) THAN Current FINAL UPPERBAND
- // ELSE IF(
- // Previous Supertrend == Previous FINAL LOWERBAND AND
- // Current Close < Current FINAL LOWERBAND
- // ) THAN Current FINAL UPPERBAND
- // ELSE IF(
- // Previous Supertrend == Previous FINAL UPPERBAND AND
- // Current Close > Current FINAL UPPERBAND
- // ) THAN Current FINAL LOWERBAND
- // ELSE IF(
- // Previous Supertrend == Previous FINAL LOWERBAND AND
- // Current Close > Current FINAL LOWERBAND
- // ) THAN Current FINAL LOWERBAND
- SupertrendIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- multiplier = params.multiplier,
- xVal = series.xData,
- yVal = series.yData,
- ATRData = [],
- // 0- date, 1- Supertrend indicator
- ST = [],
- xData = [],
- yData = [],
- close = 3,
- low = 2,
- high = 1,
- periodsOffset = (period === 0) ? 0 : period - 1,
- basicUp,
- basicDown,
- finalUp = [],
- finalDown = [],
- supertrend,
- prevFinalUp,
- prevFinalDown,
- prevST, // previous Supertrend
- prevY,
- y,
- i;
- if ((xVal.length <= period) || !isArray(yVal[0]) ||
- yVal[0].length !== 4 || period < 0) {
- return;
- }
- ATRData = ATRIndicator.prototype.getValues.call(this, series, {
- period: period
- }).yData;
- for (i = 0; i < ATRData.length; i++) {
- y = yVal[periodsOffset + i];
- prevY = yVal[periodsOffset + i - 1] || [];
- prevFinalUp = finalUp[i - 1];
- prevFinalDown = finalDown[i - 1];
- prevST = yData[i - 1];
- if (i === 0) {
- prevFinalUp = prevFinalDown = prevST = 0;
- }
- basicUp = correctFloat((y[high] + y[low]) / 2 + multiplier * ATRData[i]);
- basicDown = correctFloat((y[high] + y[low]) / 2 - multiplier * ATRData[i]);
- if ((basicUp < prevFinalUp) ||
- (prevY[close] > prevFinalUp)) {
- finalUp[i] = basicUp;
- }
- else {
- finalUp[i] = prevFinalUp;
- }
- if ((basicDown > prevFinalDown) ||
- (prevY[close] < prevFinalDown)) {
- finalDown[i] = basicDown;
- }
- else {
- finalDown[i] = prevFinalDown;
- }
- if (prevST === prevFinalUp && y[close] < finalUp[i] ||
- prevST === prevFinalDown && y[close] < finalDown[i]) {
- supertrend = finalUp[i];
- }
- else if (prevST === prevFinalUp && y[close] > finalUp[i] ||
- prevST === prevFinalDown && y[close] > finalDown[i]) {
- supertrend = finalDown[i];
- }
- ST.push([xVal[periodsOffset + i], supertrend]);
- xData.push(xVal[periodsOffset + i]);
- yData.push(supertrend);
- }
- return {
- values: ST,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Supertrend indicator. This series requires the `linkedTo` option to be
- * set and should be loaded after the `stock/indicators/indicators.js` and
- * `stock/indicators/sma.js`.
- *
- * @sample {highstock} stock/indicators/supertrend
- * Supertrend indicator
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, cropThreshold, negativeColor, colorAxis, joinBy,
- * keys, navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking, threshold
- * @requires stock/indicators/indicators
- * @requires stock/indicators/supertrend
- * @optionparent plotOptions.supertrend
- */
- SupertrendIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * Paramters used in calculation of Supertrend indicator series points.
- *
- * @excluding index
- */
- params: {
- /**
- * Multiplier for Supertrend Indicator.
- */
- multiplier: 3,
- /**
- * The base period for indicator Supertrend Indicator calculations.
- * This is the number of data points which are taken into account
- * for the indicator calculations.
- */
- period: 10
- },
- /**
- * Color of the Supertrend series line that is beneath the main series.
- *
- * @sample {highstock} stock/indicators/supertrend/
- * Example with risingTrendColor
- *
- * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
- */
- risingTrendColor: palette.indicatorPositiveLine,
- /**
- * Color of the Supertrend series line that is above the main series.
- *
- * @sample {highstock} stock/indicators/supertrend/
- * Example with fallingTrendColor
- *
- * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}
- */
- fallingTrendColor: palette.indicatorNegativeLine,
- /**
- * The styles for the Supertrend line that intersect main series.
- *
- * @sample {highstock} stock/indicators/supertrend/
- * Example with changeTrendLine
- */
- changeTrendLine: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1,
- /**
- * Color of the line.
- *
- * @type {Highcharts.ColorString}
- */
- lineColor: palette.neutralColor80,
- /**
- * The dash or dot style of the grid lines. For possible
- * values, see
- * [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).
- *
- * @sample {highcharts} highcharts/yaxis/gridlinedashstyle/
- * Long dashes
- * @sample {highstock} stock/xaxis/gridlinedashstyle/
- * Long dashes
- *
- * @type {Highcharts.DashStyleValue}
- * @since 7.0.0
- */
- dashStyle: 'LongDash'
- }
- }
- });
- return SupertrendIndicator;
- }(SMAIndicator));
- extend(SupertrendIndicator.prototype, {
- nameBase: 'Supertrend',
- nameComponents: ['multiplier', 'period'],
- requiredIndicators: ['atr']
- });
- SeriesRegistry.registerSeriesType('supertrend', SupertrendIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Supertrend indicator` series. If the [type](#series.supertrend.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.supertrend
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, cropThreshold, data, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, negativeColor, pointInterval,
- * pointIntervalUnit, pointPlacement, pointRange, pointStart,
- * showInNavigator, stacking, threshold
- * @requires stock/indicators/indicators
- * @requires stock/indicators/supertrend
- * @apioption series.supertrend
- */
- ''; // to include the above in the js output
- return SupertrendIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/VBP/VBPIndicator.js', [_modules['Core/Animation/AnimationUtilities.js'], _modules['Core/Globals.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (A, H, SeriesRegistry, U) {
- /* *
- *
- * (c) 2010-2021 Paweł Dalek
- *
- * Volume By Price (VBP) indicator for Highstock
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var animObject = A.animObject;
- var noop = H.noop;
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var addEvent = U.addEvent,
- arrayMax = U.arrayMax,
- arrayMin = U.arrayMin,
- correctFloat = U.correctFloat,
- error = U.error,
- extend = U.extend,
- isArray = U.isArray,
- merge = U.merge;
- /* eslint-disable require-jsdoc */
- // Utils
- function arrayExtremesOHLC(data) {
- var dataLength = data.length,
- min = data[0][3],
- max = min,
- i = 1,
- currentPoint;
- for (; i < dataLength; i++) {
- currentPoint = data[i][3];
- if (currentPoint < min) {
- min = currentPoint;
- }
- if (currentPoint > max) {
- max = currentPoint;
- }
- }
- return {
- min: min,
- max: max
- };
- }
- /* eslint-enable require-jsdoc */
- var abs = Math.abs,
- columnPrototype = SeriesRegistry.seriesTypes.column.prototype;
- /**
- * The Volume By Price (VBP) series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.vbp
- *
- * @augments Highcharts.Series
- */
- var VBPIndicator = /** @class */ (function (_super) {
- __extends(VBPIndicator, _super);
- function VBPIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.negWidths = void 0;
- _this.options = void 0;
- _this.points = void 0;
- _this.posWidths = void 0;
- _this.priceZones = void 0;
- _this.rangeStep = void 0;
- _this.volumeDataArray = void 0;
- _this.zoneStarts = void 0;
- _this.zoneLinesSVG = void 0;
- return _this;
- }
- VBPIndicator.prototype.init = function (chart) {
- var indicator = this,
- params,
- baseSeries,
- volumeSeries;
- H.seriesTypes.sma.prototype.init.apply(indicator, arguments);
- params = indicator.options.params;
- baseSeries = indicator.linkedParent;
- volumeSeries = chart.get(params.volumeSeriesID);
- indicator.addCustomEvents(baseSeries, volumeSeries);
- return indicator;
- };
- // Adds events related with removing series
- VBPIndicator.prototype.addCustomEvents = function (baseSeries, volumeSeries) {
- var indicator = this;
- /* eslint-disable require-jsdoc */
- function toEmptyIndicator() {
- indicator.chart.redraw();
- indicator.setData([]);
- indicator.zoneStarts = [];
- if (indicator.zoneLinesSVG) {
- indicator.zoneLinesSVG.destroy();
- delete indicator.zoneLinesSVG;
- }
- }
- /* eslint-enable require-jsdoc */
- // If base series is deleted, indicator series data is filled with
- // an empty array
- indicator.dataEventsToUnbind.push(addEvent(baseSeries, 'remove', function () {
- toEmptyIndicator();
- }));
- // If volume series is deleted, indicator series data is filled with
- // an empty array
- if (volumeSeries) {
- indicator.dataEventsToUnbind.push(addEvent(volumeSeries, 'remove', function () {
- toEmptyIndicator();
- }));
- }
- return indicator;
- };
- // Initial animation
- VBPIndicator.prototype.animate = function (init) {
- var series = this,
- inverted = series.chart.inverted,
- group = series.group,
- attr = {},
- translate,
- position;
- if (!init && group) {
- translate = inverted ? 'translateY' : 'translateX';
- position = inverted ? series.yAxis.top : series.xAxis.left;
- group['forceAnimate:' + translate] = true;
- attr[translate] = position;
- group.animate(attr, extend(animObject(series.options.animation), {
- step: function (val, fx) {
- series.group.attr({
- scaleX: Math.max(0.001, fx.pos)
- });
- }
- }));
- }
- };
- VBPIndicator.prototype.drawPoints = function () {
- var indicator = this;
- if (indicator.options.volumeDivision.enabled) {
- indicator.posNegVolume(true, true);
- columnPrototype.drawPoints.apply(indicator, arguments);
- indicator.posNegVolume(false, false);
- }
- columnPrototype.drawPoints.apply(indicator, arguments);
- };
- // Function responsible for dividing volume into positive and negative
- VBPIndicator.prototype.posNegVolume = function (initVol, pos) {
- var indicator = this, signOrder = pos ?
- ['positive', 'negative'] :
- ['negative', 'positive'], volumeDivision = indicator.options.volumeDivision, pointLength = indicator.points.length, posWidths = [], negWidths = [], i = 0, pointWidth, priceZone, wholeVol, point;
- if (initVol) {
- indicator.posWidths = posWidths;
- indicator.negWidths = negWidths;
- }
- else {
- posWidths = indicator.posWidths;
- negWidths = indicator.negWidths;
- }
- for (; i < pointLength; i++) {
- point = indicator.points[i];
- point[signOrder[0] + 'Graphic'] = point.graphic;
- point.graphic = point[signOrder[1] + 'Graphic'];
- if (initVol) {
- pointWidth = point.shapeArgs.width;
- priceZone = indicator.priceZones[i];
- wholeVol = priceZone.wholeVolumeData;
- if (wholeVol) {
- posWidths.push(pointWidth / wholeVol * priceZone.positiveVolumeData);
- negWidths.push(pointWidth / wholeVol * priceZone.negativeVolumeData);
- }
- else {
- posWidths.push(0);
- negWidths.push(0);
- }
- }
- point.color = pos ?
- volumeDivision.styles.positiveColor :
- volumeDivision.styles.negativeColor;
- point.shapeArgs.width = pos ?
- indicator.posWidths[i] :
- indicator.negWidths[i];
- point.shapeArgs.x = pos ?
- point.shapeArgs.x :
- indicator.posWidths[i];
- }
- };
- VBPIndicator.prototype.translate = function () {
- var indicator = this,
- options = indicator.options,
- chart = indicator.chart,
- yAxis = indicator.yAxis,
- yAxisMin = yAxis.min,
- zoneLinesOptions = indicator.options.zoneLines,
- priceZones = (indicator.priceZones),
- yBarOffset = 0,
- indicatorPoints,
- volumeDataArray,
- maxVolume,
- primalBarWidth,
- barHeight,
- barHeightP,
- oldBarHeight,
- barWidth,
- pointPadding,
- chartPlotTop,
- barX,
- barY;
- columnPrototype.translate.apply(indicator);
- indicatorPoints = indicator.points;
- // Do translate operation when points exist
- if (indicatorPoints.length) {
- pointPadding = options.pointPadding < 0.5 ?
- options.pointPadding :
- 0.1;
- volumeDataArray = indicator.volumeDataArray;
- maxVolume = arrayMax(volumeDataArray);
- primalBarWidth = chart.plotWidth / 2;
- chartPlotTop = chart.plotTop;
- barHeight = abs(yAxis.toPixels(yAxisMin) -
- yAxis.toPixels(yAxisMin + indicator.rangeStep));
- oldBarHeight = abs(yAxis.toPixels(yAxisMin) -
- yAxis.toPixels(yAxisMin + indicator.rangeStep));
- if (pointPadding) {
- barHeightP = abs(barHeight * (1 - 2 * pointPadding));
- yBarOffset = abs((barHeight - barHeightP) / 2);
- barHeight = abs(barHeightP);
- }
- indicatorPoints.forEach(function (point, index) {
- barX = point.barX = point.plotX = 0;
- barY = point.plotY = (yAxis.toPixels(priceZones[index].start) -
- chartPlotTop -
- (yAxis.reversed ?
- (barHeight - oldBarHeight) :
- barHeight) -
- yBarOffset);
- barWidth = correctFloat(primalBarWidth *
- priceZones[index].wholeVolumeData / maxVolume);
- point.pointWidth = barWidth;
- point.shapeArgs = indicator.crispCol.apply(// eslint-disable-line no-useless-call
- indicator, [barX, barY, barWidth, barHeight]);
- point.volumeNeg = priceZones[index].negativeVolumeData;
- point.volumePos = priceZones[index].positiveVolumeData;
- point.volumeAll = priceZones[index].wholeVolumeData;
- });
- if (zoneLinesOptions.enabled) {
- indicator.drawZones(chart, yAxis, indicator.zoneStarts, zoneLinesOptions.styles);
- }
- }
- };
- VBPIndicator.prototype.getValues = function (series, params) {
- var indicator = this,
- xValues = series.processedXData,
- yValues = series.processedYData,
- chart = indicator.chart,
- ranges = params.ranges,
- VBP = [],
- xData = [],
- yData = [],
- isOHLC,
- volumeSeries,
- priceZones;
- // Checks if base series exists
- if (!series.chart) {
- error('Base series not found! In case it has been removed, add ' +
- 'a new one.', true, chart);
- return;
- }
- // Checks if volume series exists
- if (!(volumeSeries = (chart.get(params.volumeSeriesID)))) {
- error('Series ' +
- params.volumeSeriesID +
- ' not found! Check `volumeSeriesID`.', true, chart);
- return;
- }
- // Checks if series data fits the OHLC format
- isOHLC = isArray(yValues[0]);
- if (isOHLC && yValues[0].length !== 4) {
- error('Type of ' +
- series.name +
- ' series is different than line, OHLC or candlestick.', true, chart);
- return;
- }
- // Price zones contains all the information about the zones (index,
- // start, end, volumes, etc.)
- priceZones = indicator.priceZones = indicator.specifyZones(isOHLC, xValues, yValues, ranges, volumeSeries);
- priceZones.forEach(function (zone, index) {
- VBP.push([zone.x, zone.end]);
- xData.push(VBP[index][0]);
- yData.push(VBP[index][1]);
- });
- return {
- values: VBP,
- xData: xData,
- yData: yData
- };
- };
- // Specifing where each zone should start ans end
- VBPIndicator.prototype.specifyZones = function (isOHLC, xValues, yValues, ranges, volumeSeries) {
- var indicator = this,
- rangeExtremes = (isOHLC ? arrayExtremesOHLC(yValues) : false),
- lowRange = rangeExtremes ?
- rangeExtremes.min :
- arrayMin(yValues),
- highRange = rangeExtremes ?
- rangeExtremes.max :
- arrayMax(yValues),
- zoneStarts = indicator.zoneStarts = [],
- priceZones = [],
- i = 0,
- j = 1,
- rangeStep,
- zoneStartsLength;
- if (!lowRange || !highRange) {
- if (this.points.length) {
- this.setData([]);
- this.zoneStarts = [];
- this.zoneLinesSVG.destroy();
- }
- return [];
- }
- rangeStep = indicator.rangeStep =
- correctFloat(highRange - lowRange) / ranges;
- zoneStarts.push(lowRange);
- for (; i < ranges - 1; i++) {
- zoneStarts.push(correctFloat(zoneStarts[i] + rangeStep));
- }
- zoneStarts.push(highRange);
- zoneStartsLength = zoneStarts.length;
- // Creating zones
- for (; j < zoneStartsLength; j++) {
- priceZones.push({
- index: j - 1,
- x: xValues[0],
- start: zoneStarts[j - 1],
- end: zoneStarts[j]
- });
- }
- return indicator.volumePerZone(isOHLC, priceZones, volumeSeries, xValues, yValues);
- };
- // Calculating sum of volume values for a specific zone
- VBPIndicator.prototype.volumePerZone = function (isOHLC, priceZones, volumeSeries, xValues, yValues) {
- var indicator = this,
- volumeXData = volumeSeries.processedXData,
- volumeYData = volumeSeries.processedYData,
- lastZoneIndex = priceZones.length - 1,
- baseSeriesLength = yValues.length,
- volumeSeriesLength = volumeYData.length,
- previousValue,
- startFlag,
- endFlag,
- value,
- i;
- // Checks if each point has a corresponding volume value
- if (abs(baseSeriesLength - volumeSeriesLength)) {
- // If the first point don't have volume, add 0 value at the
- // beggining of the volume array
- if (xValues[0] !== volumeXData[0]) {
- volumeYData.unshift(0);
- }
- // If the last point don't have volume, add 0 value at the end
- // of the volume array
- if (xValues[baseSeriesLength - 1] !==
- volumeXData[volumeSeriesLength - 1]) {
- volumeYData.push(0);
- }
- }
- indicator.volumeDataArray = [];
- priceZones.forEach(function (zone) {
- zone.wholeVolumeData = 0;
- zone.positiveVolumeData = 0;
- zone.negativeVolumeData = 0;
- for (i = 0; i < baseSeriesLength; i++) {
- startFlag = false;
- endFlag = false;
- value = isOHLC ? yValues[i][3] : yValues[i];
- previousValue = i ?
- (isOHLC ?
- yValues[i - 1][3] :
- yValues[i - 1]) :
- value;
- // Checks if this is the point with the
- // lowest close value and if so, adds it calculations
- if (value <= zone.start && zone.index === 0) {
- startFlag = true;
- }
- // Checks if this is the point with the highest
- // close value and if so, adds it calculations
- if (value >= zone.end && zone.index === lastZoneIndex) {
- endFlag = true;
- }
- if ((value > zone.start || startFlag) &&
- (value < zone.end || endFlag)) {
- zone.wholeVolumeData += volumeYData[i];
- if (previousValue > value) {
- zone.negativeVolumeData += volumeYData[i];
- }
- else {
- zone.positiveVolumeData += volumeYData[i];
- }
- }
- }
- indicator.volumeDataArray.push(zone.wholeVolumeData);
- });
- return priceZones;
- };
- // Function responsoble for drawing additional lines indicating zones
- VBPIndicator.prototype.drawZones = function (chart, yAxis, zonesValues, zonesStyles) {
- var indicator = this,
- renderer = chart.renderer,
- zoneLinesSVG = indicator.zoneLinesSVG,
- zoneLinesPath = [],
- leftLinePos = 0,
- rightLinePos = chart.plotWidth,
- verticalOffset = chart.plotTop,
- verticalLinePos;
- zonesValues.forEach(function (value) {
- verticalLinePos = yAxis.toPixels(value) - verticalOffset;
- zoneLinesPath = zoneLinesPath.concat(chart.renderer.crispLine([[
- 'M',
- leftLinePos,
- verticalLinePos
- ], [
- 'L',
- rightLinePos,
- verticalLinePos
- ]], zonesStyles.lineWidth));
- });
- // Create zone lines one path or update it while animating
- if (zoneLinesSVG) {
- zoneLinesSVG.animate({
- d: zoneLinesPath
- });
- }
- else {
- zoneLinesSVG = indicator.zoneLinesSVG =
- renderer.path(zoneLinesPath).attr({
- 'stroke-width': zonesStyles.lineWidth,
- 'stroke': zonesStyles.color,
- 'dashstyle': zonesStyles.dashStyle,
- 'zIndex': indicator.group.zIndex + 0.1
- })
- .add(indicator.group);
- }
- };
- /**
- * Volume By Price indicator.
- *
- * This series requires `linkedTo` option to be set.
- *
- * @sample stock/indicators/volume-by-price
- * Volume By Price indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/volume-by-price
- * @optionparent plotOptions.vbp
- */
- VBPIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding index, period
- */
- params: {
- /**
- * The number of price zones.
- */
- ranges: 12,
- /**
- * The id of volume series which is mandatory. For example using
- * OHLC data, volumeSeriesID='volume' means the indicator will be
- * calculated using OHLC and volume values.
- */
- volumeSeriesID: 'volume'
- },
- /**
- * The styles for lines which determine price zones.
- */
- zoneLines: {
- /**
- * Enable/disable zone lines.
- */
- enabled: true,
- /**
- * Specify the style of zone lines.
- *
- * @type {Highcharts.CSSObject}
- * @default {"color": "#0A9AC9", "dashStyle": "LongDash", "lineWidth": 1}
- */
- styles: {
- /** @ignore-options */
- color: '#0A9AC9',
- /** @ignore-options */
- dashStyle: 'LongDash',
- /** @ignore-options */
- lineWidth: 1
- }
- },
- /**
- * The styles for bars when volume is divided into positive/negative.
- */
- volumeDivision: {
- /**
- * Option to control if volume is divided.
- */
- enabled: true,
- styles: {
- /**
- * Color of positive volume bars.
- *
- * @type {Highcharts.ColorString}
- */
- positiveColor: 'rgba(144, 237, 125, 0.8)',
- /**
- * Color of negative volume bars.
- *
- * @type {Highcharts.ColorString}
- */
- negativeColor: 'rgba(244, 91, 91, 0.8)'
- }
- },
- // To enable series animation; must be animationLimit > pointCount
- animationLimit: 1000,
- enableMouseTracking: false,
- pointPadding: 0,
- zIndex: -1,
- crisp: true,
- dataGrouping: {
- enabled: false
- },
- dataLabels: {
- allowOverlap: true,
- enabled: true,
- format: 'P: {point.volumePos:.2f} | N: {point.volumeNeg:.2f}',
- padding: 0,
- style: {
- /** @internal */
- fontSize: '7px'
- },
- verticalAlign: 'top'
- }
- });
- return VBPIndicator;
- }(SMAIndicator));
- extend(VBPIndicator.prototype, {
- nameBase: 'Volume by Price',
- bindTo: {
- series: false,
- eventName: 'afterSetExtremes'
- },
- calculateOn: 'render',
- markerAttribs: noop,
- drawGraph: noop,
- getColumnMetrics: columnPrototype.getColumnMetrics,
- crispCol: columnPrototype.crispCol
- });
- SeriesRegistry.registerSeriesType('vbp', VBPIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Volume By Price (VBP)` series. If the [type](#series.vbp.type) option is
- * not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.vbp
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/volume-by-price
- * @apioption series.vbp
- */
- ''; // to include the above in the js output
- return VBPIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/VWAP/VWAPIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * (c) 2010-2021 Paweł Dalek
- *
- * Volume Weighted Average Price (VWAP) indicator for Highstock
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var error = U.error,
- isArray = U.isArray,
- merge = U.merge;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Volume Weighted Average Price (VWAP) series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.vwap
- *
- * @augments Highcharts.Series
- */
- var VWAPIndicator = /** @class */ (function (_super) {
- __extends(VWAPIndicator, _super);
- function VWAPIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.points = void 0;
- _this.options = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- VWAPIndicator.prototype.getValues = function (series, params) {
- var indicator = this,
- chart = series.chart,
- xValues = series.xData,
- yValues = series.yData,
- period = params.period,
- isOHLC = true,
- volumeSeries;
- // Checks if volume series exists
- if (!(volumeSeries = (chart.get(params.volumeSeriesID)))) {
- error('Series ' +
- params.volumeSeriesID +
- ' not found! Check `volumeSeriesID`.', true, chart);
- return;
- }
- // Checks if series data fits the OHLC format
- if (!(isArray(yValues[0]))) {
- isOHLC = false;
- }
- return indicator.calculateVWAPValues(isOHLC, xValues, yValues, volumeSeries, period);
- };
- /**
- * Main algorithm used to calculate Volume Weighted Average Price (VWAP)
- * values
- * @private
- * @param {boolean} isOHLC - says if data has OHLC format
- * @param {Array<number>} xValues - array of timestamps
- * @param {Array<number|Array<number,number,number,number>>} yValues -
- * array of yValues, can be an array of a four arrays (OHLC) or array of
- * values (line)
- * @param {Array<*>} volumeSeries - volume series
- * @param {number} period - number of points to be calculated
- * @return {object} - Object contains computed VWAP
- **/
- VWAPIndicator.prototype.calculateVWAPValues = function (isOHLC, xValues, yValues, volumeSeries, period) {
- var volumeValues = volumeSeries.yData,
- volumeLength = volumeSeries.xData.length,
- pointsLength = xValues.length,
- cumulativePrice = [],
- cumulativeVolume = [],
- xData = [],
- yData = [],
- VWAP = [],
- commonLength,
- typicalPrice,
- cPrice,
- cVolume,
- i,
- j;
- if (pointsLength <= volumeLength) {
- commonLength = pointsLength;
- }
- else {
- commonLength = volumeLength;
- }
- for (i = 0, j = 0; i < commonLength; i++) {
- // Depending on whether series is OHLC or line type, price is
- // average of the high, low and close or a simple value
- typicalPrice = isOHLC ?
- ((yValues[i][1] + yValues[i][2] +
- yValues[i][3]) / 3) :
- yValues[i];
- typicalPrice *= volumeValues[i];
- cPrice = j ?
- (cumulativePrice[i - 1] + typicalPrice) :
- typicalPrice;
- cVolume = j ?
- (cumulativeVolume[i - 1] + volumeValues[i]) :
- volumeValues[i];
- cumulativePrice.push(cPrice);
- cumulativeVolume.push(cVolume);
- VWAP.push([xValues[i], (cPrice / cVolume)]);
- xData.push(VWAP[i][0]);
- yData.push(VWAP[i][1]);
- j++;
- if (j === period) {
- j = 0;
- }
- }
- return {
- values: VWAP,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Volume Weighted Average Price indicator.
- *
- * This series requires `linkedTo` option to be set.
- *
- * @sample stock/indicators/vwap
- * Volume Weighted Average Price indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/vwap
- * @optionparent plotOptions.vwap
- */
- VWAPIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding index
- */
- params: {
- period: 30,
- /**
- * The id of volume series which is mandatory. For example using
- * OHLC data, volumeSeriesID='volume' means the indicator will be
- * calculated using OHLC and volume values.
- */
- volumeSeriesID: 'volume'
- }
- });
- return VWAPIndicator;
- }(SMAIndicator));
- SeriesRegistry.registerSeriesType('vwap', VWAPIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Volume Weighted Average Price (VWAP)` series. If the
- * [type](#series.vwap.type) option is not specified, it is inherited from
- * [chart.type](#chart.type).
- *
- * @extends series,plotOptions.vwap
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/vwap
- * @apioption series.vwap
- */
- ''; // to include the above in the js output
- return VWAPIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/WilliamsR/WilliamsRIndicator.js', [_modules['Mixins/ReduceArray.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (ReduceArrayMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var getArrayExtremes = ReduceArrayMixin.getArrayExtremes;
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- isArray = U.isArray,
- merge = U.merge;
- /**
- * The Williams %R series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.williamsr
- *
- * @augments Highcharts.Series
- */
- var WilliamsRIndicator = /** @class */ (function (_super) {
- __extends(WilliamsRIndicator, _super);
- function WilliamsRIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- WilliamsRIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- WR = [], // 0- date, 1- Williams %R
- xData = [],
- yData = [],
- slicedY,
- close = 3,
- low = 2,
- high = 1,
- extremes,
- R,
- HH, // Highest high value in period
- LL, // Lowest low value in period
- CC, // Current close value
- i;
- // Williams %R requires close value
- if (xVal.length < period ||
- !isArray(yVal[0]) ||
- yVal[0].length !== 4) {
- return;
- }
- // For a N-period, we start from N-1 point, to calculate Nth point
- // That is why we later need to comprehend slice() elements list
- // with (+1)
- for (i = period - 1; i < yValLen; i++) {
- slicedY = yVal.slice(i - period + 1, i + 1);
- extremes = getArrayExtremes(slicedY, low, high);
- LL = extremes[0];
- HH = extremes[1];
- CC = yVal[i][close];
- R = ((HH - CC) / (HH - LL)) * -100;
- if (xVal[i]) {
- WR.push([xVal[i], R]);
- xData.push(xVal[i]);
- yData.push(R);
- }
- }
- return {
- values: WR,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Williams %R. This series requires the `linkedTo` option to be
- * set and should be loaded after the `stock/indicators/indicators.js`.
- *
- * @sample {highstock} stock/indicators/williams-r
- * Williams %R
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, joinBy, keys, navigatorOptions,
- * pointInterval, pointIntervalUnit, pointPlacement,
- * pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/williams-r
- * @optionparent plotOptions.williamsr
- */
- WilliamsRIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * Paramters used in calculation of Williams %R series points.
- * @excluding index
- */
- params: {
- /**
- * Period for Williams %R oscillator
- */
- period: 14
- }
- });
- return WilliamsRIndicator;
- }(SMAIndicator));
- extend(WilliamsRIndicator.prototype, {
- nameBase: 'Williams %R'
- });
- SeriesRegistry.registerSeriesType('williamsr', WilliamsRIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Williams %R Oscillator` series. If the [type](#series.williamsr.type)
- * option is not specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.williamsr
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, dataParser, dataURL, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator, stacking
- * @requires stock/indicators/indicators
- * @requires stock/indicators/williams-r
- * @apioption series.williamsr
- */
- ''; // adds doclets above to the transpiled file
- return WilliamsRIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/WMA/WMAIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * (c) 2010-2021 Kacper Madej
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var isArray = U.isArray,
- merge = U.merge;
- /* eslint-disable valid-jsdoc */
- // Utils:
- /**
- * @private
- */
- function accumulateAverage(points, xVal, yVal, i, index) {
- var xValue = xVal[i],
- yValue = index < 0 ? yVal[i] : yVal[i][index];
- points.push([xValue, yValue]);
- }
- /**
- * @private
- */
- function weightedSumArray(array, pLen) {
- // The denominator is the sum of the number of days as a triangular number.
- // If there are 5 days, the triangular numbers are 5, 4, 3, 2, and 1.
- // The sum is 5 + 4 + 3 + 2 + 1 = 15.
- var denominator = (pLen + 1) / 2 * pLen;
- // reduce VS loop => reduce
- return array.reduce(function (prev, cur, i) {
- return [null, prev[1] + cur[1] * (i + 1)];
- })[1] / denominator;
- }
- /**
- * @private
- */
- function populateAverage(points, xVal, yVal, i) {
- var pLen = points.length,
- wmaY = weightedSumArray(points,
- pLen),
- wmaX = xVal[i - 1];
- points.shift(); // remove point until range < period
- return [wmaX, wmaY];
- }
- /* eslint-enable valid-jsdoc */
- /**
- * The SMA series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.wma
- *
- * @augments Highcharts.Series
- */
- var WMAIndicator = /** @class */ (function (_super) {
- __extends(WMAIndicator, _super);
- function WMAIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- WMAIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- range = 1,
- xValue = xVal[0],
- yValue = yVal[0],
- WMA = [],
- xData = [],
- yData = [],
- index = -1,
- i,
- points,
- WMAPoint;
- if (xVal.length < period) {
- return;
- }
- // Switch index for OHLC / Candlestick
- if (isArray(yVal[0])) {
- index = params.index;
- yValue = yVal[0][index];
- }
- // Starting point
- points = [[xValue, yValue]];
- // Accumulate first N-points
- while (range !== period) {
- accumulateAverage(points, xVal, yVal, range, index);
- range++;
- }
- // Calculate value one-by-one for each period in visible data
- for (i = range; i < yValLen; i++) {
- WMAPoint = populateAverage(points, xVal, yVal, i);
- WMA.push(WMAPoint);
- xData.push(WMAPoint[0]);
- yData.push(WMAPoint[1]);
- accumulateAverage(points, xVal, yVal, i, index);
- }
- WMAPoint = populateAverage(points, xVal, yVal, i);
- WMA.push(WMAPoint);
- xData.push(WMAPoint[0]);
- yData.push(WMAPoint[1]);
- return {
- values: WMA,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Weighted moving average indicator (WMA). This series requires `linkedTo`
- * option to be set.
- *
- * @sample stock/indicators/wma
- * Weighted moving average indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/wma
- * @optionparent plotOptions.wma
- */
- WMAIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- index: 3,
- period: 9
- }
- });
- return WMAIndicator;
- }(SMAIndicator));
- SeriesRegistry.registerSeriesType('wma', WMAIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `WMA` series. If the [type](#series.wma.type) option is not specified, it
- * is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.wma
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/wma
- * @apioption series.wma
- */
- ''; // adds doclet above to the transpiled file
- return WMAIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/Zigzag/ZigzagIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * (c) 2010-2021 Kacper Madej
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var merge = U.merge,
- extend = U.extend;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Zig Zag series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.zigzag
- *
- * @augments Highcharts.Series
- */
- var ZigzagIndicator = /** @class */ (function (_super) {
- __extends(ZigzagIndicator, _super);
- function ZigzagIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.points = void 0;
- _this.options = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- ZigzagIndicator.prototype.getValues = function (series, params) {
- var lowIndex = params.lowIndex,
- highIndex = params.highIndex,
- deviation = params.deviation / 100,
- deviations = {
- 'low': 1 + deviation,
- 'high': 1 - deviation
- },
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- zigzag = [],
- xData = [],
- yData = [],
- i,
- j,
- zigzagPoint,
- firstZigzagLow,
- firstZigzagHigh,
- directionUp,
- zigzagLen,
- exitLoop = false,
- yIndex = false;
- // Exit if not enught points or no low or high values
- if (!xVal || xVal.length <= 1 ||
- (yValLen &&
- (typeof yVal[0][lowIndex] === 'undefined' ||
- typeof yVal[0][highIndex] === 'undefined'))) {
- return;
- }
- // Set first zigzag point candidate
- firstZigzagLow = yVal[0][lowIndex];
- firstZigzagHigh = yVal[0][highIndex];
- // Search for a second zigzag point candidate,
- // this will also set first zigzag point
- for (i = 1; i < yValLen; i++) {
- // requried change to go down
- if (yVal[i][lowIndex] <= firstZigzagHigh * deviations.high) {
- zigzag.push([xVal[0], firstZigzagHigh]);
- // second zigzag point candidate
- zigzagPoint = [xVal[i], yVal[i][lowIndex]];
- // next line will be going up
- directionUp = true;
- exitLoop = true;
- // requried change to go up
- }
- else if (yVal[i][highIndex] >= firstZigzagLow * deviations.low) {
- zigzag.push([xVal[0], firstZigzagLow]);
- // second zigzag point candidate
- zigzagPoint = [xVal[i], yVal[i][highIndex]];
- // next line will be going down
- directionUp = false;
- exitLoop = true;
- }
- if (exitLoop) {
- xData.push(zigzag[0][0]);
- yData.push(zigzag[0][1]);
- j = i++;
- i = yValLen;
- }
- }
- // Search for next zigzags
- for (i = j; i < yValLen; i++) {
- if (directionUp) { // next line up
- // lower when going down -> change zigzag candidate
- if (yVal[i][lowIndex] <= zigzagPoint[1]) {
- zigzagPoint = [xVal[i], yVal[i][lowIndex]];
- }
- // requried change to go down -> new zigzagpoint and
- // direction change
- if (yVal[i][highIndex] >=
- zigzagPoint[1] * deviations.low) {
- yIndex = highIndex;
- }
- }
- else { // next line down
- // higher when going up -> change zigzag candidate
- if (yVal[i][highIndex] >= zigzagPoint[1]) {
- zigzagPoint = [xVal[i], yVal[i][highIndex]];
- }
- // requried change to go down -> new zigzagpoint and
- // direction change
- if (yVal[i][lowIndex] <=
- zigzagPoint[1] * deviations.high) {
- yIndex = lowIndex;
- }
- }
- if (yIndex !== false) { // new zigzag point and direction change
- zigzag.push(zigzagPoint);
- xData.push(zigzagPoint[0]);
- yData.push(zigzagPoint[1]);
- zigzagPoint = [xVal[i], yVal[i][yIndex]];
- directionUp = !directionUp;
- yIndex = false;
- }
- }
- zigzagLen = zigzag.length;
- // no zigzag for last point
- if (zigzagLen !== 0 &&
- zigzag[zigzagLen - 1][0] < xVal[yValLen - 1]) {
- // set last point from zigzag candidate
- zigzag.push(zigzagPoint);
- xData.push(zigzagPoint[0]);
- yData.push(zigzagPoint[1]);
- }
- return {
- values: zigzag,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Zig Zag indicator.
- *
- * This series requires `linkedTo` option to be set.
- *
- * @sample stock/indicators/zigzag
- * Zig Zag indicator
- *
- * @extends plotOptions.sma
- * @since 6.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/zigzag
- * @optionparent plotOptions.zigzag
- */
- ZigzagIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding index, period
- */
- params: {
- /**
- * The point index which indicator calculations will base - low
- * value.
- *
- * For example using OHLC data, index=2 means the indicator will be
- * calculated using Low values.
- */
- lowIndex: 2,
- /**
- * The point index which indicator calculations will base - high
- * value.
- *
- * For example using OHLC data, index=1 means the indicator will be
- * calculated using High values.
- */
- highIndex: 1,
- /**
- * The threshold for the value change.
- *
- * For example deviation=1 means the indicator will ignore all price
- * movements less than 1%.
- */
- deviation: 1
- }
- });
- return ZigzagIndicator;
- }(SMAIndicator));
- extend(ZigzagIndicator.prototype, {
- nameComponents: ['deviation'],
- nameSuffixes: ['%'],
- nameBase: 'Zig Zag'
- });
- SeriesRegistry.registerSeriesType('zigzag', ZigzagIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `Zig Zag` series. If the [type](#series.zigzag.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.zigzag
- * @since 6.0.0
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/zigzag
- * @apioption series.zigzag
- */
- ''; // adds doclets above to transpiled file
- return ZigzagIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/LinearRegression/LinearRegression.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /**
- *
- * (c) 2010-2021 Kamil Kulig
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var isArray = U.isArray,
- extend = U.extend,
- merge = U.merge;
- /* *
- *
- * Class
- *
- * */
- /**
- * Linear regression series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.linearregression
- *
- * @augments Highcharts.Series
- */
- var LinearRegressionIndicator = /** @class */ (function (_super) {
- __extends(LinearRegressionIndicator, _super);
- function LinearRegressionIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- /**
- * Return the slope and intercept of a straight line function.
- * @private
- * @param {Highcharts.LinearRegressionIndicator} this indicator to use
- * @param {Array<number>} xData - list of all x coordinates in a period
- * @param {Array<number>} yData - list of all y coordinates in a period
- * @return {Highcharts.RegressionLineParametersObject}
- * object that contains the slope and the intercept
- * of a straight line function
- */
- LinearRegressionIndicator.prototype.getRegressionLineParameters = function (xData, yData) {
- // least squares method
- var yIndex = this.options.params.index,
- getSingleYValue = function (yValue,
- yIndex) {
- return isArray(yValue) ? yValue[yIndex] : yValue;
- }, xSum = xData.reduce(function (accX, val) {
- return val + accX;
- }, 0), ySum = yData.reduce(function (accY, val) {
- return getSingleYValue(val, yIndex) + accY;
- }, 0), xMean = xSum / xData.length, yMean = ySum / yData.length, xError, yError, formulaNumerator = 0, formulaDenominator = 0, i, slope;
- for (i = 0; i < xData.length; i++) {
- xError = xData[i] - xMean;
- yError = getSingleYValue(yData[i], yIndex) - yMean;
- formulaNumerator += xError * yError;
- formulaDenominator += Math.pow(xError, 2);
- }
- slope = formulaDenominator ?
- formulaNumerator / formulaDenominator : 0; // don't divide by 0
- return {
- slope: slope,
- intercept: yMean - slope * xMean
- };
- };
- /**
- * Return the y value on a straight line.
- * @private
- * @param {Highcharts.RegressionLineParametersObject} lineParameters
- * object that contains the slope and the intercept
- * of a straight line function
- * @param {number} endPointX - x coordinate of the point
- * @return {number} - y value of the point that lies on the line
- */
- LinearRegressionIndicator.prototype.getEndPointY = function (lineParameters, endPointX) {
- return lineParameters.slope * endPointX + lineParameters.intercept;
- };
- /**
- * Transform the coordinate system so that x values start at 0 and
- * apply xAxisUnit.
- * @private
- * @param {Array<number>} xData - list of all x coordinates in a period
- * @param {number} xAxisUnit - option (see the API)
- * @return {Array<number>} - array of transformed x data
- */
- LinearRegressionIndicator.prototype.transformXData = function (xData, xAxisUnit) {
- var xOffset = xData[0];
- return xData.map(function (xValue) {
- return (xValue - xOffset) / xAxisUnit;
- });
- };
- /**
- * Find the closest distance between points in the base series.
- * @private
- * @param {Array<number>} xData list of all x coordinates in the base series
- * @return {number} - closest distance between points in the base series
- */
- LinearRegressionIndicator.prototype.findClosestDistance = function (xData) {
- var distance,
- closestDistance,
- i;
- for (i = 1; i < xData.length - 1; i++) {
- distance = xData[i] - xData[i - 1];
- if (distance > 0 &&
- (typeof closestDistance === 'undefined' ||
- distance < closestDistance)) {
- closestDistance = distance;
- }
- }
- return closestDistance;
- };
- // Required to be implemented - starting point for indicator's logic
- LinearRegressionIndicator.prototype.getValues = function (baseSeries, regressionSeriesParams) {
- var xData = baseSeries.xData,
- yData = baseSeries.yData,
- period = regressionSeriesParams.period,
- lineParameters,
- i,
- periodStart,
- periodEnd,
- // format required to be returned
- indicatorData = {
- xData: [],
- yData: [],
- values: []
- },
- endPointX,
- endPointY,
- periodXData,
- periodYData,
- periodTransformedXData,
- xAxisUnit = this.options.params.xAxisUnit ||
- this.findClosestDistance(xData);
- // Iteration logic: x value of the last point within the period
- // (end point) is used to represent the y value (regression)
- // of the entire period.
- for (i = period - 1; i <= xData.length - 1; i++) {
- periodStart = i - period + 1; // adjusted for slice() function
- periodEnd = i + 1; // (as above)
- endPointX = xData[i];
- periodXData = xData.slice(periodStart, periodEnd);
- periodYData = yData.slice(periodStart, periodEnd);
- periodTransformedXData = this.transformXData(periodXData, xAxisUnit);
- lineParameters = this.getRegressionLineParameters(periodTransformedXData, periodYData);
- endPointY = this.getEndPointY(lineParameters, periodTransformedXData[periodTransformedXData.length - 1]);
- // @todo this is probably not used anywhere
- indicatorData.values.push({
- regressionLineParameters: lineParameters,
- x: endPointX,
- y: endPointY
- });
- indicatorData.xData.push(endPointX);
- indicatorData.yData.push(endPointY);
- }
- return indicatorData;
- };
- /**
- * Linear regression indicator. This series requires `linkedTo` option to be
- * set.
- *
- * @sample {highstock} stock/indicators/linear-regression
- * Linear regression indicator
- *
- * @extends plotOptions.sma
- * @since 7.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregression
- * @optionparent plotOptions.linearregression
- */
- LinearRegressionIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- /**
- * Unit (in milliseconds) for the x axis distances used to
- * compute the regression line paramters (slope & intercept) for
- * every range. In Highstock the x axis values are always
- * represented in milliseconds which may cause that distances
- * between points are "big" integer numbers.
- *
- * Highstock's linear regression algorithm (least squares
- * method) will utilize these "big" integers for finding the
- * slope and the intercept of the regression line for each
- * period. In consequence, this value may be a very "small"
- * decimal number that's hard to interpret by a human.
- *
- * For instance: `xAxisUnit` equealed to `86400000` ms (1 day)
- * forces the algorithm to treat `86400000` as `1` while
- * computing the slope and the intercept. This may enchance the
- * legiblitity of the indicator's values.
- *
- * Default value is the closest distance between two data
- * points.
- *
- * @sample {highstock} stock/plotoptions/linear-regression-xaxisunit
- * xAxisUnit set to 1 minute
- *
- * @example
- * // In Liniear Regression Slope Indicator series `xAxisUnit`is
- * // `86400000` (1 day) and period is `3`. There're 3 points in
- * // the base series:
- *
- * data: [
- * [Date.UTC(2020, 0, 1), 1],
- * [Date.UTC(2020, 0, 2), 3],
- * [Date.UTC(2020, 0, 3), 5]
- * ]
- *
- * // This will produce one point in the indicator series that
- * // has a `y` value of `2` (slope of the regression line). If
- * // we change the `xAxisUnit` to `1` (ms) the value of the
- * // indicator's point will be `2.3148148148148148e-8` which is
- * // harder to interpert for a human.
- *
- * @type {number}
- * @product highstock
- */
- xAxisUnit: void 0
- },
- tooltip: {
- valueDecimals: 4
- }
- });
- return LinearRegressionIndicator;
- }(SMAIndicator));
- extend(LinearRegressionIndicator.prototype, {
- nameBase: 'Linear Regression Indicator'
- });
- SeriesRegistry.registerSeriesType('linearRegression', LinearRegressionIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A linear regression series. If the
- * [type](#series.linearregression.type) option is not specified, it is
- * inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.linearregression
- * @since 7.0.0
- * @product highstock
- * @excluding dataParser,dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregression
- * @apioption series.linearregression
- */
- ''; // to include the above in the js output
- return LinearRegressionIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/LinearRegressionSlopes/LinearRegressionSlopes.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /**
- *
- * (c) 2010-2021 Kamil Kulig
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var _a = SeriesRegistry.seriesTypes,
- SMAIndicator = _a.sma,
- LinearRegressionIndicator = _a.linearRegression;
- var isArray = U.isArray,
- extend = U.extend,
- merge = U.merge;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Linear Regression Slope series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.linearRegressionSlope
- *
- * @augments Highcharts.Series
- */
- var LinearRegressionSlopesIndicator = /** @class */ (function (_super) {
- __extends(LinearRegressionSlopesIndicator, _super);
- function LinearRegressionSlopesIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- LinearRegressionSlopesIndicator.prototype.getEndPointY = function (lineParameters) {
- return lineParameters.slope;
- };
- /**
- * Linear regression slope indicator. This series requires `linkedTo`
- * option to be set.
- *
- * @sample {highstock} stock/indicators/linear-regression-slope
- * Linear regression slope indicator
- *
- * @extends plotOptions.linearregression
- * @since 7.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregression
- * @optionparent plotOptions.linearregressionslope
- */
- LinearRegressionSlopesIndicator.defaultOptions = merge(LinearRegressionIndicator.defaultOptions);
- return LinearRegressionSlopesIndicator;
- }(LinearRegressionIndicator));
- extend(LinearRegressionSlopesIndicator.prototype, {
- nameBase: 'Linear Regression Slope Indicator'
- });
- SeriesRegistry.registerSeriesType('linearRegressionSlope', LinearRegressionSlopesIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A linear regression intercept series. If the
- * [type](#series.linearregressionslope.type) option is not specified, it is
- * inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.linearregressionslope
- * @since 7.0.0
- * @product highstock
- * @excluding dataParser,dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregressionslope
- * @apioption series.linearregressionslope
- */
- ''; // to include the above in the js output
- return LinearRegressionSlopesIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/LinearRegressionIntercept/LinearRegressionIntercept.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /**
- *
- * (c) 2010-2021 Kamil Kulig
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var _a = SeriesRegistry.seriesTypes,
- SMAIndicator = _a.sma,
- LinearRegressionIndicator = _a.linearRegression;
- var isArray = U.isArray,
- extend = U.extend,
- merge = U.merge;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Linear Regression Intercept series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.linearRegressionIntercept
- *
- * @augments Highcharts.Series
- */
- var LinearRegressionInterceptIndicator = /** @class */ (function (_super) {
- __extends(LinearRegressionInterceptIndicator, _super);
- function LinearRegressionInterceptIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- LinearRegressionInterceptIndicator.prototype.getEndPointY = function (lineParameters) {
- return lineParameters.intercept;
- };
- /**
- * Linear regression intercept indicator. This series requires `linkedTo`
- * option to be set.
- *
- * @sample {highstock} stock/indicators/linear-regression-intercept
- * Linear intercept slope indicator
- *
- * @extends plotOptions.linearregression
- * @since 7.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregressionintercept
- * @optionparent plotOptions.linearregressionintercept
- */
- LinearRegressionInterceptIndicator.defaultOptions = merge(LinearRegressionIndicator.defaultOptions);
- return LinearRegressionInterceptIndicator;
- }(LinearRegressionIndicator));
- extend(LinearRegressionInterceptIndicator.prototype, {
- nameBase: 'Linear Regression Intercept Indicator'
- });
- SeriesRegistry.registerSeriesType('linearRegressionIntercept', LinearRegressionInterceptIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A linear regression intercept series. If the
- * [type](#series.linearregressionintercept.type) option is not specified, it is
- * inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.linearregressionintercept
- * @since 7.0.0
- * @product highstock
- * @excluding dataParser,dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregressionintercept
- * @apioption series.linearregressionintercept
- */
- ''; // to include the above in the js output
- return LinearRegressionInterceptIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/LinearRegressionAngle/LinearRegressionAngle.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /**
- *
- * (c) 2010-2021 Kamil Kulig
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var _a = SeriesRegistry.seriesTypes,
- SMAIndicator = _a.sma,
- LinearRegressionIndicator = _a.linearRegression;
- var extend = U.extend,
- merge = U.merge;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Linear Regression Angle series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.linearRegressionAngle
- *
- * @augments Highcharts.Series
- */
- var LinearRegressionAngleIndicator = /** @class */ (function (_super) {
- __extends(LinearRegressionAngleIndicator, _super);
- function LinearRegressionAngleIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- /**
- * Convert a slope of a line to angle (in degrees) between
- * the line and x axis
- * @private
- * @param {number} slope of the straight line function
- * @return {number} angle in degrees
- */
- LinearRegressionAngleIndicator.prototype.slopeToAngle = function (slope) {
- return Math.atan(slope) * (180 / Math.PI); // rad to deg
- };
- LinearRegressionAngleIndicator.prototype.getEndPointY = function (lineParameters) {
- return this.slopeToAngle(lineParameters.slope);
- };
- /**
- * Linear regression angle indicator. This series requires `linkedTo`
- * option to be set.
- *
- * @sample {highstock} stock/indicators/linear-regression-angle
- * Linear intercept angle indicator
- *
- * @extends plotOptions.linearregression
- * @since 7.0.0
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregressionangle
- * @optionparent plotOptions.linearregressionangle
- */
- LinearRegressionAngleIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- tooltip: {
- pointFormat: '<span style="color:{point.color}">\u25CF</span>' +
- '{series.name}: <b>{point.y}°</b><br/>'
- }
- });
- return LinearRegressionAngleIndicator;
- }(LinearRegressionIndicator));
- extend(LinearRegressionAngleIndicator.prototype, {
- nameBase: 'Linear Regression Angle Indicator'
- });
- SeriesRegistry.registerSeriesType('linearRegressionAngle', LinearRegressionAngleIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A linear regression intercept series. If the
- * [type](#series.linearregressionangle.type) option is not specified, it is
- * inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.linearregressionangle
- * @since 7.0.0
- * @product highstock
- * @excluding dataParser,dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/linearregressionangle
- * @apioption series.linearregressionangle
- */
- ''; // to include the above in the js output
- return LinearRegressionAngleIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/ABands/ABandsIndicator.js', [_modules['Mixins/MultipleLines.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (MultipleLinesMixin, SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var correctFloat = U.correctFloat,
- extend = U.extend,
- merge = U.merge;
- /* eslint-disable valid-jsdoc */
- /**
- * @private
- */
- function getBaseForBand(low, high, factor) {
- return (((correctFloat(high - low)) /
- ((correctFloat(high + low)) / 2)) * 1000) * factor;
- }
- /**
- * @private
- */
- function getPointUB(high, base) {
- return high * (correctFloat(1 + 2 * base));
- }
- /**
- * @private
- */
- function getPointLB(low, base) {
- return low * (correctFloat(1 - 2 * base));
- }
- /* eslint-enable valid-jsdoc */
- /**
- * The ABands series type
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.abands
- *
- * @augments Highcharts.Series
- */
- var ABandsIndicator = /** @class */ (function (_super) {
- __extends(ABandsIndicator, _super);
- function ABandsIndicator() {
- /* *
- *
- * Static Properties
- *
- * */
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- ABandsIndicator.prototype.getValues = function (series, params) {
- var period = params.period,
- factor = params.factor,
- index = params.index,
- xVal = series.xData,
- yVal = series.yData,
- yValLen = yVal ? yVal.length : 0,
- // Upperbands
- UB = [],
- // Lowerbands
- LB = [],
- // ABANDS array structure:
- // 0-date, 1-top line, 2-middle line, 3-bottom line
- ABANDS = [],
- // middle line, top line and bottom line
- ML,
- TL,
- BL,
- date,
- bandBase,
- pointSMA,
- ubSMA,
- lbSMA,
- low = 2,
- high = 1,
- xData = [],
- yData = [],
- slicedX,
- slicedY,
- i;
- if (yValLen < period) {
- return;
- }
- for (i = 0; i <= yValLen; i++) {
- // Get UB and LB values of every point. This condition
- // is necessary, because there is a need to calculate current
- // UB nad LB values simultaneously with given period SMA
- // in one for loop.
- if (i < yValLen) {
- bandBase = getBaseForBand(yVal[i][low], yVal[i][high], factor);
- UB.push(getPointUB(yVal[i][high], bandBase));
- LB.push(getPointLB(yVal[i][low], bandBase));
- }
- if (i >= period) {
- slicedX = xVal.slice(i - period, i);
- slicedY = yVal.slice(i - period, i);
- ubSMA = _super.prototype.getValues.call(this, {
- xData: slicedX,
- yData: UB.slice(i - period, i)
- }, {
- period: period
- });
- lbSMA = _super.prototype.getValues.call(this, {
- xData: slicedX,
- yData: LB.slice(i - period, i)
- }, {
- period: period
- });
- pointSMA = _super.prototype.getValues.call(this, {
- xData: slicedX,
- yData: slicedY
- }, {
- period: period,
- index: index
- });
- date = pointSMA.xData[0];
- TL = ubSMA.yData[0];
- BL = lbSMA.yData[0];
- ML = pointSMA.yData[0];
- ABANDS.push([date, TL, ML, BL]);
- xData.push(date);
- yData.push([TL, ML, BL]);
- }
- }
- return {
- values: ABANDS,
- xData: xData,
- yData: yData
- };
- };
- /**
- * Acceleration bands (ABANDS). This series requires the `linkedTo` option
- * to be set and should be loaded after the
- * `stock/indicators/indicators.js`.
- *
- * @sample {highstock} stock/indicators/acceleration-bands
- * Acceleration Bands
- *
- * @extends plotOptions.sma
- * @mixes Highcharts.MultipleLinesMixin
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, joinBy, keys,
- * navigatorOptions, pointInterval, pointIntervalUnit,
- * pointPlacement, pointRange, pointStart, showInNavigator,
- * stacking,
- * @requires stock/indicators/indicators
- * @requires stock/indicators/acceleration-bands
- * @optionparent plotOptions.abands
- */
- ABandsIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- params: {
- period: 20,
- /**
- * The algorithms factor value used to calculate bands.
- *
- * @product highstock
- */
- factor: 0.001,
- index: 3
- },
- lineWidth: 1,
- topLine: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1
- }
- },
- bottomLine: {
- styles: {
- /**
- * Pixel width of the line.
- */
- lineWidth: 1
- }
- },
- dataGrouping: {
- approximation: 'averages'
- }
- });
- return ABandsIndicator;
- }(SMAIndicator));
- extend(ABandsIndicator.prototype, {
- drawGraph: MultipleLinesMixin.drawGraph,
- getTranslatedLinesNames: MultipleLinesMixin.getTranslatedLinesNames,
- linesApiNames: ['topLine', 'bottomLine'],
- nameBase: 'Acceleration Bands',
- nameComponents: ['period', 'factor'],
- pointArrayMap: ['top', 'middle', 'bottom'],
- pointValKey: 'middle',
- toYData: MultipleLinesMixin.toYData,
- translate: MultipleLinesMixin.translate
- });
- SeriesRegistry.registerSeriesType('abands', ABandsIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /* *
- *
- * API Options
- *
- * */
- /**
- * An Acceleration bands indicator. If the [type](#series.abands.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.abands
- * @since 7.0.0
- * @product highstock
- * @excluding allAreas, colorAxis, compare, compareBase, dataParser, dataURL,
- * joinBy, keys, navigatorOptions, pointInterval,
- * pointIntervalUnit, pointPlacement, pointRange, pointStart,
- * stacking, showInNavigator,
- * @requires stock/indicators/indicators
- * @requires stock/indicators/acceleration-bands
- * @apioption series.abands
- */
- ''; // to include the above in jsdoc
- return ABandsIndicator;
- });
- _registerModule(_modules, 'Stock/Indicators/TrendLine/TrendLineIndicator.js', [_modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (SeriesRegistry, U) {
- /* *
- *
- * License: www.highcharts.com/license
- *
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
- *
- * */
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d,
- b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d,
- b) { d.__proto__ = b; }) ||
- function (d,
- b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var SMAIndicator = SeriesRegistry.seriesTypes.sma;
- var extend = U.extend,
- merge = U.merge,
- isArray = U.isArray;
- /* *
- *
- * Class
- *
- * */
- /**
- * The Trend line series type.
- *
- * @private
- * @class
- * @name Highcharts.seriesTypes.trendline
- *
- * @augments Highcharts.Series
- */
- var TrendLineIndicator = /** @class */ (function (_super) {
- __extends(TrendLineIndicator, _super);
- function TrendLineIndicator() {
- var _this = _super !== null && _super.apply(this,
- arguments) || this;
- /* *
- *
- * Properties
- *
- * */
- _this.data = void 0;
- _this.options = void 0;
- _this.points = void 0;
- return _this;
- }
- /* *
- *
- * Functions
- *
- * */
- TrendLineIndicator.prototype.getValues = function (series, params) {
- var xVal = series.xData,
- yVal = series.yData,
- LR = [],
- xData = [],
- yData = [],
- sumX = 0,
- sumY = 0,
- sumXY = 0,
- sumX2 = 0,
- xValLength = xVal.length,
- index = params.index,
- alpha,
- beta,
- i,
- x,
- y;
- // Get sums:
- for (i = 0; i < xValLength; i++) {
- x = xVal[i];
- y = isArray(yVal[i]) ? yVal[i][index] : yVal[i];
- sumX += x;
- sumY += y;
- sumXY += x * y;
- sumX2 += x * x;
- }
- // Get slope and offset:
- alpha = (xValLength * sumXY - sumX * sumY) /
- (xValLength * sumX2 - sumX * sumX);
- if (isNaN(alpha)) {
- alpha = 0;
- }
- beta = (sumY - alpha * sumX) / xValLength;
- // Calculate linear regression:
- for (i = 0; i < xValLength; i++) {
- x = xVal[i];
- y = alpha * x + beta;
- // Prepare arrays required for getValues() method
- LR[i] = [x, y];
- xData[i] = x;
- yData[i] = y;
- }
- return {
- xData: xData,
- yData: yData,
- values: LR
- };
- };
- /**
- * Trendline (linear regression) fits a straight line to the selected data
- * using a method called the Sum Of Least Squares. This series requires the
- * `linkedTo` option to be set.
- *
- * @sample stock/indicators/trendline
- * Trendline indicator
- *
- * @extends plotOptions.sma
- * @since 7.1.3
- * @product highstock
- * @requires stock/indicators/indicators
- * @requires stock/indicators/trendline
- * @optionparent plotOptions.trendline
- */
- TrendLineIndicator.defaultOptions = merge(SMAIndicator.defaultOptions, {
- /**
- * @excluding period
- */
- params: {
- /**
- * The point index which indicator calculations will base. For
- * example using OHLC data, index=2 means the indicator will be
- * calculated using Low values.
- *
- * @default 3
- */
- index: 3
- }
- });
- return TrendLineIndicator;
- }(SMAIndicator));
- extend(TrendLineIndicator.prototype, {
- nameBase: 'Trendline',
- nameComponents: false
- });
- SeriesRegistry.registerSeriesType('trendline', TrendLineIndicator);
- /* *
- *
- * Default Export
- *
- * */
- /**
- * A `TrendLine` series. If the [type](#series.trendline.type) option is not
- * specified, it is inherited from [chart.type](#chart.type).
- *
- * @extends series,plotOptions.trendline
- * @since 7.1.3
- * @product highstock
- * @excluding dataParser, dataURL
- * @requires stock/indicators/indicators
- * @requires stock/indicators/trendline
- * @apioption series.trendline
- */
- ''; // to include the above in the js output
- return TrendLineIndicator;
- });
- _registerModule(_modules, 'masters/indicators/indicators-all.src.js', [], function () {
- // eslint-disable-next-line max-len
- // eslint-disable-next-line max-len
- });
- }));
|