I haven't had a chance to look at your code but here is a good place to start 
to answer your question (1):

<http://www.jsoftware.com/jwiki/Guides/Multiple Verb Arguments>


---PackRat wrote:
> Subject: Re: [Jprogramming] Point & Figure charting in J?
> 
> On 23 Dec 2008, I wrote:
> > Recently, there was discussion of OHLC and Candlestick charting of
> > stock market data.  Rather than reinvent the wheel, I thought I'd ask
> > first: has anyone created J code that will convert stock market data
> > into a point & figure chart and that they'd be willing to share?
> 
> There being no responses with such code, I went ahead and wrote an
> explicit verb that creates an array containing P&F chart data (see
> bottom of this post).  Admittedly, it's not very J-ish at all, but it
> does seem to work.  Anyway, before I can have a finalized version (I
> probably should prepend an initial column containing the price values
> for each box), I need the answers to some questions:
> 
> (1) How do I pass *six* arguments to the verb?  (nBox, nRevBoxes,
> nMaxColumns, nMaxRows, nShowDate, datafilename--the latter would be
> passed to the readcsv line below) (depending on whether nChartLow and
> nChartHigh are derived from the data or from user input, these might
> possibly be additional arguments, for a total of *eight* arguments)
> How would any of these multiple arguments be made "optional" (i.e.,
> they could be present or not)?
> 
> (2) How can the resulting array be "plotted" (or converted into some
> sort of resizable diagram/chart/whatever) in a way that shows all the
> (perhaps tiny) X's, O's, and date digits?  It would be nice, too, to
> impose a gridwork surrounding the array elements.
> 
> Harvey
> 
> 
> NB. #################################################################
> 
> NB. pf.ijs - standard "Point & Figure" charting algorithm with optional
> dating added
> NB. by Harvey E. Hahn -- 23-25,29-31 Jan; 1,4,6-7 Feb 2009
> 
> NB. Initial datatype prefixes used to keep names straight:
> NB.    "b" for boxed
> NB.    "s" for string (literal)
> NB.    "n" for numeric
> 
> require 'files'
> 
> pfchart=: 3 : 0
> 
> NB. constants (should be input by user instead?):
> nBox=. 150    NB. size of charting box (related to nMaxRows below))
> nRevBoxes=. 3    NB. number of boxes needed for reversal
> nMaxColumns=. 125
> nMaxRows=. 50    NB. this can affect value of "nBox" if calculated by
> formula
> nShowDate=. 1    NB. flag to display dates or not
> 
> NB. initialize variables:
> nBoxHigh=. 0
> nBoxLow=. 0
> nHigh=. 0
> nLow=. 0
> nClose=. 0
> nNewHigh=. 0
> nNewLow=. 0
> nCurrCol=. 0
> nFirst=. 1    NB. flag is turned "off" (false) after first entry
> nXCol=. 1
> nOCol=. 0
> nColType=. nXCol
> sLastMonthPlotted=. ''
> sLastYearPlotted=. ''
> sYr=. ''
> sMn=. ''
> nMon=. 0
> sMonth=. ''
> nRowOffset=. 0
> 
> if. (1 = nShowDate) do.
>   nMaxRows=. nMaxRows + 4  NB. 4 extra rows needed for 4 vertical
> digits of year
>   nRowOffset=. 4
> end.
> 
> sChart=. (nMaxRows,nMaxColumns) $ ' '    NB. chart array
> 
> NB. read in (Yahoo) market data file and cull out date/high/low/close
> values:
> bMktData=. readcsv (jpath '~user\data\DJI-r-pf.csv')
> bDate=.  0 {"1 bMktData   NB. column 0 is date (format: yyyy-mm-dd)
> bHigh=.  2 {"1 bMktData   NB. column 2 is high
> bLow=.   3 {"1 bMktData   NB. column 3 is low
> bClose=. 4 {"1 bMktData   NB. column 4 is close
> 
> NB. two ways chart range might be done --
> NB.   (1) look for max and min of prices (nBox = (max-min)/boxsize),
> NB. or
> NB.   (2) take first price and calculate range of 50% higher
> NB.       and 50% lower
> 
> NB. for testing purposes (DJIA 2007-2008):
> nChartLow=. 7000
> nChartHigh=. 14500    NB. midpoint = 10750, nBox = 150
> 
> for_i. i.((#bMktData)-1) do.
> 
>   sYr=. 4 {. > i { bDate
>   sMn=. 2 {. 5 }. > i { bDate
>   nMon=. ". sMn
>   if. (9 < nMon) do.
>     sMonth=. (nMon-10) { 'abc'
>   else.
>     sMonth=. ": 1 } sMn
>   end.
>   nHigh=. (". > i { bHigh) - nChartLow
>   nLow=. (". > i { bLow) - nChartLow
>   nClose=. (". > i { bClose) - nChartLow
> 
>   if. (nChartHigh < (". > i { bHigh)) +. (nChartLow > (". > i { bLow))
> do.
>     sChart=. |. sChart
>     smoutput 'Data for ',(> i { bDate),' exceeded chart range'
>     return.
>   end.
> 
>   NB. (initialize starting point of chart in the first column)
>   NB. is this the first entry?
>   if. (1 = nFirst) do.
> 
>     nFirst=. 0    NB. turn off flag to guarantee this is done only
> once:
> 
>     if. nClose >= ((nHigh - nLow) % 2) do.
>       nColType=. nXCol
>       nBoxHigh=. <. (nLow % nBox)
>       nNewHigh=. <. (nHigh % nBox)
>       for_b. i.((nNewHigh-nBoxHigh)+1) do.
>         sChart=. 'X' (< (nBoxHigh+b+nRowOffset),nCurrCol) } sChart
>       end.
>     else.
>       nColType=. nOCol
>       nBoxLow=. <. (nHigh % nBox)
>       nNewLow=. <. (nLow % nBox)
>       for_b. i.((nBoxLow-nNewLow)+1) do.
>         sChart=. 'O' (< ((nBoxLow-b)+nRowOffset),nCurrCol) } sChart
>       end.
>     end.
>     if. 1 = nShowDate do.
>       if. (0 = (sLastYearPlotted -: sYr)) do.
>         for_c. i._4 do.
>           sChart=. (c{sYr) (< (3-c),nCurrCol) } sChart
>         end.
>         sLastYearPlotted=. sYr
>       end.
>     end.
> 
>   else.    NB. the following is the normal (i.e., non-first) procedure:
> 
>     NB. convert prices to boxes:
>     nNewHigh=. <. (nHigh % nBox)
>     nNewLow=. <. (nLow % nBox)
> 
>     NB. continue upward direction?
>     if. (nXCol = nColType) do.
> 
>       if. (1 <: (nNewHigh-nBoxHigh)) do.
> 
>         for_b. (1+i.(nNewHigh-nBoxHigh)) do.
>           sChart=. 'X' (< (nBoxHigh+b+nRowOffset),nCurrCol) } sChart
>         end.
>         if. 1 = nShowDate do.
>           if. (0 = (sLastMonthPlotted -: sMonth)) do.
>             sChart=. sMonth (< (nBoxHigh+1+nRowOffset),nCurrCol) }
> sChart
>             sLastMonthPlotted=. sMonth
>             if. 1 = ".sMonth do.
>               if. (0 = (sLastYearPlotted -: sYr)) do.
>                 for_c. i._4 do.
>                   sChart=. (c{sYr) (< (3-c),nCurrCol) } sChart
>                 end.
>                 sLastYearPlotted=. sYr
>               end.
>             end.
>           end.
>         end.
>         nBoxHigh=. nNewHigh
>         nBoxLow=. nBoxHigh - 1    NB. for drawing purposes, 1 box below
> highest 'X'
> 
>       NB. no new high, so test for downside reversal:
>       elseif. (nRevBoxes <: (nBoxHigh - nNewLow) ) do.
> 
>         if. (nCurrCol < nMaxColumns-1) do.
>           nCurrCol=. nCurrCol + 1
>         else.
>           sChart=. |. sChart
>           return.
>         end.
>         nColType=. nOCol
>         for_b. i.((nBoxLow-nNewLow)+1) do.
>           sChart=. 'O' (< ((nBoxLow-b)+nRowOffset),nCurrCol) } sChart
>         end.
>         if. 1 = nShowDate do.
>           if. (0 = (sLastMonthPlotted -: sMonth)) do.
>             sChart=. sMonth (< ((nBoxLow-2)+nRowOffset),nCurrCol) }
> sChart
>             sLastMonthPlotted=. sMonth
>             if. 1 = ".sMonth do.
>               if. (0 = (sLastYearPlotted -: sYr)) do.
>                 for_c. i._4 do.
>                   sChart=. (c{sYr) (< (3-c),nCurrCol) } sChart
>                 end.
>                 sLastYearPlotted=. sYr
>               end.
>             end.
>           end.
>         end.
>         nBoxLow=. nNewLow
>         nBoxHigh=. nBoxLow + 1    NB. for drawing purposes, 1 box above
> lowest 'O'
> 
>       end.
> 
>     NB. continue downward direction?
>     elseif. (nOCol = nColType) do.
> 
>       if. (1 <: (nBoxLow-nNewLow)) do.
> 
>         for_b. (1+i.(nBoxLow-nNewLow)) do.
>           sChart=. 'O' (< ((nBoxLow-b)+nRowOffset),nCurrCol) } sChart
>         end.
>         if. 1 = nShowDate do.
>           if. (0 = (sLastMonthPlotted -: sMonth)) do.
>             sChart=. sMonth (< ((nBoxLow-1)+nRowOffset),nCurrCol) }
> sChart
>             sLastMonthPlotted=. sMonth
>             if. 1 = ".sMonth do.
>               if. (0 = (sLastYearPlotted -: sYr)) do.
>                 for_c. i._4 do.
>                   sChart=. (c{sYr) (< (3-c),nCurrCol) } sChart
>                 end.
>                 sLastYearPlotted=. sYr
>               end.
>             end.
>           end.
>         end.
>         nBoxLow=. nNewLow
>         nBoxHigh=. nBoxLow + 1    NB. for drawing purposes, 1 box above
> lowest 'O'
> 
>       NB. no new low, so test for upside reversal:
>       elseif. (nRevBoxes <: (nNewHigh - nBoxLow) ) do.
> 
>         if. (nCurrCol < nMaxColumns-1) do.
>           nCurrCol=. nCurrCol + 1
>         else.
>           sChart=. |. sChart
>           return.
>         end.
>         nColType=. nXCol
>         for_b. i.((nNewHigh-nBoxHigh)+1) do.
>           sChart=. 'X' (< (nBoxHigh+b+nRowOffset),nCurrCol) } sChart
>         end.
>         if. 1 = nShowDate do.
>           if. (0 = (sLastMonthPlotted -: sMonth)) do.
>             sChart=. sMonth (< (nBoxHigh+2+nRowOffset),nCurrCol) }
> sChart
>             sLastMonthPlotted=. sMonth
>             if. 1 = ".sMonth do.
>               if. (0 = (sLastYearPlotted -: sYr)) do.
>                 for_c. i._4 do.
>                   sChart=. (c{sYr) (< (3-c),nCurrCol) } sChart
>                 end.
>                 sLastYearPlotted=. sYr
>               end.
>             end.
>           end.
>         end.
>         nBoxHigh=. nNewHigh
>         nBoxLow=. nBoxHigh - 1    NB. for drawing purposes, 1 box below
> highest 'X'
> 
>       end.
> 
>     end.
> 
>   end.
> 
> end.  NB. "for" loop
> 
> NB. flip chart array so that smallest coords are at lower left
> NB. rather than at upper left:
> sChart=. |. sChart
> )
> 
> NB. #################################################################
> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to