{ From user Lonnie, Model Read_historical_stoc at Thu, Oct 18, 2007 9:46 AM~~ } Softwareversion 4.0.0 { System Variables with non-default values: } Typechecking := 1 Checking := 1 Saveoptions := 2 Savevalues := 0 Allwarnings := 0 Attribute Reference Attribute Date_bough Askattribute Recursive,Function,Yes Model Read_historical_stoc Title: Read Historical Stock Data Description: Reads historic stock data from Yahoo finance.~ Demonstrates the use of RunConsoleProcess.~ Also, to show non-blocking use of RunConsoleProcess, it graphs data u~~ sing gnuplot.~ ~ Used for Analytica User Group Webinar, 18 Oct 2007 Author: Lonnie Chrisman~ Lumina Decision Systems Date: Wed, Aug 08, 2007 12:05 PM Saveauthor: Lonnie Savedate: Thu, Oct 18, 2007 9:46 AM Defaultsize: 48,24 Diagstate: 1,31,23,665,673,17 Fontstyle: Arial, 15 Fileinfo: 0,Model Read_historical_stoc,2,2,0,0,C:\Documents and Settin~~ gs\Lonnie\My Documents\Analytica\Read Historical Stock Data.ANA Module Internals Title: Internals Author: Lonnie Date: Wed, Oct 17, 2007 5:28 PM Defaultsize: 48,24 Nodelocation: 72,392,1 Nodesize: 48,24 Diagstate: 1,381,23,550,682,17 Decision Start_date Title: Start date Definition: 1 jan 2007 Nodelocation: 96,48,1 Nodesize: 48,24 Aliases: Formnode Start_date1 Numberformat: 2,DD,2,2,0,0,4,0,$,0,"ABBREV",0 Decision End_date Title: End date Definition: Today() Nodelocation: 208,48,1 Nodesize: 48,24 Aliases: Formnode End_date1 Numberformat: 2,DD,2,2,0,0,4,0,$,0,"ABBREV",0 Decision Stock_sym Title: stock sym Definition: Choice(Self,5) Nodelocation: 320,48,1 Nodesize: 48,24 Windstate: 2,102,90,476,344 Aliases: Formnode Stock_sym1 Script: On_Symbol_Select( ) Domain: ['Type Symbol','MSFT','SUNW','ORCL','INTC','AAPL'] {!40000|Att_previndexvalue: ['Type Symbol','AAPL','MSFT','SUNW','ORCL'~~ ,'INTC']} Function Historical_stock_url(symb : text ; startDate,endDate:numeric)~~ Title: Historical Stock URL Description: Returns the url for a historical stock price CSV table. Definition: "http://ichart.finance.yahoo.com/table.csv?s=" & symb & ~ "&a=" & (DatePart(startDate,"d")-1) &~ "&b=" & DatePart(startDate,"M") &~ "&c=" & DatePart(startDate,"y") &~ "&d=" & (DatePart(endDate,"d")-1) &~ "&e=" & DatePart(endDate,"M") &~ "&f=" & DatePart(endDate,"y") &~ "&g=d&ignore=.csv" Nodelocation: 96,208,1 Nodesize: 48,24 Windstate: 2,218,60,435,297 Paramnames: symb,startDate,endDate Variable Url Title: URL Definition: var sym := if stock_sym="Type Symbol" then Enter_ticker_sy~~ mbol_ else stock_sym;~ Historical_stock_url(sym,Start_date,End_date) Nodelocation: 232,208,1 Nodesize: 48,24 Valuestate: 2,5,194,878,303,0,MIDM Function Readfromurl(url:text) Title: ReadFromURL (url) Description: Reads text data from a given url. Returns the data read.~~ Definition: RunConsoleProcess("C:\Src\ReadURL\Debug\ReadUrl.exe","Read~~ Url " & url) Nodelocation: 96,272,1 Nodesize: 48,24 Windstate: 2,433,28,476,208 Paramnames: url Library Flat_file_library Title: Flat File Library Description: Routines for writing data to and from flat files, particu~~ larly for 2-D tables to and from comma-separated files. Author: Lonnie Chrisman Date: Thu, Mar 17, 2005 12:59 PM Saveauthor: Lonnie Savedate: Wed, Aug 08, 2007 2:12 PM Defaultsize: 48,24 Nodelocation: 96,336,1 Nodesize: 48,24 Nodeinfo: 1,1,1,1,1,1,0,0,0,0 Diagstate: 1,406,557,550,300,17 Function Readcsvfile(filename:atomic textual ; linesep,colsep : option~~ al textual) Title: ReadCsvFile Description: Reads in a CSV file.~ The first line of the CSV should be the field names.~ Lines are separated by linesep (Chr(10) by default) and columns by co~~ lsep (comma by default).~ ~ The result will be an array of STRINGS. You must convert them to num~~ bers separately. They will be indexed by two local indexes: Field a~~ nd Row. Definition: Parsecsvtext0(ReadTextFile(filename)) Nodelocation: 88,48,1 Nodesize: 52,24 Windstate: 2,188,146,517,447 Paramnames: filename,linesep,colsep Function Parsenum(x:atom) Title: ParseNum Description: Parses text to a numeric value, for example:~ ParseNum("3.14") --> 3.14~ ~ Leaves Null alone Definition: if IsUndef(x) then x else~ Coerce_to_numeric(x) Nodelocation: 88,120,1 Nodesize: 48,24 Windstate: 2,313,237,476,224 Paramnames: x Numberformat: 1,D,4,2,0,0 Function Parsedate(x:atom) Title: ParseDate Description: Converts a textual date to an integer representing the # ~~ of days since the date origin, either 1 Jan 1904 or 1 Jan 1900 (the l~~ atter when the "Use Excel Date Origin" preference is checked).~ ~ Leaves Null unchanged Definition: if IsUndef(x) then x else~ Coerce_to_numeric(x) Nodelocation: 200,120,1 Nodesize: 48,24 Paramnames: x Numberformat: 1,DD,2,2,0,0 Function Writecsvfile( Filename : atomic textual ;~ A : ArrayType[Field,Row] ; Field,Row : IndexType ; ~ sep,lineSep : optional atomic textual ;~ warn : optional atomic boolean ) Title: WriteCsvFile Description: Write a two-dimensional array to a CsvFile.~ The Field dimension is written on a single line separated by commas.~ The Row dimension has each element on a separate line.~ The first line of the file contains the names of the I index elements~~ .~ ~ Warning: You should make sure that your array A does not contain the ~~ sep or lineSep strings, or if it does, you should use alternative (pe~~ rhaps multi-character) separators to avoid ambiguity.~ ~ Numbers are written in an exponential full-precision format. To use ~~ an alternative format, caller can coerce to strings before calling, f~~ or example use ""&A as the A parameter and set the caller's number fo~~ rmat to the desired output format. If you do that, be careful not to~~ include thousand separators if sep is a comma. Definition: if IsNotSpecified(sep) then sep := ",";~ If IsNotSpecified(lineSep) then lineSep := chr(10); { LF }~ If IsNotSpecified(warn) then warn:=false;~ ~ { First, write the column headers }~ WriteTextFile( filename,~ JoinText( '"' & Field & '"', Field )&lineSep,~ warn:warn );~ ~ { Next, write the 2-D data: }~ ~ WriteTextFile( filename, ~ JoinText( A, Field, sep ), ~ append:true, ~ warn:warn,~ sep : lineSep ) Nodelocation: 208,48,1 Nodesize: 52,24 Windstate: 2,135,19,554,676 Paramnames: Filename,A,Field,Row,sep,lineSep,warn Numberformat: 1,F,15,14,0,0 Module Flat_file_internals Title: Flat File Internals Author: Lonnie Date: Wed, Aug 08, 2007 1:00 PM Defaultsize: 48,24 Nodelocation: 88,184,1 Nodesize: 48,24 Function Coerce_to_numeric(x : coerce numeric) Title: Coerce to Numeric Description: When x is text, parses it to a numeric value based on the~~ calling object's number format. If the caller uses a date format, t~~ hen a date can be parsed, etc. If x is already numeric, x is returne~~ d. Definition: x Nodelocation: 96,48,1 Nodesize: 48,24 Windstate: 2,454,371,476,224 Paramnames: x Function Parsecsvtext0(s:atomic textual ; linesep,colsep : optional at~~ omic textual) Title: ParseCsvText0 Description: This is a helper function for ParseCsvText, which works o~~ n a single file, without array abstracting, and returns a reference. Definition: if IsNotSpecified(linesep) then linesep := Chr(10);~ if IsNotSpecified(colsep) then colsep := ",";~ var file := split(s,linesep);~ var n:=size(file);~ while (n>1 and slice(file,n)="") do n:=n-1;~ index Row := 1..n-1;~ index Field := Split(Slice(file,1),colsep);~ \ (for line[] := Slice(file,Row+1) do Array(Field,Split(line,colsep))~~ ) Nodelocation: 232,48,1 Nodesize: 60,24 Windstate: 2,352,27,598,433 Paramnames: s,linesep,colsep Close Flat_file_internals Function Parsecsvtext(s: textual ; linesep,colsep : optional textual) Title: ParseCsvText Description: Parses the textual contents of a CSV file. You provide t~~ he actual CSV contents -- already obtained from a flie or other data ~~ source.~ ~ The first line of the CSV should be the field names.~ Lines are separated by linesep (Chr(10) by default) and columns by co~~ lsep (comma by default).~ ~ The result will be an array of STRINGS. You must convert them to num~~ bers separately. They will be indexed by two local indexes: Field a~~ nd Row.~ ~ When this function is array-abstracted over many strings, or separato~~ rs, etc., each parse may contain a different number of fields or rows~~ . In that case, they are all placed on a common field/row index, the~~ union of fields and the longest number of rows. All cells not prese~~ nt in any one parse is filled with null. Definition: var parses := ParseCsvText0(s,linesep,colsep);~ { Compute the union of all field columns }~ var allfields := [];~ for r[] := parses do ( allfields := concat( allfields,(#r).field ) );~~ ~ var F := allfields;~ index field := F[F=Unique(F,F)];~ var n:=0;~ for r[] := parses do (n:=max([n, size( (#r).row ) ]));~ index row := 1..n;~ for r[] := parses do (~ var t := #r;~ IgnoreWarnings(t[@t.row=@row,t.field=field])~ ) Nodelocation: 320,120,1 Nodesize: 60,24 Windstate: 2,49,295,476,556 Paramnames: s,linesep,colsep Close Flat_file_library Function Union(L1,L2 : List) Title: Union Definition: MsgBox(L2);~ index L := concat(L1,L2);~ Unique(L,L) Nodelocation: 96,392,1 Nodesize: 48,24 Paramnames: L1,L2 Function Uniqueall(A) Title: Uniqueall Description: Returns the set of all unique elements in A, across all ~~ slices. Definition: var count := 0;~ for b[]:=A do count:=count+1;~ index J:=1..count;~ var R := array(J,null);~ count := 0;~ for b[] := A do (~ count := count+1;~ R[J=count] := b;~ );~ R[J=Unique(R,J)] Nodelocation: 96,456,1 Nodesize: 48,24 Windstate: 2,515,357,476,356 Paramnames: A Variable Textual_price_data1 Title: Textual Price Data Definition: Parsecsvtext( Raw_text ) Nodelocation: 464,208,1 Nodesize: 48,24 Valuestate: 2,38,1,916,853,0,MIDM Reformval: [Stock_sym,Sys_localindex('ROW')] {!40000|Att_previndexvalue: ['Date','Open','High','Low','Close','Volum~~ e','Adj Close','Date','Open','High','Low','Close','Volume','Adj Close~~ ','Date','Open','High','Low','Close','Volume','Adj Close','Date','Ope~~ n','High','Low','Close','Volume','Adj Close','Date','Open','High','L~~ ow','Close','Volume','Adj Close']} {!40000|Att_resultslicestate: [Stock_sym,5,Sys_localindex('ROW'),1,Sys~~ _localindex('FIELD'),1]} {!40000|Att_coordinateindex: Sys_localindex('FIELD')} Variable Trading_date Title: Trading Date Definition: index dates := UniqueAll(parsed_dates);~ sortIndex(subset(dates<>null)) Nodelocation: 232,336,1 Nodesize: 48,24 Valuestate: 2,474,37,416,807,0,MIDM Reformval: [Sys_localindex('ROW'),Stock_sym] Numberformat: 2,DD,2,2,0,0,4,0,$,0,"ABBREV",0 {!40000|Att_previndexvalue: [37.909K,37.908K,37.905K,37.904K,37.903K,37.902K~~ ,37.901K,37.898K,37.897K,37.896K,37.895K,37.894K,37.891K,37.89K,37.889K~~ ,37.888K,37.887K,37.884K,37.883K,37.882K,37.881K,37.88K,37.877K,37.876K~~ ,37.875K,37.874K,37.873K,37.87K,37.869K,37.868K,37.867K,37.863K,37.862K~~ ,37.861K,37.86K,37.859K,37.856K,37.855K,37.854K,37.853K,37.852K,37.849K~~ ,37.848K,37.847K,37.846K,37.845K,37.842K,37.841K,37.84K,37.839K,37.838K~~ ,37.835K,37.834K,37.833K,37.832K,37.831K,37.828K,37.827K,37.826K,37.825K~~ ,37.824K,37.821K,37.82K,37.819K,37.818K,37.817K,37.814K,37.813K,37.812K~~ ,37.811K,37.81K,37.807K,37.806K,37.804K,37.803K,37.8K,37.799K,37.798K~~ ,37.797K,37.796K,37.793K,37.792K,37.791K,37.79K,37.789K,37.786K,37.785K~~ ,37.784K,37.783K,37.782K,37.779K,37.778K,37.777K,37.776K,37.775K,37.772K~~ ,37.771K,37.77K,37.769K,37.765K,37.764K,37.763K,37.762K,37.761K,37.758K~~ ,37.757K,37.756K,37.755K,37.754K,37.751K,37.75K,37.749K,37.748K,37.747K~~ ,37.744K,37.743K,37.742K,37.741K,37.74K,37.737K,37.736K,37.735K,37.734K~~ ,37.733K,37.73K,37.729K,37.728K,37.727K,37.726K,37.723K,37.722K,37.721K~~ ,37.72K,37.719K,37.715K,37.714K,37.713K,37.712K,37.709K,37.708K,37.707K~~ ,37.706K,37.705K,37.702K,37.701K,37.7K,37.699K,37.698K,37.695K,37.694K~~ ,37.693K,37.692K,37.691K,37.688K,37.687K,37.686K,37.685K,37.684K,37.681K~~ ,37.68K,37.679K,37.678K,37.677K,37.674K,37.673K,37.672K,37.671K,37.667K~~ ,37.666K,37.665K,37.664K,37.663K,37.66K,37.659K,37.658K,37.657K,37.656K~~ ,37.653K,37.652K,37.651K,37.65K,37.649K,37.646K,37.645K,37.644K,37.643K~~ ,37.642K,37.639K,37.638K,37.637K,37.636K,37.632K,37.631K,37.63K,37.629K~~ ,37.628K,37.625K,37.624K,37.623K,Null]} Variable Row_number Title: Row number Definition: subindex(Parsed_dates,Trading_date,Parsed_dates.row) Nodelocation: 464,272,1 Nodesize: 48,24 Reformval: [Trading_date,Stock_sym] Variable Parsed_dates Title: Parsed dates Definition: if IsUndef(Textual_price_data1[.Field='Date'] ) then null ~~ else~ ParseDate( if IsUndef(Textual_price_data1[.Field='Date'] ) then 0 els~~ e Textual_price_data1[.Field='Date'] ) Nodelocation: 352,272,1 Nodesize: 48,24 Reformval: [Sys_localindex('ROW'),Stock_sym] Numberformat: 2,DD,2,2,0,0,4,0,$,0,"ABBREV",0 Variable Open1 Title: Open Definition: Numeric_field("Open") Nodelocation: 352,336,1 Nodesize: 48,24 Reformval: [Stock_sym,Trading_date] Variable High Title: High Definition: Numeric_field("High") Nodelocation: 464,336,1 Nodesize: 48,24 Reformval: [Stock_sym,Trading_date] Variable Low Title: Low Definition: Numeric_field("Low") Nodelocation: 464,400,1 Nodesize: 48,24 Reformval: [Stock_sym,Trading_date] Variable Close1 Title: Close Definition: Numeric_field("Close") Nodelocation: 352,400,1 Nodesize: 48,24 Reformval: [Stock_sym,Trading_date] Variable Adj_close Title: Adj Close Definition: Numeric_field("Adj Close") Nodelocation: 352,464,1 Nodesize: 48,24 Reformval: [Stock_sym,Trading_date] Variable Volume Title: Volume Definition: Numeric_field("Volume") Nodelocation: 576,336,1 Nodesize: 48,24 Reformval: [Stock_sym,Trading_date] Numberformat: 2,I,4,2,0,0,4,0,$,0,"ABBREV",0 Function Numeric_field(fieldName : text) Title: Numeric Field Definition: IgnoreWarnings(ParseNum(Textual_price_data1[.Field=fieldNa~~ me,.Row=Row_number])) Nodelocation: 96,520,1 Nodesize: 48,24 Windstate: 2,454,588,476,224 Paramnames: fieldName Objective Stock_data Title: Stock Data Definition: [Open1,High,Low,Close1,Adj_close,Volume] Indexvals: ['Open','High','Low','Close','Adj Close','Volume'] Nodelocation: 464,464,1 Nodesize: 48,24 Valuestate: 2,245,127,669,620,0,MIDM Aliases: Alias Stock_data1, Formnode Report1 Reformval: [Self,Trading_date] Numberformat: 2,F,2,2,0,1,2,1,$,0,"ABBREV",0 {!40000|Att_previndexvalue: [Open1,High,Low,Close1,Adj_close,Volume]} {!40000|Att_resultslicestate: [Stock_sym,1,Trading_date,1,Self,1]} Decision Enter_ticker_symbol_ Title: Enter ticker symbol: Definition: 'AAPL' Nodelocation: 440,48,1 Nodesize: 48,24 Aliases: Formnode Enter_ticker_symbol1 Module Hidden_nodes Title: Hidden nodes Author: Lonnie Date: Wed, Oct 17, 2007 5:28 PM Nodelocation: 584,48,1 Nodesize: 48,24 Formnode Enter_ticker_symbol1 Title: Enter ticker symbol: Definition: 0 Nodelocation: 444,69,1 Nodesize: 128,13 Nodeinfo: 1,0,0,1,0,0,0,72,0,1 Original: Enter_ticker_symbol_ Button Add_symbol Title: Add Symbol Nodelocation: 520,100,1 Nodesize: 48,12 Windstate: 2,247,400,476,224 Script: ( domain of stock_sym := concat(domain of stock_sym, [Enter_ti~~ cker_symbol_])) Close Hidden_nodes Function On_symbol_select( ) Title: On Symbol Select Description: Called when a new stock symbol is selected Definition: var bShow := sum(stock_sym="Type Symbol");~ var par := if bShow then Handle(Read_Historical_Stock_Data) ~ else Handle(Hidden_nodes);~ var unpar := if size(stock_sym)=1 and not bShow~ then Handle(Read_Historical_Stock_Data) else Han~~ dle(Hidden_nodes);~ MoveObj( Handle(Enter_ticker_symbol1), par);~ MoveObj( Handle(Add_symbol), par );~ MoveObj( Handle(Remove_symbol), unpar ) Nodelocation: 96,592,1 Nodesize: 48,24 Windstate: 2,395,371,476,224 Paramnames: Function Moveobj( obj,newParent : handle atom ) Description: Moves obj to a new parent. Definition: evaluatescript( "Move " & (identifier of obj) & " " & (ide~~ ntifier of newParent)) Nodelocation: 96,648,1 Nodesize: 48,24 Nodeinfo: 1,1,1,1,1,1,0,0,0,0 Windstate: 2,407,609,476,224 Paramnames: obj,newParent Variable Raw_text Title: raw text Definition: ReadFromUrl(Url) Nodelocation: 352,208,1 Nodesize: 48,24 Module Data_flattening Title: Data flattening Author: Lonnie Date: Wed, Oct 17, 2007 6:13 PM Defaultsize: 48,24 Nodelocation: 240,552,1 Nodesize: 48,24 Diagstate: 1,33,278,556,396,17 Alias Stock_data1 Title: Stock Data Definition: 1 Nodelocation: 96,48,1 Nodesize: 48,24 Original: Stock_data Constant Location_of_datafile Title: Location of datafile Definition: "w:\Testmodels\stock.dat" Nodelocation: 96,112,1 Nodesize: 48,24 Constant Gnuplot Title: GnuPlot Definition: "C:\Program Files\gnuplot\bin\wgnuplot.exe" Nodelocation: 96,168,1 Nodesize: 48,24 Constant Candlestick_command_ Title: Candlestick command file Definition: "W:\Testmodels\gnuplot-candlesticks.dat" Nodelocation: 96,232,1 Nodesize: 48,31 Function Data_to_text(sym : optional = stock_sym) Title: Data to text Definition: Date_to_text(trading_date) & " """ & sym & """ " & Join(~~ stock_data[stock_sym=sym],stock_data," ") Nodelocation: 240,48,1 Nodesize: 48,24 Paramnames: sym Numberformat: 2,F,4,2,0,0,4,0,$,0,"ABBREV",0 Function Date_to_text(x) Title: Date to text Definition: "" & x Nodelocation: 96,304,1 Nodesize: 48,24 Paramnames: x Numberformat: 2,DD,0,2,0,0,4,0,$,0,"SHORT",0 Variable Test Title: test Definition: Data_to_text() Nodelocation: 240,120,1 Nodesize: 48,24 Valuestate: 2,280,290,522,303,0,MIDM Button Candlestick_plot Title: Candlestick Plot Nodelocation: 360,48,1 Nodesize: 48,24 Aliases: Alias Plot_it1 Script: writetextfile( Location_of_datafile, Data_to_text( ), warn:fal~~ se )~ RunConsoleProcess(Gnuplot, "gnuplot """ & Candlestick_command_ & """ ~~ -", block : False ) Text Te2 Description: Fun with 3-D plots Nodelocation: 240,408,-1 Nodesize: 88,12 Function Plot_3d_surface( x,y,z : array[u,v] ; u,v : Index) Title: Plot 3D surface Definition: WriteTextFile( Location_of_3d_dataf, join(x & " " & y & " ~~ " & z,u,chr(13)&chr(10) ), warn:false);~ WriteTextFile( Location_of_3d_dataf, join(x & " " & y & " " & z,v,chr~~ (10)&chr(13) ), append:true,warn:false);~ RunConsoleProcess( Gnuplot, "gnuplot """ & A3d_surface_command_ & """~~ -", block:false ) Nodelocation: 96,448,1 Nodesize: 48,24 Windstate: 2,59,38,476,224 Paramnames: x,y,z,u,v Numberformat: 2,E,15,2,0,0,15,0,$,0,"ABBREV",0 Constant Location_of_3d_dataf Title: Location of 3d datafile Definition: "W:\testmodels\gnuplot-3d-data.dat" Nodelocation: 96,504,1 Nodesize: 48,24 Constant A3d_surface_command_ Title: 3d surface command file Definition: "W:\testmodels\gnuplot-3dsurface.dat" Nodelocation: 96,561,1 Nodesize: 48,31 Variable Donut Definition: index u:=sequence(-180,180,10);~ index v:=sequence(-180,180,10);~ var x := cos(u) + 0.5*cos(u)*cos(v);~ var y := sin(u) + 0.5*sin(u)*cos(v);~ var z := 0.5 * sin(v);~ Plot_3d_surface(x,y,z,u,v);~ undefined Nodelocation: 248,456,1 Nodesize: 48,24 Variable Shell Definition: index u := sequence(0,360,20);~ index v := sequence(0,360,20);~ Plot_3d_surface( ~ cos(u) * u * (1+cos(v)/2), ~ sin(v) * u / 2,~ sin(u) * u * (1+cos(v)/2), ~ u,v );~ undefined Nodelocation: 248,528,1 Nodesize: 48,24 Close Data_flattening Close Internals Formnode Start_date1 Title: Start date Definition: 0 Nodelocation: 172,103,1 Nodesize: 108,15 Nodeinfo: 1,0,0,1,0,0,0,86,0,1 Original: Start_date Formnode End_date1 Title: End date Definition: 0 Nodelocation: 172,136,1 Nodesize: 108,15 Nodeinfo: 0,0,0,0,0,0,0,86 Original: End_date Formnode Stock_sym1 Title: stock sym Definition: 0 Nodelocation: 176,69,1 Nodesize: 136,13 Nodeinfo: 1,0,0,1,0,0,0,150,0,1 Original: Stock_sym Text Te1 Nodelocation: 298,194,-1 Nodesize: 278,166 Nodeinfo: 1,0,0,1,1,1,0,,0, Formnode Report1 Title: Report Definition: 1 Nodelocation: 128,173,1 Nodesize: 100,13 Nodeinfo: 1,0,0,1,0,0,0,72,0,1 Original: Stock_data Button Remove_symbol Title: Remove Symbol Nodelocation: 392,68,1 Nodesize: 72,12 Windstate: 2,141,359,476,224 Script: ( index s := domain of stock_sym; domain of stock_sym := subse~~ t( s<>stock_sym ) ) Alias Plot_it1 Title: Plot it Definition: 1 Nodelocation: 96,208,1 Nodesize: 68,12 Original: Candlestick_plot Close Read_historical_stoc