12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167 |
- /*
- copyright (c) 2018 jones
- http://www.apache.org/licenses/LICENSE-2.0
- 开源项目 https://github.com/jones2000/HQChart
- jones_2000@163.com
- 小程序图形库
- */
- //行情数据结构体 及涉及到的行情算法(复权,周期等)
- import
- {
- JSCommon_ChartData as ChartData, JSCommon_HistoryData as HistoryData,
- JSCommon_SingleData as SingleData, JSCommon_MinuteData as MinuteData,
- JSCommon_Rect as Rect,
- } from "./umychart.data.wechat.js";
- import
- {
- JSCommonResource_Global_JSChartResource as g_JSChartResource,
- } from './umychart.resource.wechat.js'
- import
- {
- JSCommonSplit_IFrameSplitOperator as IFrameSplitOperator,
- } from './umychart.framesplit.wechat.js'
- import
- {
- JSCommonCoordinateData as JSCommonCoordinateData,
- JSCommonCoordinateData_MARKET_SUFFIX_NAME as MARKET_SUFFIX_NAME
- } from "./umychart.coordinatedata.wechat.js";
- //配色
- function JSChartPaintResource()
- {
- //指标不支持信息
- this.Index=
- {
- NotSupport : { Font: "12px 微软雅黑", TextColor: "rgb(52,52,52)" }
- }
- }
- var g_JSChartPaintResource = new JSChartPaintResource();
- //图新画法接口类
- function IChartPainting()
- {
- this.Canvas; //画布
- this.ChartBorder; //边框信息
- this.ChartFrame; //框架画法
- this.Name; //名称
- this.ClassName = 'IChartPainting'; //类名
- this.Data = new ChartData(); //数据区
- this.NotSupportMessage = null;
- this.MessageFont = g_JSChartPaintResource.Index.NotSupport.Font;
- this.MessageColor = g_JSChartPaintResource.Index.NotSupport.TextColor;
- this.IsDrawFirst = false; //是否比K线先画
- this.IsShow = true; //是否显示
- this.Draw = function () { }
- this.IsMinuteFrame=function()
- {
- var isMinute=(this.ChartFrame.ClassName=="MinuteFrame" || this.ChartFrame.ClassName=="MinuteHScreenFrame");
- return isMinute
- }
- this.DrawNotSupportmessage = function ()
- {
- this.Canvas.font = this.MessageFont;
- this.Canvas.setFillStyle(this.MessageColor);
- var left = this.ChartBorder.GetLeft();
- var width = this.ChartBorder.GetWidth();
- var top = this.ChartBorder.GetTopEx();
- var height = this.ChartBorder.GetHeightEx();
- var x = left + width / 2;
- var y = top + height / 2;
- this.Canvas.textAlign = "center";
- this.Canvas.textBaseline = "middle";
- this.Canvas.fillText(this.NotSupportMessage, x, y);
- }
- this.GetTooltipData = function (x, y, tooltip)
- {
- return false;
- }
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Min = null;
- range.Max = null;
- if (!this.Data || !this.Data.Data) return range;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null || isNaN(value)) continue;
- if (range.Max == null) range.Max = value;
- if (range.Min == null) range.Min = value;
- if (range.Max < value) range.Max = value;
- if (range.Min > value) range.Min = value;
- }
- return range;
- }
- this.GetDynamicFont = function (dataWidth) //根据宽度自动获取对应字体
- {
- var font;
- if (dataWidth < 5) font = '4px Arial'; //字体根据数据宽度动态调整
- else if (dataWidth < 7) font = '6px Arial';
- else if (dataWidth < 9) font = '8px Arial';
- else if (dataWidth < 11) font = '10px Arial';
- else if (dataWidth < 13) font = '12px Arial';
- else if (dataWidth < 15) font = '14px Arial';
- else font = '16px Arial';
- console.log(dataWidth);
- return font;
- }
- this.GetDynamicFontEx=function(dataWidth, distanceWidth, maxSize, minSize, zoom, fontname) //根据宽度自动获取对应字体
- {
- if (maxSize==minSize)
- {
- var font=`${maxSize.toFixed(0)}px ${fontname}` ;
- return font;
- }
- var fontSize=(dataWidth+distanceWidth);
- if (zoom)
- {
- if (zoom.Type==0)
- {
- if (zoom.Value>0) fontSize=(dataWidth*zoom.Value);
- }
- else if (zoom.Type==1)
- {
- if (zoom.Value>0) fontSize=(dataWidth+distanceWidth)*zoom.Value;
- }
- else if (zoom.Type==2)
- {
- if (IFrameSplitOperator.IsNumber(zoom.Value))
- fontSize=(dataWidth+distanceWidth) + (2*zoom.Value);
- }
- }
- if (fontSize<minSize) fontSize=minSize;
- else if (fontSize>maxSize) fontSize=maxSize;
- var font=`${fontSize.toFixed(0)}px ${fontname}` ;
- return font;
- }
- this.SetFillStyle = function (color, x0, y0, x1, y1)
- {
- if (Array.isArray(color))
- {
- let gradient = this.Canvas.createLinearGradient(x0, y0, x1, y1);
- var offset = 1 / (color.length);
- for (var i in color)
- {
- gradient.addColorStop(i * offset, color[i]);
- }
- this.Canvas.setFillStyle(gradient);
- }
- else
- {
- this.Canvas.setFillStyle(color);
- }
- }
- }
- //K线画法
- function ChartKLine()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName = 'ChartKLine';
- this.Symbol; //股票代码
- this.DrawType = 0; // 0=K线 1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积
- this.CloseLineColor = g_JSChartResource.CloseLineColor;
- this.CloseLineAreaColor = g_JSChartResource.CloseLineAreaColor;
- this.UpColor = g_JSChartResource.UpBarColor;
- this.DownColor = g_JSChartResource.DownBarColor;
- this.UnchagneColor = g_JSChartResource.UnchagneBarColor; //平盘
- this.ColorData; //五彩K线颜色 >0 UpColor 其他 DownColor
- this.TradeData; //交易系统 包含买卖数据{Buy:, Sell:}
- this.IsShowMaxMinPrice = true; //是否显示最大最小值
- this.TextFont = g_JSChartResource.KLine.MaxMin.Font;
- this.TextColor = g_JSChartResource.KLine.MaxMin.Color;
- this.InfoPointColor = g_JSChartResource.KLine.Info.Color;
- this.InfoPointColor2 = g_JSChartResource.KLine.Info.Color2;
- this.InfoDrawType = 0; //0=在底部画远点 1=在最低价画三角
- this.PtMax; //最大值的位置
- this.PtMin; //最小值的位置
- this.MinBarWidth=g_JSChartResource.MinKLineBarWidth; //最小的柱子宽度
- this.DrawAKLine = function () //美国线
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + g_JSChartResource.FrameLeftMargin;
- if (isHScreen) xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + g_JSChartResource.FrameLeftMargin;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var ptMax = { X: null, Y: null, Value: null, Align: 'left' };
- var ptMin = { X: null, Y: null, Value: null, Align: 'left' };
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var x = left + (right - left) / 2;
- var yLow = this.ChartFrame.GetYFromData(data.Low);
- var yHigh = this.ChartFrame.GetYFromData(data.High);
- var yOpen = this.ChartFrame.GetYFromData(data.Open);
- var yClose = this.ChartFrame.GetYFromData(data.Close);
- if (ptMax.Value == null || ptMax.Value < data.High) //求最大值
- {
- ptMax.X = x;
- ptMax.Y = yHigh;
- ptMax.Value = data.High;
- ptMax.Align = j < xPointCount / 2 ? 'left' : 'right';
- }
- if (ptMin.Value == null || ptMin.Value > data.Low) //求最小值
- {
- ptMin.X = x;
- ptMin.Y = yLow;
- ptMin.Value = data.Low;
- ptMin.Align = j < xPointCount / 2 ? 'left' : 'right';
- }
- if (data.Open < data.Close) this.Canvas.setStrokeStyle(this.UpColor); //阳线
- else if (data.Open > data.Close) this.Canvas.setStrokeStyle(this.DownColor); //阳线
- else this.Canvas.setStrokeStyle(this.UnchagneColor); //平线
- this.Canvas.beginPath(); //最高-最低
- if (isHScreen) {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- this.Canvas.stroke();
- if (dataWidth >= this.MinBarWidth) {
- this.Canvas.beginPath(); //开盘
- if (isHScreen) {
- this.Canvas.moveTo(ToFixedPoint(yOpen), left);
- this.Canvas.lineTo(ToFixedPoint(yOpen), x);
- }
- else {
- this.Canvas.moveTo(left, ToFixedPoint(yOpen));
- this.Canvas.lineTo(x, ToFixedPoint(yOpen));
- }
- this.Canvas.stroke();
- this.Canvas.beginPath(); //收盘
- if (isHScreen) {
- this.Canvas.moveTo(ToFixedPoint(yClose), right);
- this.Canvas.lineTo(ToFixedPoint(yClose), x);
- }
- else {
- this.Canvas.moveTo(right, ToFixedPoint(yClose));
- this.Canvas.lineTo(x, ToFixedPoint(yClose));
- }
- this.Canvas.stroke();
- }
- if (this.Data.DataType == 0 && ChartData.IsDayPeriod(this.Data.Period,true)) //信息地雷
- {
- var infoItem = { X: x, Xleft: left, XRight: right, YMax: yHigh, YMin: yLow, DayData: data, Index: j };
- this.DrawInfoDiv(infoItem);
- }
- }
- this.PtMax = ptMax;
- this.PtMin = ptMin;
- }
- this.DrawCloseLine = function () //收盘价线
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- if (isHScreen) xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var bFirstPoint = true;
- this.Canvas.beginPath();
- this.Canvas.setStrokeStyle(this.CloseLineColor);
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth)) {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var x = left + (right - left) / 2;
- var yClose = this.ChartFrame.GetYFromData(data.Close);
- if (bFirstPoint) {
- if (isHScreen) this.Canvas.moveTo(yClose, x);
- else this.Canvas.moveTo(x, yClose);
- bFirstPoint = false;
- }
- else {
- if (isHScreen) this.Canvas.lineTo(yClose, x);
- else this.Canvas.lineTo(x, yClose);
- }
- }
- if (bFirstPoint == false) this.Canvas.stroke();
- }
- this.DrawCloseArea = function () //收盘价面积
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- if (isHScreen) xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var bFirstPoint = true;
- var firstPoint = null;
- this.Canvas.beginPath();
- this.Canvas.setStrokeStyle(this.CloseLineColor);
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth)) {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var x = left + (right - left) / 2;
- var yClose = this.ChartFrame.GetYFromData(data.Close);
- if (bFirstPoint) {
- if (isHScreen) {
- this.Canvas.moveTo(yClose, x);
- firstPoint = { X: yClose, Y: x };
- }
- else {
- this.Canvas.moveTo(x, yClose);
- firstPoint = { X: x, Y: yClose };
- }
- bFirstPoint = false;
- }
- else {
- if (isHScreen) this.Canvas.lineTo(yClose, x);
- else this.Canvas.lineTo(x, yClose);
- }
- }
- if (bFirstPoint) return;
- this.Canvas.stroke();
- //画面积
- if (isHScreen) {
- this.Canvas.lineTo(this.ChartBorder.GetLeft(), x);
- this.Canvas.lineTo(this.ChartBorder.GetLeft(), firstPoint.Y);
- }
- else {
- this.Canvas.lineTo(x, this.ChartBorder.GetBottom());
- this.Canvas.lineTo(firstPoint.X, this.ChartBorder.GetBottom());
- }
- this.Canvas.closePath();
- if (Array.isArray(this.CloseLineAreaColor)) {
- if (isHScreen) {
- let gradient = this.Canvas.createLinearGradient(this.ChartBorder.GetRightEx(), this.ChartBorder.GetTop(), this.ChartBorder.GetLeft(), this.ChartBorder.GetTop());
- gradient.addColorStop(0, this.CloseLineAreaColor[0]);
- gradient.addColorStop(1, this.CloseLineAreaColor[1]);
- this.Canvas.setFillStyle(gradient);
- }
- else {
- let gradient = this.Canvas.createLinearGradient(firstPoint.X, this.ChartBorder.GetTopEx(), firstPoint.X, this.ChartBorder.GetBottom());
- gradient.addColorStop(0, this.CloseLineAreaColor[0]);
- gradient.addColorStop(1, this.CloseLineAreaColor[1]);
- this.Canvas.setFillStyle(gradient);
- }
- }
- else {
- this.Canvas.setFillStyle(this.CloseLineAreaColor);
- }
- this.Canvas.fill();
- }
- this.DrawKBar = function ()
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- var xPointCount = this.ChartFrame.XPointCount;
- if (isHScreen) {
- xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- chartright = this.ChartBorder.GetBottom();
- }
- var ptMax = { X: null, Y: null, Value: null, Align: 'left' };
- var ptMin = { X: null, Y: null, Value: null, Align: 'left' };
- var upColor = this.UpColor;
- var downColor = this.DownColor;
- var unchagneColor = this.UnchagneColor;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright)
- break;
- var x = left + (right - left) / 2;
- var yLow = this.ChartFrame.GetYFromData(data.Low);
- var yHigh = this.ChartFrame.GetYFromData(data.High);
- var yOpen = this.ChartFrame.GetYFromData(data.Open);
- var yClose = this.ChartFrame.GetYFromData(data.Close);
- var y = yHigh;
- if (ptMax.Value == null || ptMax.Value < data.High) //求最大值
- {
- ptMax.X = x;
- ptMax.Y = yHigh;
- ptMax.Value = data.High;
- ptMax.Align = j < xPointCount / 2 ? 'left' : 'right';
- }
- if (ptMin.Value == null || ptMin.Value > data.Low) //求最小值
- {
- ptMin.X = x;
- ptMin.Y = yLow;
- ptMin.Value = data.Low;
- ptMin.Align = j < xPointCount / 2 ? 'left' : 'right';
- }
- if (this.ColorData) ///五彩K线颜色设置
- {
- if (i < this.ColorData.length)
- upColor = downColor = unchagneColor = (this.ColorData[i] > 0 ? this.UpColor : this.DownColor);
- else
- upColor = downColor = unchagneColor = this.DownColor;
- }
- if (data.Open < data.Close) //阳线
- {
- if (dataWidth >= this.MinBarWidth)
- {
- this.Canvas.setStrokeStyle(upColor);
- if (data.High > data.Close) //上影线
- {
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(this.DrawType == 3 ? Math.max(yClose, yOpen) : yClose), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(this.DrawType == 3 ? Math.min(yClose, yOpen) : yClose));
- }
- this.Canvas.stroke();
- y = yClose;
- }
- else
- {
- y = yClose;
- }
- this.Canvas.setFillStyle(upColor);
- if (isHScreen)
- {
- if (Math.abs(yOpen - y) < 1)
- {
- this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(left), 1, ToFixedRect(dataWidth)); //高度小于1,统一使用高度1
- }
- else
- {
- if (this.DrawType == 3) //空心柱
- {
- this.Canvas.beginPath();
- this.Canvas.rect(ToFixedPoint(y), ToFixedPoint(left), ToFixedRect(yOpen - y), ToFixedRect(dataWidth));
- this.Canvas.stroke();
- }
- else
- {
- //宽度是负数竟然不会画, h5就可以
- //this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(left), ToFixedRect(yOpen - y), ToFixedRect(dataWidth));
- this.Canvas.fillRect(ToFixedRect(Math.min(yOpen, y)), ToFixedRect(left), ToFixedRect(Math.abs(yOpen - y)), ToFixedRect(dataWidth));
- }
- }
- }
- else
- {
- if (Math.abs(yOpen - y) < 1)
- {
- this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), 1); //高度小于1,统一使用高度1
- }
- else
- {
- if (this.DrawType == 3) //空心柱
- {
- this.Canvas.beginPath();
- this.Canvas.rect(ToFixedPoint(left), ToFixedPoint(y), ToFixedRect(dataWidth), ToFixedRect(yOpen - y));
- this.Canvas.stroke();
- }
- else
- {
- this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), ToFixedRect(yOpen - y));
- }
- }
- }
- if (data.Open > data.Low) //下影线
- {
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(this.DrawType == 3 ? Math.min(yClose, yOpen) : y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yLow), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(this.DrawType == 3 ? Math.max(yClose, yOpen) : y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yLow));
- }
- this.Canvas.stroke();
- }
- }
- else
- {
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- this.Canvas.setStrokeStyle(upColor);
- this.Canvas.stroke();
- }
- }
- else if (data.Open > data.Close) //阴线
- {
- if (dataWidth >= this.MinBarWidth)
- {
- this.Canvas.setStrokeStyle(downColor);
- if (data.High > data.Close) //上影线
- {
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yOpen), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yOpen));
- }
- this.Canvas.stroke();
- y = yOpen;
- }
- else
- {
- y = yOpen
- }
- this.Canvas.setFillStyle(downColor);
- if (isHScreen)
- {
- if (Math.abs(yClose - y) < 1)
- {
- this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(left), 1, ToFixedRect(dataWidth)); //高度小于1,统一使用高度1
- }
- else
- {
- //宽度是负数竟然不会画, h5就可以
- this.Canvas.fillRect(ToFixedRect(Math.min(yClose, y)), ToFixedRect(left), ToFixedRect(Math.abs(yClose - y)), ToFixedRect(dataWidth));
- }
- }
- else
- {
- if (Math.abs(yClose - y) < 1) this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), 1); //高度小于1,统一使用高度1
- else this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), ToFixedRect(yClose - y));
- }
- if (data.Open > data.Low) //下影线
- {
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yLow), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yLow));
- }
- this.Canvas.stroke();
- }
- }
- else
- {
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- this.Canvas.setStrokeStyle(downColor);
- this.Canvas.stroke();
- }
- }
- else // 平线
- {
- if (dataWidth >= this.MinBarWidth)
- {
- this.Canvas.setStrokeStyle(unchagneColor);
- this.Canvas.beginPath();
- if (data.High > data.Close) //上影线
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(y, ToFixedPoint(x));
- this.Canvas.lineTo(yOpen, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), y);
- this.Canvas.lineTo(ToFixedPoint(x), yOpen);
- }
- y = yOpen;
- }
- else
- {
- y = yOpen;
- }
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(left));
- this.Canvas.lineTo(ToFixedPoint(y), ToFixedPoint(right));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(left), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(right), ToFixedPoint(y));
- }
- if (data.Open > data.Low) //下影线
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yLow), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yLow));
- }
- }
- this.Canvas.stroke();
- }
- else
- {
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- this.Canvas.setStrokeStyle(unchagneColor);
- this.Canvas.stroke();
- }
- }
- if (this.Data.DataType == 0 && ChartData.IsDayPeriod(this.Data.Period,true)) //信息地雷
- {
- var infoItem = { X: x, Xleft: left, XRight: right, YMax: yHigh, YMin: yLow, DayData: data, Index: j };
- this.DrawInfoDiv(infoItem);
- }
- }
- this.PtMax = ptMax;
- this.PtMin = ptMin;
- }
- this.DrawTrade = function () //交易系统
- {
- if (!this.TradeData) return;
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- var xPointCount = this.ChartFrame.XPointCount;
- if (isHScreen) {
- xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- chartright = this.ChartBorder.GetBottom();
- }
- var sellData = this.TradeData.Sell;
- var buyData = this.TradeData.Buy;
- var arrowWidth = dataWidth;
- if (arrowWidth > 10) arrowWidth = 10;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth)) {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- var buy = false, sell = false;
- if (sellData && i < sellData.length) sell = sellData[i] > 0;
- if (buyData && i < buyData.length) buy = buyData[i] > 0;
- if (!sell && !buy) continue;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var x = left + (right - left) / 2;
- var yLow = this.ChartFrame.GetYFromData(data.Low);
- var yHigh = this.ChartFrame.GetYFromData(data.High);
- var yOpen = this.ChartFrame.GetYFromData(data.Open);
- var yClose = this.ChartFrame.GetYFromData(data.Close);
- var y = yHigh;
- if (buy) {
- this.Canvas.setFillStyle(this.UpColor);
- this.Canvas.setStrokeStyle(this.UnchagneColor);
- this.Canvas.beginPath();
- if (isHScreen) {
- this.Canvas.moveTo(yLow - 1, x);
- this.Canvas.lineTo(yLow - arrowWidth - 1, x - arrowWidth / 2);
- this.Canvas.lineTo(yLow - arrowWidth - 1, x + arrowWidth / 2);
- }
- else {
- this.Canvas.moveTo(x, yLow + 1);
- this.Canvas.lineTo(x - arrowWidth / 2, yLow + arrowWidth + 1);
- this.Canvas.lineTo(x + arrowWidth / 2, yLow + arrowWidth + 1);
- }
- this.Canvas.closePath();
- this.Canvas.fill();
- this.Canvas.stroke();
- }
- if (sell) {
- this.Canvas.setFillStyle(this.DownColor);
- this.Canvas.setStrokeStyle(this.UnchagneColor);
- this.Canvas.beginPath();
- if (isHScreen) {
- this.Canvas.moveTo(yHigh + 1, x);
- this.Canvas.lineTo(yHigh + arrowWidth + 1, x - arrowWidth / 2);
- this.Canvas.lineTo(yHigh + arrowWidth + 1, x + arrowWidth / 2);
- }
- else {
- this.Canvas.moveTo(x, yHigh - 1);
- this.Canvas.lineTo(x - arrowWidth / 2, yHigh - arrowWidth - 1);
- this.Canvas.lineTo(x + arrowWidth / 2, yHigh - arrowWidth - 1);
- }
- this.Canvas.closePath();
- this.Canvas.fill();
- this.Canvas.stroke();
- }
- }
- }
- this.Draw = function () {
- this.PtMax = { X: null, Y: null, Value: null, Align: 'left' }; //清空最大
- this.PtMin = { X: null, Y: null, Value: null, Align: 'left' }; //清空最小
- this.ChartFrame.ChartKLine = { Max: null, Min: null }; //保存K线上 显示最大最小值坐标
- if (this.IsShow == false) return;
- if (this.DrawType == 1) {
- this.DrawCloseLine();
- return;
- }
- else if (this.DrawType == 2) {
- this.DrawAKLine();
- }
- else if (this.DrawType == 4) {
- this.DrawCloseArea();
- }
- else {
- this.DrawKBar();
- }
- this.DrawTrade();
- if (this.IsShowMaxMinPrice) //标注最大值最小值
- {
- if (this.ChartFrame.IsHScreen === true) this.HScreenDrawMaxMinPrice(this.PtMax, this.PtMin);
- else this.DrawMaxMinPrice(this.PtMax, this.PtMin);
- }
- }
- this.DrawMaxMinPrice = function (ptMax, ptMin) {
- if (ptMax.X == null || ptMax.Y == null || ptMax.Value == null) return;
- if (ptMin.X == null || ptMin.Y == null || ptMin.Value == null) return;
- var leftArrow=g_JSChartResource.KLine.MaxMin.LeftArrow;
- var rightArrow=g_JSChartResource.KLine.MaxMin.RightArrow;
- var highYOffset=g_JSChartResource.KLine.MaxMin.HighYOffset;
- var lowYOffset=g_JSChartResource.KLine.MaxMin.LowYOffset;
- var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
- this.Canvas.font = this.TextFont;
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.textAlign = ptMax.Align;
- this.Canvas.textBaseline = 'bottom';
- var left = ptMax.X;
- if (IFrameSplitOperator.IsNumber(highYOffset)) ptMax.Y+=highYOffset;
- var text = ptMax.Value.toFixed(defaultfloatPrecision);
- if (ptMax.Align == 'left') text = leftArrow + text;
- else text = text + rightArrow;
- this.Canvas.fillText(text, left, ptMax.Y);
- this.ChartFrame.ChartKLine.Max = { X: left, Y: ptMax.Y, Text: { BaseLine: 'bottom' } };
- this.Canvas.textAlign = ptMin.Align;
- this.Canvas.textBaseline = 'top';
- var left = ptMin.X;
- if (IFrameSplitOperator.IsNumber(lowYOffset)) ptMin.Y+=lowYOffset;
- text = ptMin.Value.toFixed(defaultfloatPrecision);
- if (ptMin.Align == 'left') text = leftArrow + text;
- else text = text + rightArrow;
- this.Canvas.fillText(text, left, ptMin.Y);
- this.ChartFrame.ChartKLine.Min = { X: left, Y: ptMin.Y, Text: { BaseLine: 'top' } };
- }
- this.HScreenDrawMaxMinPrice = function (ptMax, ptMin) //横屏模式下显示最大最小值
- {
- if (ptMax.X == null || ptMax.Y == null || ptMax.Value == null) return;
- if (ptMin.X == null || ptMin.Y == null || ptMin.Value == null) return;
- var leftArrow=g_JSChartResource.KLine.MaxMin.LeftArrow;
- var rightArrow=g_JSChartResource.KLine.MaxMin.RightArrow;
- var highYOffset=g_JSChartResource.KLine.MaxMin.HighYOffset;
- var lowYOffset=g_JSChartResource.KLine.MaxMin.LowYOffset;
- var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
- var xText = ptMax.Y;
- var yText = ptMax.X;
- if (IFrameSplitOperator.IsNumber(highYOffset)) xText+=highYOffset;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180);
- this.Canvas.font = this.TextFont;
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.textAlign = ptMax.Align;
- this.Canvas.textBaseline = 'bottom';
- var text = ptMax.Value.toFixed(defaultfloatPrecision);
- if (ptMax.Align == 'left') text = leftArrow + text;
- else text = text + rightArrow;
- this.Canvas.fillText(text, 0, 0);
- this.Canvas.restore();
- var xText = ptMin.Y;
- var yText = ptMin.X;
- if (IFrameSplitOperator.IsNumber(lowYOffset)) xText+=lowYOffset;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180);
- this.Canvas.font = this.TextFont;
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.textAlign = ptMin.Align;
- this.Canvas.textBaseline = 'top';
- var text = ptMin.Value.toFixed(defaultfloatPrecision);
- if (ptMin.Align == 'left') text = leftArrow + text;
- else text = text + rightArrow;
- this.Canvas.fillText(text, 0, 0);
- this.Canvas.restore();
- }
- //画某一天的信息地雷 画在底部
- this.DrawInfoDiv = function (item) {
- if (!this.InfoData || this.InfoData.length <= 0) return;
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var infoData = this.InfoData.get(item.DayData.Date.toString());
- if (!infoData || infoData.Data.length <= 0) return;
- var bHScreen = (this.ChartFrame.IsHScreen === true);
- if (this.InfoDrawType === 1) {
- this.Canvas.font = this.GetDynamicFont(dataWidth);
- this.Canvas.setFillStyle(this.InfoPointColor2);
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'top';
- if (bHScreen) {
- var xText = item.YMin;
- var yText = item.X;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180);
- this.Canvas.fillText('▲', 0, 0);
- this.Canvas.restore();
- }
- else {
- var left = ToFixedPoint(item.X);
- this.Canvas.fillText('▲', left, item.YMin);
- }
- }
- else {
- var dataWidth = this.ChartFrame.DataWidth;
- var radius = dataWidth / 2;
- if (radius > 3) radius = 3;
- var x = item.X;
- var y = this.ChartFrame.ChartBorder.GetBottom() - 2 - radius;
- if (bHScreen) y = this.ChartFrame.ChartBorder.GetLeft() + 2 + radius;
- this.Canvas.setFillStyle(this.InfoPointColor);
- this.Canvas.beginPath();
- if (bHScreen) this.Canvas.arc(y, x, radius, 0, Math.PI * 2, true);
- else this.Canvas.arc(ToFixedPoint(x), y, radius, 0, Math.PI * 2, true);
- this.Canvas.closePath();
- this.Canvas.fill();
- }
- }
- this.GetTooltipData = function (x, y, tooltip) {
- return false;
- }
- this.GetMaxMin = function () //计算当天显示数据的最大最小值
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Max = null;
- range.Min = null;
- if (this.IsShow == false) return range;
- if (this.DrawType==1 || this.DrawType==4 ) // 1=收盘价线 4=收盘价面积图
- {
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
- {
- var data=this.Data.Data[i];
- if (!IFrameSplitOperator.IsNumber(data.Close)) continue;
- if (range.Max==null) range.Max=data.Close;
- if (range.Min==null) range.Min=data.Close;
- if (range.Max<data.Close) range.Max=data.Close;
- if (range.Min>data.Close) range.Min=data.Close;
- }
- }
- else
- {
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
-
- if (range.Max == null) range.Max = data.High;
- if (range.Min == null) range.Min = data.Low;
-
- if (range.Max < data.High) range.Max = data.High;
- if (range.Min > data.Low) range.Min = data.Low;
- }
-
- }
-
- return range;
- }
- }
- /*
- 文字输出 支持横屏
- 数组不为null的数据中输出 this.Text文本
- */
- function ChartSingleText()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.Color = "rgb(255,193,37)"; //线段颜色
- this.TextFont = "12px 微软雅黑"; //字体
- this.Text;
- this.TextAlign = 'left';
- this.Direction = 0; //0=middle 1=bottom 2=top
- this.YOffset = 0;
- this.Position; //指定输出位置
- this.TextSize=
- {
- Max: g_JSChartResource.DRAWICON.Text.MaxSize, Min:g_JSChartResource.DRAWICON.Text.MinSize, //字体的最大最小值
- Zoom:{ Type:g_JSChartResource.DRAWICON.Text.Zoom.Type , Value:g_JSChartResource.DRAWICON.Text.Zoom.Value }, //放大倍数
- FontName:g_JSChartResource.DRAWICON.Text.FontName
- }
- this.ReloadResource=function(resource)
- {
- if (this.Name=="DRAWTEXT")
- {
- this.TextSize=
- {
- Max: g_JSChartResource.DRAWTEXT.MaxSize, Min:g_JSChartResource.DRAWTEXT.MinSize, //字体的最大最小值
- Zoom:{ Type:g_JSChartResource.DRAWTEXT.Zoom.Type , Value:g_JSChartResource.DRAWTEXT.Zoom.Value }, //放大倍数
- FontName:g_JSChartResource.DRAWTEXT.FontName
- }
- }
- else if (this.Name=="DRAWNUMBER")
- {
- this.TextSize=
- {
- Max: g_JSChartResource.DRAWNUMBER.MaxSize, Min:g_JSChartResource.DRAWNUMBER.MinSize, //字体的最大最小值
- Zoom:{ Type:g_JSChartResource.DRAWNUMBER.Zoom.Type , Value:g_JSChartResource.DRAWNUMBER.Zoom.Value }, //放大倍数
- FontName:g_JSChartResource.DRAWNUMBER.FontName
- }
- }
- }
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- if (this.Position)
- {
- this.DrawPosition();
- return;
- }
- if (!this.Data || !this.Data.Data) return;
- var isHScreen = (this.ChartFrame.IsHScreen === true)
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- var top = this.ChartBorder.GetTopEx();
- var bottom = this.ChartBorder.GetBottomEx();
- if (isHScreen)
- {
- chartright = this.ChartBorder.GetBottom();
- top = this.ChartBorder.GetRightEx();
- bottom = this.ChartBorder.GetLeftEx();
- }
- var xPointCount = this.ChartFrame.XPointCount;
- var isArrayText = Array.isArray(this.Text);
- var text;
- if (this.Direction == 1) this.Canvas.textBaseline = 'bottom';
- else if (this.Direction == 2) this.Canvas.textBaseline = 'top';
- else this.Canvas.textBaseline = 'middle';
- this.TextFont = this.GetDynamicFontEx(dataWidth,distanceWidth,this.TextSize.Max,this.TextSize.Min,this.TextSize.Zoom,this.TextSize.FontName);
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var x = this.ChartFrame.GetXFromIndex(j);
- var y = this.ChartFrame.GetYFromData(value);
- if (x > chartright) break;
- this.Canvas.textAlign = this.TextAlign;
- this.Canvas.setFillStyle(this.Color);
- this.Canvas.font = this.TextFont;
- if (this.YOffset > 0 && this.Direction > 0)
- {
- var yPrice = y;
-
- this.Canvas.save();
- this.Canvas.setLineDash([5, 10]);
- this.Canvas.setStrokeStyle(this.Color);
- this.Canvas.beginPath();
- if (isHScreen)
- {
- if (this.Direction == 1)
- {
- y = top - this.YOffset;
- yPrice += 5;
- }
- else
- {
- y = bottom + this.YOffset;
- yPrice -= 5;
- }
- this.Canvas.moveTo(ToFixedPoint(yPrice), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(y), ToFixedPoint(x));
- }
- else
- {
- if (this.Direction == 1)
- {
- y = top + this.YOffset;
- yPrice += 5;
- }
- else
- {
- y = bottom - this.YOffset;
- yPrice -= 5;
- }
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(yPrice));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(y));
- }
-
- this.Canvas.stroke();
- this.Canvas.restore();
- }
- if (isArrayText)
- {
- text = this.Text[i];
- if (!text) continue;
- if (isHScreen)
- {
- if (this.Name=='DRAWNUMBER')
- {
- if (this.Direction==1) y+=g_JSChartResource.DRAWABOVE.YOffset;
- else if (this.Direction==2) y-=4;
- }
- }
- else
- {
- if (this.Name=='DRAWNUMBER')
- {
- if (this.Direction==1) y-=g_JSChartResource.DRAWABOVE.YOffset;
- else if (this.Direction==2) y+=4;
- }
- }
-
- this.DrawText(text, x, y, isHScreen);
- }
- else
- {
- this.DrawText(this.Text, x, y, isHScreen);
- }
- }
- }
- this.DrawPosition=function() //绘制在指定位置上
- {
- if (!this.Text) return;
- var isHScreen=(this.ChartFrame.IsHScreen===true)
- if (isHScreen)
- {
- var y=this.ChartBorder.GetRightEx()-this.ChartBorder.GetWidthEx()*this.Position.Y;
- var x=this.ChartBorder.GetTop()+this.ChartBorder.GetHeight()*this.Position.X;
- }
- else
- {
- var x=this.ChartBorder.GetLeft()+this.ChartBorder.GetWidth()*this.Position.X;
- var y=this.ChartBorder.GetTopEx()+this.ChartBorder.GetHeight()*this.Position.Y;
- }
- this.Canvas.fillStyle=this.Color;
- //TYPE:0为左对齐,1为右对齐.
- if (this.Position.Type==0) this.Canvas.textAlign='left';
- else if (this.Position.Type==1) this.Canvas.textAlign='right';
- else this.Canvas.textAlign='center';
- if (this.Direction==1) this.Canvas.textBaseline='bottom';
- else if (this.Direction==2) this.Canvas.textBaseline='top';
- else this.Canvas.textBaseline='middle';
- this.DrawText(this.Text,x,y,isHScreen);
- }
- this.DrawText = function (text, x, y, isHScreen)
- {
-
- if(text.length<=2){
- this.Canvas.font="18px Arial";
- }else{
- this.Canvas.font="12px Arial";
- }
-
-
- // console.log(text);
- // console.log(text.length);
- // console.log(this.Canvas.font);
- if (isHScreen)
- {
- this.Canvas.save();
- this.Canvas.translate(y, x);
- this.Canvas.rotate(90 * Math.PI / 180);
- this.Canvas.fillText(text, 0, 0);
- this.Canvas.restore();
- }
- else
- {
- this.Canvas.fillText(text, x, y);
- }
- }
- }
- //线段
- function ChartLine()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName ='ChartLine';
- this.Color = "rgb(255,193,37)"; //线段颜色
- this.LineWidth; //线段宽度
- this.DrawType = 0; //画图方式 0=无效数平滑 1=无效数不画断开
- this.IsDotLine = false; //虚线
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- if (!this.Data || !this.Data.Data) return;
- switch (this.DrawType)
- {
- case 0:
- return this.DrawLine();
- case 1:
- return this.DrawStraightLine();
- }
- }
- this.DrawLine = function ()
- {
- var bHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- if (bHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- this.Canvas.save();
- if (this.LineWidth > 0) this.Canvas.lineWidth = this.LineWidth;
- var bFirstPoint = true;
- var drawCount = 0;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var x = this.ChartFrame.GetXFromIndex(j);
- var y = this.GetYFromData(value);
- if (x > chartright) break;
- if (bFirstPoint)
- {
- this.Canvas.setStrokeStyle(this.Color);
- this.Canvas.beginPath();
- if (bHScreen) this.Canvas.moveTo(y, x); //横屏坐标轴对调
- else this.Canvas.moveTo(x, y);
- bFirstPoint = false;
- }
- else
- {
- if (bHScreen) this.Canvas.lineTo(y, x);
- else this.Canvas.lineTo(x, y);
- }
- ++drawCount;
- }
- if (drawCount > 0) this.Canvas.stroke();
- this.Canvas.restore();
- }
- //无效数不画
- this.DrawStraightLine = function ()
- {
- var bHScreen = (this.ChartFrame.IsHScreen === true);
- var isMinute=this.IsMinuteFrame();
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
- var chartright = this.ChartBorder.GetRight();
- if (bHScreen) chartright = this.ChartBorder.GetBottom();
- if (bHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
- var xPointCount = this.ChartFrame.XPointCount;
- this.Canvas.save();
- if (this.LineWidth > 0) this.Canvas.lineWidth = this.LineWidth;
- this.Canvas.setStrokeStyle(this.Color);
- if (this.IsDotLine) this.Canvas.setLineDash([3, 5]); //画虚线
- var bFirstPoint = true;
- var drawCount = 0;
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
- //for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null)
- {
- if (drawCount > 0) this.Canvas.stroke();
- bFirstPoint = true;
- drawCount = 0;
- continue;
- }
- if (isMinute)
- {
- var x = this.ChartFrame.GetXFromIndex(j);
- }
- else
- {
- var left=xOffset;
- var right=xOffset+dataWidth;
- if (right>chartright) break;
- var x=left+(right-left)/2;
- }
-
-
- var y = this.GetYFromData(value);
- if (x > chartright) break;
- if (bFirstPoint)
- {
- this.Canvas.beginPath();
- if (bHScreen) this.Canvas.moveTo(y, x); //横屏坐标轴对调
- else this.Canvas.moveTo(x, y);
- bFirstPoint = false;
- }
- else
- {
- if (bHScreen) this.Canvas.lineTo(y, x);
- else this.Canvas.lineTo(x, y);
- }
- ++drawCount;
- }
- if (drawCount > 0) this.Canvas.stroke();
- this.Canvas.restore();
- }
- this.GetYFromData = function (value)
- {
- return this.ChartFrame.GetYFromData(value);
- }
- }
- //子线段
- function ChartSubLine()
- {
- this.newMethod = ChartLine; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName = 'ChartSubLine'; //类名
- this.Color = "rgb(255,193,37)"; //线段颜色
- this.LineWidth; //线段宽度
- this.DrawType = 0; //画图方式 0=无效数平滑 1=无效数不画断开
- this.IsDotLine = false; //虚线
- this.SubFrame = { Max: null, Min: null };
- this.Draw = function ()
- {
- if (!this.IsShow) return;
- if (!this.Data || !this.Data.Data) return;
- this.CalculateDataMaxMin();
- switch (this.DrawType)
- {
- case 0:
- return this.DrawLine();
- case 1:
- return this.DrawStraightLine();
- }
- }
- this.GetYFromData = function (value)
- {
- var bHScreen = (this.ChartFrame.IsHScreen === true);
- if (bHScreen)
- {
- if (value <= this.SubFrame.Min) return this.ChartBorder.GetLeftEx();
- if (value >= this.SubFrame.Max) return this.ChartBorder.GetRightEx();
- var width = this.ChartBorder.GetWidthEx() * (value - this.SubFrame.Min) / (this.SubFrame.Max - this.SubFrame.Min);
- return this.ChartBorder.GetLeftEx() + width;
- }
- else
- {
- if (value <= this.SubFrame.Min) return this.ChartBorder.GetBottomEx();
- if (value >= this.SubFrame.Max) return this.ChartBorder.GetTopEx();
- var height = this.ChartBorder.GetHeightEx() * (value - this.SubFrame.Min) / (this.SubFrame.Max - this.SubFrame.Min);
- return this.ChartBorder.GetBottomEx() - height;
- }
- }
- this.CalculateDataMaxMin = function ()
- {
- this.SubFrame = { Max: null, Min: null };
- var bHScreen = (this.ChartFrame.IsHScreen === true);
- var chartright = this.ChartBorder.GetRight();
- if (bHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var x = this.ChartFrame.GetXFromIndex(j);
- if (x > chartright) break;
- if (this.SubFrame.Min == null || this.SubFrame.Min > value) this.SubFrame.Min = value;
- if (this.SubFrame.Max == null || this.SubFrame.Max < value) this.SubFrame.Max = value;
- }
- }
- this.GetMaxMin = function () //数据不参与坐标轴最大最小值计算
- {
- var range = { Min: null, Max: null };
- return range;
- }
- }
- //POINTDOT 圆点 支持横屏
- function ChartPointDot()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.Color = "rgb(255,193,37)"; //线段颜色
- this.Radius = 1; //点半径
- this.ClassName = 'ChartPointDot';
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- if (!this.Data || !this.Data.Data) return;
- var bHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- if (bHScreen === true) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- this.Canvas.save();
- this.Canvas.setFillStyle(this.Color);
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var x = this.ChartFrame.GetXFromIndex(j);
- var y = this.ChartFrame.GetYFromData(value);
- if (x > chartright) break;
- this.Canvas.beginPath();
- if (bHScreen) this.Canvas.arc(y, x, this.Radius, 0, Math.PI * 2, true);
- else this.Canvas.arc(x, y, this.Radius, 0, Math.PI * 2, true);
- this.Canvas.closePath();
- this.Canvas.fill();
- }
- this.Canvas.restore();
- }
- }
- //通达信语法 STICK 支持横屏
- function ChartStick()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.Color = "rgb(255,193,37)"; //线段颜色
- this.LineWidth; //线段宽度
- this.ClassName = 'ChartStick';
- this.DrawLine = function ()
- {
- if (this.ChartFrame.IsMinSize) return;
- if (!this.Data || !this.Data.Data) return;
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen === true) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- this.Canvas.save();
- if (this.LineWidth > 0) this.Canvas.lineWidth = this.LineWidth;
- var bFirstPoint = true;
- var drawCount = 0;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var x = this.ChartFrame.GetXFromIndex(j);
- var y = this.ChartFrame.GetYFromData(value);
- if (x > chartright) break;
- if (bFirstPoint)
- {
- this.Canvas.setStrokeStyle(this.Color);
- this.Canvas.beginPath();
- if (isHScreen) this.Canvas.moveTo(y, x);
- else this.Canvas.moveTo(x, y);
- bFirstPoint = false;
- }
- else
- {
- if (isHScreen) this.Canvas.lineTo(y, x);
- else this.Canvas.lineTo(x, y);
- }
- ++drawCount;
- }
- if (drawCount > 0) this.Canvas.stroke();
- this.Canvas.restore();
- }
- this.DrawStick = function ()
- {
- if (!this.Data || !this.Data.Data) return;
- var bHScreen = (this.ChartFrame.IsHScreen === true);
- var chartright = this.ChartBorder.GetRight();
- if (bHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var yBottom = this.ChartBorder.GetBottom();
- var xLeft = this.ChartBorder.GetLeft();
- this.Canvas.save();
- this.Canvas.setStrokeStyle(this.Color);
- if (this.LineWidth) this.Canvas.lineWidth = this.LineWidth;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var x = this.ChartFrame.GetXFromIndex(j);
- var y = this.ChartFrame.GetYFromData(value);
- if (x > chartright) break;
- this.Canvas.beginPath();
- if (bHScreen)
- {
- this.Canvas.moveTo(xLeft, x);
- this.Canvas.lineTo(y, x);
- this.Canvas.stroke();
- }
- else
- {
- var xFix = parseInt(x.toString()) + 0.5;
- this.Canvas.moveTo(xFix, y);
- this.Canvas.lineTo(xFix, yBottom);
- }
- this.Canvas.stroke();
- }
- this.Canvas.restore();
- }
- this.Draw = function ()
- {
- if (!this.IsShow) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- this.DrawStick();
- }
- }
- //通达信语法 LINESTICK 支持横屏
- function ChartLineStick()
- {
- this.newMethod = ChartStick; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName = 'ChartLineStick';
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- this.DrawStick();
- this.DrawLine();
- }
- }
- //柱子 支持横屏
- function ChartStickLine()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName ='ChartStickLine';
- this.Color = "rgb(255,193,37)"; //线段颜色
- this.LineWidth = 2; //线段宽度
- this.BarType = 0; //柱子类型 0=实心 1=空心
- this.MinBarWidth=g_JSChartResource.MinKLineBarWidth; //最小的柱子宽度
- this.Draw = function ()
- {
- if (this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- if (!this.Data || !this.Data.Data) return;
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- if (isHScreen) xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var isMinute=this.IsMinuteFrame();
- this.Canvas.save();
- var bFillBar = false;
- var bFillKLine = false;
- if (isMinute)
- {
- if (this.LineWidth>1) this.Canvas.lineWidth=2;
- else this.Canvas.lineWidth=1;
- this.Canvas.strokeStyle=this.Color;
- }
- else if (this.LineWidth==50)
- {
- if (dataWidth >= this.MinBarWidth)
- {
- bFillKLine = true;
- this.Canvas.setFillStyle(this.Color);
- this.Canvas.setStrokeStyle(this.Color);
- }
- else //太细了 画竖线
- {
- this.Canvas.lineWidth = 1;
- this.Canvas.setStrokeStyle(this.Color);
- }
- }
- else if (this.LineWidth < 100)
- {
- var LineWidth = this.LineWidth;
- if (dataWidth <= 4) LineWidth = 1;
- else if (dataWidth < LineWidth) LineWidth = parseInt(dataWidth);
- this.Canvas.lineWidth = LineWidth;
- this.Canvas.setStrokeStyle(this.Color);
- }
- else
- {
- bFillBar = true;
- this.Canvas.setFillStyle(this.Color);
- var fixedWidth = 2;
- }
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var price = value.Value;
- var price2 = value.Value2;
- if (price2 == null) price2 = 0;
- var x = this.ChartFrame.GetXFromIndex(j);
- var y = this.ChartFrame.GetYFromData(price);
- var y2 = this.ChartFrame.GetYFromData(price2);
- if (x > chartright) break;
- if (bFillBar)
- {
- var left = xOffset - fixedWidth;
- if (isHScreen)
- {
- this.Canvas.fillRect(Math.min(y, y2), left, Math.abs(y - y2), dataWidth + distanceWidth + fixedWidth * 2);
- }
- else
- {
- var barWidth = dataWidth + distanceWidth + fixedWidth * 2;
- if (left + barWidth > chartright) barWidth = chartright - left; //不要超过右边框子
- this.Canvas.fillRect(left, ToFixedRect(Math.min(y, y2)), barWidth, ToFixedRect(Math.abs(y - y2)));
- }
- }
- else if (bFillKLine)
- {
- if (this.BarType == 1) //实心
- {
- if (isHScreen)
- {
- this.Canvas.beginPath();
- this.Canvas.fillRect(ToFixedRect(Math.min(y, y2)), ToFixedRect(xOffset), ToFixedRect(Math.abs(y - y2)), ToFixedRect(dataWidth));
- this.Canvas.stroke();
- }
- else
- {
- this.Canvas.beginPath();
- this.Canvas.rect(ToFixedRect(xOffset), ToFixedRect(Math.min(y, y2)), ToFixedRect(dataWidth), ToFixedRect(Math.abs(y - y2)));
- this.Canvas.stroke();
- }
- }
- else
- {
- if (isHScreen)
- this.Canvas.fillRect(ToFixedRect(Math.min(y, y2)), ToFixedRect(xOffset), ToFixedRect(Math.abs(y - y2)), ToFixedRect(dataWidth));
- else
- this.Canvas.fillRect(ToFixedRect(xOffset), ToFixedRect(Math.min(y, y2)), ToFixedRect(dataWidth), ToFixedRect(Math.abs(y - y2)));
- }
- }
- else
- {
- if (isHScreen)
- {
- this.Canvas.beginPath();
- this.Canvas.moveTo(y, ToFixedPoint(x));
- this.Canvas.lineTo(y2, ToFixedPoint(x));
- this.Canvas.stroke();
- }
- else
- {
- var xFix = parseInt(x.toString()) + 0.5;
- this.Canvas.beginPath();
- this.Canvas.moveTo(xFix, y);
- this.Canvas.lineTo(xFix, y2);
- this.Canvas.stroke();
- }
- }
- }
- this.Canvas.restore();
- }
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Min = null;
- range.Max = null;
- if (!this.Data || !this.Data.Data) return range;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var data = this.Data.Data[i];
- if (data == null) continue;
- var value2 = data.Value2;
- if (value2 == null) value2 = 0;
- if (data == null || isNaN(data.Value) || isNaN(value2)) continue;
- var valueMax = Math.max(data.Value, value2);
- var valueMin = Math.min(data.Value, value2);
- if (range.Max == null) range.Max = valueMax;
- if (range.Min == null) range.Min = valueMin;
- if (range.Max < valueMax) range.Max = valueMax;
- if (range.Min > valueMin) range.Min = valueMin;
- }
- return range;
- }
- }
- //画矩形
- function ChartRectangle()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName ='ChartRectangle';
- this.Color = [];
- this.Rect;
- this.BorderColor = g_JSChartResource.FrameBorderPen;
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (!this.Color || !this.Rect) return;
- if (this.Color.length <= 0) return;
- this.Canvas.setStrokeStyle(this.BorderColor);
- var bFill = false;
- if (this.Color.length == 2)
- {
- /* TODO 渐变下次做吧
- if (this.ColorAngle==0)
- {
- var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };
- var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetBottomEx() };
- }
- else
- {
- var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };
- var ptEnd={ X:this.ChartBorder.GetRight(), Y:this.ChartBorder.GetTopEx() };
- }
- let gradient = this.Canvas.createLinearGradient(ptStart.X,ptStart.Y, ptEnd.X,ptEnd.Y);
- gradient.addColorStop(0, this.Color[0]);
- gradient.addColorStop(1, this.Color[1]);
- this.Canvas.fillStyle=gradient;
- */
- this.Canvas.setFillStyle(this.Color[0]);
- bFill = true;
- }
- else if (this.Color.length == 1)
- {
- if (this.Color[0])
- {
- this.Canvas.setFillStyle(this.Color[0]);
- bFill = true;
- }
- }
- else
- {
- return;
- }
- var chartWidth = this.ChartBorder.GetWidth();
- var chartHeight = this.ChartBorder.GetHeightEx();
- var left = this.Rect.Left / 1000 * chartWidth;
- var top = this.Rect.Top / 1000 * chartHeight;
- var right = this.Rect.Right / 1000 * chartWidth;
- var bottom = this.Rect.Bottom / 1000 * chartHeight;
- left = this.ChartBorder.GetLeft() + left
- top = this.ChartBorder.GetTopEx() + top;
- right = this.ChartBorder.GetLeft() + right;
- bottom = this.ChartBorder.GetTopEx() + bottom;
- var width = Math.abs(left - right);
- var height = Math.abs(top - bottom);
- if (bFill) this.Canvas.fillRect(left, top, width, height);
- this.Canvas.rect(ToFixedPoint(left), ToFixedPoint(top), ToFixedRect(width), ToFixedRect(height));
- this.Canvas.stroke();
- }
- }
- //K线叠加
- function ChartOverlayKLine()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.Color = "rgb(65,105,225)";
- this.MainData; //主图K线数据
- this.SourceData; //叠加的原始数据
- this.Name = "ChartOverlayKLine";
- this.Title;
- this.DrawType = 0;
- this.ClassName ='ChartOverlayKLine';
- this.CustomDrawType = null; //图形类型
- this.SetOption = function (option)
- {
- if (!option) return;
- if (IFrameSplitOperator.IsNumber(option.DrawType)) this.CustomDrawType = option.DrawType;
- }
- this.DrawKBar = function (firstOpen) //firstOpen 当前屏第1个显示数据
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- if (isHScreen) xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var isFristDraw = true;
- var firstOverlayOpen = null;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var data = this.Data.Data[i];
- if (!data || data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- if (firstOverlayOpen == null) firstOverlayOpen = data.Open;
- if (isFristDraw)
- {
- this.Canvas.setStrokeStyle(this.Color);
- this.Canvas.setFillStyle(this.Color);
- this.Canvas.beginPath();
- isFristDraw = false;
- }
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var x = left + (right - left) / 2;
- var yLow = this.ChartFrame.GetYFromData(data.Low / firstOverlayOpen * firstOpen);
- var yHigh = this.ChartFrame.GetYFromData(data.High / firstOverlayOpen * firstOpen);
- var yOpen = this.ChartFrame.GetYFromData(data.Open / firstOverlayOpen * firstOpen);
- var yClose = this.ChartFrame.GetYFromData(data.Close / firstOverlayOpen * firstOpen);
- var y = yHigh;
- if (data.Open < data.Close) //阳线
- {
- if (dataWidth >= 4)
- {
- if (data.High > data.Close) //上影线
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(this.DrawType == 3 ? Math.max(yClose, yOpen) : yClose), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(this.DrawType == 3 ? Math.min(yClose, yOpen) : yClose));
- }
- y = yClose;
- }
- else
- {
- y = yClose;
- }
- if (isHScreen) {
- if (Math.abs(yOpen - y) < 1)
- {
- this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(left), 1, ToFixedRect(dataWidth)); //高度小于1,统一使用高度1
- }
- else
- {
- if (this.DrawType == 3) this.Canvas.rect(ToFixedPoint(y), ToFixedPoint(left), ToFixedRect(yOpen - y), ToFixedRect(dataWidth)); //空心柱
- else this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(left), ToFixedRect(yOpen - y), ToFixedRect(dataWidth));
- }
- }
- else
- {
- if (Math.abs(yOpen - y) < 1)
- {
- this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), 1); //高度小于1,统一使用高度1
- }
- else
- {
- if (this.DrawType == 3) this.Canvas.rect(ToFixedPoint(left), ToFixedPoint(y), ToFixedRect(dataWidth), ToFixedRect(yOpen - y)); //空心柱
- else this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), ToFixedRect(yOpen - y));
- }
- }
- if (data.Open > data.Low)
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(this.DrawType == 3 ? Math.min(yClose, yOpen) : y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yLow), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(this.DrawType == 3 ? Math.max(yClose, yOpen) : y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yLow));
- }
- }
- }
- else
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- }
- }
- else if (data.Open > data.Close) //阴线
- {
- if (dataWidth >= 4)
- {
- if (data.High > data.Close) //上影线
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yOpen), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yOpen));
- }
- y = yOpen;
- }
- else
- {
- y = yOpen
- }
- if (isHScreen)
- {
- if (Math.abs(yClose - y) < 1) this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(left), 1, ToFixedRect(dataWidth)); //高度小于1,统一使用高度1
- else this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(left), ToFixedRect(yClose - y), ToFixedRect(dataWidth));
- }
- else
- {
- if (Math.abs(yClose - y) < 1) this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), 1); //高度小于1,统一使用高度1
- else this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(y), ToFixedRect(dataWidth), ToFixedRect(yClose - y));
- }
- if (data.Open > data.Low) //下影线
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yLow), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yLow));
- }
- }
- }
- else
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- }
- }
- else // 平线
- {
- if (dataWidth >= 4)
- {
- if (data.High > data.Close) //上影线
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(y, ToFixedPoint(x));
- this.Canvas.lineTo(yOpen, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), y);
- this.Canvas.lineTo(ToFixedPoint(x), yOpen);
- }
- y = yOpen;
- }
- else
- {
- y = yOpen;
- }
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(left));
- this.Canvas.lineTo(ToFixedPoint(y), ToFixedPoint(right));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(left), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(right), ToFixedPoint(y));
- }
- if (data.Open > data.Low) //下影线
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(y), ToFixedPoint(x));
- this.Canvas.lineTo(ToFixedPoint(yLow), ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(y));
- this.Canvas.lineTo(ToFixedPoint(x), ToFixedPoint(yLow));
- }
- }
- }
- else
- {
- if (isHScreen)
- {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- }
- }
- }
- if (isFristDraw == false) this.Canvas.stroke();
- }
- this.DrawAKLine = function (firstOpen) //美国线
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- if (isHScreen) xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var firstOverlayOpen = null;
- this.Canvas.setStrokeStyle(this.Color);
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- if (firstOverlayOpen == null) firstOverlayOpen = data.Open;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var x = left + (right - left) / 2;
- var yLow = this.ChartFrame.GetYFromData(data.Low / firstOverlayOpen * firstOpen);
- var yHigh = this.ChartFrame.GetYFromData(data.High / firstOverlayOpen * firstOpen);
- var yOpen = this.ChartFrame.GetYFromData(data.Open / firstOverlayOpen * firstOpen);
- var yClose = this.ChartFrame.GetYFromData(data.Close / firstOverlayOpen * firstOpen);
- this.Canvas.beginPath(); //最高-最低
- if (isHScreen)
- {
- this.Canvas.moveTo(yHigh, ToFixedPoint(x));
- this.Canvas.lineTo(yLow, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), yHigh);
- this.Canvas.lineTo(ToFixedPoint(x), yLow);
- }
- this.Canvas.stroke();
- if (dataWidth >= 4)
- {
- this.Canvas.beginPath(); //开盘
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(yOpen), left);
- this.Canvas.lineTo(ToFixedPoint(yOpen), x);
- }
- else
- {
- this.Canvas.moveTo(left, ToFixedPoint(yOpen));
- this.Canvas.lineTo(x, ToFixedPoint(yOpen));
- }
- this.Canvas.stroke();
- this.Canvas.beginPath(); //收盘
- if (isHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(yClose), right);
- this.Canvas.lineTo(ToFixedPoint(yClose), x);
- }
- else
- {
- this.Canvas.moveTo(right, ToFixedPoint(yClose));
- this.Canvas.lineTo(x, ToFixedPoint(yClose));
- }
- this.Canvas.stroke();
- }
- }
- }
- this.DrawCloseLine = function (firstOpen) //收盘价线
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- if (isHScreen) xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var firstOverlayOpen = null;
- var bFirstPoint = true;
- this.Canvas.setStrokeStyle(this.Color);
- this.Canvas.beginPath();
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var data = this.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- if (firstOverlayOpen == null) firstOverlayOpen = data.Open;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var x = left + (right - left) / 2;
- var yClose = this.ChartFrame.GetYFromData(data.Close / firstOverlayOpen * firstOpen);
- if (bFirstPoint)
- {
- if (isHScreen) this.Canvas.moveTo(yClose, x);
- else this.Canvas.moveTo(x, yClose);
- bFirstPoint = false;
- }
- else
- {
- if (isHScreen) this.Canvas.lineTo(yClose, x);
- else this.Canvas.lineTo(x, yClose);
- }
- }
- if (bFirstPoint == false) this.Canvas.stroke();
- }
- this.Draw = function ()
- {
- this.TooltipRect = [];
- if (!this.MainData || !this.Data) return;
- var xPointCount = this.ChartFrame.XPointCount;
- var firstOpen = null; //主线数据第1个开盘价
- for (var i = this.Data.DataOffset, j = 0; i < this.MainData.Data.length && j < xPointCount; ++i, ++j)
- {
- var data = this.MainData.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- firstOpen = data.Open;
- break;
- }
- if (firstOpen == null) return;
- var drawTypeBackup = this.DrawType; //备份下线段类型
- if (this.CustomDrawType != null) this.DrawType = this.CustomDrawType;
- if (this.DrawType == 1) this.DrawCloseLine(firstOpen);
- else if (this.DrawType == 2) this.DrawAKLine(firstOpen);
- else this.DrawKBar(firstOpen);
- this.DrawType = drawTypeBackup; //还原线段类型
- }
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Max = null;
- range.Min = null;
- if (!this.MainData || !this.Data) return range;
- var firstOpen = null; //主线数据第1个收盘价
- for (var i = this.Data.DataOffset, j = 0; i < this.MainData.Data.length && j < xPointCount; ++i, ++j)
- {
- var data = this.MainData.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- firstOpen = data.Close;
- break;
- }
- if (firstOpen == null) return range;
- var firstOverlayOpen = null;
- var high, low;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var data = this.Data.Data[i];
- if (!data || data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
- if (firstOverlayOpen == null) firstOverlayOpen = data.Open;
- high = data.High / firstOverlayOpen * firstOpen;
- low = data.Low / firstOverlayOpen * firstOpen;
- if (range.Max == null) range.Max = high;
- if (range.Min == null) range.Min = low;
- if (range.Max < high) range.Max = high;
- if (range.Min > low) range.Min = low;
- }
- return range;
- }
- }
- // 多文本集合 支持横屏
- function ChartMultiText()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName ='ChartMultiText';
- this.Texts = []; //[ {Index:, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 } } ]
- this.Font = g_JSChartResource.DefaultTextFont;
- this.Color = g_JSChartResource.DefaultTextColor;
- this.IsHScreen = false; //是否横屏
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (!this.Data || this.Data.length <= 0) return;
- if (!this.Texts) return;
- this.IsHScreen = (this.ChartFrame.IsHScreen === true);
- var xPointCount = this.ChartFrame.XPointCount;
- var offset = this.Data.DataOffset;
- var left = this.ChartBorder.GetLeft();
- var right = this.ChartBorder.GetRight();
- if (this.IsHScreen)
- {
- left = this.ChartBorder.GetTop();
- right = this.ChartBorder.GetBottom();
- }
- for (var i in this.Texts)
- {
- var item = this.Texts[i];
- if (!item.Text) continue;
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
- var index = item.Index - offset;
- if (index >= 0 && index < xPointCount)
- {
- var x = this.ChartFrame.GetXFromIndex(index);
- var y = this.ChartFrame.GetYFromData(item.Value);
- if (item.Color) this.Canvas.setFillStyle(item.Color);
- else this.Canvas.setFillStyle(this.Color);
- if (item.Font) this.Canvas.font = item.Font;
- else this.Canvas.font = this.Font;
- var textWidth = this.Canvas.measureText(item.Text).width;
- this.Canvas.textAlign = 'center';
- if (x + textWidth / 2 >= right)
- {
- this.Canvas.textAlign = 'right';
- x = right;
- }
- else if (x - textWidth / 2 < left)
- {
- this.Canvas.textAlign = 'left';
- x = left;
- }
- if (item.Baseline == 1) this.Canvas.textBaseline = 'top';
- else if (item.Baseline == 2) this.Canvas.textBaseline = 'bottom';
- else this.Canvas.textBaseline = 'middle';
- if (this.IsHScreen) //横屏旋转
- {
- this.Canvas.save();
- this.Canvas.translate(y, x);
- this.Canvas.rotate(90 * Math.PI / 180);
- this.Canvas.fillText(item.Text, 0, 0);
- this.Canvas.restore();
- }
- else
- {
- this.Canvas.fillText(item.Text, x, y);
- }
-
- if (item.Line)
- {
- var kItem=this.Data.Data[item.Index];
- var price=item.Line.KData=="H"? kItem.High:kItem.Low;
- var yPrice=this.ChartFrame.GetYFromData(price);
- var yText=y;
- if (Array.isArray(item.Line.Offset) && item.Line.Offset.length==2)
- {
- if (yText>yPrice) //文字在下方
- {
- yText-=item.Line.Offset[1];
- yPrice+=item.Line.Offset[0]
- }
- else if (yText<yPrice)
- {
- yText+=item.Line.Offset[1];
- yPrice-=item.Line.Offset[0]
- }
- }
- this.Canvas.save();
- if (item.Line.Dash) this.Canvas.setLineDash(item.Line.Dash); //虚线
- if (item.Line.Width>0) this.Canvas.lineWidth=item.Line.Width; //线宽
- this.Canvas.setStrokeStyle(item.Line.Color);
- this.Canvas.beginPath();
- if (this.IsHScreen)
- {
- this.Canvas.moveTo(yText,ToFixedPoint(x));
- this.Canvas.lineTo(yPrice,ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x),yText);
- this.Canvas.lineTo(ToFixedPoint(x),yPrice);
- }
- this.Canvas.stroke();
- this.Canvas.restore();
- }
- }
- }
- }
- this.GetMaxMin = function ()
- {
- var range = { Min: null, Max: null };
- if (!this.Texts) return range;
- var xPointCount = this.ChartFrame.XPointCount;
- var start = this.Data.DataOffset;
- var end = start + xPointCount;
- for (var i in this.Texts)
- {
- var item = this.Texts[i];
- if (item.Index >= start && item.Index < end)
- {
- if (range.Max == null) range.Max = item.Value;
- else if (range.Max < item.Value) range.Max = item.Value;
- if (range.Min == null) range.Min = item.Value;
- else if (range.Min > item.Value) range.Min = item.Value;
- }
- }
- return range;
- }
- }
- // 多dom节点
- function ChartMultiHtmlDom()
- {
- this.newMethod=IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName="ChartMultiHtmlDom";
- this.Texts=[]; //[ {Index:, Value:, Text: ] Text=dom内容
- this.IsHScreen=false; //是否横屏
- this.DrawCallback; //function(op, obj) op:1=开始 2=结束 3=绘制单个数据
- this.DrawItem=[];
- this.Draw=function()
- {
- this.DrawItem=[];
- if (this.DrawCallback) this.DrawCallback(1, {Self:this} );
- this.DrawDom();
-
- if (this.DrawCallback) this.DrawCallback(2, { Self:this, Draw:this.DrawItem } );
- }
- this.DrawDom=function()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (!this.Data || this.Data.length<=0) return;
- this.IsHScreen=(this.ChartFrame.IsHScreen===true);
- var xPointCount=this.ChartFrame.XPointCount;
- var offset=this.Data.DataOffset;
-
- for(var i in this.Texts)
- {
- var item=this.Texts[i];
- if (!item.Text) continue;
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
- var index=item.Index-offset;
- var kItem=this.Data.Data[item.Index]; //K线数据
- var obj={ KData:kItem, Item:item, IsShow:false, Self:this };
- if (index>=0 && index<xPointCount)
- {
- var x=this.ChartFrame.GetXFromIndex(index);
- var y=this.ChartFrame.GetYFromData(item.Value);
- obj.X=x;
- obj.Y=y;
- obj.IsShow=true;
- }
- this.DrawItem.push(obj);
- if (this.DrawCallback) this.DrawCallback(3, obj);
- }
- }
- this.GetMaxMin=function()
- {
- var range={ Min:null, Max:null };
- var xPointCount=this.ChartFrame.XPointCount;
- var start=this.Data.DataOffset;
- var end=start+xPointCount;
- for(var i in this.Texts)
- {
- var item=this.Texts[i];
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
- if (item.Index>=start && item.Index<end)
- {
- if (range.Max==null) range.Max=item.Value;
- else if (range.Max<item.Value) range.Max=item.Value;
- if (range.Min==null) range.Min=item.Value;
- else if (range.Min>item.Value) range.Min=item.Value;
- }
- }
- return range;
- }
- }
- // 线段集合 支持横屏
- function ChartMultiLine()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.Lines = []; // [ {Point:[ {Index, Value }, ], Color: }, ]
- this.IsHScreen = false;
- this.LineWidth=1;
- this.LineDash;
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (!this.Data || this.Data.length <= 0) return;
- this.IsHScreen = (this.ChartFrame.IsHScreen === true);
- var xPointCount = this.ChartFrame.XPointCount;
- var offset = this.Data.DataOffset;
- var drawLines = [];
- for (var i in this.Lines)
- {
- var line = this.Lines[i];
- var drawPoints = { Point: [], Color: line.Color };
- for (var j in line.Point)
- {
- var point = line.Point[j];
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
- var index = point.Index - offset;
- if (index >= 0 && index < xPointCount)
- {
- var x = this.ChartFrame.GetXFromIndex(index);
- var y = this.ChartFrame.GetYFromData(point.Value);
- drawPoints.Point.push({ X: x, Y: y });
- }
- }
- if (drawPoints.Point.length >= 2) drawLines.push(drawPoints)
- }
- this.Canvas.save();
- for (var i in drawLines)
- {
- if (this.LineDash) this.Canvas.setLineDash(this.LineDash);
- if (IFrameSplitOperator.IsPlusNumber(this.LineWidth)) this.Canvas.lineWidth=this.LineWidth;
- else this.Canvas.lineWidth=1;
- var item = drawLines[i];
- this.DrawLine(item);
- }
- this.Canvas.restore();
- }
- this.DrawLine = function (line)
- {
- this.Canvas.setStrokeStyle(line.Color);
- for (var i in line.Point)
- {
- var item = line.Point[i];
- if (i == 0)
- {
- this.Canvas.beginPath();
- if (this.IsHScreen) this.Canvas.moveTo(item.Y, item.X);
- else this.Canvas.moveTo(item.X, item.Y);
- }
- else
- {
- if (this.IsHScreen) this.Canvas.lineTo(item.Y, item.X);
- else this.Canvas.lineTo(item.X, item.Y);
- }
- }
- this.Canvas.stroke();
- }
- this.GetMaxMin = function ()
- {
- var range = { Min: null, Max: null };
- var xPointCount = this.ChartFrame.XPointCount;
- var start = this.Data.DataOffset;
- var end = start + xPointCount;
- for (var i in this.Lines)
- {
- var line = this.Lines[i];
- for (var j in line.Point)
- {
- var point = line.Point[j];
- if (point.Index >= start && point.Index < end)
- {
- if (range.Max == null) range.Max = point.Value;
- else if (range.Max < point.Value) range.Max = point.Value;
- if (range.Min == null) range.Min = point.Value;
- else if (range.Min > point.Value) range.Min = point.Value;
- }
- }
- }
- return range;
- }
- }
- // 柱子集合 支持横屏
- function ChartMultiBar()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.Bars = []; // [ {Point:[ {Index, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
- this.IsHScreen = false;
- this.Draw = function ()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (!this.Data || this.Data.length <= 0) return;
- this.IsHScreen = (this.ChartFrame.IsHScreen === true);
- var xPointCount = this.ChartFrame.XPointCount;
- var offset = this.Data.DataOffset;
- var dataWidth = this.ChartFrame.DataWidth;
- var drawBars = [];
- for (var i in this.Bars)
- {
- var item = this.Bars[i];
- var drawPoints = { Point: [], Color: item.Color, Width: dataWidth, Type: 0 };
- if (item.Type > 0) drawPoints.Type = item.Type;
- if (item.Width > 0)
- {
- drawPoints.Width = item.Width;
- if (drawPoints.Width > dataWidth) drawPoints.Width = dataWidth;
- }
- else
- {
- if (drawPoints.Width < 4) drawPoints.Width = 1;
- }
- for (var j in item.Point)
- {
- var point = item.Point[j];
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
- var index = point.Index - offset;
- if (index >= 0 && index < xPointCount)
- {
- var x = this.ChartFrame.GetXFromIndex(index);
- var y = this.ChartFrame.GetYFromData(point.Value);
- var y2 = this.ChartFrame.GetYFromData(point.Value2);
- drawPoints.Point.push({ X: x, Y: y, Y2: y2 });
- }
- }
- if (drawPoints.Point.length > 0) drawBars.push(drawPoints)
- }
- for (var i in drawBars)
- {
- var item = drawBars[i];
- if (item.Width >= 4)
- {
- if (item.Type == 1) this.DrawHollowBar(item);
- else this.DrawFillBar(item);
- }
- else
- {
- this.DrawLineBar(item);
- }
- }
- }
- this.DrawLineBar = function (bar)
- {
- this.Canvas.setStrokeStyle(bar.Color);
- var backupLineWidth = this.Canvas.lineWidth;
- this.Canvas.lineWidth = bar.Width;
- for (var i in bar.Point)
- {
- var item = bar.Point[i];
- this.Canvas.beginPath();
- if (this.IsHScreen)
- {
- this.Canvas.moveTo(ToFixedPoint(item.Y), ToFixedPoint(item.X));
- this.Canvas.lineTo(ToFixedPoint(item.Y2), ToFixedPoint(item.X));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(item.X), ToFixedPoint(item.Y));
- this.Canvas.lineTo(ToFixedPoint(item.X), ToFixedPoint(item.Y2));
- }
- this.Canvas.stroke();
- }
- this.Canvas.lineWidth = backupLineWidth;
- }
- this.DrawFillBar = function (bar)
- {
- this.Canvas.setFillStyle(bar.Color);
- for (var i in bar.Point)
- {
- var item = bar.Point[i];
- var x = item.X - (bar.Width / 2);
- var y = Math.min(item.Y, item.Y2);
- var barWidth = bar.Width;
- var barHeight = Math.abs(item.Y - item.Y2);
- if (this.IsHScreen)
- this.Canvas.fillRect(ToFixedRect(y), ToFixedRect(x), ToFixedRect(barHeight), ToFixedRect(barWidth));
- else
- this.Canvas.fillRect(ToFixedRect(x), ToFixedRect(y), ToFixedRect(barWidth), ToFixedRect(barHeight));
- }
- }
- this.DrawHollowBar = function (bar) //空心柱子
- {
- this.Canvas.setStrokeStyle(bar.Color);
- var backupLineWidth = 1;
- for (var i in bar.Point)
- {
- var item = bar.Point[i];
- var x = item.X - (bar.Width / 2);
- var y = Math.min(item.Y, item.Y2);
- var barWidth = bar.Width;
- var barHeight = Math.abs(item.Y - item.Y2);
- this.Canvas.beginPath();
- if (this.IsHScreen)
- this.Canvas.rect(ToFixedPoint(y), ToFixedPoint(x), ToFixedRect(barHeight), ToFixedRect(barWidth));
- else
- this.Canvas.rect(ToFixedPoint(x), ToFixedPoint(y), ToFixedRect(barWidth), ToFixedRect(barHeight));
- this.Canvas.stroke();
- }
- this.Canvas.lineWidth = backupLineWidth;
- }
- this.GetMaxMin = function ()
- {
- var range = { Min: null, Max: null };
- var xPointCount = this.ChartFrame.XPointCount;
- var start = this.Data.DataOffset;
- var end = start + xPointCount;
- for (var i in this.Bars)
- {
- var item = this.Bars[i];
- for (var j in item.Point)
- {
- var point = item.Point[j];
- if (point.Index >= start && point.Index < end)
- {
- var minValue = Math.min(point.Value, point.Value2);
- var maxValue = Math.max(point.Value, point.Value2);
- if (range.Max == null) range.Max = maxValue;
- else if (range.Max < maxValue) range.Max = maxValue;
- if (range.Min == null) range.Min = minValue;
- else if (range.Min > minValue) range.Min = minValue;
- }
- }
- }
- return range;
- }
- }
- //分钟信息地雷 支持横屏
- function ChartMinuteInfo()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName = "ChartMinuteInfo";
- this.Data = new Map() //Map key=date-time, value=[{Date, Time, Title, Type, ID:}]
- this.SourceData;
- this.ChartMinutePrice;
- this.YClose;
- this.TextColor = g_JSChartResource.MinuteInfo.TextColor;
- this.Font = g_JSChartResource.MinuteInfo.Font;
- this.PointColor = g_JSChartResource.MinuteInfo.PointColor;
- this.LineColor = g_JSChartResource.MinuteInfo.LineColor;
- this.TextBGColor = g_JSChartResource.MinuteInfo.TextBGColor;
- this.TextHeight = 18;
- this.TextRectCache = [];
- this.InfoDrawCache = [];
- this.FrameBottom;
- this.FrameTop;
- this.FrameLeft;
- this.FrameRight;
- this.YOffset = 5;
- this.IsHScreen = false;
- this.SetOption = function (option)
- {
- if (option.TextColor) this.TextColor = option.TextColor;
- if (option.TextBGColor) this.TextBGColor = option.TextBGColor;
- if (option.Font) this.Font = option.Font;
- if (option.PointColor) this.PointColor = option.PointColor;
- if (option.LineColor) this.LineColor = option.LineColor;
- if (option.TextHeight > 0) this.TextHeight = option.TextHeight;
- }
- this.Draw = function ()
- {
- if (!this.ChartMinutePrice) return;
- if (!this.Data || this.Data.size <= 0) return;
- this.TextRectCache = [];
- this.InfoDrawCache = [];
- this.IsHScreen = (this.ChartFrame.IsHScreen === true);
- var xPointCount = this.ChartFrame.XPointCount;
- var minuteCount = this.ChartFrame.MinuteCount;
- this.FrameBottom = this.ChartBorder.GetBottom();
- this.FrameTop = this.ChartBorder.GetTop();
- this.FrameLeft = this.ChartBorder.GetLeft();
- this.FrameRight = this.ChartBorder.GetRight();
- if (this.IsHScreen)
- {
- this.FrameRight = this.ChartBorder.GetBottom();
- this.FrameLeft = this.ChartBorder.GetTop();
- this.FrameBottom = this.ChartBorder.GetLeft();
- this.FrameTop = this.ChartBorder.GetRight();
- }
- this.YClose = this.ChartMinutePrice.YClose;
- var data = this.ChartMinutePrice.Data;
- var isBeforeData = false;
- if (this.ChartMinutePrice.SourceData)
- {
- data = this.ChartMinutePrice.SourceData;
- isBeforeData = true;
- }
- this.Canvas.font = this.Font;
- for (var i = data.DataOffset, j = 0; i < data.Data.length && j < xPointCount; ++i, ++j)
- {
- var item = this.SourceData.Data[i];
- if (isBeforeData && item.Before) continue;
- if (!item) continue;
- var dateTime = item.DateTime;
- if (!this.Data.has(dateTime)) continue;
- if (this.IsHScreen)
- this.CalcuateInfoHScreenPosition(this.Data.get(dateTime), j, item);
- else
- this.CalcuateInfoPosition(this.Data.get(dateTime), j, item);
- }
- for (var i in this.InfoDrawCache)
- {
- var item = this.InfoDrawCache[i];
- this.DrawInfoLines(item);
- }
- for (var i in this.InfoDrawCache)
- {
- var item = this.InfoDrawCache[i];
- this.DrawInfoText(item);
- }
- this.TextRectCache = [];
- this.InfoDrawCache = [];
- }
- this.CalcuateInfoPosition = function (infoItem, index, minuteItem)
- {
- if (!infoItem || !infoItem.Data || infoItem.Data.length <= 0) return;
- var showItem = infoItem.Data[0];
- var textWidth = this.Canvas.measureText(showItem.Title).width + 4;
- var textHeight = this.TextHeight;
- var x = this.ChartFrame.GetXFromIndex(index);
- var y = this.ChartFrame.GetYFromData(minuteItem.Close);
- x = ToFixedPoint(x);
- var isDrawLeft = x < (this.FrameLeft + Math.abs(this.FrameLeft - this.FrameRight) / 2);
- var ARRAY_OFFSET = [2, 4, 3, 2, 3, 3, 2];
- var offset = textHeight + ARRAY_OFFSET[index % ARRAY_OFFSET.length];
- var yData =
- {
- Y:
- [
- { Value: y + (textHeight + this.YOffset), Offset: offset },
- { Value: y - (2 * textHeight + this.YOffset), Offset: -offset }
- ]
- };
- if (minuteItem.Close < this.YClose)
- yData.Y = yData.Y.reverse();
- var rtBorder = { X: x, Y: null, Width: textWidth, Height: textHeight };
- if (!isDrawLeft) rtBorder.X -= rtBorder.Width;
- this.FixTextRect(rtBorder, yData);
- var InfoDrawItem = { Border: rtBorder, Start: { X: x, Y: y }, IsLeft: isDrawLeft, Title: showItem.Title };
- this.InfoDrawCache.push(InfoDrawItem);
- this.TextRectCache.push(rtBorder);
- }
- this.CalcuateInfoHScreenPosition = function (infoItem, index, minuteItem)
- {
- if (!infoItem || !infoItem.Data || infoItem.Data.length <= 0) return;
- var showItem = infoItem.Data[0];
- var textHeight = this.Canvas.measureText(showItem.Title).width + 4;
- var textWidth = this.TextHeight;
- var y = this.ChartFrame.GetXFromIndex(index);
- var x = this.ChartFrame.GetYFromData(minuteItem.Close);
- y = ToFixedPoint(y);
- var isDrawLeft = y < (this.FrameLeft + Math.abs(this.FrameLeft - this.FrameRight) / 2);
- var ARRAY_OFFSET = [2, 4, 3, 2, 3, 3, 2];
- var offset = textWidth + ARRAY_OFFSET[index % ARRAY_OFFSET.length];
- var xData =
- {
- X:
- [
- { Value: x + (textWidth + this.YOffset), Offset: offset },
- { Value: x - (2 * textWidth + this.YOffset), Offset: -offset }
- ]
- };
- if (minuteItem.Close > this.YClose)
- xData.X = xData.X.reverse();
- var rtBorder = { X: null, Y: y, Width: textWidth, Height: textHeight };
- if (!isDrawLeft) rtBorder.Y -= rtBorder.Height;
- this.FixHScreenTextRect(rtBorder, xData);
- var InfoDrawItem = { Border: rtBorder, Start: { X: x, Y: y }, IsLeft: isDrawLeft, Title: showItem.Title };
- this.InfoDrawCache.push(InfoDrawItem);
- this.TextRectCache.push(rtBorder);
- }
- this.DrawInfoLines = function (item)
- {
- var rtBorder = item.Border;
- var isDrawLeft = item.IsLeft;
- this.Canvas.setStrokeStyle(this.LineColor);
- this.Canvas.beginPath();
- this.Canvas.moveTo(item.Start.X, item.Start.Y);
- if (isDrawLeft)
- {
- this.Canvas.lineTo(rtBorder.X, rtBorder.Y);
- }
- else
- {
- if (this.IsHScreen) this.Canvas.lineTo(rtBorder.X, rtBorder.Y + rtBorder.Height);
- else this.Canvas.lineTo(rtBorder.X + rtBorder.Width, rtBorder.Y);
- }
- this.Canvas.stroke();
- this.Canvas.setFillStyle(this.PointColor);
- this.Canvas.beginPath();
- this.Canvas.arc(item.Start.X, item.Start.Y, 5, 0, 2 * Math.PI);
- this.Canvas.closePath();
- this.Canvas.fill();
- }
- this.DrawInfoText = function (item)
- {
- var rtBorder = item.Border;
- var x = rtBorder.X, y = rtBorder.Y;
- this.Canvas.setFillStyle(this.TextBGColor);
- this.Canvas.fillRect(x, y, rtBorder.Width, rtBorder.Height);
- this.Canvas.setStrokeStyle(this.LineColor);
- this.Canvas.beginPath();
- this.Canvas.rect(x, y, rtBorder.Width, rtBorder.Height);
- this.Canvas.stroke();
- if (this.IsHScreen)
- {
- this.Canvas.save();
- this.Canvas.translate(rtBorder.X, rtBorder.Y);
- this.Canvas.rotate(90 * Math.PI / 180);
- x = 0; y = 0;
- }
- this.Canvas.textAlign = 'left'
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.font = this.Font;
- if (this.IsHScreen) this.Canvas.fillText(item.Title, x + 2, y - rtBorder.Width / 2);
- else this.Canvas.fillText(item.Title, x+2, y + rtBorder.Height / 2);
- if (this.IsHScreen) this.Canvas.restore();
- }
- this.FixTextRect = function (rect, yData)
- {
- for (var k in yData.Y)
- {
- var yItem = yData.Y[k];
- rect.Y = yItem.Value;
- var y;
- for (var j = 0; j < 10; ++j)
- {
- var isOverlap = false;
- for (var i in this.TextRectCache)
- {
- var item = this.TextRectCache[i];
- if (this.IsOverlap(item, rect))
- {
- isOverlap = true;
- break;
- }
- }
- if (isOverlap == false) return;
- y = rect.Y;
- y += yItem.Offset;
- if (y + rect.Height > this.FrameBottom || y < this.FrameTop) break;
- rect.Y = y;
- }
- }
- }
- this.FixHScreenTextRect = function (rect, xData)
- {
- for (var k in xData.X)
- {
- var xItem = xData.X[k];
- rect.X = xItem.Value;
- var x;
- for (var j = 0; j < 10; ++j)
- {
- var isOverlap = false;
- for (var i in this.TextRectCache)
- {
- var item = this.TextRectCache[i];
- if (this.IsOverlap(item, rect))
- {
- isOverlap = true;
- break;
- }
- }
- if (isOverlap == false) return;
- x = rect.X;
- x += xItem.Offset;
- if (x + rect.Width < this.FrameBottom || x > this.FrameTop) break;
- rect.X = x;
- }
- }
- }
- this.IsOverlap = function (rc1, rc2)
- {
- if (rc1.X + rc1.Width > rc2.X && rc2.X + rc2.Width > rc1.X && rc1.Y + rc1.Height > rc2.Y && rc2.Y + rc2.Height > rc1.Y)
- return true;
- else
- return false;
- }
- this.GetMaxMin = function ()
- {
- var range = { Min: null, Max: null };
- return range;
- }
- }
- //买卖盘
- function ChartBuySell()
- {
- this.newMethod = ChartSingleText; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName = "ChartBuySell";
- this.TextFont = g_JSChartResource.KLineTrain.Font; //"bold 14px arial"; //买卖信息字体
- this.LastDataIcon = g_JSChartResource.KLineTrain.LastDataIcon; //{Color:'rgb(0,0,205)',Text:'↓'};
- this.BuyIcon = g_JSChartResource.KLineTrain.BuyIcon; //{Color:'rgb(0,0,205)',Text:'B'};
- this.SellIcon = g_JSChartResource.KLineTrain.SellIcon; //{Color:'rgb(0,0,205)',Text:'S'};
- this.BuySellData = new Map(); //Key=数据索引index Value:Data:[ { Op: 买/卖 0=buy 1=sell, Date:, Time, Price: Vol:}, ]
- this.AddTradeItem = function (tradeItem)
- {
- if (this.BuySellData.has(tradeItem.Key))
- {
- var Trade = this.BuySellData.get(tradeItem.Key);
- Trade.Data.push(tradeItem);
- }
- else
- {
- this.BuySellData.set(tradeItem.Key, { Data: [tradeItem] });
- }
- }
- this.ClearTradeData = function ()
- {
- this.BuySellData = new Map();
- }
- this.Draw = function ()
- {
- if (!this.Data || !this.Data.Data) return;
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen === true) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var bottom = this.ChartBorder.GetBottomEx();
- var top = this.ChartBorder.GetTopEx();
- var height = this.ChartBorder.GetHeightEx();
- if (isHScreen)
- {
- top = this.ChartBorder.GetRightEx();
- bottom = this.ChartBorder.GetLeftEx();
- height = this.ChartBorder.GetWidthEx();
- }
- this.Canvas.font = this.TextFont;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- if (x > chartright) break;
- if (i == this.Data.Data.length - 1)
- {
- var x = this.ChartFrame.GetXFromIndex(j);
- var yHigh = this.ChartFrame.GetYFromData(value.High);
- if (this.LastDataIcon.Text)
- {
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'bottom';
- this.Canvas.setFillStyle(this.LastDataIcon.Color);
- this.Canvas.font = this.TextFont;
- this.DrawText(this.LastDataIcon.Text, x, yHigh, isHScreen);
- }
- else
- {
- var obj =
- {
- X: x, Top: top, Bottom: bottom, Height: height,
- DataWidth: dataWidth, Color: this.LastDataIcon.Color, IsHScreen: isHScreen,
- };
- this.DrawLastData(obj);
- }
- }
- var key = i;
- if (!this.BuySellData.has(key)) continue;
- var trade = this.BuySellData.get(key);
- var x = this.ChartFrame.GetXFromIndex(j);
- var yHigh = this.ChartFrame.GetYFromData(value.High);
- var yLow = this.ChartFrame.GetYFromData(value.Low);
- var drawInfo = [false, false]; //0=buy 1=sell
- for (var k in trade.Data)
- {
- if (drawInfo[0] == true && drawInfo[1] == true) break; //买卖图标只画一次
- var bsItem = trade.Data[k];
- if (bsItem.Op == 0 && drawInfo[0] == false) //买 标识在最低价上
- {
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'top';
- this.Canvas.setFillStyle(this.BuyIcon.Color);
- this.DrawText(this.BuyIcon.Text, x, yLow, isHScreen);
- drawInfo[0] = true;
- }
- else if (bsItem.Op == 1 && drawInfo[1] == false) //卖 标识在最高价上
- {
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'bottom';
- this.Canvas.setFillStyle(this.SellIcon.Color);
- this.DrawText(this.SellIcon.Text, x, yHigh, isHScreen);
- drawInfo[1] = true;
- }
- }
- }
- }
- this.DrawLastData=function(obj)
- {
- this.Canvas.setFillStyle(obj.Color);
- var width = obj.DataWidth;
- if (this.LastDataIcon.Width >= 2 && this.LastDataIcon.Width < obj.DataWidth)
- width = this.LastDataIcon.Width;
- var left = obj.X - width / 2;
- if (obj.IsHScreen)
- {
- this.Canvas.fillRect(ToFixedRect(obj.Bottom), ToFixedRect(left), ToFixedRect(obj.Height), ToFixedRect(width));
- }
- else
- {
- var left = obj.X - width/2;
- this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(obj.Top), ToFixedRect(width), ToFixedRect(obj.Height));
- }
- }
- }
- //分钟成交量
- function ChartMinuteVolumBar()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
-
- this.UpColor = g_JSChartResource.UpBarColor;
- this.DownColor = g_JSChartResource.DownBarColor;
- this.CustomColor=g_JSChartResource.Minute.VolBarColor;
- this.YClose; //前收盘
-
- this.Draw = function ()
- {
- var isHScreen = (this.ChartFrame.IsHScreen === true)
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var yBottom = this.ChartFrame.GetYFromData(0);
- var yPrice = this.YClose; //上一分钟的价格
- if (this.CustomColor) this.Canvas.strokeStyle=this.CustomColor;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var item = this.Data.Data[i];
- if (!item || !item.Vol) continue;
-
- var y = this.ChartFrame.GetYFromData(item.Vol);
- var x = this.ChartFrame.GetXFromIndex(i);
- if (x > chartright) break;
- //价格>=上一分钟价格 红色 否则绿色
- if (!this.CustomColor) this.Canvas.setStrokeStyle(item.Close >= yPrice ? this.UpColor : this.DownColor);
- this.Canvas.beginPath();
- if (isHScreen)
- {
- this.Canvas.moveTo(y, ToFixedPoint(x));
- this.Canvas.lineTo(yBottom, ToFixedPoint(x));
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), y);
- this.Canvas.lineTo(ToFixedPoint(x), yBottom);
- }
- this.Canvas.stroke();
- yPrice = item.Close;
- }
- }
-
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Min = 0;
- range.Max = null;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var item = this.Data.Data[i];
- if (!item || !item.Vol) continue;
- if (range.Max == null) range.Max = item.Vol;
- if (range.Max < item.Vol) range.Max = item.Vol;
- }
-
- return range;
- }
- }
- //MACD森林线 支持横屏
- function ChartMACD()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName ='ChartMACD';
- this.UpColor = g_JSChartResource.UpBarColor;
- this.DownColor = g_JSChartResource.DownBarColor;
- this.LineWidth=1;
- this.Draw = function ()
- {
- if (this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- if (this.ChartFrame.IsHScreen === true)
- {
- this.HScreenDraw();
- return;
- }
- var isMinute=this.IsMinuteFrame();
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
- var chartright = this.ChartBorder.GetRight();
- var xPointCount = this.ChartFrame.XPointCount;
- var lineWidth=this.LineWidth;
- if (this.LineWidth==50) lineWidth=dataWidth;
- else if (lineWidth>dataWidth) lineWidth=dataWidth;
- this.Canvas.save();
- this.Canvas.lineWidth=lineWidth;
- var bFirstPoint = true;
- var drawCount = 0;
- var yBottom = this.ChartFrame.GetYFromData(0);
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
- //for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- if (isMinute)
- {
- var x = this.ChartFrame.GetXFromIndex(j);
- }
- else
- {
- var left=xOffset;
- var right=xOffset+dataWidth;
- if (right>chartright) break;
- var x=left+(right-left)/2;
- }
- var y = this.ChartFrame.GetYFromData(value);
- if (x > chartright) break;
- var xFix = parseInt(x.toString()) + 0.5; //毛边修正
- this.Canvas.beginPath();
- this.Canvas.moveTo(xFix, yBottom);
- this.Canvas.lineTo(xFix, y);
- if (value >= 0) this.Canvas.setStrokeStyle(this.UpColor);
- else this.Canvas.setStrokeStyle(this.DownColor);
- this.Canvas.stroke();
- this.Canvas.closePath();
- }
- this.Canvas.restore();
- }
- this.HScreenDraw = function ()
- {
- var isMinute=this.IsMinuteFrame();
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
- var chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var yBottom = this.ChartFrame.GetYFromData(0);
- var lineWidth=this.LineWidth;
- if (this.LineWidth==50) lineWidth=dataWidth;
- else if (lineWidth>dataWidth) lineWidth=dataWidth;
- this.Canvas.save();
- this.Canvas.lineWidth=lineWidth;
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
- //for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- if (isMinute)
- {
- var x = this.ChartFrame.GetXFromIndex(j);
- }
- else
- {
- var left=xOffset;
- var right=xOffset+dataWidth;
- if (right>chartright) break;
- var x=left+(right-left)/2;
- }
- var y = this.ChartFrame.GetYFromData(value);
- if (x > chartright) break;
- this.Canvas.beginPath();
- this.Canvas.moveTo(yBottom, ToFixedPoint(x));
- this.Canvas.lineTo(y, ToFixedPoint(x));
- if (value >= 0) this.Canvas.setStrokeStyle(this.UpColor);
- else this.Canvas.setStrokeStyle(this.DownColor);
- this.Canvas.stroke();
- this.Canvas.closePath();
- }
- this.Canvas.restore();
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- // 等待提示
- function ChartSplashPaint()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
-
- this.Font = g_JSChartResource.DefaultTextFont; //字体
- this.TextColor = g_JSChartResource.DefaultTextColor; //文本颜色
- this.IsEnableSplash = false;
- this.SplashTitle = '数据加载中.....';
- this.HQChart;
- this.EnableSplash=function(bEnable)
- {
- this.IsEnableSplash=bEnable;
- if (this.HQChart)
- {
- var event=this.HQChart.GetEnableSplashEvent();
- if (event)
- {
- var data={ Enable:bEnable };
- event.Callback(event,data,this);
- }
- }
- }
- this.SetTitle=function(title)
- {
- this.SplashTitle=title;
- }
-
- this.Draw = function ()
- {
- if (!this.IsEnableSplash) return;
-
- if (this.Frame.IsHScreen === true)
- {
- this.HScreenDraw();
- return;
- }
-
- var xCenter = (this.Frame.ChartBorder.GetLeft() + this.Frame.ChartBorder.GetRight()) / 2;
- var yCenter = (this.Frame.ChartBorder.GetTop() + this.Frame.ChartBorder.GetBottom()) / 2;
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.font = this.Font;
- this.Canvas.fillText(this.SplashTitle, xCenter, yCenter);
- }
-
- this.HScreenDraw = function () //横屏
- {
- var xCenter = (this.Frame.ChartBorder.GetLeft() + this.Frame.ChartBorder.GetRight()) / 2;
- var yCenter = (this.Frame.ChartBorder.GetTop() + this.Frame.ChartBorder.GetBottom()) / 2;
-
- this.Canvas.save();
- this.Canvas.translate(xCenter, yCenter);
- this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
-
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.font = this.Font;
- this.Canvas.fillText(this.SplashTitle, 0, 0);
-
- this.Canvas.restore();
- }
- }
- //填充背景 支持横屏
- function ChartBackground()
- {
- this.newMethod=IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName="ChartBackground";
- this.Color=null;
- this.ColorAngle=0; //0 竖向 1 横向
- this.IsDrawFirst = true; //面积图在K线前面画,否则回挡住K线的
- this.IsHScreen=false;
- this.Draw=function()
- {
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
- if (!this.Color) return;
- if (this.Color.length<=0) return;
- this.IsHScreen=(this.ChartFrame.IsHScreen===true);
- if (this.Color.length==2)
- {
- if (this.IsHScreen)
- {
- if (this.ColorAngle==0)
- {
- var ptStart={ X:this.ChartBorder.GetRight(), Y:this.ChartBorder.GetTopEx() };
- var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };
- }
- else
- {
- var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };
- var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetBottomEx() };
- }
- }
- else
- {
- if (this.ColorAngle==0)
- {
- var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };
- var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetBottomEx() };
- }
- else
- {
- var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };
- var ptEnd={ X:this.ChartBorder.GetRight(), Y:this.ChartBorder.GetTopEx() };
- }
- }
-
- let gradient = this.Canvas.createLinearGradient(ptStart.X,ptStart.Y, ptEnd.X,ptEnd.Y);
- gradient.addColorStop(0, this.Color[0]);
- gradient.addColorStop(1, this.Color[1]);
- this.Canvas.fillStyle=gradient;
- }
- else if (this.Color.length==1)
- {
- this.Canvas.fillStyle=this.Color[0];
- }
- else
- {
- return;
- }
- if (this.Name=="DRAWGBK2" || this.Name=="KLINE_BG")
- {
- this.DrawRegion();
- return;
- }
- if (this.IsHScreen)
- {
- var left=this.ChartBorder.GetLeftEx();
- var top=this.ChartBorder.GetTop();
- var width=this.ChartBorder.GetWidthEx();
- var height=this.ChartBorder.GetHeight();
- }
- else
- {
- var left=this.ChartBorder.GetLeft();
- var top=this.ChartBorder.GetTopEx();
- var width=this.ChartBorder.GetWidth();
- var height=this.ChartBorder.GetHeightEx();
- }
- this.Canvas.fillRect(left, top,width, height);
- }
- this.DrawRegion=function()
- {
- var xPointCount=this.ChartFrame.XPointCount;
- var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
- var dataWidth=this.ChartFrame.DataWidth;
- var distanceWidth=this.ChartFrame.DistanceWidth;
- var top=this.ChartBorder.GetTopEx();
- var bottom=this.ChartBorder.GetBottomEx();
- if (this.IsHScreen)
- {
- top=this.ChartBorder.GetRightEx();
- bottom=this.ChartBorder.GetLeftEx();
- }
- var aryPoint=[]; //点坐标
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
- {
- var value=this.Data.Data[i];
- aryPoint[i]=null;
- if (!IFrameSplitOperator.IsNumber(value) || value<=0) continue;
- var x=this.ChartFrame.GetXFromIndex(j);
- var y=this.ChartFrame.GetYFromData(value.Value);
- if (this.IsHScreen)
- aryPoint[i]={ Line:{ X:bottom, Y:x }, Line2:{ X:top, Y:x } };
- else
- aryPoint[i]={ Line:{ X:x, Y:top }, Line2:{ X:x, Y:bottom } };
- }
- this.DrawBG(aryPoint);
- }
- this.DrawBG=function(aryPoint)
- {
- var dataWidth=this.ChartFrame.DataWidth;
- var distanceWidth=this.ChartFrame.DistanceWidth;
- var halfWidth=(distanceWidth+dataWidth)/2;
- var firstPoint=true;
- var pointCount=0;
- var aryLine2=[];
- var color=null;
- for(var i in aryPoint)
- {
- var item=aryPoint[i];
- if (!item || (color && item.Color!=color) )
- {
- if (pointCount>0)
- {
- for(var j=aryLine2.length-1; j>=0; --j)
- {
- var item2=aryLine2[j];
- if (this.IsHScreen)
- {
- this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y+halfWidth);
- this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y-halfWidth);
- }
- else
- {
- this.Canvas.lineTo(item2.Line2.X+halfWidth, item2.Line2.Y);
- this.Canvas.lineTo(item2.Line2.X-halfWidth, item2.Line2.Y);
- }
- }
- this.Canvas.closePath();
- this.Canvas.fill();
- }
- firstPoint=true;
- pointCount=0;
- aryLine2=[];
- color=null;
- }
- if (!item) continue;
- if (firstPoint)
- {
- this.Canvas.beginPath();
- if (this.IsHScreen)
- {
- this.Canvas.moveTo(item.Line.X, item.Line.Y-halfWidth);
- this.Canvas.lineTo(item.Line.X, item.Line.Y+halfWidth);
- }
- else
- {
- this.Canvas.moveTo(item.Line.X-halfWidth, item.Line.Y);
- this.Canvas.lineTo(item.Line.X+halfWidth, item.Line.Y);
- }
- firstPoint=false;
- color=item.Color;
- }
- else
- {
- if (this.IsHScreen)
- {
- this.Canvas.lineTo(item.Line.X, item.Line.Y-halfWidth);
- this.Canvas.lineTo(item.Line.X, item.Line.Y+halfWidth);
- }
- else
- {
- this.Canvas.lineTo(item.Line.X-halfWidth, item.Line.Y);
- this.Canvas.lineTo(item.Line.X+halfWidth, item.Line.Y);
- }
- }
- aryLine2.push(item);
- ++pointCount;
- }
- if (pointCount>0)
- {
- for(var j=aryLine2.length-1; j>=0; --j)
- {
- var item2=aryLine2[j];
- if (this.IsHScreen)
- {
- this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y+halfWidth);
- this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y-halfWidth);
- }
- else
- {
- this.Canvas.lineTo(item2.Line2.X+halfWidth, item2.Line2.Y);
- this.Canvas.lineTo(item2.Line2.X-halfWidth, item2.Line2.Y);
- }
-
- }
- this.Canvas.closePath();
- this.Canvas.fill();
- }
- }
- this.GetMaxMin=function()
- {
- return { Min:null, Max:null };
- }
- }
- //锁 支持横屏
- function ChartLock()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.WidthDiv = 0.2; // 框子宽度占比
- this.LockCount = 10; // 锁最新的几个数据
- this.BGColor = g_JSChartResource.LockBGColor;
- this.TextColor = g_JSChartResource.LockTextColor;
- this.Font = g_JSChartResource.DefaultTextFont;
- this.Title = '🔒开通权限';
- this.LockRect = null; //上锁区域
- this.LockID; //锁ID
- this.Callback; //回调
- this.IndexName; //指标名字
-
- this.Draw = function ()
- {
- this.LockRect = null;
- if (this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
-
- if (this.ChartFrame.IsHScreen === true)
- {
- this.HScreenDraw();
- return;
- }
-
- var xOffset = this.ChartBorder.GetRight();
- var lOffsetWidth = 0;
- if (this.ChartFrame.Data != null)
- {
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- var xPointCount = this.ChartFrame.XPointCount;
- for (var i = this.ChartFrame.Data.DataOffset, j = 0; i < this.ChartFrame.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var data = this.ChartFrame.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
-
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- }
- lOffsetWidth = (dataWidth + distanceWidth) * this.LockCount;
- }
- if (lOffsetWidth == 0)
- {
- lOffsetWidth = (xOffset - this.ChartBorder.GetLeft()) * this.WidthDiv;
- }
- var lLeft = xOffset - lOffsetWidth;
- if (lLeft < this.ChartBorder.GetLeft())
- lLeft = this.ChartBorder.GetLeft();
- var lHeight = this.ChartBorder.GetBottom() - this.ChartBorder.GetTop();
- var lWidth = this.ChartBorder.GetRight() - lLeft;
- this.Canvas.setFillStyle(this.BGColor);
- this.Canvas.fillRect(lLeft, this.ChartBorder.GetTop(), lWidth, lHeight);
- var xCenter = lLeft + lWidth / 2;
- var yCenter = this.ChartBorder.GetTop() + lHeight / 2;
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.font = this.Font;
- this.Canvas.fillText(this.Title, xCenter, yCenter);
-
- this.LockRect = { Left: lLeft, Top: this.ChartBorder.GetTop(), Width: lWidth, Heigh: lHeight }; //保存上锁区域
- }
-
- this.HScreenDraw = function ()
- {
- var xOffset = this.ChartBorder.GetBottom();
-
- var lOffsetWidth = 0;
- if (this.ChartFrame.Data != null)
- {
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- //求最后1个数据的位置
- for (var i = this.ChartFrame.Data.DataOffset, j = 0; i < this.ChartFrame.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var data = this.ChartFrame.Data.Data[i];
- if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
-
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- }
- lOffsetWidth = (dataWidth + distanceWidth) * this.LockCount;
- }
- if (lOffsetWidth == 0)
- {
- lOffsetWidth = (xOffset - this.ChartBorder.GetTop()) * this.WidthDiv;
- }
-
- var lLeft = xOffset - lOffsetWidth;
- if (lLeft < this.ChartBorder.GetTop()) lLeft = this.ChartBorder.GetTop();
- var lHeight = this.ChartBorder.GetRight() - this.ChartBorder.GetLeft();
- var lWidth = this.ChartBorder.GetBottom() - lLeft;
- this.Canvas.setFillStyle(this.BGColor);
- this.Canvas.fillRect(this.ChartBorder.GetLeft(), lLeft, lHeight, lWidth);
-
- var xCenter = this.ChartBorder.GetLeft() + lHeight / 2;
- var yCenter = lLeft + lWidth / 2;
- this.Canvas.save();
- this.Canvas.translate(xCenter, yCenter);
- this.Canvas.rotate(90 * Math.PI / 180);
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.font = this.Font;
- this.Canvas.fillText(this.Title, 0, 0);
- this.Canvas.restore();
-
- this.LockRect = { Left: this.ChartBorder.GetLeft(), Top: lLeft, Width: lHeight, Heigh: lWidth }; //保存上锁区域
- }
-
- //x,y是否在上锁区域
- this.GetTooltipData = function (x, y, tooltip)
- {
- if (this.LockRect == null) return false;
-
- if (this.IsPointInRect(x, y, this.LockRect.Left, this.LockRect.Top, this.LockRect.Width, this.LockRect.Heigh))
- {
- tooltip.Data = { ID: this.LockID, Callback: this.Callback, IndexName: this.IndexName };
- tooltip.ChartPaint = this;
- return true;
- }
-
- return false;
- }
-
- this.IsPointInRect = function (x, y, left, top, width, heigh)
- {
- if (x > left && x < left + width && y > top && y < top + heigh) return true;
- return false;
- }
- }
- //通达信语法 VOLSTICK 支持横屏
- function ChartVolStick()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.UpColor = g_JSChartResource.UpBarColor;
- this.DownColor = g_JSChartResource.DownBarColor;
- this.HistoryData; //历史数据
- this.KLineDrawType = 0;
- this.ClassName = 'ChartVolStick';
- this.MinBarWidth=g_JSChartResource.MinKLineBarWidth; //最小的柱子宽度
- this.Draw = function ()
- {
- if (this.ChartFrame.IsMinSize) return;
- if (this.ChartFrame.IsHScreen === true)
- {
- this.HScreenDraw();
- return;
- }
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- var chartright = this.ChartBorder.GetRight();
- var xPointCount = this.ChartFrame.XPointCount;
- var yBottom = this.ChartFrame.GetYFromData(0);
- var isMinute=this.IsMinuteFrame();
- if (dataWidth >= this.MinBarWidth)
- { //只有K线, 分时图dataWidth=1
- yBottom = ToFixedRect(yBottom);
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var value = this.Data.Data[i];
- var kItem = this.HistoryData.Data[i];
- if (value == null || kItem == null) continue;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartright) break;
- var y = this.ChartFrame.GetYFromData(value);
- var bUp = false;
- if (kItem.Close >= kItem.Open)
- {
- this.Canvas.setFillStyle(this.UpColor);
- bUp = true;
- }
- else
- {
- this.Canvas.setFillStyle(this.DownColor);
- }
- //高度调整为整数
- var height = ToFixedRect(Math.abs(yBottom - y)>=1 ? yBottom - y : 1);
- y = yBottom - height;
- if (bUp && (this.KLineDrawType == 1 || this.KLineDrawType == 2 || this.KLineDrawType == 3)) //空心柱子
- {
- this.Canvas.setStrokeStyle(this.UpColor);
- this.Canvas.beginPath();
- this.Canvas.rect(ToFixedPoint(left), ToFixedPoint(y), ToFixedRect(dataWidth), height);
- this.Canvas.stroke();
- }
- else
- {
- this.Canvas.fillRect(ToFixedRect(left), y, ToFixedRect(dataWidth), height);
- }
- }
- }
- else //太细了直接话线
- {
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var value = this.Data.Data[i];
- var kItem = this.HistoryData.Data[i];
- if (value == null || kItem == null) continue;
- var y = this.ChartFrame.GetYFromData(value);
- if (isMinute)
- {
- var x=this.ChartFrame.GetXFromIndex(j);
- }
- else
- {
- var left=xOffset;
- var right=xOffset+dataWidth;
- var x=left+(right-left)/2;
- }
- if (x > chartright) break;
- if (kItem.Close > kItem.Open)
- this.Canvas.setStrokeStyle(this.UpColor);
- else
- this.Canvas.setStrokeStyle(this.DownColor);
- var x = this.ChartFrame.GetXFromIndex(j);
- this.Canvas.beginPath();
- this.Canvas.moveTo(ToFixedPoint(x), y);
- this.Canvas.lineTo(ToFixedPoint(x), yBottom);
- this.Canvas.stroke();
- }
- }
- }
- this.HScreenDraw = function () //横屏画法
- {
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xOffset = this.ChartBorder.GetTop() + distanceWidth / 2.0 + 2.0;
- var chartBottom = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var yBottom = this.ChartFrame.GetYFromData(0);
- if (dataWidth >= this.MinBarWidth)
- {
- yBottom = ToFixedRect(yBottom);
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var value = this.Data.Data[i];
- var kItem = this.HistoryData.Data[i];
- if (value == null || kItem == null) continue;
- var left = xOffset;
- var right = xOffset + dataWidth;
- if (right > chartBottom) break;
- var y = this.ChartFrame.GetYFromData(value);
- var bUp = false;
- if (kItem.Close >= kItem.Open)
- {
- bUp = true;
- this.Canvas.setFillStyle(this.UpColor);
- }
- else
- {
- this.Canvas.setFillStyle(this.DownColor);
- }
- //高度调整为整数
- var height = ToFixedRect(y - yBottom);
- if (bUp && (this.KLineDrawType == 1 || this.KLineDrawType == 2 || this.KLineDrawType == 3)) //空心柱子
- {
- this.Canvas.setStrokeStyle(this.UpColor);
- this.Canvas.beginPath();
- this.Canvas.rect(ToFixedPoint(yBottom), ToFixedPoint(left), height, ToFixedRect(dataWidth));
- this.Canvas.stroke();
- }
- else
- {
- this.Canvas.fillRect(yBottom, ToFixedRect(left), height, ToFixedRect(dataWidth));
- }
- }
- }
- else //太细了直接话线
- {
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var value = this.Data.Data[i];
- var kItem = this.HistoryData.Data[i];
- if (value == null || kItem == null) continue;
- var y = this.ChartFrame.GetYFromData(value);
- var x = this.ChartFrame.GetXFromIndex(j);
- if (x > chartBottom) break;
- if (kItem.Close > kItem.Open)
- this.Canvas.setStrokeStyle(this.UpColor);
- else
- this.Canvas.setStrokeStyle(this.DownColor);
- var x = this.ChartFrame.GetXFromIndex(j);
- this.Canvas.beginPath();
- this.Canvas.moveTo(y, ToFixedPoint(x));
- this.Canvas.lineTo(yBottom, ToFixedPoint(x));
- this.Canvas.stroke();
- }
- }
- }
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Min = 0;
- range.Max = null;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (range.Max == null) range.Max = value;
- if (range.Max < value) range.Max = value;
- }
- return range;
- }
- }
- function ChartText()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
-
- this.TextFont = "12px 微软雅黑";
-
- this.Draw = function ()
- {
- if (this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
-
- if (!this.Data || !this.Data.Data) return;
-
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- var xPointCount = this.ChartFrame.XPointCount;
-
- for (var i in this.Data.Data)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
-
- var price = value.Value;
- var position = value.Position;
-
- if (position == 'Left') {
- var x = this.ChartFrame.GetXFromIndex(0);
- var y = this.ChartFrame.GetYFromData(price);
-
- if (x > chartright) continue;
-
- this.Canvas.textAlign = 'left';
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(value.Color);
- this.Canvas.font = this.TextFont;
- this.Canvas.fillText(value.Message, x, y);
- }
- }
- }
-
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Min = null;
- range.Max = null;
-
- if (!this.Data || !this.Data.Data) return range;
-
- for (var i in this.Data.Data)
- {
- var data = this.Data.Data[i];
- if (data == null || isNaN(data.Value)) continue;
-
- var value = data.Value;
-
- if (range.Max == null) range.Max = value;
- if (range.Min == null) range.Min = value;
-
- if (range.Max < value) range.Max = value;
- if (range.Min > value) range.Min = value;
- }
-
- return range;
- }
- }
- /* 水平面积 只有1个数据
- Data 数据结构
- Value, Value2 区间最大最小值
- Color=面积的颜色
- Title=标题 TitleColor=标题颜色
- 支持横屏
- */
- function ChartStraightArea()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
-
- this.Color = "rgb(255,193,37)"; //线段颜色
- this.Font = '11px 微软雅黑';
-
- this.Draw = function ()
- {
- if (this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
-
- if (!this.Data || !this.Data.Data) return;
-
- if (this.ChartFrame.IsHScreen === true)
- {
- this.HScreenDraw();
- return;
- }
-
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- var bottom = this.ChartBorder.GetBottom();
- var left = this.ChartBorder.GetLeft();
- var xPointCount = this.ChartFrame.XPointCount;
-
- var xRight = this.ChartFrame.GetXFromIndex(xPointCount - 1);
-
- //画背景
- for (let i in this.Data.Data)
- {
- let item = this.Data.Data[i];
- if (item == null || isNaN(item.Value) || isNaN(item.Value2)) continue;
- if (item.Color == null) continue;
-
- let valueMax = Math.max(item.Value, item.Value2);
- let valueMin = Math.min(item.Value, item.Value2);
-
- let yTop = this.ChartFrame.GetYFromData(valueMax);
- let yBottom = this.ChartFrame.GetYFromData(valueMin);
-
- this.Canvas.setFillStyle(item.Color);
- this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(yTop), ToFixedRect(xRight - left), ToFixedRect(yBottom - yTop));
- }
-
- for (let i in this.Data.Data)
- {
- let item = this.Data.Data[i];
- if (item == null || isNaN(item.Value) || isNaN(item.Value2)) continue;
- if (item.Color == null) continue;
-
- let valueMax = Math.max(item.Value, item.Value2);
- let valueMin = Math.min(item.Value, item.Value2);
-
- let yTop = this.ChartFrame.GetYFromData(valueMax);
- let yBottom = this.ChartFrame.GetYFromData(valueMin);
-
- if (item.Title && item.TitleColor)
- {
- let x = xRight;
- if (item.Align == 'left')
- {
- this.Canvas.textAlign = 'left';
- x = left;
- }
- else
- {
- this.Canvas.textAlign = 'right';
- x = xRight;
- }
-
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(item.TitleColor);
- this.Canvas.font = this.Font;
- let y = yTop + (yBottom - yTop) / 2;
- this.Canvas.fillText(item.Title, x, y);
- }
- }
- }
-
- this.HScreenDraw = function ()
- {
- var bottom = this.ChartBorder.GetBottom();
- var top = this.ChartBorder.GetTop();
- var height = this.ChartBorder.GetHeight();
-
- for (let i in this.Data.Data)
- {
- let item = this.Data.Data[i];
- if (item == null || isNaN(item.Value) || isNaN(item.Value2)) continue;
- if (item.Color == null) continue;
-
- let valueMax = Math.max(item.Value, item.Value2);
- let valueMin = Math.min(item.Value, item.Value2);
-
- var yTop = this.ChartFrame.GetYFromData(valueMax);
- var yBottom = this.ChartFrame.GetYFromData(valueMin);
-
- this.Canvas.setFillStyle(item.Color);
- this.Canvas.fillRect(ToFixedRect(yBottom), ToFixedRect(top), ToFixedRect(yTop - yBottom), ToFixedRect(height));
-
- if (item.Title && item.TitleColor)
- {
- var xText = yTop + (yBottom - yTop) / 2;
- var yText = bottom;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180);
-
- this.Canvas.textAlign = 'right';
- this.Canvas.textBaseline = 'middle';
- this.Canvas.setFillStyle(item.TitleColor);
- this.Canvas.font = this.Font;
- this.Canvas.fillText(item.Title, 0, -2);
-
- this.Canvas.restore();
- }
- }
- }
-
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Min = null;
- range.Max = null;
-
- if (!this.Data || !this.Data.Data) return range;
-
- for (let i in this.Data.Data)
- {
- let item = this.Data.Data[i];
- if (item == null || isNaN(item.Value) || isNaN(item.Value2)) continue;
-
- let valueMax = Math.max(item.Value, item.Value2);
- let valueMin = Math.min(item.Value, item.Value2);
-
- if (range.Max == null) range.Max = valueMax;
- if (range.Min == null) range.Min = valueMin;
-
- if (range.Max < valueMax) range.Max = valueMax;
- if (range.Min > valueMin) range.Min = valueMin;
- }
- return range;
- }
- }
- // 面积图
- function ChartBand() {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.IsDrawFirst = true;
-
- this.FirstColor = g_JSChartResource.Index.LineColor[0];
- this.SecondColor = g_JSChartResource.Index.LineColor[1];
-
- this.Draw = function ()
- {
- if (this.ChartFrame.IsMinSize) return;
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
-
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var xPointCount = this.ChartFrame.XPointCount;
- var xOffset = this.ChartBorder.GetLeft() + distanceWidth / 2.0 + 2.0;
- var x = 0;
- var y = 0;
- var y2 = 0;
- var firstlinePoints = [];
- var secondlinePoints = [];
- var lIndex = 0;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j, xOffset += (dataWidth + distanceWidth))
- {
- var value = this.Data.Data[i];
- if (value == null || value.Value == null || value.Value2 == null) continue;
- x = this.ChartFrame.GetXFromIndex(j);
- y = this.ChartFrame.GetYFromData(value.Value);
- y2 = this.ChartFrame.GetYFromData(value.Value2);
- firstlinePoints[lIndex] = { x: x, y: y };
- secondlinePoints[lIndex] = { x: x, y: y2 };
- lIndex++;
- }
- if (firstlinePoints.length > 1)
- {
- this.Canvas.save();
- this.Canvas.beginPath();
- for (var i = 0; i < firstlinePoints.length; ++i)
- {
- if (i == 0)
- this.Canvas.moveTo(firstlinePoints[i].x, firstlinePoints[i].y);
- else
- this.Canvas.lineTo(firstlinePoints[i].x, firstlinePoints[i].y);
- }
- for (var j = secondlinePoints.length - 1; j >= 0; --j)
- {
- this.Canvas.lineTo(secondlinePoints[j].x, secondlinePoints[j].y);
- }
- this.Canvas.closePath();
- this.Canvas.setStrokeStyle("rgba(255,255,255,0)");
- this.Canvas.stroke();
- this.Canvas.clip();
- this.Canvas.beginPath();
- this.Canvas.moveTo(firstlinePoints[0].x, this.ChartBorder.GetBottom());
- for (var i = 0; i < firstlinePoints.length; ++i)
- {
- this.Canvas.lineTo(firstlinePoints[i].x, firstlinePoints[i].y);
- }
- this.Canvas.lineTo(firstlinePoints[firstlinePoints.length - 1].x, this.ChartBorder.GetBottom());
- this.Canvas.closePath();
- this.Canvas.setFillStyle(this.FirstColor);
- this.Canvas.fill();
- this.Canvas.beginPath();
- this.Canvas.moveTo(secondlinePoints[0].x, this.ChartBorder.GetBottom());
- for (var i = 0; i < secondlinePoints.length; ++i)
- {
- this.Canvas.lineTo(secondlinePoints[i].x, secondlinePoints[i].y);
- }
- this.Canvas.lineTo(secondlinePoints[secondlinePoints.length - 1].x, this.ChartBorder.GetBottom());
- this.Canvas.closePath();
- this.Canvas.setFillStyle(this.SecondColor);
- this.Canvas.fill();
- this.Canvas.restore();
- }
- }
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- range.Min = null;
- range.Max = null;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null || value.Value == null || value.Value2 == null) continue;
- var maxData = value.Value > value.Value2 ? value.Value : value.Value2;
- var minData = value.Value < value.Value2 ? value.Value : value.Value2;
- if (range.Max == null)
- range.Max = maxData;
- else if (range.Max < maxData)
- range.Max = maxData;
-
- if (range.Min == null)
- range.Min = minData;
- else if (range.Min > minData)
- range.Min = minData;
- }
- return range;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- // 其他图形
- //
- //
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- /*
- 饼图
- */
- function ChartPie()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.Draw = function ()
- {
- if (!this.Data || !this.Data.Data || !(this.Data.Data.length > 0)) return this.DrawEmptyData();
- let left = this.ChartBorder.GetLeft();
- let right = this.ChartBorder.GetRight();
- let top = this.ChartBorder.GetTop();
- let bottom = this.ChartBorder.GetBottom();
- let width = this.ChartBorder.GetWidth();
- let height = this.ChartBorder.GetHeight();
- //圆半径
- let radius = width / 4 * 0.8;
- this.Canvas.save();
- this.Canvas.translate(left + radius, top + height / 2);
- let totalValue = 0; //求和
- for (let i in this.Data.Data) {
- totalValue += this.Data.Data[i].Value;
- }
- let startAngle = Math.PI * 1.5;
- let start = startAngle;
- let end = startAngle;
- //画饼图
- for (let i in this.Data.Data)
- {
- let item = this.Data.Data[i];
- let rate = item.Value / totalValue; //占比
- // 绘制扇形
- this.Canvas.beginPath();
- this.Canvas.moveTo(0, 0);
- end += rate * 2 * Math.PI;//终止角度
- this.Canvas.setStrokeStyle("white");
- this.Canvas.setFillStyle(item.Color);
- this.Canvas.arc(0, 0, radius, start, end);
- this.Canvas.fill();
- this.Canvas.closePath();
- this.Canvas.stroke();
- start += rate * 2 * Math.PI;//起始角度
- }
- //画文字
- this.Canvas.restore();
- let textLeft = left + width / 2 + 5;
- // let textTop = top + height / 2 + 20;
- let textTop = top;
- this.Canvas.textBaseline = "bottom";
- this.Canvas.font = "12px 微软雅黑";
- for (let i = 0, j = 0; i < this.Data.Data.length; ++i)
- {
- let item = this.Data.Data[i];
- if (!item.Text) continue;
- this.Canvas.setFillStyle(item.Color);
- this.Canvas.fillRect(textLeft, textTop - 15, 13, 13);
- this.Canvas.setFillStyle('rgb(102,102,102)');
- this.Canvas.fillText(item.Text, textLeft + 16, textTop);
- // textTop += 20;
- textTop += 17;
- if (textTop > top + height / 2 + radius) {
- ++j;
- if (j >= 2) break;
- // textTop = top + height / 2 + 20;
- textTop = top;
- textLeft = right - (width / 4) + 5;
- }
- }
- }
- //空数据
- this.DrawEmptyData = function ()
- {
- console.log('[ChartPie::DrawEmptyData]')
- let left = this.ChartBorder.GetLeft();
- let right = this.ChartBorder.GetRight();
- let top = this.ChartBorder.GetTop();
- let bottom = this.ChartBorder.GetBottom();
- let width = this.ChartBorder.GetWidth();
- let height = this.ChartBorder.GetHeight();
- //圆半径
- let radius = width / 4 * 0.8;
- this.Canvas.save();
- this.Canvas.translate(left + radius, top + height / 2);
- this.Canvas.beginPath();
- this.Canvas.setFillStyle('rgb(211,211,211)');
- this.Canvas.setStrokeStyle("white");
- this.Canvas.arc(0, 0, radius * 0.8, 0, 2 * Math.PI);
- this.Canvas.fill();
- this.Canvas.closePath();
- this.Canvas.stroke();
- this.Canvas.restore();
- }
- }
- /*
- 圆环
- */
- function ChartCircle()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.BGColor = 'white'; //背景色
- this.TextHeight = 25;
- //空数据
- this.DrawEmptyData = function ()
- {
- console.log('[ChartCircle::DrawEmptyData]')
- }
- this.Draw = function ()
- {
- if (!this.Data || !this.Data.Data || !(this.Data.Data.length > 0)) return this.DrawEmptyData();
- let left = this.ChartBorder.GetLeft();
- let right = this.ChartBorder.GetRight();
- let top = this.ChartBorder.GetTop();
- let bottom = this.ChartBorder.GetBottom();
- let width = this.ChartBorder.GetWidth();
- let height = this.ChartBorder.GetHeight();
- //圆半径
- let lTextHeight = this.TextHeight;
- let size = width - lTextHeight;
- if (size > height - lTextHeight) size = height - lTextHeight;
- let radius = (size - lTextHeight) / 2;
- this.Canvas.save();
- this.Canvas.translate(left + width / 2, top + height / 2 - lTextHeight / 2);
- let totalValue = 0; //求和
- for (let i in this.Data.Data)
- {
- totalValue += this.Data.Data[i].Value;
- }
- let startAngle = Math.PI * 1.5;
- let start = startAngle;
- let end = startAngle;
- //画饼图
- for (let i in this.Data.Data)
- {
- let item = this.Data.Data[i];
- let rate = item.Value / totalValue; //占比
- //console.log('[ChartPie::Draw]', i, rate, item);
- // 绘制扇形
- this.Canvas.beginPath();
- this.Canvas.moveTo(0, 0);
- end += rate * 2 * Math.PI;//终止角度
- this.Canvas.setStrokeStyle("white");
- this.Canvas.setFillStyle(item.Color);
- this.Canvas.arc(0, 0, radius, start, end);
- this.Canvas.fill();
- this.Canvas.closePath();
- this.Canvas.stroke();
- start += rate * 2 * Math.PI;//起始角度
- }
- //中心画一个背景色的圆
- this.Canvas.beginPath();
- this.Canvas.setFillStyle(this.BGColor);
- this.Canvas.arc(0, 0, radius * 0.5, 0, 2 * Math.PI);
- this.Canvas.fill();
- this.Canvas.closePath();
- this.Canvas.stroke();
- this.Canvas.restore();
- //画文字
- this.Canvas.restore();
- let textLeft = left;
- let textTop = top + height / 2 - lTextHeight / 2 + radius + 5 + 20;
- this.Canvas.textBaseline = "bottom";
- this.Canvas.textAlign = 'left';
- this.Canvas.font = "12px 微软雅黑";
- let textWidth = 0;
- //以圆心左右显示
- for (let i = 0, j = 0; i < this.Data.Data.length; ++i)
- {
- let item = this.Data.Data[i];
- if (!item.Text) continue;
- this.Canvas.setFillStyle(item.Color);
- if (j % 2 == 0)
- {
- textLeft = left + width / 2 - 10;
- textWidth = this.Canvas.measureText(item.Text).width;
- textLeft = textLeft - textWidth - 16;
- this.Canvas.fillRect(textLeft, textTop - 15, 13, 13);
- this.Canvas.setFillStyle('rgb(102,102,102)');
- this.Canvas.fillText(item.Text, textLeft + 16, textTop);
- }
- else
- {
- textLeft = left + width / 2 + 10 + 10;
- this.Canvas.fillRect(textLeft, textTop - 15, 13, 13);
- this.Canvas.setFillStyle('rgb(102,102,102)');
- this.Canvas.fillText(item.Text, textLeft + 16, textTop);
- textTop += 20;
- }
- if (textTop > bottom) break;
- ++j;
- }
- }
- }
- // 中国地图
- function ChartChinaMap()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ImageData = null;
- this.Left;
- this.Top;
- this.Width;
- this.Height;
- this.ImageWidth;
- this.ImageHeight;
- this.DefaultColor = [217, 222, 239];
- this.Color =
- [
- { Name: '海南', Color: 'rgb(217,222,223)' },
- { Name: '内蒙古', Color: 'rgb(217,222,225)' },
- { Name: '新疆', Color: 'rgb(217,222,226)' },
- { Name: '青海', Color: 'rgb(217,222,227)' },
- { Name: '西藏', Color: 'rgb(217,222,228)' },
- { Name: '云南', Color: 'rgb(217,222,229)' },
- { Name: '黑龙江', Color: 'rgb(217,222,230)' },
- { Name: '吉林', Color: 'rgb(217,222,231)' },
- { Name: '辽宁', Color: 'rgb(217,222,232)' },
- { Name: '河北', Color: 'rgb(217,222,233)' },
- { Name: '山东', Color: 'rgb(217,222,234)' },
- { Name: '江苏', Color: 'rgb(217,222,235)' },
- { Name: '浙江', Color: 'rgb(217,222,236)' },
- { Name: '福建', Color: 'rgb(217,222,237)' },
- { Name: '广东', Color: 'rgb(217,222,238)' },
- { Name: '广西', Color: 'rgb(217,222,239)' },
- { Name: '贵州', Color: 'rgb(217,222,240)' },
- { Name: '湖南', Color: 'rgb(217,222,241)' },
- { Name: '江西', Color: 'rgb(217,222,242)' },
- { Name: '安徽', Color: 'rgb(217,222,243)' },
- { Name: '湖北', Color: 'rgb(217,222,244)' },
- { Name: '重庆', Color: 'rgb(217,222,245)' },
- { Name: '四川', Color: 'rgb(217,222,246)' },
- { Name: '甘肃', Color: 'rgb(217,222,247)' },
- { Name: '陕西', Color: 'rgb(217,222,248)' },
- { Name: '山西', Color: 'rgb(217,222,249)' },
- { Name: '河南', Color: 'rgb(217,222,250)' }
- ];
- this.Draw = function ()
- {
- let left = this.ChartBorder.GetLeft() + 1;
- let right = this.ChartBorder.GetRight() - 1;
- let top = this.ChartBorder.GetTop() + 1;
- let bottom = this.ChartBorder.GetBottom() - 1;
- let width = this.ChartBorder.GetWidth() - 2;
- let height = this.ChartBorder.GetHeight() - 2;
- let imageWidth = CHINA_MAP_IMAGE.width;
- let imageHeight = CHINA_MAP_IMAGE.height;
- let drawImageWidth = imageWidth;
- let drawImageHeight = imageHeight;
- if (height < drawImageHeight || width < drawImageWidth)
- {
- this.ImageData = null;
- return;
- }
- if (this.Left != left || this.Top != top || this.Width != width || this.Height != height || this.ImageWidth != imageWidth || this.ImageHeight != imageHeight)
- {
- this.ImageData = null;
- this.ImageWidth = imageWidth;
- this.ImageHeight = imageHeight;
- this.Left = left;
- this.Top = top;
- this.Width = width;
- this.Height = height;
- console.log(imageWidth, imageHeight);
- }
- if (this.ImageData == null)
- {
- this.Canvas.drawImage(CHINA_MAP_IMAGE, 0, 0, imageWidth, imageHeight, left, top, drawImageWidth, drawImageHeight);
- this.ImageData = this.Canvas.getImageData(left, top, drawImageWidth, drawImageHeight);
- let defaultColorSet = new Set(); //默认颜色填充的色块
- let colorMap = new Map(); //定义颜色填充的色块
- let nameMap = new Map();
- if (this.Data.length > 0)
- {
- for (let i in this.Data)
- {
- let item = this.Data[i];
- nameMap.set(item.Name, item.Color)
- }
- }
- console.log(this.Data);
- for (let i in this.Color)
- {
- let item = this.Color[i];
- if (nameMap.has(item.Name))
- {
- colorMap.set(item.Color, nameMap.get(item.Name));
- }
- else
- {
- defaultColorSet.add(item.Color);
- }
- }
- var color;
- for (let i = 0; i < this.ImageData.data.length; i += 4)
- {
- color = 'rgb(' + this.ImageData.data[i] + ',' + this.ImageData.data[i + 1] + ',' + this.ImageData.data[i + 2] + ')';
- if (defaultColorSet.has(color))
- {
- this.ImageData.data[i] = this.DefaultColor[0];
- this.ImageData.data[i + 1] = this.DefaultColor[1];
- this.ImageData.data[i + 2] = this.DefaultColor[2];
- }
- else if (colorMap.has(color))
- {
- let colorValue = colorMap.get(color);
- this.ImageData.data[i] = colorValue[0];
- this.ImageData.data[i + 1] = colorValue[1];
- this.ImageData.data[i + 2] = colorValue[2];
- }
- }
- this.Canvas.clearRect(left, top, drawImageWidth, drawImageHeight);
- this.Canvas.putImageData(this.ImageData, left, top, 0, 0, drawImageWidth, drawImageHeight);
- }
- else
- {
- this.Canvas.putImageData(this.ImageData, left, top, 0, 0, drawImageWidth, drawImageHeight);
- }
- }
- }
- // 雷达图
- function ChartRadar()
- {
- this.newMethod = IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.BorderPoint = []; //边框点
- this.DataPoint = []; //数据点
- this.CenterPoint = {};
- this.StartAngle = 0;
- this.Color = 'rgb(198,198,198)';
- this.AreaColor = 'rgba(242,154,118,0.4)'; //面积图颜色
- this.AreaLineColor = 'rgb(242,154,118)';
- this.TitleFont = '24px 微软雅黑';
- this.TitleColor = 'rgb(102,102,102)';
- this.BGColor = ['rgb(255,255,255)', 'rgb(224,224,224)']//背景色
- this.DrawBorder = function () //画边框
- {
- if (this.BorderPoint.length <= 0) return;
- this.Canvas.font = this.TitleFont;
- this.Canvas.setStrokeStyle(this.Color);
- const aryBorder = [1, 0.8, 0.6, 0.4, 0.2];
- for (let j in aryBorder)
- {
- var rate = aryBorder[j];
- var isFirstDraw = true;
- for (let i in this.BorderPoint)
- {
- var item = this.BorderPoint[i];
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180) * rate;
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180) * rate;
- if (isFirstDraw)
- {
- this.Canvas.beginPath();
- this.Canvas.moveTo(item.X, item.Y);
- isFirstDraw = false;
- }
- else
- {
- this.Canvas.lineTo(item.X, item.Y);
- }
- if (j == 0) this.DrawText(item);
- }
- this.Canvas.closePath();
- this.Canvas.stroke();
- this.Canvas.setFillStyle(this.BGColor[j % 2 == 0 ? 0 : 1]);
- this.Canvas.fill();
- }
- this.Canvas.beginPath();
- for (let i in this.BorderPoint)
- {
- var item = this.BorderPoint[i];
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
- this.Canvas.moveTo(this.CenterPoint.X, this.CenterPoint.Y);
- this.Canvas.lineTo(item.X, item.Y);
- }
- this.Canvas.stroke();
- }
- this.DrawArea = function ()
- {
- if (!this.DataPoint || this.DataPoint.length <= 0) return;
- this.Canvas.setFillStyle(this.AreaColor);
- this.Canvas.setStrokeStyle(this.AreaLineColor);
- this.Canvas.beginPath();
- var isFirstDraw = true;
- for (let i in this.DataPoint)
- {
- var item = this.DataPoint[i];
- if (isFirstDraw)
- {
- this.Canvas.beginPath();
- this.Canvas.moveTo(item.X, item.Y);
- isFirstDraw = false;
- }
- else
- {
- this.Canvas.lineTo(item.X, item.Y);
- }
- }
- this.Canvas.closePath();
- this.Canvas.fill();
- this.Canvas.stroke();
- }
- this.DrawText = function (item)
- {
- if (!item.Text) return;
- //console.log(item.Text, item.Angle);
- this.Canvas.setFillStyle(this.TitleColor);
- var xText = item.X, yText = item.Y;
- //显示每个角度的位置
- if (item.Angle > 0 && item.Angle < 45)
- {
- this.Canvas.textAlign = 'left';
- this.Canvas.textBaseline = 'middle';
- xText += 2;
- }
- else if (item.Angle >= 0 && item.Angle < 90) {
- this.Canvas.textAlign = 'left';
- this.Canvas.textBaseline = 'top';
- xText += 2;
- }
- else if (item.Angle >= 90 && item.Angle < 135)
- {
- this.Canvas.textAlign = 'right';
- this.Canvas.textBaseline = 'top';
- xText -= 2;
- }
- else if (item.Angle >= 135 && item.Angle < 180)
- {
- this.Canvas.textAlign = 'right';
- this.Canvas.textBaseline = 'top';
- xText -= 2;
- }
- else if (item.Angle >= 180 && item.Angle < 225) {
- this.Canvas.textAlign = 'right';
- this.Canvas.textBaseline = 'middle';
- xText -= 2;
- }
- else if (item.Angle >= 225 && item.Angle <= 270) {
- this.Canvas.textAlign = 'center';
- this.Canvas.textBaseline = 'bottom';
- }
- else if (item.Angle > 270 && item.Angle < 315)
- {
- this.Canvas.textAlign = 'left';
- this.Canvas.textBaseline = 'bottom';
- xText += 2;
- }
- else
- {
- this.Canvas.textAlign = 'left';
- this.Canvas.textBaseline = 'middle';
- xText += 2;
- }
- this.Canvas.fillText(item.Text, xText, yText);
- }
- this.Draw = function ()
- {
- this.BorderPoint = [];
- this.DataPoint = [];
- this.InternalBorderPoint = [];
- this.CenterPoint = {};
- if (!this.Data || !this.Data.Data || !(this.Data.Data.length > 0))
- this.CalculatePoints(null);
- else
- this.CalculatePoints(this.Data.Data);
- this.DrawBorder();
- this.DrawArea();
- }
- this.CalculatePoints = function (data)
- {
- let left = this.ChartBorder.GetLeft();
- let right = this.ChartBorder.GetRight();
- let top = this.ChartBorder.GetTop();
- let bottom = this.ChartBorder.GetBottom();
- let width = this.ChartBorder.GetWidth();
- let height = this.ChartBorder.GetHeight();
- let ptCenter = { X: left + width / 2, Y: top + height / 2 }; //中心点
- let radius = Math.min(width / 2, height / 2) - 2 //半径
- let count = Math.max(5, data ? data.length : 0);
- let averageAngle = 360 / count;
- for (let i = 0; i < count; ++i)
- {
- let ptBorder = { Index: i, Radius: radius, Angle: i * averageAngle + this.StartAngle };
- let angle = ptBorder.Angle;
- if (data && i < data.length)
- {
- var item = data[i];
- let ptData = { Index: i, Text: item.Text };
- ptBorder.Text = item.Name;
- if (!item.Value)
- {
- ptData.X = ptCenter.X;
- ptData.Y = ptCenter.Y;
- }
- else
- {
- var value = item.Value;
- if (value >= 1) value = 1;
- var dataRadius = radius * value;
- ptData.X = ptCenter.X + dataRadius * Math.cos(angle * Math.PI / 180);
- ptData.Y = ptCenter.Y + dataRadius * Math.sin(angle * Math.PI / 180);
- }
- this.DataPoint.push(ptData);
- }
- this.BorderPoint.push(ptBorder);
- }
- this.CenterPoint = ptCenter;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- //十字光标
- function ChartCorssCursor()
- {
- this.Frame;
- this.Canvas; //画布
- this.HPenColor = g_JSChartResource.CorssCursorHPenColor; //水平线颜色
- this.HPenType = 0; //水平线样式 0=虚线 1=实线
- this.VPenColor = g_JSChartResource.CorssCursorVPenColor; //垂直线颜色
- this.VPenType = 0; //垂直线颜色 0=虚线 1=实线 2=K线宽度
- this.Font = g_JSChartResource.CorssCursorTextFont; //字体
- this.TextColor = g_JSChartResource.CorssCursorTextColor; //文本颜色
- this.TextBGColor = g_JSChartResource.CorssCursorBGColor; //文本背景色
- this.TextHeight = 15; //文本字体高度
- this.LastPoint;
- this.CursorIndex; //当前数据的位置
- this.PointX;
- this.PointY;
- this.StringFormatX;
- this.StringFormatY;
- this.IsShow = true; //是否显示
- this.ShowTextMode = { Left: 1, Right: 1, Bottom: 1 }; //0=不显示 1=显示在框架外 2=显示在框架内
- this.IsShowCorss = true; //是否显示十字光标
- this.IsShowClose = false; //Y轴始终显示收盘价
- this.IsFixXLastTime=false; //是否修正X轴,超出当前时间的,X轴调整到当前最后的时间.
- //内部使用
- this.Close = null; //收盘价格
- this.GetCloseYPoint = function (index)
- {
- this.Close = null;
- if (!this.StringFormatX.Data) return null;
- var data = this.StringFormatX.Data;
- if (!data.Data || data.Data.length <= 0) return null;
- var dataIndex = data.DataOffset + index;
- if (dataIndex >= data.Data.length) dataIndex = data.Data.length - 1;
- if (dataIndex < 0) return null;
- var klineData = data.Data[dataIndex];
- if (!klineData) return null;
- this.Close = klineData.Close;
- var yPoint = this.Frame.GetYFromData(this.Close);
- return yPoint;
- }
- this.FixMinuteLastTimeXPoint=function(index)
- {
- if (!IFrameSplitOperator.IsNumber(index)) return null;
- index=parseInt(index);
- if (!this.StringFormatX.Data) return null;
- var data = this.StringFormatX.Data;
- if (!data.Data || data.Data.length <= 0) return null;
- var dataIndex = data.DataOffset + index;
- if (dataIndex<data.Data.length) return null;
- dataIndex=data.Data.length - 1;
- dataIndex-=data.DataOffset;
- var xPoint=this.Frame.GetXFromIndex(dataIndex);
- return { X:xPoint, Index:dataIndex };
- }
- this.Draw = function ()
- {
- if (!this.LastPoint) return;
- var x = this.LastPoint.X;
- var y = this.LastPoint.Y;
- var isInClient = false;
- var rtClient = new Rect(this.Frame.ChartBorder.GetLeft(), this.Frame.ChartBorder.GetTop(), this.Frame.ChartBorder.GetWidth(), this.Frame.ChartBorder.GetHeight());
- isInClient = rtClient.IsPointIn(x, y);
- this.PointY = null;
- this.PointY == null;
- if (!isInClient) return;
- if (this.Frame.IsHScreen === true)
- {
- this.HScreenDraw();
- return;
- }
- var left = this.Frame.ChartBorder.GetLeft();
- var right = this.Frame.ChartBorder.GetRight();
- var top = this.Frame.ChartBorder.GetTopTitle();
- var bottom = this.Frame.ChartBorder.GetBottom();
- var rightWidth = this.Frame.ChartBorder.Right;
- var chartRight = this.Frame.ChartBorder.GetChartWidth();
- x = this.Frame.GetXFromIndex(this.CursorIndex); //手机端 十字只能画在K线上
- if (this.IsShowClose)
- {
- var yPoint = this.GetCloseYPoint(this.CursorIndex);
- if (yPoint != null) y = yPoint;
- }
- if (this.IsFixXLastTime)
- {
- var value=this.FixMinuteLastTimeXPoint(this.CursorIndex)
- if (value)
- {
- x=value.X;
- this.CursorIndex=value.Index;
- }
- }
- this.PointY = [[left, y], [right, y]];
- this.PointX = [[x, top], [x, bottom]];
- if (this.IsShowCorss) //十字线
- {
- if (this.HPenType==1 || this.HPenType==0)
- {
- this.Canvas.setStrokeStyle(this.HPenColor);
- if (this.HPenType == 0) this.Canvas.setLineDash([3, 2]); //虚线
- //this.Canvas.lineWidth=0.5
- this.Canvas.beginPath();
- this.Canvas.moveTo(left, ToFixedPoint(y));
- this.Canvas.lineTo(right, ToFixedPoint(y));
- this.Canvas.stroke();
- this.Canvas.setLineDash([]);
- }
-
- this.Canvas.save();
- this.Canvas.setStrokeStyle(this.VPenColor);
- if (this.VPenType == 0)
- {
- this.Canvas.setLineDash([3, 2]); //虚线
- }
- else if (this.VPenType == 2)
- {
- let barWidth = this.Frame.SubFrame[0].Frame.DataWidth; //和K线一样宽度
- if (barWidth > 2) this.Canvas.lineWidth = barWidth;
- }
- this.Canvas.beginPath();
- if (this.Frame.SubFrame.length > 0)
- {
- for (var i in this.Frame.SubFrame)
- {
- var frame = this.Frame.SubFrame[i].Frame;
- top = frame.ChartBorder.GetTopTitle();
- bottom = frame.ChartBorder.GetBottom();
- this.Canvas.moveTo(ToFixedPoint(x), top);
- this.Canvas.lineTo(ToFixedPoint(x), bottom);
- }
- }
- else
- {
- this.Canvas.moveTo(ToFixedPoint(x), top);
- this.Canvas.lineTo(ToFixedPoint(x), bottom);
- }
- this.Canvas.stroke();
- this.Canvas.restore();
- }
- var xValue = this.Frame.GetXData(x);
- var yValueExtend = {};
- var yValue = this.Frame.GetYData(y, yValueExtend);
- this.StringFormatY.RValue = yValueExtend.RightYValue; //右侧子坐标
- if (this.IsShowClose && this.Close != null) yValue = this.Close;
- this.StringFormatX.Value = this.CursorIndex;
- this.StringFormatY.Value = yValue;
- this.StringFormatY.FrameID = yValueExtend.FrameID;
- if (((this.ShowTextMode.Left == 1 && this.Frame.ChartBorder.Left >= 30) || this.ShowTextMode.Left == 2 ||
- (this.ShowTextMode.Right == 1 && this.Frame.ChartBorder.Right >= 30) || this.ShowTextMode.Right == 2) && this.StringFormatY.Operator())
- {
- var text = this.StringFormatY.Text;
- this.Canvas.font = this.Font;
- var textWidth = this.Canvas.measureText(text).width + 4; //前后各空2个像素
-
- if (this.Frame.ChartBorder.Left >= 30 && this.ShowTextMode.Left == 1)
- {
- this.Canvas.setFillStyle(this.TextBGColor);
- if (left < textWidth) //左边空白的地方太少了画布下
- {
- this.Canvas.fillRect(2, y - this.TextHeight / 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, 2 + 2, y, textWidth);
- }
- else
- {
- this.Canvas.fillRect(left - 2, y - this.TextHeight / 2, -textWidth, this.TextHeight);
- this.Canvas.textAlign = "right";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, left - 4, y, textWidth);
- }
- }
- else if (this.ShowTextMode.Left == 2)
- {
- this.Canvas.setFillStyle(this.TextBGColor);
- this.Canvas.fillRect(left, y - this.TextHeight / 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, left + 2, y, textWidth);
- }
- if (this.StringFormatY.RText)
- {
- text = this.StringFormatY.RText;
- var textWidth = this.Canvas.measureText(text).width + 4; //前后各空2个像素
- }
-
- if (this.Frame.ChartBorder.Right >= 30 && this.ShowTextMode.Right == 1)
- {
- this.Canvas.setFillStyle(this.TextBGColor);
- if (rightWidth > textWidth) //右边不够就不画
- {
- this.Canvas.fillRect(right + 2, y - this.TextHeight / 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, right + 4, y, textWidth);
- }
- else
- {
- this.Canvas.fillRect(chartRight - 2 - textWidth, y - this.TextHeight / 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "right";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, chartRight - 4, y, textWidth);
- }
- }
- else if (this.ShowTextMode.Right == 2)
- {
- this.Canvas.setFillStyle(this.TextBGColor);
- var showLeft = right - textWidth;
- this.Canvas.fillRect(showLeft, y - this.TextHeight / 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, showLeft + 2, y, textWidth);
- }
- }
- if (this.ShowTextMode.Bottom == 1 && this.StringFormatX.Operator())
- {
- var text = this.StringFormatX.Text;
- this.Canvas.font = this.Font;
- //这个地方是显示十字光标下的日期
- this.Canvas.setFillStyle(this.TextBGColor);
- var textWidth = this.Canvas.measureText(text).width + 4; //前后各空2个像素
- if (x - textWidth / 2 < 3) //左边位置不够了, 顶着左边画
- {
- this.Canvas.fillRect(x - 1, bottom + 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "top";
- this.Canvas.setFillStyle(this.TextColor);
- var textBottom=bottom;
- var textLeft=x;
- //#ifdef MP-TOUTIAO
- textBottom=textBottom+10;
- textLeft=textLeft-25;
- //#endif
- this.Canvas.fillText(text, textLeft + 1, textBottom + 2, textWidth);
- }
- else if ((right - left) - x < textWidth)
- { //右边位置不够用,顶着右边画
- this.Canvas.fillRect(x - textWidth, bottom + 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "right";
- this.Canvas.textBaseline = "top";
- this.Canvas.setFillStyle(this.TextColor);
-
- var textBottom=bottom;
- var textLeft=x;
- //#ifdef MP-TOUTIAO
- textBottom=textBottom+10;
- textLeft=textLeft-25;
- //#endif
- this.Canvas.fillText(text, textLeft + 1, textBottom + 2, textWidth);
- }
- else
- {
- this.Canvas.fillRect(x - textWidth / 2, bottom + 2, textWidth, this.TextHeight);
- this.Canvas.textAlign = "center";
- this.Canvas.textBaseline = "top";
- this.Canvas.setFillStyle(this.TextColor);
- var textBottom=bottom;
- var textLeft=x;
- //#ifdef MP-TOUTIAO
- textBottom=textBottom+10;
- textLeft=textLeft-25;
- //#endif
- this.Canvas.fillText(text, textLeft + 1, textBottom + 2, textWidth);
- }
- }
- }
- this.HScreenDraw = function ()
- {
- var x = this.LastPoint.X;
- var y = this.LastPoint.Y;
- y = this.Frame.GetXFromIndex(this.CursorIndex); //手机端 十字只能画在K线上
- var left = this.Frame.ChartBorder.GetLeft();
- var right = this.Frame.ChartBorder.GetRightEx();
- var top = this.Frame.ChartBorder.GetTop();
- var bottom = this.Frame.ChartBorder.GetBottom();
- var bottomWidth = this.Frame.ChartBorder.Bottom;
- this.PointY = [[left, y], [right, y]];
- this.PointX = [[x, top], [x, bottom]];
- if (this.IsShowCorss) //十字线
- {
- this.Canvas.save();
- this.Canvas.setStrokeStyle(this.HPenColor);
- if (this.HPenType == 0) this.Canvas.setLineDash([3, 2]); //虚线
-
- //画竖线
- this.Canvas.beginPath();
- this.Canvas.moveTo(ToFixedPoint(x), top);
- this.Canvas.lineTo(ToFixedPoint(x), bottom);
- this.Canvas.stroke();
- this.Canvas.restore();
- this.Canvas.save();
- this.Canvas.setStrokeStyle(this.VPenColor);
- if (this.VPenType == 0)
- {
- this.Canvas.setLineDash([3, 2]); //虚线
- }
- else if (this.VPenType == 2)
- {
- let barWidth = this.Frame.SubFrame[0].Frame.DataWidth; //和K线一样宽度
- if (barWidth > 2) this.Canvas.lineWidth = barWidth;
- }
- this.Canvas.beginPath();
- //画横线
- if (this.Frame.SubFrame.length > 0)
- {
- for (var i in this.Frame.SubFrame)
- {
- var frame = this.Frame.SubFrame[i].Frame;
- this.Canvas.moveTo(frame.ChartBorder.GetLeft(), ToFixedPoint(y));
- this.Canvas.lineTo(frame.ChartBorder.GetRightTitle(), ToFixedPoint(y));
- }
- }
- else
- {
- this.Canvas.moveTo(left, ToFixedPoint(y));
- this.Canvas.lineTo(right, ToFixedPoint(y));
- }
- this.Canvas.stroke();
- this.Canvas.restore();
- }
- var xValue = this.Frame.GetXData(y);
- var yValueExtend = {};
- var yValue = this.Frame.GetYData(x, yValueExtend);
- this.StringFormatX.Value = xValue;
- this.StringFormatY.Value = yValue;
- this.StringFormatY.FrameID = yValueExtend.FrameID;
- if (((this.ShowTextMode.Left == 1 && this.Frame.ChartBorder.Top >= 30) || this.ShowTextMode.Left == 2 ||
- (this.ShowTextMode.Right == 1 && this.Frame.ChartBorder.Bottom >= 30) || this.ShowTextMode.Right == 2) && this.StringFormatY.Operator()) {
- var text = this.StringFormatY.Text;
- this.Canvas.font = this.Font;
- var textWidth = this.Canvas.measureText(text).width + 4; //前后各空2个像素
- if (this.Frame.ChartBorder.Top >= 30 && this.ShowTextMode.Left == 1) {
- var xText = x, yText = top;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
- this.Canvas.setFillStyle(this.TextBGColor);
- if (top >= textWidth) {
- this.Canvas.fillRect(-textWidth, -(this.TextHeight / 2), textWidth, this.TextHeight);
- this.Canvas.textAlign = "right";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, -2, 0, textWidth);
- }
- else {
- this.Canvas.fillRect((textWidth - top), -(this.TextHeight / 2), -textWidth, this.TextHeight);
- this.Canvas.textAlign = "right";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, (textWidth - top) - 2, 0, textWidth);
- }
- this.Canvas.restore();
- }
- else if (this.ShowTextMode.Left == 2) {
- var xText = x;
- var yText = top;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
- this.Canvas.setFillStyle(this.TextBGColor);
- this.Canvas.fillRect(0, -(this.TextHeight / 2), textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, 2, 0, textWidth);
- this.Canvas.restore();
- }
- if (this.Frame.ChartBorder.Bottom >= 30 && this.ShowTextMode.Right == 1) {
- var xText = x, yText = bottom;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
- this.Canvas.setFillStyle(this.TextBGColor);
- if (bottomWidth > textWidth) {
- this.Canvas.fillRect(0, -(this.TextHeight / 2), textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, 2, 0, textWidth);
- }
- else {
- this.Canvas.fillRect((bottomWidth - textWidth), -(this.TextHeight / 2), textWidth, this.TextHeight);
- this.Canvas.textAlign = "left";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, (bottomWidth - textWidth) + 2, 0, textWidth);
- }
- this.Canvas.restore();
- }
- else if (this.ShowTextMode.Right == 2) {
- var xText = x;
- var yText = bottom;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
- this.Canvas.setFillStyle(this.TextBGColor);
- this.Canvas.fillRect(0, -(this.TextHeight / 2), -textWidth, this.TextHeight);
- this.Canvas.textAlign = "right";
- this.Canvas.textBaseline = "middle";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, -2, 0, textWidth);
- this.Canvas.restore();
- }
- }
- if (this.ShowTextMode.Bottom === 1 && this.StringFormatX.Operator()) {
- var text = this.StringFormatX.Text;
- this.Canvas.font = this.Font;
- this.Canvas.setFillStyle(this.TextBGColor);
- var textWidth = this.Canvas.measureText(text).width + 4; //前后各空2个像素
- if (y - textWidth / 2 < 3) //左边位置不够了, 顶着左边画
- {
- var xText = left;
- var yText = y;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
- this.Canvas.fillRect(0, 0, textWidth, this.TextHeight);
- this.Canvas.textAlign = "center";
- this.Canvas.textBaseline = "top";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, 0, 0, textWidth);
- this.Canvas.restore();
- }
- else {
- var xText = left;
- var yText = y;
- this.Canvas.save();
- this.Canvas.translate(xText, yText);
- this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
- this.Canvas.fillRect(-(textWidth / 2), 0, textWidth, this.TextHeight);
- this.Canvas.textAlign = "center";
- this.Canvas.textBaseline = "top";
- this.Canvas.setFillStyle(this.TextColor);
- this.Canvas.fillText(text, 0, 0, textWidth);
- this.Canvas.restore();
- }
- }
- }
- }
- //分钟线
- function ChartMinutePriceLine()
- {
- this.newMethod = ChartLine; //派生
- this.newMethod();
- delete this.newMethod;
- this.YClose;
- this.IsDrawArea = true; //是否画价格面积图
- this.AreaColor = 'rgba(0,191,255,0.1)';
- this.Draw = function ()
- {
- if (this.NotSupportMessage)
- {
- this.DrawNotSupportmessage();
- return;
- }
- if (!this.IsShow) return;
- if (!this.Data) return;
- var isHScreen = (this.ChartFrame.IsHScreen === true);
- var dataWidth = this.ChartFrame.DataWidth;
- var distanceWidth = this.ChartFrame.DistanceWidth;
- var chartright = this.ChartBorder.GetRight();
- if (isHScreen === true) chartright = this.ChartBorder.GetBottom();
- var xPointCount = this.ChartFrame.XPointCount;
- var minuteCount = this.ChartFrame.MinuteCount;
- var bottom = this.ChartBorder.GetBottomEx();
- var left = this.ChartBorder.GetLeftEx();
- var bFirstPoint = true;
- var ptFirst = {}; //第1个点
- var drawCount = 0;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (value == null) continue;
- var x = this.ChartFrame.GetXFromIndex(j);
- var y = this.ChartFrame.GetYFromData(value);
- if (bFirstPoint)
- {
- this.Canvas.setStrokeStyle(this.Color);
- this.Canvas.beginPath();
- if (isHScreen) this.Canvas.moveTo(y, x);
- else this.Canvas.moveTo(x, y);
- bFirstPoint = false;
- ptFirst = { X: x, Y: y };
- }
- else
- {
- if (isHScreen) this.Canvas.lineTo(y, x);
- else this.Canvas.lineTo(x, y);
- }
- ++drawCount;
- if (drawCount >= minuteCount) //上一天的数据和这天地数据线段要断开
- {
- bFirstPoint = true;
- this.Canvas.stroke();
- if (this.IsDrawArea) //画面积
- {
- if (isHScreen)
- {
- this.Canvas.lineTo(left, x);
- this.Canvas.lineTo(left, ptFirst.X);
- this.SetFillStyle(this.AreaColor, this.ChartBorder.GetRightEx(), bottom, this.ChartBorder.GetLeftEx(), bottom);
- }
- else
- {
- this.Canvas.lineTo(x, bottom);
- this.Canvas.lineTo(ptFirst.X, bottom);
- this.SetFillStyle(this.AreaColor, left, this.ChartBorder.GetTopEx(), left, bottom);
- }
- this.Canvas.fill();
- }
- drawCount = 0;
- }
- }
- if (drawCount > 0)
- {
- this.Canvas.stroke();
- if (this.IsDrawArea) //画面积
- {
- if (isHScreen)
- {
- this.Canvas.lineTo(left, x);
- this.Canvas.lineTo(left, ptFirst.X);
- this.SetFillStyle(this.AreaColor, this.ChartBorder.GetRightEx(), bottom, this.ChartBorder.GetLeftEx(), bottom);
- }
- else
- {
- this.Canvas.lineTo(x, bottom);
- this.Canvas.lineTo(ptFirst.X, bottom);
- this.SetFillStyle(this.AreaColor, left, this.ChartBorder.GetTopEx(), left, bottom);
- }
- this.Canvas.fill();
- }
- }
- }
- this.GetMaxMin = function ()
- {
- var xPointCount = this.ChartFrame.XPointCount;
- var range = {};
- if (this.YClose == null) return range;
- range.Min = this.YClose;
- range.Max = this.YClose;
- for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
- {
- var value = this.Data.Data[i];
- if (!value) continue;
- if (range.Max == null) range.Max = value;
- if (range.Min == null) range.Min = value;
- if (range.Max < value) range.Max = value;
- if (range.Min > value) range.Min = value;
- }
- if (range.Max == this.YClose && range.Min == this.YClose)
- {
- range.Max = this.YClose + this.YClose * 0.1;
- range.Min = this.YClose - this.YClose * 0.1;
- return range;
- }
- var distance = Math.max(Math.abs(this.YClose - range.Max), Math.abs(this.YClose - range.Min));
- range.Max = this.YClose + distance;
- range.Min = this.YClose - distance;
- return range;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- //深度图十字光标
- function DepthChartCorssCursor()
- {
- this.Frame;
- this.Canvas; //画布
- this.Data;
- this.Symbol;
- this.HQChart;
- this.HPenType=0; //水平线样式 0=虚线 1=实线
- this.VPenType=0; //垂直线颜色 0=虚线 1=实线
- this.LineDash=g_JSChartResource.DepthCorss.LineDash;
- this.AskColor=g_JSChartResource.DepthCorss.AskColor.Line; //卖
- this.BidColor=g_JSChartResource.DepthCorss.BidColor.Line; //买
- this.LineWidth=g_JSChartResource.DepthCorss.LineWidth;
- this.IsShowTooltip=true;
- this.Tooltip=
- {
- LineHeight:g_JSChartResource.DepthCorss.Tooltip.LineHeight,
- Border:
- {
- Top:g_JSChartResource.DepthCorss.Tooltip.Border.Top,
- Left:g_JSChartResource.DepthCorss.Tooltip.Border.Left,
- Bottom:g_JSChartResource.DepthCorss.Tooltip.Border.Bottom,
- Center: g_JSChartResource.DepthCorss.Tooltip.Border.Center
- },
- Font:g_JSChartResource.DepthCorss.Tooltip.Font,
- TextColor:g_JSChartResource.DepthCorss.Tooltip.TextColor,
- BGColor:g_JSChartResource.DepthCorss.Tooltip.BGColor
- }; // Width: Height:
- this.Font=g_JSChartResource.CorssCursorTextFont; //字体
- this.TextColor=g_JSChartResource.CorssCursorTextColor; //文本颜色
- this.TextBGColor=g_JSChartResource.CorssCursorBGColor; //文本背景色
- this.TextHeight=20; //文本字体高度
- this.LastPoint;
- this.PointX;
- this.PointY;
- this.StringFormatX;
- this.StringFormatY;
- this.IsShowCorss=true; //是否显示十字光标
- this.IsShow=true;
- this.GetVol=function(price, isAsk)
- {
- if (!this.Data) return null;
- var aryData=isAsk? this.Data.Asks:this.Data.Bids;
- if (!aryData || !Array.isArray(aryData) || aryData.length<=0) return null;
- for(var i in aryData)
- {
- var item=aryData[i];
- if (item.Price==price) return item.Vol;
- }
- return null;
- }
- this.Draw=function()
- {
- this.Status=0;
- if (!this.LastPoint) return;
- if (!this.Data) return;
- if (!this.IsShow) return;
- var x=this.LastPoint.X;
- var y=this.LastPoint.Y;
- var isInClient=false;
- var rtClient = new Rect(this.Frame.ChartBorder.GetLeft(), this.Frame.ChartBorder.GetTop(), this.Frame.ChartBorder.GetWidth(), this.Frame.ChartBorder.GetHeight());
- isInClient = rtClient.IsPointIn(x, y);
-
- this.PointY=null;
- this.PointY==null;
- if (!isInClient) return;
- if (this.Frame.IsHScreen===true)
- {
- return;
- }
- var left=this.Frame.ChartBorder.GetLeft();
- var right=this.Frame.ChartBorder.GetRight();
- var top=this.Frame.ChartBorder.GetTopTitle();
- var bottom=this.Frame.ChartBorder.GetBottom();
- var rightWidth=this.Frame.ChartBorder.Right;
- var chartRight=this.Frame.ChartBorder.GetChartWidth();
- var xValue=this.Frame.GetXData(x);
- var xInfo=this.Frame.GetXFromPrice(xValue); //调整价格到有数据的点上
- if (!xInfo) return;
- var yVol=this.GetVol(xInfo.Price, xInfo.IsAsk);
- y=this.Frame.GetYFromData(yVol); //调整Y轴, 让它在线段上
- xInfo.Vol=yVol;
- xInfo.Y=y;
-
- this.PointY=[[left,y],[right,y]];
- this.PointX=[[x,top],[x,bottom]];
- if (this.IsShowCorss)
- {
- if (xInfo.IsAsk) this.Canvas.strokeStyle=this.AskColor;
- else this.Canvas.strokeStyle=this.BidColor;
- this.Canvas.save();
- this.Canvas.lineWidth=this.LineWidth;
- var lineWidth=this.Canvas.lineWidth;
- if (this.HPenType==1 || this.HPenType==0) //0=实线 1=虚线
- {
- if (this.HPenType==0) this.Canvas.setLineDash(this.LineDash); //虚线
- var yFix=ToFixedPoint(y);
- this.Canvas.beginPath();
- this.Canvas.moveTo(left,yFix);
- this.Canvas.lineTo(right,yFix);
- this.Canvas.stroke();
- if (this.HPenType==0) this.Canvas.setLineDash([]);
- }
-
- if (this.VPenType==0) this.Canvas.setLineDash(this.LineDash); //虚线
- var xFix=ToFixedPoint(xInfo.X);
- this.Canvas.beginPath();
- this.Canvas.moveTo(xFix,top);
- this.Canvas.lineTo(xFix,bottom);
- this.Canvas.stroke();
- if (this.VPenType==0) this.Canvas.setLineDash([]);
- this.Canvas.restore();
- }
- if (this.HQChart)
- {
- //JSCHART_EVENT_ID.ON_DRAW_DEPTH_TOOLTIP
- var event=this.HQChart.GetEvent(25);
- if (event)
- {
- event.Callback(event,xInfo,this);
- }
- }
- if (this.IsShowTooltip) this.DrawTooltip(xInfo);
- }
- this.DrawTooltip=function(data)
- {
- var price=data.Price;
- var vol=data.Vol;
- var border=this.Tooltip.Border;
- this.Canvas.font=this.Tooltip.Font;
- var floatPrecision=2;
- if (this.Symbol) floatPrecision=JSCommonCoordinateData.GetfloatPrecision(this.Symbol);//价格小数位数
- var maxText='擎擎: 9999.99亿 ';
- if (floatPrecision>=5) maxText=`擎擎: ${99.99.toFixed(floatPrecision)} `; //小数位数太多了
- this.Tooltip.Width=this.Canvas.measureText(maxText).width+border.Left;
- this.Tooltip.Height=this.Tooltip.LineHeight*4+border.Top+border.Bottom+border.Center;
- var chartRight=this.Frame.ChartBorder.GetRight();
- var chartTop=this.Frame.ChartBorder.GetTop();
-
- var left=data.X+2;
- var top=data.Y-this.Tooltip.Height-2;
- if (left+this.Tooltip.Width>=chartRight) left=data.X-this.Tooltip.Width-2;
- if (top<chartTop) top=data.Y+2;
- this.Canvas.fillStyle=this.Tooltip.BGColor;
- this.Canvas.fillRect(left,top,this.Tooltip.Width,this.Tooltip.Height);
- var x=border.Left+left;
- var y=border.Top+top;
- this.Canvas.textBaseline="top";
- this.Canvas.textAlign="left";
- this.Canvas.fillStyle=this.Tooltip.TextColor;
- this.Canvas.fillText("委托价",x,y);
- y+=this.Tooltip.LineHeight;
- this.Canvas.fillText(data.Price.toFixed(floatPrecision),x,y);
- y+=this.Tooltip.LineHeight;
- y+=border.Center;
- this.Canvas.fillText("累计",x,y);
- y+=this.Tooltip.LineHeight;
- this.Canvas.fillText(data.Vol.toFixed(4),x,y);
- }
- }
- //深度图
- function ChartOrderbookDepth()
- {
- this.newMethod=IChartPainting; //派生
- this.newMethod();
- delete this.newMethod;
- this.ClassName="ChartOrderbookDepth";
- this.Data=null;
- this.AskColor={ Line:g_JSChartResource.DepthChart.AskColor.Line, Area:g_JSChartResource.DepthChart.AskColor.Area } //卖
- this.BidColor={ Line:g_JSChartResource.DepthChart.BidColor.Line, Area:g_JSChartResource.DepthChart.BidColor.Area } //买
- this.LineWidth=g_JSChartResource.DepthChart.LineWidth;
- this.Draw=function()
- {
- if (!this.Data) return;
- this.Canvas.save();
- this.Canvas.lineWidth=this.LineWidth;
- this.DrawArea(this.Data.Bids, this.BidColor.Line, this.BidColor.Area, true);
- this.DrawArea(this.Data.Asks, this.AskColor.Line, this.AskColor.Area, false);
- this.Canvas.restore();
- }
- this.DrawArea=function(aryData, colorLine, colorArea, isLeft)
- {
- var xRange=this.ChartFrame.VerticalRange;
- var aryPoint=[];
- for(var i in aryData)
- {
- var item=aryData[i];
- if (isLeft)
- {
- if (item.Price<xRange.Min) break;
- }
- else
- {
- if (item.Price>xRange.Max) break;
- }
- var x=this.ChartFrame.GetXFromIndex(item.Price);
- var y=this.ChartFrame.GetYFromData(item.Vol);
- aryPoint.push({X:x,Y:y});
- }
- if (aryPoint.length<=1) return;
- var left=this.ChartBorder.GetLeft();
- var bottom=this.ChartBorder.GetBottom();
- var right=this.ChartBorder.GetRight();
- this.Canvas.beginPath();
- this.Canvas.moveTo(aryPoint[0].X, bottom);
- for(var i in aryPoint)
- {
- var item=aryPoint[i];
- this.Canvas.lineTo(item.X,item.Y);
- }
- this.Canvas.lineTo(isLeft?left:right,aryPoint[aryPoint.length-1].Y);
- this.Canvas.lineTo(isLeft?left:right,bottom);
- this.Canvas.lineTo(aryPoint[0].X,bottom);
- this.Canvas.closePath();
- this.Canvas.setFillStyle(colorArea);
- this.Canvas.fill();
- this.Canvas.beginPath();
- this.Canvas.moveTo(aryPoint[0].X, bottom);
- for(var i in aryPoint)
- {
- var item=aryPoint[i];
- this.Canvas.lineTo(item.X,item.Y);
- }
- this.Canvas.lineTo(isLeft?left:right,aryPoint[aryPoint.length-1].Y);
- this.Canvas.strokeStyle=colorLine;
- this.Canvas.stroke();
- }
- this.GetMaxMin=function()
- {
- var range={ Min:null, Max:null, XMin:null, XMax:null };
- var xRange=this.ChartFrame.VerticalRange;
- for(var i in this.Data.Asks)
- {
- var item=this.Data.Asks[i];
- if (item.Price>xRange.Max) break;
-
- if (range.XMin==null || range.XMin>item.Price) range.XMin=item.Price;
- if (range.XMax==null || range.XMax<item.Price) range.XMax=item.Price;
- if (range.Min==null || range.Min>item.Vol) range.Min=item.Vol;
- if (range.Max==null || range.Max<item.Vol) range.Max=item.Vol;
- }
- for(var i in this.Data.Bids)
- {
- var item=this.Data.Bids[i];
- if (item.Price<xRange.Min) break;
- if (range.XMin==null || range.XMin>item.Price) range.XMin=item.Price;
- if (range.XMax==null || range.XMax<item.Price) range.XMax=item.Price;
- if (range.Min==null || range.Min>item.Vol) range.Min=item.Vol;
- if (range.Max==null || range.Max<item.Vol) range.Max=item.Vol;
- }
- return range;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////////////
- // 公共函数
- //修正线段有毛刺
- function ToFixedPoint(value)
- {
- //return value;
- return parseInt(value) + 0.5;
- }
- function ToFixedRect(value)
- {
- var rounded;
- return rounded = (0.5 + value) << 0;
- }
- //导出统一使用JSCommon命名空间名
- module.exports =
- {
- JSCommonChartPaint:
- {
- IChartPaintin: IChartPainting,
- ChartKLine: ChartKLine,
- ChartLine: ChartLine,
- ChartSubLine: ChartSubLine,
- ChartSingleText: ChartSingleText,
- ChartPointDot: ChartPointDot,
- ChartStick: ChartStick,
- ChartLineStick: ChartLineStick,
- ChartStickLine: ChartStickLine,
- ChartOverlayKLine: ChartOverlayKLine,
- ChartMinuteInfo: ChartMinuteInfo,
- ChartRectangle: ChartRectangle,
- ChartMultiText: ChartMultiText,
- ChartMultiHtmlDom:ChartMultiHtmlDom,
- ChartMultiLine: ChartMultiLine,
- ChartBackground:ChartBackground,
- ChartBuySell: ChartBuySell,
- ChartMultiBar: ChartMultiBar,
- ChartMACD:ChartMACD,
- ChartMinutePriceLine:ChartMinutePriceLine,
- ChartLock:ChartLock,
- ChartVolStick:ChartVolStick,
- ChartBand:ChartBand,
- ChartMinuteVolumBar:ChartMinuteVolumBar,
- ChartText:ChartText,
- ChartStraightArea:ChartStraightArea,
- ChartSplashPaint:ChartSplashPaint,
- ChartPie: ChartPie,
- ChartCircle: ChartCircle,
- ChartChinaMap: ChartChinaMap,
- ChartRadar: ChartRadar,
-
- ChartCorssCursor: ChartCorssCursor, //十字光标
- DepthChartCorssCursor:DepthChartCorssCursor,
- ChartOrderbookDepth:ChartOrderbookDepth,
- },
- //单个类导出
- JSCommonChartPaint_IChartPainting: IChartPainting,
- JSCommonChartPaint_ChartKLine: ChartKLine,
- JSCommonChartPaint_ChartLine: ChartLine,
- JSCommonChartPaint_ChartSubLine: ChartSubLine,
- JSCommonChartPaint_ChartSingleText: ChartSingleText,
- JSCommonChartPaint_ChartPointDot: ChartPointDot,
- JSCommonChartPaint_ChartStick: ChartStick,
- JSCommonChartPaint_ChartLineStick: ChartLineStick,
- JSCommonChartPaint_ChartStickLine: ChartStickLine,
- JSCommonChartPaint_ChartBackground:ChartBackground,
- JSCommonChartPaint_ChartMinuteVolumBar:ChartMinuteVolumBar,
- JSCommonChartPaint_ChartOverlayKLine: ChartOverlayKLine,
- JSCommonChartPaint_ChartLock:ChartLock,
- JSCommonChartPaint_ChartVolStick:ChartVolStick,
- JSCommonChartPaint_ChartBand:ChartBand,
- JSCommonChartPaint_ChartMinutePriceLine:ChartMinutePriceLine,
- JSCommonChartPaint_ChartPie: ChartPie,
- JSCommonChartPaint_ChartCircle: ChartCircle,
- JSCommonChartPaint_ChartChinaMap: ChartChinaMap,
- JSCommonChartPaint_ChartRadar: ChartRadar,
- JSCommonChartPaint_ChartMinuteInfo: ChartMinuteInfo,
- JSCommonChartPaint_ChartRectangle: ChartRectangle,
- JSCommonChartPaint_ChartMultiText: ChartMultiText,
- JSCommonChartPaint_ChartMultiLine: ChartMultiLine,
- JSCommonChartPaint_ChartMultiHtmlDom: ChartMultiHtmlDom,
- JSCommonChartPaint_ChartMultiBar: ChartMultiBar,
- JSCommonChartPaint_ChartBuySell: ChartBuySell,
- JSCommonChartPaint_ChartMACD: ChartMACD,
- JSCommonChartPaint_ChartText:ChartText,
- JSCommonChartPaint_ChartStraightArea:ChartStraightArea,
- JSCommonChartPaint_ChartCorssCursor: ChartCorssCursor,
- JSCommonChartPaint_DepthChartCorssCursor:DepthChartCorssCursor,
- JSCommonChartPaint_ChartOrderbookDepth:ChartOrderbookDepth,
- JSCommonChartPaint_ChartSplashPaint:ChartSplashPaint,
- };
|