2008/07/08

The Labs.Com Issue_05_Futures
Last update 1999/02/20

TPJ: Issue_05_Futures

This is a collection of programs published by The Perl Journal. You can download all source-code also from TPJ: Programs.
  1. channel.pl
  2. stats.pl
  3. More Samples on Futures
Issue_05_Futures
1. channel.pl
Download channel.pl

 <html> 
 <head> 
 <title> channel.pl </title> 
 </head> 
 <body> 
 <h1> channel.pl </h1> 
 <pre> 
 # Simulate basic channel system 
 # M. Edward Borasky 
 # 26-DEC-96 
 # usage: 
 #        perl channel.pl <contract> <days> 
 # where <contract> is the contract name and <days> is the 
 # number of days in the channel. 
  
 $start = time(); # starting time stamp 
  
 # open input file 
 $contract = $ARGV[0]; # contract name 
 $infile = "a:\\pinnacle\\clc\\temp\\${contract}_clc.asc"; 
 open(INPUT, $infile); 
 print "Input from $infile\n"; 
  
 $days = $ARGV[1]+0; # number of days in channel 
 print "Days in channel = $days\n"; 
 # open output file 
 $outfile = "${contract}.prn"; 
 open(OUTPUT, ">> $outfile"); 
 print "Output to $outfile\n"; 
  
 @high = @low = (); # allocate saved data arrays empty 
 $position = 0; # start neutral 
 $rollflag = 0; # first day is regular record 
  
 # main loop over data file 
 while (<INPUT>) {# read a line 
         @F = split(' ', $_); # split into fields 
         $date = $F[0]+0; # date 
         if ($date == 0) {# rollover record 
                 $rollflag = 1; # set rollover flag 
                 $offset = $F[4] - $F[1]; # compute offset 
         } 
         else {# regular data record 
                 $open = $F[1]+0; # opening price 
                 $high = $F[2]+0; # day's high 
                 $low = $F[3]+0; # day's low 
                 $close = $F[4]+0; # closing price 
                 $trdays++ if $position != 0; # days in trade 
  
                 if ($rollflag) {# this is a rollover day 
                         &backadjust; # back adjust data 
                         &rolltrade; # do rollover trade 
                         &newdata; # update data buffer/stops 
                         $rollflag = 0; # reset flag 
                         printf ("%s %d Rollover %6g %12.9g\n", 
                             $contract, $days, $date, $offset); 
                 } 
                 else {# regular day 
                         &trades; # simulate any trades 
                         &newdata; # update data buffer/stops 
                 } 
         } 
 } 
 $stop = time(); $minutes = ($stop - $start)/60; # elapsed time 
 printf ("%s %d Elapsed minutes=%6g\n", 
   $contract, $days, $minutes); 
 printf OUTPUT ("%s %d Elapsed minutes=%6g\n", 
   $contract, $days, $minutes); 
 close(INPUT); close(OUTPUT); # close files 
  
 sub rolltrade { # trades on rollover day 
         return if $#high < ($days - 1); # not enough data 
         if ($open >= $buystop && $position != 1) { 
                 &closeshort($open - $offset); # close short 
                 &openlong($open); # open new long 
         } 
  
         elsif ($open <= $sellstop && $position != -1) { 
                 &closelong($open - $offset); # close long 
                 &openshort($open); # open new short 
         } 
         elsif ($high >= $buystop && $position != 1) { 
                 &closeshort($buystop - $offset); 
                 &openlong($buystop); 
         } 
  
         elsif ($low <= $sellstop && $position != -1) { 
                 &closelong($sellstop - $offset); 
                 &openshort($sellstop); 
         } 
         elsif ($position == -1) {# holding short 
                 &closeshort($close - $offset); # close 
                 &openshort($close); # open new 
         } 
  
         elsif ($position == 1) {# holding long 
                 &closelong($close - $offset); # close 
                 &openlong($close); # open new 
         } 
 } 
  
 sub backadjust { # adjust past price data on rollover day 
         for ($ix=0; $ix<=$#high; $ix++) { # adjust back data 
                 $high[$ix] += $offset; 
                 $low[$ix] += $offset; 
         } 
         $buystop += $offset; $sellstop += $offset; # and stops 
 } 
  
 sub trades { # simulate any trades for this day 
         return if $#high < ($days - 1); # not enough data 
         if ($open >= $buystop && $position != 1) { 
                 &closeshort($open); # close any open short 
                 &openlong($open); # open new long 
         } 
  
         elsif ($open <= $sellstop && $position != -1) { 
                 &closelong($open); # close any open long 
                 &openshort($open); # open new short 
         } 
         elsif ($high >= $buystop && $position != 1) { 
                 &closeshort($buystop); 
                 &openlong($buystop); 
         } 
  
         elsif ($low <= $sellstop && $position != -1) { 
                 &closelong($sellstop); 
                 &openshort($sellstop); 
         } 
 } 
  
 sub newdata { # add today's data, drop oldest point 
         push(@high, $high); # today's high 
         push(@low, $low); # today's low 
         if ($#high >= $days) { # buffer full 
                 shift(@high); shift(@low); # drop oldest 
         } 
         # search for stops 
         $buystop = $high[0]; $sellstop = $low[0]; # init 
         for ($ix=1; $ix<=$#high; $ix++) { # search 
                 $buystop = $high[$ix] if $high[$ix] > $buystop; 
                 $sellstop = $low[$ix] if $low[$ix] < $sellstop; 
         } 
 } 
 sub closeshort { # close out any short position 
         return if $position != -1; # not short -- go away 
         $price = $_[0]; # argument is price 
         # print to trade log 
         #print "$contract $days -1 "; 
         #printf ("%6g %12.9g %6g %12.9g %d\n", 
           #$opendate, $paid, $date, $price ,$trdays); 
         print OUTPUT "$contract $days -1 "; 
         printf OUTPUT ("%6g %12.9g %6g %12.9g %d\n", 
           $opendate, $paid, $date, $price ,$trdays); 
         $position = 0; # we're neutral 
 } 
 sub closelong { # close out any long position 
         return if $position != 1; # not long -- go away 
         $price = $_[0]; # argument is price 
  
         # print to trade log 
         #print "$contract $days  1 "; 
         #printf ("%6g %12.9g %6g %12.9g %d\n", 
           #$opendate, $paid, $date, $price ,$trdays); 
         print OUTPUT "$contract $days  1 "; 
         printf OUTPUT ("%6g %12.9g %6g %12.9g %d\n", 
           $opendate, $paid, $date, $price ,$trdays); 
         $position = 0; # we're neutral 
 } 
  
 sub openlong { 
         return if $position == 1; # already long -- go away 
         $paid = $_[0]; # argument is price 
         $trdays = 0; # days in trade 
         $position = 1; # we're now long 
         $opendate = $date; # remember when we opened trade 
 } 
 sub openshort { 
         return if $position == -1; # already short -- go away 
         $paid = $_[0]; # argument is price 
         $trdays = 0; # days in trade 
         $position = -1; # we're now short 
         $opendate = $date; # remember when we opened trade 
 } 
 </pre> 
 </body> 
 </html> 

