X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Fweb%2Froutetrade;h=e4e583a83a190f1f33a77411c8533fdf50b505a8;hb=2cf70baa979e0c460e4e46a9c1a53677b09a1972;hp=0adf9920bbbc6bb96bd0f05ad0f7d4fa78ece764;hpb=73e2dfca626db42870a6e1342f7f7ead4a5a819e;p=ypp-sc-tools.db-test.git diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade index 0adf992..e4e583a 100644 --- a/yarrg/web/routetrade +++ b/yarrg/web/routetrade @@ -35,8 +35,6 @@ ========== TODO ========== 16:36 alpha,byrne,papaya,turtle,jorvik,luthien is my example -16:46 Also trading plan not functional but I guess you know that :-) - use POST for update. Hrrm. LATER OR NOT AT ALL @@ -54,8 +52,13 @@ $dbh @archipelagoes $qa +<&| script &> + da_pageload= Date.now(); + + <%perl> +my $now= time; my $loss_per_league= 1e-7; my @flow_conds; @@ -115,21 +118,29 @@ my $stmt= " SELECT sell_islands.islandname org_name, sell_islands.islandid org_id, sell.price org_price, + sell.qty org_qty_stall, + sell_stalls.stallname org_stallname, + sell.stallid org_stallid, sell_uploads.timestamp org_timestamp, buy_islands.islandname dst_name, buy_islands.islandid dst_id, buy.price dst_price, + buy.qty dst_qty_stall, + buy_stalls.stallname dst_stallname, + buy.stallid dst_stallid, buy_uploads.timestamp dst_timestamp, ".($qa->{ShowStalls} ? " - sell.stallid org_stallid, - sell_stalls.stallname org_stallname, - sell.qty org_qty, - buy.stallid dst_stallid, - buy_stalls.stallname dst_stallname, - buy.qty dst_qty, + sell.qty org_qty_agg, + buy.qty dst_qty_agg, " : " - sum(sell.qty) org_qty, - sum(buy.qty) dst_qty, + (SELECT sum(qty) FROM sell AS sell_agg + WHERE sell_agg.commodid = commods.commodid + AND sell_agg.islandid = sell.islandid + AND sell_agg.price = sell.price) org_qty_agg, + (SELECT sum(qty) FROM buy AS buy_agg + WHERE buy_agg.commodid = commods.commodid + AND buy_agg.islandid = buy.islandid + AND buy_agg.price = buy.price) dst_qty_agg, ")." commods.commodname commodname, commods.commodid commodid, @@ -138,27 +149,23 @@ my $stmt= " dist dist, buy.price - sell.price unitprofit FROM commods - JOIN buy ON commods.commodid = buy.commodid JOIN sell ON commods.commodid = sell.commodid + JOIN buy ON commods.commodid = buy.commodid JOIN islands AS sell_islands ON sell.islandid = sell_islands.islandid JOIN islands AS buy_islands ON buy.islandid = buy_islands.islandid JOIN uploads AS sell_uploads ON sell.islandid = sell_uploads.islandid JOIN uploads AS buy_uploads ON buy.islandid = buy_uploads.islandid -".($qa->{ShowStalls} ? " JOIN stalls AS sell_stalls ON sell.stallid = sell_stalls.stallid JOIN stalls AS buy_stalls ON buy.stallid = buy_stalls.stallid -" : "")." JOIN dists ON aiid = sell.islandid AND biid = buy.islandid WHERE ( ".join(" OR ", @flow_conds)." ) AND buy.price > sell.price -".($qa->{ShowStalls} ? "" : " - GROUP BY commods.commodid, org_id, org_price, dst_id, dst_price -")." ORDER BY org_name, dst_name, commodname, unitprofit DESC, - org_price, dst_price DESC + org_price, dst_price DESC, + org_stallname, dst_stallname "; my $sth= $dbh->prepare($stmt); @@ -188,8 +195,13 @@ if ($qa->{ShowStalls}) { } $addcols->({ Text => 1 }, qw(commodname)); $addcols->({ DoReverse => 1 }, - qw( org_price org_qty dst_price dst_qty - Margin unitprofit MaxQty + qw( org_price org_qty_agg dst_price dst_qty_agg + )); +$addcols->({ DoReverse => 1, SortColKey => 'MarginSortKey' }, + qw( Margin + )); +$addcols->({ DoReverse => 1 }, + qw( unitprofit MaxQty MaxCapital MaxProfit )); @@ -204,27 +216,57 @@ $addcols->({ DoReverse => 1 }, <& dumptable:start, qa => $qa, sth => $sth &> % { -% my $f; -% while ($f= $sth->fetchrow_hashref()) { +% my $got; +% while ($got= $sth->fetchrow_hashref()) { <%perl> - $f->{Ix}= @flows; - $f->{Var}= "f$f->{Ix}"; + my $f= $flows[$#flows]; + if ( !$f || + $qa->{ShowStalls} || + grep { $f->{$_} ne $got->{$_} } + qw(org_id org_price dst_id dst_price commodid) + ) { + # Make a new flow rather than adding to the existing one + + $f= { + Ix => scalar(@flows), + Var => "f".@flows, + %$got + }; + $f->{"org_stallid"}= $f->{"dst_stallid"}= 'all' + if !$qa->{ShowStalls}; + push @flows, $f; + } + foreach my $od (qw(org dst)) { + $f->{"${od}Stalls"}{ + $got->{"${od}_stallname"} + } = + $got->{"${od}_qty_stall"} + ; + } + + +<& dumptable:row, qa => $qa, sth => $sth, row => $f &> +% } +<& dumptable:end, qa => $qa &> +% } + +<%perl> +foreach my $f (@flows) { - $f->{MaxQty}= $f->{'org_qty'} < $f->{'dst_qty'} - ? $f->{'org_qty'} : $f->{'dst_qty'}; + $f->{MaxQty}= $f->{'org_qty_agg'} < $f->{'dst_qty_agg'} + ? $f->{'org_qty_agg'} : $f->{'dst_qty_agg'}; $f->{MaxProfit}= $f->{MaxQty} * $f->{'unitprofit'}; $f->{MaxCapital}= $f->{MaxQty} * $f->{'org_price'}; + $f->{MarginSortKey}= sprintf "%d", + $f->{'dst_price'} * 10000 / $f->{'org_price'}; $f->{Margin}= sprintf "%3.1f%%", $f->{'dst_price'} * 100.0 / $f->{'org_price'} - 100.0; - $f->{"org_stallid"}= $f->{"dst_stallid"}= 'all' - if !$qa->{ShowStalls}; - $f->{ExpectedUnitProfit}= $f->{'dst_price'} * (1.0 - $loss_per_league) ** $f->{'dist'} - - $f->{'src_price'}; + - $f->{'org_price'}; my @uid= $f->{commodid}; foreach my $od (qw(org dst)) { @@ -294,13 +336,8 @@ die "$cmpu $uue ?" if length $cmpu > 20; $f->{Suppress}= 1; } - push @flows, $f; - +} -<& dumptable:row, qa => $qa, sth => $sth, row => $f &> -% } -<& dumptable:end, qa => $qa &> -% } % my $optimise= $specific && !$confusing && @islandids>1; % if (!$optimise) { @@ -352,7 +389,7 @@ foreach my $flow (@flows) { ); push @{ $avail_csts{$cstname}{Flows} }, $flow->{Var}; - $avail_csts{$cstname}{Qty}= $flow->{"${od}_qty"}; + $avail_csts{$cstname}{Qty}= $flow->{"${od}_qty_agg"}; } } foreach my $cstname (sort keys %avail_csts) { @@ -489,7 +526,9 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw( % my $v= $flow->{$col->{Name}}; % $col->{Total} += $v if defined $col->{Total}; % $v='' if !$col->{Text} && !$v; -% $ts_sortkeys{$ci}{$rowid}= $v; +% my $sortkey= $col->{SortColKey} ? +% $flow->{$col->{SortColKey}} : $v; +% $ts_sortkeys{$ci}{$rowid}= $sortkey; {Text} ? '' : 'align=right' %>><% $v |h %> % } % } @@ -521,11 +560,13 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw( % % my $iquery= $dbh->prepare('SELECT islandname FROM islands % WHERE islandid = ?'); +% my %da_ages; %

