home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / ABACKTST.ZIP / APROCEDU.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-10-09  |  29.2 KB  |  852 lines

  1. {$F+,V-}
  2. UNIT APROCEDU; {PROCEDURES & FUNCTIONS TO CHART WITH version 2.20.00}
  3.  
  4. INTERFACE
  5.  
  6. USES DOS;
  7. TYPE
  8.     mktdata = RECORD {MARKET, & RAW DATA FIELDS}
  9.                time   :STRING[12];{DATE & TIME 199108020600 DONT WRITE TO TIME}
  10.                last   :REAL;
  11.                high   :REAL;
  12.                low    :REAL;
  13.                vol    :REAL;
  14.              END;
  15.  
  16.     inddata = RECORD {PROFIT & INDICATOR DATA FIELD}
  17.                data  : REAL;  {IE.. HIGH, LOW, LAST}
  18.                color : BYTE;  {LINE COLOR}
  19.               END;
  20.  
  21. VAR
  22.      marketdata    :        mktdata; {ACCESS TO MARKET & RAW STOCK DATA}
  23.      indicatordata :        inddata; {ACCESS TO INDICATOR & PROFIT DATA}
  24.  
  25.  
  26. CONST
  27.            {charttypes}
  28.       candlestick   =1; {MARKET TYPE}
  29.       highlowclose  =2; {MARKET TYPE}
  30.       line          =3; {INDICATOR & PROFIT TYPE}
  31.           {chartadjust}
  32.       dontdraw      =0;{USE IF DATA IS CLUTTERING SCREEN}
  33.       autoadjust    =1;{USE IF DATA IS INDEPENDNET OF THE MARKET}
  34.       followmarket  =2;{USE IF DATA FOLLOWS THE MARKET, IE.. MOVING AVERAGES}
  35.       hundredpercent=3;{USE IF DATA VALUES ARE 0..100, IE.. STOCKASTICS}
  36.       lock          =4;{USE IF NO ADJUSTMENT NEEDED AFTER FIRST AUTOADJUST}
  37.       realtimeprofit=5;{USE FOR $link datafeed piggyback for real time}
  38.       nochartdata   =255; {USE IF NOT CHARTING,[PROFIT ONLY-LOOP OPTIMIZING]}
  39.            {dayofweeknow}
  40.       sunday        =1;
  41.       monday        =2;
  42.       tuesday       =3;
  43.       wednessday    =4;
  44.       thursday      =5;
  45.       friday        =6;
  46.       saturday      =7;
  47.            {linecolors}
  48.        blue         =1;
  49.        green        =2;
  50.        cyan         =3;
  51.        red          =4;
  52.        magenta      =5;
  53.        brown        =6;
  54.        lightgray    =7;
  55.        lightblue    =9;
  56.       lightgreen   =10;
  57.       lightcyan    =11;
  58.       lightred     =12;
  59.       lightmagenta =13;
  60.       yellow       =14;
  61.       white        =15;
  62.          {FOR ALL}
  63. PROCEDURE Howtochart(charttype:BYTE;chartadjust:BYTE;programname:STRING);
  64. PROCEDURE Writechartdatafile;
  65.          {FOR PROFIT & INDICATOR}
  66. PROCEDURE Readmarketfile;
  67.          {FOR PROFIT & INDICATOR}
  68. PROCEDURE Openindicatorfile(inumber:BYTE;iname:STRING); {inumber = 1..18}
  69. PROCEDURE Readindicatorfile(inumber:BYTE);
  70.          {FOR MARKET & INDICATOR}
  71. PROCEDURE Openrawstockfile(rnumber:BYTE;rname:STRING);  {rnumber = 1..6}
  72. PROCEDURE Readrawstockfile(rnumber:BYTE);
  73.          {FOR ALL}
  74. PROCEDURE Nexttime;
  75. FUNCTION  Timenow:STRING;
  76. FUNCTION  Daynow:STRING;
  77. FUNCTION  Dayofweeknow:BYTE;
  78. FUNCTION  Alldone:BOOLEAN;
  79. PROCEDURE Done;
  80.           {ONLY FOR PROFIT ENDLESS LOOP OPTIMAZING OR REALTIME}
  81. PROCEDURE Closeall;
  82. FUNCTION  Indicatortime:BOOLEAN;
  83.  
  84. {-----------------------------------------------------------------------}
  85.  
  86. IMPLEMENTATION
  87. CONST listwidth = 12;
  88.       listsize  = 21;
  89. TYPE
  90.     sys_rec = RECORD     {RECORD OF SYSTEM SETUP}
  91.                ldescription:STRING[20];
  92.                backdstart  :STRING[8];
  93.                backdend    :STRING[8];
  94.                markttstart :STRING[4];
  95.                markttend   :STRING[4];
  96.                inditstart  :STRING[4];     {SMALL FILE - READ ONLY}
  97.                inditend    :STRING[4];
  98.                pathraws    :STRING[41];
  99.                pathrawd    :STRING[41];
  100.                pathchart   :STRING[41];
  101.                rawtime     :STRING[2];
  102.                compilern   :STRING[41];
  103.               END;
  104.  
  105.     strlist = ARRAY[1..listsize+1] OF STRING[listwidth]; {ARRAY OF CHARTABLES SELECTED
  106.               1..18 = INDICATOR CHARTABLES
  107.                  19 = MARKET    CHARTABLE       SMALL FILE - READ ONLY
  108.                  20 = PROFIT    CHARTABLE
  109.                  21 = TEMP STORAGE
  110.                  22 = LISTSIZE+1 = TEMP REDRAW INFO}
  111.  
  112.     chrtrec = RECORD
  113.                name        : STRING[12];
  114.                date        : LONGINT;
  115.                buildnow    : BOOLEAN;
  116.                charttype   : BYTE;
  117.                chartadjust : BYTE;
  118.               END;
  119.  
  120.      bacrec = RECORD
  121.                systemlevel  :BYTE;
  122.               END;
  123.  
  124.     flofrawdataa = ARRAY[1..6] OF FILE OF mktdata;
  125.     nrnamea      = ARRAY[1..6] OF STRING[12];
  126.     rdataptra    = ARRAY[1..6] OF WORD;
  127.     rawfinisheda = ARRAY[1..6] OF BOOLEAN;
  128.     flofinddataa = ARRAY[1..18] OF FILE OF inddata;
  129.     ninamea      = ARRAY[1..18] OF STRING[12];
  130.     idataptra    = ARRAY[1..18] OF WORD;
  131.  
  132. VAR
  133.    {###### SETUP FILES ######}
  134.      systemsetup :        sys_rec; {UNITS ACCESS TO DATA}
  135.        syssetupf :FILE OF sys_rec; {DISK ACCESS TO DATA}
  136.      mylist      :        strlist;
  137.        listf     :FILE OF strlist;
  138.      chartrecord :        chrtrec;
  139.        chartrecf :FILE OF chrtrec;
  140.      backsetup   :         bacrec;
  141.        bacsetupf :FILE OF  bacrec;
  142.  
  143.    {###### DATA FILES ######}
  144.        mnamef      :FILE OF mktdata;
  145.        pnamef      :FILE OF inddata;
  146.        inamef      :   flofinddataa;
  147.        inamea      :        ninamea;
  148.        inamefc     :FILE OF inddata;
  149.        rnamef      :   flofrawdataa;
  150.        rnamea      :        nrnamea;
  151.  
  152.    {######## MISC VARIABLES #######}
  153.        Y,T,I,Q,mdataptr,idataptrc,pdataptr:WORD;
  154.        code,tspace    : INTEGER;
  155.        idataptr       : idataptra;
  156.        rdataptr       : rdataptra;
  157.        rawfinished    : rawfinisheda;
  158.        chartrecnumber,chrtadj : BYTE; {!!! READ ONLY !!!!}
  159.        RN,dataname,mname      : STRING;
  160.        timet,rawdates,YR,OYR  : STRING[12];
  161.        rawfile,newdaydata,newday,newyear,newyeardata,market: BOOLEAN;
  162.        firstmraw,finished,rawfinish: BOOLEAN;
  163.        systemlevel    : BYTE;
  164.        rtime          : LONGINT;
  165.  
  166. CONST       {ftypes}
  167.       backrecfile   =0;  {bacrec   - FILE TYPE LIST OF SYSTEM LEVEL}
  168.       chartrecfile  =1;  {chrtrec  - FILE TYPE LIST OF CHARTABLES INFORMATION}
  169.       chrtlstfile   =2;  {listfile - FILE TYPE LIST OF CHARTABLES YOU SELECTED}
  170.       systemfile    =3;  {syssetup - FILE TYPE RECORD OF THE SYSTEM SETUPS}
  171.       marketfile    =4;
  172.       indicatorfile =5;
  173.       profitfile    =6;
  174.           {testtime types}
  175.       outofrange =0; {NOT EVEN SAME DAY}
  176.       overrange  =1; {DONT GO ANY HIGHER}
  177.       inrange    =3; {JUST RIGHT}
  178.       underrange =5; {DONT GO ANY LOWER}
  179.          {misc.}
  180.       W=65535;{largest WORD value}
  181.  
  182. PROCEDURE Badexit(s:STRING);
  183.            BEGIN
  184.             WRITELN;
  185.             WRITELN(' BAD BUILD - HALT=2');
  186.             WRITELN;
  187.             WRITELN(S);
  188.             HALT(2);
  189.            END;
  190.  
  191. FUNCTION  Findprogram(lend:BYTE;lname:STRING):BYTE;
  192.            BEGIN
  193.             Findprogram:=0;
  194.             FOR Q := 1 TO lend DO
  195.               IF mylist[Q] = lname THEN
  196.                    Findprogram:=Q;
  197.            END;
  198.  
  199. PROCEDURE Openmarketfile; {INTERNAL}
  200.            BEGIN
  201.             IF chartrecnumber = (listsize-2) THEN Badexit('Market cant openmarketfile - just use rawstock');
  202.             mname:=systemsetup.pathrawd+(COPY(mylist[listsize-2],1,6)+YR+COPY(mylist[listsize-2],9,4));
  203.             ASSIGN(mnamef,mname);
  204.             {$I-} RESET(mnamef); {$I+}
  205.             IF IORESULT<>0 THEN Badexit('Can''t OPENMARKETFILE - '+mname);
  206.             RESET(mnamef);
  207.             mdataptr:=0;
  208.            END;
  209.  
  210. PROCEDURE Readmarketfile;
  211.            BEGIN
  212.             SEEK(mnamef,mdataptr);
  213.             READ(mnamef,marketdata);
  214.            END;
  215.  
  216. PROCEDURE Openindicatorfile;
  217.           VAR R:STRING[3];
  218.               niname:STRING;
  219.            BEGIN
  220.             IF chartrecnumber = (listsize-2) THEN Badexit('Market cant openindicatorfile - just use rawstock');
  221.             niname:=iname+'-P.'+systemsetup.rawtime+'I';
  222.             IF Findprogram(chartrecnumber,niname)=0 THEN
  223.                 Badexit('Indicator file -'+niname+'- not in list before -'+mylist[chartrecnumber]);
  224.           RN:=systemsetup.pathrawd+iname+YR+'.'+systemsetup.rawtime+'I';
  225.           CASE inumber OF
  226.      1..18:BEGIN
  227.             ASSIGN(inamef[inumber],RN);
  228.             {$I-} RESET(inamef[inumber]); {$I+}
  229.             IF IORESULT<>0 THEN Badexit('Can''t OPENINDICATORFILE - '+RN);
  230.             RESET(inamef[inumber]);
  231.             inamea[inumber]:=iname;
  232.             idataptr[inumber]:=0;
  233.            END;
  234.       ELSE BEGIN
  235.             STR(inumber,R);
  236.             Badexit('INCIDATORFILE MUST BE 1..18, YOU USED- '+R);
  237.            END;
  238.            END;
  239.            END;
  240.  
  241. PROCEDURE Readindicatorfile;
  242.            BEGIN
  243.             SEEK(inamef[inumber],idataptr[inumber]);
  244.             READ(inamef[inumber],indicatordata);
  245.            END;
  246.  
  247. PROCEDURE Openrawstockfile;
  248.           LABEL 20;
  249.            BEGIN
  250.             IF chartrecnumber = (listsize-1) THEN Badexit('Profit cant openrawstockfile - use indicators');
  251.           CASE rnumber OF
  252.       1..6:BEGIN
  253.          20:STR(Y,YR); YR:=COPY(YR,3,2);
  254.             RN:=systemsetup.pathraws+rname+YR+'.'+systemsetup.rawtime+'R';
  255.             ASSIGN(rnamef[rnumber],RN);
  256.             {$I-} RESET(rnamef[rnumber]); {$I+}
  257.             IF IORESULT<>0 THEN
  258.               BEGIN
  259.                 STR(Y,YR);
  260.                 IF YR<COPY(SYSTEMSETUP.BACKDEND,1,4) THEN
  261.                     BEGIN
  262.                      INC(Y);
  263.                      GOTO 20;
  264.                     END
  265.                     ELSE rawfinish:=TRUE;
  266.               END
  267.               ELSE
  268.                BEGIN
  269.                 RESET(rnamef[rnumber]);
  270.                 rnamea[rnumber]:=rname;
  271.                 rdataptr[rnumber]:=0;
  272.                END;
  273.            END
  274.      ELSE  BEGIN
  275.             STR(rnumber,RN);
  276.             Badexit('RAWSTOCKFILE MUST BE 1..6, YOU USED- '+RN);
  277.            END;
  278.           END;
  279.           END;
  280.  
  281. PROCEDURE Setrawsfinished;
  282.            BEGIN
  283.             FOR I:=1 TO 6 DO
  284.              IF rdataptr[I]<W THEN rawfinished[I]:=FALSE ELSE rawfinished[I]:=TRUE;
  285.            END;
  286.  
  287. PROCEDURE Readrawstockfile;
  288.            BEGIN
  289.             IF NOT rawfinish THEN
  290.               BEGIN
  291.                SEEK(rnamef[rnumber],rdataptr[rnumber]);
  292.                READ(rnamef[rnumber],marketdata);
  293.                rawdates:=marketdata.time;
  294.                IF (FIRSTMRAW) THEN
  295.                  BEGIN
  296.                   FIRSTMRAW:=FALSE;
  297.                   Setrawsfinished;
  298.                   NEXTTIME;
  299.                 END;
  300.               {* WRITELN(TIMET,' R-',RDATAPTR[RNUMBER],' ',MARKETDATA.TIME,' ',MARKETDATA.LAST);}
  301.               END;
  302.            END;
  303.  
  304. PROCEDURE Readfiletype(fltyp:BYTE); {INTERNAL}
  305.           VAR code:INTEGER;
  306.               S:STRING[2];
  307.            BEGIN
  308.             CASE fltyp OF
  309.     backrecfile: BEGIN
  310.                   ASSIGN (bacsetupf,'ABACSET.SET');
  311.                   {$I-}RESET(bacsetupf);{$I+}
  312.                   IF IORESULT <> 0 THEN Badexit('Can''t find file 0-ABACSET.SET-');
  313.                   READ(bacsetupf,backsetup);
  314.                   systemlevel:=backsetup.systemlevel;
  315.                   CLOSE(bacsetupf);
  316.                  END;
  317.    chartrecfile: BEGIN
  318.                   STR(SYSTEMLEVEL,S);
  319.                   ASSIGN(chartrecf,'ACHRTRE'+S+'.SET');
  320.                   {$I-}RESET(chartrecf);{$I+}
  321.                   IF IORESULT<>0 THEN Badexit('Can''t open file 1-ACHRTRE'+S+'.SET-');
  322.                   RESET(chartrecf);
  323.                   SEEK(chartrecf,chartrecnumber-1);
  324.                   READ(chartrecf,chartrecord);
  325.                  END;
  326.     chrtlstfile: BEGIN
  327.                   ASSIGN(listf,'ACHRTLST.SET');
  328.                   {$I-}RESET(listf);{$I+}
  329.                   IF IORESULT<>0 THEN Badexit('Can''t find file 2-ACHRTLST.SET-.');
  330.                   RESET(listf);
  331.                   SEEK(listf,systemlevel-1);
  332.                   READ(listf,mylist);
  333.                   CLOSE(listf);
  334.                  END;
  335.      systemfile: BEGIN
  336.                   ASSIGN(syssetupf,'ASYSSET.SET');
  337.                   {$I-}RESET(syssetupf);{$I+}
  338.                   IF IORESULT<>0 THEN Badexit('Can''t find file 3-ASYSSET.SET-.');
  339.                   RESET(syssetupf);
  340.                   SEEK(syssetupf,systemlevel-1);
  341.                   READ(syssetupf,systemsetup);
  342.                   CLOSE(syssetupf);
  343.                  END;
  344.             END;{CASE}
  345.            END;
  346.  
  347. FUNCTION  Fltype:BYTE; {INTERNAL}
  348.            BEGIN
  349.             CASE chartrecnumber OF
  350.               listsize-2: Fltype:=marketfile;
  351.            1..listsize-3: Fltype:=indicatorfile;
  352.               listsize-1: Fltype:=profitfile;
  353.               ELSE Badexit('OOPS WRONG FILE TYPE-'+dataname);
  354.              END;{CASE}
  355.             END;
  356.  
  357. PROCEDURE Rewritechartdatafile; {INTERNAL}
  358.           VAR nname:STRING;
  359.             BEGIN
  360.              STR(Y,YR);YR:=COPY(YR,3,2);
  361.              WITH marketdata DO
  362.                    BEGIN
  363.                     time:='';last:=0;high:=0;low:=0;vol:=0;
  364.                    END;
  365.             WITH indicatordata DO
  366.                   BEGIN
  367.                   {data:=0;} color:=yellow;
  368.                   END;
  369.              CASE Fltype OF
  370.      marketfile:BEGIN
  371.                  nname:=systemsetup.pathrawd+(COPY(mylist[listsize-2],1,6)+YR+COPY(mylist[listsize-2],9,4));
  372.                  ASSIGN(mnamef,nname);
  373.                  REWRITE(mnamef);
  374.                  WRITE(mnamef,marketdata);
  375.                  CLOSE(mnamef);
  376.                  RESET(mnamef);
  377.                  mdataptr:=0;
  378.                 END;
  379.   indicatorfile:BEGIN
  380.                  nname:=systemsetup.pathrawd+COPY(dataname,1,6)+YR+COPY(dataname,9,4);
  381.                  ASSIGN(inamefc,nname);
  382.                  REWRITE(inamefc);
  383.                  WRITE(inamefc,indicatordata);
  384.                  CLOSE(inamefc);
  385.                  RESET(inamefc);
  386.                  idataptrc:=0;
  387.                  Openmarketfile;
  388.                  Readmarketfile;
  389.                  timet:=marketdata.time;
  390.                 END;
  391.     profitfile: BEGIN
  392.                  nname:=systemsetup.pathrawd+(COPY(mylist[listsize-1],1,6)+YR+COPY(mylist[listsize-1],9,4));
  393.                  ASSIGN(pnamef,nname);
  394.                  REWRITE(pnamef);
  395.                  pdataptr:=0;
  396.                  Openmarketfile;
  397.                  Readmarketfile;
  398.                  timet:=marketdata.time;
  399.                 END;
  400.             END;{CASE}
  401.            END;
  402.  
  403. PROCEDURE Writechartdatafile;
  404.           VAR nextyear:BOOLEAN;
  405.           BEGIN
  406.           CASE Fltype OF
  407.      marketfile:BEGIN
  408.                  marketdata.time:=timet;
  409.                  SEEK(mnamef,mdataptr);
  410.                  WRITE(mnamef,marketdata);
  411.                 {* WRITELN(mdataptr,' ',MARKETDATA.TIME,' ',MARKETDATA.LAST);}
  412.                  INC(mdataptr);
  413.                 END;
  414.   indicatorfile:BEGIN
  415.                  SEEK(inamefc,idataptrc);
  416.                  WRITE(inamefc,indicatordata);
  417.                  {WRITELN(idataptrc,' ',TIMET,' ',INDICATORDATA.DATA);}
  418.                 END;
  419.   profitfile   :BEGIN
  420.                  SEEK(pnamef,pdataptr);
  421.                  WRITE(pnamef,indicatordata);
  422.                  {WRITELN(pdataptr,' ',TIMET,' ',indicatorDATA.DATA);}
  423.                 END;
  424.             END;{CASE}
  425.            END;
  426.  
  427. PROCEDURE Closechartdatafile;
  428.             BEGIN
  429.              IF mdataptr<W THEN
  430.                    BEGIN
  431.                     CLOSE(mnamef);mdataptr:=W;
  432.                    END;
  433.              IF idataptrc<W THEN
  434.                    BEGIN
  435.                     CLOSE(inamefc);idataptrc:=W;
  436.                    END;
  437.              IF pdataptr<W THEN
  438.                    BEGIN
  439.                     CLOSE(pnamef);pdataptr:=W;
  440.                    END;
  441.             END;
  442.  
  443. PROCEDURE Restarttime;{INTERNAL}
  444.            BEGIN
  445.             Rewritechartdatafile;
  446.             FOR I := 1 TO 18 DO
  447.               BEGIN
  448.                IF idataptr[I]<>W THEN
  449.                  BEGIN
  450.                   CLOSE(inamef[I]);
  451.                   Openindicatorfile(I,inamea[I]);
  452.                  END;
  453.               END;
  454.  
  455.             FOR I := 1 TO 6 DO
  456.               BEGIN
  457.                IF rdataptr[I]<>W THEN
  458.                  BEGIN
  459.                    CLOSE(rnamef[I]);
  460.                    Openrawstockfile(I,rnamea[I]);
  461.                  END;
  462.               END;
  463.             setrawsfinished;
  464.            END;
  465.  
  466. PROCEDURE Getspace;
  467.            BEGIN
  468.             VAL(systemsetup.rawtime,rtime,CODE);
  469.             IF rtime=0 THEN rtime:=-32768; {0=CL}
  470.             IF rtime=-32768 THEN tspace:=0
  471.                  ELSE tspace:=(ROUND(rtime*0.5)-1);
  472.            END;
  473.  
  474.  
  475. FUNCTION Juliantodate(J:LONGINT):STRING; {INTERNAL}
  476.          VAR D,M,Y : WORD;
  477.              DD,MM,YY : STRING[4];
  478.          remainder,factored : longint;
  479.           BEGIN
  480.            IF J <= 58 THEN
  481.             BEGIN
  482.              Y := 1900;
  483.              IF J <= 30 THEN
  484.               BEGIN
  485.                M := 1;
  486.                D := succ(J);
  487.               END
  488.               ELSE
  489.                BEGIN
  490.                 M := 2;
  491.                 D := J - 30;
  492.                END;
  493.             END
  494.             ELSE
  495.              BEGIN
  496.               factored := 4*longInt(J) - 233;
  497.               Y := factored DIV 1461;
  498.               remainder := (factored MOD 1461 DIV 4 * 5) + 2;
  499.               M := remainder DIV 153;
  500.               D := SUCC((remainder MOD 153) DIV 5);
  501.               Y := Y + 1900;
  502.               IF M < 10 THEN M := M + 3
  503.                ELSE
  504.                 BEGIN
  505.                  M := M - 9;
  506.                  INC(Y);
  507.                 END;
  508.             END;
  509.             STR(D,DD);
  510.             IF D < 10 THEN DD := '0'+DD;
  511.             STR(M,MM);
  512.             IF M < 10 THEN MM := '0'+MM;
  513.             IF Y < 1900 THEN
  514.              IF Y < 78 THEN
  515.                 Y := Y + 2000
  516.               ELSE
  517.                 Y := Y + 1900;
  518.             STR(Y,YY);
  519.             Juliantodate := YY+MM+DD;
  520.           END;
  521.  
  522. FUNCTION Datetojulian(month,day,year:INTEGER):LONGINT; {INTERNAL}
  523.          VAR temp:LONGINT;
  524.          BEGIN
  525.           IF (year=1900) AND (month <= 2) THEN
  526.            BEGIN
  527.             IF month=1 then temp := pred(day)
  528.              ELSE
  529.               Temp := day+30;
  530.            END
  531.            ELSE
  532.             BEGIN
  533.              IF month > 2 THEN month:=month-3
  534.               ELSE
  535.               BEGIN
  536.                month:=month+9;
  537.                DEC(year);
  538.               END;
  539.              year:=year-1900;
  540.              temp := (1461*longint(year) div 4) +
  541.                  (153*month+2) div 5 + day + 58;
  542.             END;
  543.           Datetojulian:=temp;
  544.          END;
  545.  
  546. FUNCTION  Dayofweeknow;
  547.           VAR m,d,y:word;
  548.            BEGIN
  549.             VAL(COPY(timet,1,4),y,code);
  550.             VAL(COPY(timet,5,2),m,code);
  551.             VAL(COPY(timet,7,2),d,code);
  552.             Dayofweeknow:=((Datetojulian(m,d,y)+1)MOD 7);
  553.            END;
  554.  
  555. FUNCTION  Addtime(dates:STRING;fudgeminutes:INTEGER;market:BOOLEAN):STRING; {INTERNAL}
  556.           VAR y,m,d,hour,minute,minutes,fudgeday:WORD;
  557.               hh,mm:STRING;
  558.           CONST nextday=-32768;
  559.            BEGIN
  560.               fudgeday:=0;
  561.               VAL(COPY(dates,1,4),y,code);
  562.               VAL(COPY(dates,5,2),m,code);
  563.               VAL(COPY(dates,7,2),d,code);
  564.               VAL(COPY(dates,9,2),hour,code);
  565.               VAL(COPY(dates,11,2),minute,code);
  566.              IF fudgeminutes=nextday THEN
  567.                  BEGIN
  568.                   fudgeminutes:=0;
  569.                   fudgeday:=1;
  570.                  END;
  571.              minutes:=(hour*60)+minute+fudgeminutes;
  572.              hour:=(minutes DIV 60);
  573.              minute:=(minutes MOD 60);
  574.              STR(hour,hh);
  575.              IF hour < 10 THEN hh:='0'+hh;
  576.              STR(minute,mm);
  577.              IF minute < 10 THEN mm:='0'+mm;
  578.             IF market THEN
  579.               BEGIN
  580.                IF {(newdaydata) OR} ((hh+mm)>systemsetup.markttend) OR (COPY(dates,1,8)<COPY(rawdates,1,8)) THEN
  581.                   BEGIN
  582.                    fudgeday:=1;
  583.                    hh:=COPY(systemsetup.markttstart,1,2);
  584.                    mm:=COPY(systemsetup.markttstart,3,2);
  585.                    newdaydata:=FALSE;
  586.                   END;
  587.               END;
  588.             Addtime:=juliantodate(datetojulian(m,d,y)+fudgeday)+hh+mm;
  589.            END;
  590.  
  591. FUNCTION  Checkrawvsmarkettime:BYTE; {INTERNAL}
  592.       VAR  systime,ratimehi,ratimelo:STRING;
  593.            market:BOOLEAN;
  594.            BEGIN
  595.             market:=FALSE;
  596.             ratimehi:=Addtime(marketdata.time,tspace,market);
  597.             ratimelo:=Addtime(marketdata.time,-tspace,market);
  598.             systime:=timet;
  599.             IF ((systime<=ratimehi) AND (systime>=ratimelo)) OR
  600.                ((COPY(SYSTIME,1,8)=COPY(RATIMELO,1,8)) AND (TSPACE=0)) THEN
  601.               Checkrawvsmarkettime:=inrange
  602.               ELSE
  603.                BEGIN
  604.                 IF (systime<ratimehi) OR (COPY(SYSTIME,1,8)<COPY(RATIMELO,1,8)) THEN
  605.                   Checkrawvsmarkettime:=overrange
  606.                   ELSE
  607.                    Checkrawvsmarkettime:=underrange;
  608.                END;
  609.            IF (chartrecnumber=listsize-2) AND (COPY(timet,1,8)<>COPY(marketdata.time,1,8)) THEN
  610.                    newday:=TRUE ELSE newday:=FALSE;
  611.            END;
  612.  
  613. FUNCTION  Allrawsfinished:BOOLEAN;
  614.            BEGIN
  615.             Allrawsfinished:=TRUE;
  616.             FOR I:=1 TO 6 DO IF rawfinished[I]=FALSE THEN Allrawsfinished:=FALSE;
  617.            END;
  618.  
  619. PROCEDURE Nextsystemtime;
  620.            BEGIN
  621.             Getspace;
  622.             market:=TRUE;
  623.             timet:=Addtime(timet,rtime,market);
  624.             IF (COPY(timet,1,4)>OYR) OR (ALLRAWSFINISHED) THEN
  625.                 BEGIN
  626.                  Closechartdatafile;
  627.                  IF ALLRAWSFINISHED THEN
  628.                    BEGIN
  629.                     VAL(OYR,Y,CODE);INC(Y);
  630.                     STR(Y,OYR);
  631.                    END
  632.                    ELSE
  633.                    BEGIN
  634.                     OYR:=COPY(timet,1,4);
  635.                    END;
  636.                  VAL(OYR,Y,code);
  637.                  TIMET:=OYR+'01010001';
  638.             IF (COPY(timet,1,8)>systemsetup.backdend) THEN
  639.               finished:=TRUE ELSE Restarttime;
  640.                 END;
  641.             IF (COPY(timet,1,8)>systemsetup.backdend) THEN
  642.               finished:=TRUE;
  643.            END;
  644.  
  645. FUNCTION  Timenow;
  646.             BEGIN
  647.              Timenow:=COPY(timet,9,4);
  648.             END;
  649.  
  650. FUNCTION  Daynow;
  651.             BEGIN
  652.              Daynow:=COPY(timet,1,8);
  653.             END;
  654.  
  655. FUNCTION  Marketfileexists:BOOLEAN;  {INTERNAL}
  656.             BEGIN
  657.              mname:=systemsetup.pathrawd+(COPY(mylist[listsize-2],1,6)+YR+COPY(mylist[listsize-2],9,4));
  658.              ASSIGN(mnamef,mname);
  659.              {$I-} RESET(mnamef); {$I+}
  660.              IF IORESULT<>0 THEN Marketfileexists:=FALSE
  661.                ELSE
  662.                 BEGIN
  663.                  Marketfileexists:=TRUE;
  664.                 END;
  665.             END;
  666.  
  667. PROCEDURE Nextmarketdata; {INTERNAL}
  668.             BEGIN
  669.              INC(mdataptr);
  670.              IF mdataptr>=FILESIZE(mnamef) THEN
  671.                IF OYR>=COPY(SYSTEMSETUP.BACKDEND,1,4) THEN finished:=TRUE
  672.                  ELSE
  673.                   BEGIN
  674.                    newyear:=TRUE;
  675.                    Closechartdatafile;
  676.                    REPEAT
  677.                     IF OYR>=COPY(SYSTEMSETUP.BACKDEND,1,4) THEN finished:=TRUE
  678.                       ELSE
  679.                        BEGIN
  680.                         VAL(OYR,Y,CODE);INC(Y);STR(Y,OYR);YR:=COPY(OYR,3,2);
  681.                         IF Marketfileexists THEN
  682.                           BEGIN
  683.                            timet:=OYR+COPY(timet,5,8);
  684.                            Restarttime;
  685.                           END;
  686.                        END;
  687.                    UNTIL finished OR Marketfileexists;
  688.                   END
  689.              ELSE
  690.               BEGIN
  691.                newyear:=FALSE;
  692.                SEEK(mnamef,mdataptr);
  693.                READ(mnamef,marketdata);
  694.                timet:=marketdata.time;
  695.               END;
  696.             END;
  697.  
  698. PROCEDURE Nextindicatordata; {INTERNAL}
  699.             BEGIN
  700.              FOR I := 1 TO 18 DO IF idataptr[I]<W THEN INC(idataptr[I]);
  701.             END;
  702.  
  703. PROCEDURE Nextrawstockdata; {INTERNAL}
  704.             BEGIN
  705.           {  IF TIMET='199109051305' THEN
  706.                  BEGIN
  707.                  WRITELN;
  708.                  END;    }
  709.              newdaydata:=TRUE;
  710.              FOR I := 1 TO 6 DO
  711.               IF rdataptr[I]<W THEN
  712.                   REPEAT
  713.                    IF (rdataptr[I]<FILESIZE(rnamef[I])) AND (NOT rawfinished[I]) THEN
  714.                     BEGIN
  715.                      Readrawstockfile(I);
  716.                      T:=Checkrawvsmarkettime;
  717.                      IF (T=underrange) THEN INC(rdataptr[I]);
  718.                      IF (T=overrange) AND (rdataptr[I]>0) THEN DEC(rdataptr[I]);
  719.                     END
  720.                     ELSE
  721.                     BEGIN
  722.                      IF COPY(timet,1,8)<COPY(systemsetup.backdend,1,8) THEN
  723.                        newyeardata:=TRUE ELSE newyeardata:=FALSE;
  724.                      IF (NOT rawfinished[I]) AND (rdataptr[I]>0) THEN DEC(rdataptr[I]);
  725.                      rawfinished[I]:=TRUE;
  726.                     END;
  727.                    IF NOT newday THEN newdaydata:=FALSE;
  728.                   UNTIL (T<>underrange) OR (rawfinished[I]);
  729.             END;
  730.  
  731. FUNCTION  Indicatortime;
  732.            BEGIN
  733.             IF ((COPY(timet,9,4)>=systemsetup.inditstart) AND (COPY(timet,9,4)<=systemsetup.inditend)) OR
  734.                (tspace=0) THEN
  735.                   Indicatortime:=TRUE
  736.                  ELSE
  737.                   Indicatortime:=FALSE;
  738.            END;
  739.  
  740. PROCEDURE Copyindichartdata; {INTERNAL}
  741.            BEGIN
  742.             SEEK(inamefc,idataptrc-1);
  743.             READ(inamefc,indicatordata);
  744.             Writechartdatafile;
  745.            END;
  746.  
  747.  
  748. PROCEDURE Nexttime;
  749.             BEGIN
  750.              CASE Fltype OF
  751.            marketfile:   BEGIN
  752.                           REPEAT
  753.                            Nextsystemtime;
  754.                            IF NOT finished THEN
  755.                             Nextrawstockdata;
  756.                            IF (Allrawsfinished) AND (NOT newyeardata) THEN finished:=TRUE;
  757.                            UNTIL (NOT NEWDAYDATA) OR (finished);
  758.                          END;
  759.           indicatorfile: BEGIN
  760.                           REPEAT
  761.                            Nextmarketdata;
  762.                            IF NOT finished THEN
  763.                             BEGIN
  764.                               Nextrawstockdata;
  765.                               IF NOT newyear THEN Nextindicatordata;
  766.                               INC(idataptrc);
  767.                               IF  NOT Indicatortime THEN Copyindichartdata;
  768.                               IF newyear THEN idataptrc:=0;
  769.                             END;
  770.                           UNTIL (Indicatortime) OR (finished);
  771.                          END;
  772.           profitfile:   BEGIN
  773.                           Nextmarketdata;
  774.                           IF NOT finished THEN
  775.                             BEGIN
  776.                              IF chrtadj=nochartdata THEN pdataptr:=0 ELSE INC(pdataptr);
  777.                              IF NOT newyear THEN Nextindicatordata ELSE pdataptr:=0;
  778.                             END;
  779.                          END;
  780.              END;
  781.             END;
  782.  
  783. PROCEDURE Starttime; {INTERNAL}
  784.            BEGIN
  785.             OYR:=COPY(timet,1,4);
  786.             FOR I := 1 TO 18 DO idataptr[I]:=W;
  787.             FOR I := 1 TO 6 DO rdataptr[I]:=W;
  788.             mdataptr:=W;idataptrc:=W;pdataptr:=W;
  789.             Getspace;
  790.             Rewritechartdatafile;
  791.            END;
  792.  
  793.  
  794. PROCEDURE Howtochart;
  795.           VAR S:STRING[1];
  796.              ss:string;
  797.            BEGIN
  798.             Readfiletype(backrecfile);
  799.             Readfiletype(systemfile);
  800.             Readfiletype(chrtlstfile);
  801.             chartrecnumber:=0;tspace:=0;
  802.             STR(chartadjust,S);
  803.             rawfinish:=FALSE;finished:=FALSE;firstmraw:=TRUE;
  804.             newdaydata:=TRUE;newyeardata:=TRUE;
  805.             VAL(COPY(systemsetup.backdstart,1,4),Y,code);
  806.             STR(Y,YR);YR:=COPY(YR,3,2);
  807.             dataname:=COPY(programname,1,6)+YR+COPY(programname,9,4);
  808.             chartrecnumber:=Findprogram(listsize-1,programname);
  809.             str(chartrecnumber,ss);
  810.             IF chartrecnumber=0 THEN Badexit('CANT FIND HOWTOCHART-'+programname+'- "programname=" WRONG IN CHARTABLE.');
  811.             Readfiletype(chartrecfile);
  812.             IF (chartrecnumber=listsize-2) AND ((charttype=candlestick) OR (charttype=highlowclose)) THEN
  813.                 chartrecord.charttype:=charttype
  814.               ELSE chartrecord.charttype:=candlestick;
  815.             IF (chartrecnumber<>(listsize-2)) THEN chartrecord.charttype:=line;
  816.             CASE chartadjust OF
  817.               0..4,255 : BEGIN
  818.                           chartrecord.chartadjust:=chartadjust;
  819.                           chrtadj:=chartadjust;
  820.                          END;
  821.                   ELSE   Badexit('chartadjust S/B 0..4 NOT -'+S);
  822.             END;
  823.           IF chrtadj<>nochartdata THEN
  824.               BEGIN
  825.                SEEK(chartrecf,chartrecnumber-1);
  826.                WRITE(chartrecf,chartrecord);
  827.               END;
  828.             CLOSE(chartrecf);
  829.             timet:=systemsetup.backdstart+systemsetup.markttstart;{199008220615}
  830.             Starttime;
  831.            END;
  832.  
  833. FUNCTION  Alldone;
  834.            BEGIN
  835.             Alldone:=finished;
  836.            END;
  837.  
  838. PROCEDURE Closeall;
  839.            BEGIN
  840.             FOR I := 1 TO 18 DO IF idataptr[I]<W THEN CLOSE(inamef[I]);
  841.             FOR I := 1 TO 6 DO IF rdataptr[I]<W THEN CLOSE(rnamef[I]);
  842.             Closechartdatafile;
  843.            END;
  844.  
  845. PROCEDURE Done;
  846.            BEGIN
  847.             Closeall;
  848.             {WRITELN('DONE - GOOD BUILD');} HALT(4); {GOOD EXIT CODE}
  849.            END;
  850.  
  851. END.
  852.