Issue_05_Futures
2. stats.pl

Download stats.pl

 <html> 
 <head> 
 <title>stats.pl</title> 
 </head> 
 <body> 
 <h1>stats.pl</h1> 
 <pre> 
 # stats.pl -- basic statistics on trade logs 
 # M. Edward Borasky -- 27-DEC-96 
  
 $commslip = 100; # deduction for commission and slippage 
  
 # dollar table -- price*table value is contract value 
 %dollars = (); # allocate dollar table 
 $dollars{"c_"} = 50; # corn 
 $dollars{"dm"} = 1250; # Deutschemark 
 $dollars{"ed"} = 2500; # Eurodollars 
 $dollars{"fb"} = 1000; # five-year Treasuries 
 $dollars{"gc"} = 100; # COMEX gold 
 $dollars{"jy"} = 1250; # Japanese yen 
 $dollars{"s_"} = 50; # soybeans 
 $dollars{"si"} = 50; # COMEX silver 
 $dollars{"ty"} = 1000; # ten-year Treasuries 
 $dollars{"us"} = 1000; # US T-bonds {30-year} 
 $count = $sum = $sumsq = 0; # all lengths, all contracts 
 %ccount = %csum = %csumsq = (); # all lengths, each contract 
 %dcount = %dsum = %dsumsq = (); # each length, all contracts 
 %cdcount = %cdsum = %cdsumsq = (); # each length/contract combo 
  
 # open P/L record file 
 open (OUTPUT, "> record.out"); 
 # loop over trade logs 
 foreach $file (`dir /o /b /l *.prn`) { 
         chop ($file); 
         open (INPUT, $file); 
         print "Loading $file\n"; 
         &dostats; # load the data 
         close (INPUT); 
 }         
  
 close (OUTPUT); 
  
 # print statistics for contract / length combinations 
 foreach $key (sort(keys(%cdcount))) { 
         $mean = $cdsum{$key}/$cdcount{$key}; 
         $stdev = sqrt($cdsumsq{$key}/$cdcount{$key} - $mean**2); 
         $stderr = $stdev/sqrt($cdcount{$key}); 
         printf ("%s %10g %10g %10g %10.2f %10.2f %10.2f\n", 
           $key, $cdcount{$key}, $cdsum{$key}, $cdsumsq{$key}, 
           $mean, $stdev, $stderr); 
 } 
  
 # print statistics for each length 
 foreach $key (sort(keys(%dcount))) { 
         $mean = $dsum{$key}/$dcount{$key}; 
         $stdev = sqrt($dsumsq{$key}/$dcount{$key} - $mean**2); 
         $stderr = $stdev/sqrt($dcount{$key}); 
         printf ("%s %10g %10g %10g %10.2f %10.2f %10.2f\n", 
           $key, $dcount{$key}, $dsum{$key}, $dsumsq{$key}, 
           $mean, $stdev, $stderr); 
 } 
  
 # print statistics for each contract 
 foreach $key (sort(keys(%ccount))) { 
         $mean = $csum{$key}/$ccount{$key}; 
         $stdev = sqrt($csumsq{$key}/$ccount{$key} - $mean**2); 
         $stderr = $stdev/sqrt($ccount{$key}); 
         printf ("%s %10g %10g %10g %10.2f %10.2f %10.2f\n", 
           $key, $ccount{$key}, $csum{$key}, $csumsq{$key}, 
           $mean, $stdev, $stderr); 
 } 
  
 # print statistics for all trades 
 $mean = $sum/$count; 
 $stdev = sqrt($sumsq/$count - $mean**2); 
 $stderr = $stdev/sqrt($count); 
 $key = "Total"; 
 printf ("%s %10g %10g %10g %10.2f %10.2f %10.2f\n", 
   $key, $count, $sum, $sumsq, 
   $mean, $stdev, $stderr); 
 sub dostats { # accumulate statistics 
         while (<INPUT>) { 
                 chop ($_); # get rid of EOL 
                 @F = split (' ', $_); 
                 if ($F[2] eq "1" || $F[2] eq "-1") { 
                         $contract = $F[0]; 
                         $days = $F[1]; 
                         # compute profit from trade 
                         $profit = $dollars{$contract}*$F[2]* 
                           ($F[6]-$F[4]) - $commslip; 
                         printf OUTPUT  
                           ("%s %12.2f\n",  $_, $profit); 
                         $key = "$contract $days"; 
  
                         # compute counts 
                         $count++; 
                         $ccount{$contract}++; 
                         $dcount{$days}++;  
                         $cdcount{$key}++; 
  
                         # compute sums 
                         $sum += $profit; 
                         $csum{$contract} += $profit; 
                         $dsum{$days} += $profit;  
                         $cdsum{$key} += $profit; 
  
                         # compute sums of squares 
                         $sumsq += $profit**2; 
                         $csumsq{$contract} += $profit**2; 
                         $dsumsq{$days} += $profit**2;  
                         $cdsumsq{$key} += $profit**2; 
                 } 
         } 
 }         
 </pre> 
 </body> 
 </html> 

Issue_05_Futures
3. More Samples on Futures

  • Issue_05_Futures

                                                                                                                                   

Last update 1999/02/20

All Rights Reserved - (C) 1997 - 2008 by The Labs.Com

Top of Page

The Labs.Com