Voyage trading plan

- +
% foreach my $i (0..$#islandids) { - + % } - +<<% $td %>><% $collectdeliver %> +<<% $td %>><% $t->{'commodname'} |h %> +% +% my @stalls= sort keys %{ $t->{Stalls} }; +% my $pstall= sub { +% my $name= $stalls[$_[0]]; + +% $pstall->($stallix); % } - +
+
% $iquery->execute($islandids[$i]); % my ($islandname) = $iquery->fetchrow_array(); % if (!$i) { @@ -534,61 +575,108 @@ Start at <% $islandname |h %> Sail to <% $islandname |h %> % } -% foreach my $od (qw(dst org)) { -% my $sign= $od eq 'dst' ? -1 : +1; -% my %todo; -% foreach my $f (@flows) { -% next if $f->{Suppress}; -% next unless $f->{"${od}_id"} == $islandids[$i]; -% next unless $f->{OptQty}; -% my $price= $f->{"${od}_price"}; -% my $stallname= $f->{"${od}_stallname"}; -% my $todo= \$todo{ $f->{'commodname'}, -% (sprintf "%07d", $price), -% $stallname }; -% $$todo= { } unless $$todo; -% $$todo->{'commodname'}= $f->{'commodname'}; -% $$todo->{'stallname'}= $stallname; -% $$todo->{Price} += $price; -% $$todo->{Qty} += $f->{OptQty}; -% $$todo->{Total} = $$todo->{Price} * $$todo->{Qty}; -% $$todo->{Timestamp} = $f->{"${od}_timestamp"}; -% } -% my $total= 0; -% my $dline= 0; -% foreach my $tkey (sort keys %todo) { -% my $t= $todo{$tkey}; -% $total += $t->{Total}; -
-% if ($od eq 'org') { -Collect -% } else { -Deliver +<%perl> + my $age_reported= 0; + my %flowlists; + foreach my $od (qw(org dst)) { + foreach my $f (@flows) { + next if $f->{Suppress}; + next unless $f->{"${od}_id"} == $islandids[$i]; + next unless $f->{OptQty}; + my $price= $f->{"${od}_price"}; + my $stallname= $f->{"${od}_stallname"}; + my $todo= \$flowlists{$od}{ + $f->{'commodname'}, + (sprintf "%07d", $price), + $stallname + }; + $$todo= { + Qty => 0, + orgArbitrage => 0, + dstArbitrage => 0, + } unless $$todo; + $$todo->{'commodname'}= $f->{'commodname'}; + $$todo->{'stallname'}= $stallname; + $$todo->{Price}= $price; + $$todo->{Timestamp}= $f->{"${od}_timestamp"}; + $$todo->{Qty} += $f->{OptQty}; + $$todo->{Total}= $$todo->{Price} * $$todo->{Qty}; + $$todo->{Stalls}= $f->{"${od}Stalls"}; + if ($f->{'org_id'} == $f->{'dst_id'}) { + $$todo->{"${od}Arbitrage"}= 1; + } + } + } + + my $total; + my $dline= 0; + my $show_flows= sub { + my ($od,$arbitrage,$collectdeliver) = @_; + +% +% my $todo= $flowlists{$od}; +% return unless $todo; +% foreach my $tkey (sort keys %$todo) { +% my $t= $todo->{$tkey}; +% next if $t->{"${od}Arbitrage"} != $arbitrage; +% if (!$age_reported++) { +% my $age= $now - $t->{Timestamp}; +% my $cellid= "da_${i}"; +% $da_ages{$cellid}= $age; +\ +(Data age: <% prettyprint_age($age) %>) +% } elsif (!defined $total) { +% $total= 0; +
<% $t->{'commodname'} |h %> -<% $t->{Price} |h %> each -% if ($qa->{ShowStalls}) { -<% $t->{'stallname'} |h %> +% $total += $t->{Total}; +% my $span= 0 + keys %{ $t->{Stalls} }; +% my $td= "td rowspan=$span"; +
<% $name |h %> +% }; +% +% $pstall->(0); +<<% $td %> align=right><% $t->{Price} |h %> poe ea. +<<% $td %> align=right><% $t->{Qty} |h %> unit(s) +<<% $td %> align=right><% $t->{Total} |h %> total +% +% foreach my $stallix (1..$#stalls) { +
<% $t->{Qty} |h %> unit(s) -<% $t->{Total} |h %> total +% % $dline ^= 1; % } -% if (%todo) { -
-{ShowStalls} %>> -<% (values %todo)[0]->{Timestamp} %> - -% if ($od eq 'org') { -Outlay -% } else { -Proceeds -% } +% }; +% my $show_total= sub { +% my ($totaldesc)= @_; +% if (defined $total) { +
+<% $totaldesc %> <% $total |h %> total % } -% } -% } +% $total= undef; +% $dline= 0; +<%perl> + }; + + $show_flows->('org',1,'Collect'); $show_total->('(Arbitrage) outlay'); + $show_flows->('dst',1,'Deliver'); + $show_flows->('dst',0,'Deliver'); $show_total->('Proceeds'); + $show_flows->('org',0,'Collect'); $show_total->('Outlay'); + +} +
+<& query_age:dataages, id2age => \%da_ages &> % % } # ========== TRADING PLAN ==========