chiark / gitweb /
Better arbitrage display
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 7 Jun 2009 21:58:19 +0000 (22:58 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 7 Jun 2009 21:58:19 +0000 (22:58 +0100)
pctb/yppsc-commod-processor

index 92dbb0c4f118332801a4b5fb3abbef50c15cb876..5e4e03d59a6068d32d8866efde84682491720448 100755 (executable)
@@ -91,8 +91,87 @@ sub bs_p_bestprice ($) {
 our $arbitrage_only= 0;
 
 sub main__arbitrage () {
-    $arbitrage_only= 1;
-    main__bestprices();
+    my @arbs= ();
+    foreach $commod (sort keys %commod) {
+       $current= $commod{$commod};
+       my @buys=  @{ bs_p($commod,Buy, -1) };
+       my @sells= @{ bs_p($commod,Sell,+1) };
+       my $profit= 0;
+       my $cqty= 0;
+       my $info= '';
+       my $arbs= [];
+       for (;;) {
+#print Dumper($commod,\@buys,\@sells);
+           last unless @buys;
+           last unless @sells;
+           my $pricediff= $buys[0]{Price} - $sells[0]{Price};
+           last unless $pricediff > 0;
+           our $qty= 1000;
+           sub arb_check_qty (\@) {
+                my ($verbs) = @_;
+               my $vqty= $verbs->[0]{Qty};
+               return if $vqty =~ m/^\>/;
+               $qty= $vqty if $qty > $vqty;
+               return if $vqty;
+               my $verb= shift @$verbs;
+           }
+           arb_check_qty(@buys);
+           arb_check_qty(@sells);
+           next unless $qty;
+           my $tprofit= $qty*$pricediff;
+           $profit += $tprofit;
+           $cqty += $qty;
+           
+           $info.=
+               sprintf("%-13.13s| %-19.19s %4d| %-19.19s %4d|%3d x%3d =%3d\n",
+                      $commod,
+                      $buys[0]{Stall},$buys[0]{Price},
+                      $sells[0]{Stall},$sells[0]{Price},
+                      $qty, $pricediff, $tprofit);
+           sub arb_subtract_qty (\@) {
+               my ($verbs) = @_;
+               my $verb= shift @$verbs;
+               unshift @$verbs, {
+                    Stall => $verb->{Stall},
+                    Price => $verb->{Price},
+                    Qty => $verb->{Qty} - $qty
+               };
+           }
+           arb_subtract_qty(@buys);
+           arb_subtract_qty(@sells);
+        }
+       next unless $profit;
+       $info.=
+           sprintf("%-13.13s| %19s %4s| %19s %4s|%3d      %4d\n",
+                   $commod, '','', '','', $cqty, $profit);
+       push @arbs, { Profit => $profit, Info => $info };
+    }
+    my $allprofit;
+
+    return unless @arbs;
+    my $bigdiv= <<END;
+=============+=========================+=========================+=============
+END
+
+    print <<END or die $!;
+
+commodity    | seller             price| buyer              price| qty  ea prof
+END
+
+    my $div= $bigdiv;
+    foreach my $arb (sort {
+       $b->{Profit} <=> $a->{Profit};
+    } @arbs) {
+       print $div,$arb->{Info} or die $1;
+       $div= <<END;
+-------------+-------------------------+-------------------------+-------------
+END
+       $allprofit += $arb->{Profit};
+    }
+    print $bigdiv or die $!;
+    printf("%-13.13s  %19s %4s  %19s %4s %-5s %7d\n",
+          '', '','', '','', 'TOTAL', $allprofit)
+       or die $!;
 }
 
 sub main__bestprices () {
@@ -101,8 +180,6 @@ sub main__bestprices () {
        my $buys=  bs_p($commod,Buy, -1);
        my $sells= bs_p($commod,Sell,+1);
        if ($arbitrage_only) {
-           next unless @$buys and @$sells;
-           next unless $buys->[0]{Price} > $sells->[0]{Price};
        }
        printf("%-15.15s", $commod) or die $!;
        bs_p_bestprice($buys);