X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Fweb%2Froutetrade;h=eadc473d4b23dac47885d569b89a79d12a741ae5;hb=880b063ca880504e85bbeba2e37fc8faa187947e;hp=c135e67bc5b16a69452fec1a559f332eebf1a5cd;hpb=c20deee42fbd2d86e976bb6a2e4f8e5f5cf2631b;p=ypp-sc-tools.db-live.git diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade index c135e67..eadc473 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,19 +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, -".($qa->{ShowStalls} ? " - sell.stallid org_stallid, - sell_stalls.stallname org_stallname, - sell.qty org_qty, - buy.stallid dst_stallid, + buy.qty dst_qty_stall, buy_stalls.stallname dst_stallname, - buy.qty dst_qty, + buy.stallid dst_stallid, + buy_uploads.timestamp dst_timestamp, +".($qa->{ShowStalls} ? " + 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, @@ -136,25 +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 -".($qa->{ShowStalls} ? " + JOIN uploads AS sell_uploads ON sell.islandid = sell_uploads.islandid + JOIN uploads AS buy_uploads ON buy.islandid = buy_uploads.islandid 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); @@ -184,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 )); @@ -200,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 &> +% } - $f->{MaxQty}= $f->{'org_qty'} < $f->{'dst_qty'} - ? $f->{'org_qty'} : $f->{'dst_qty'}; +<%perl> +foreach my $f (@flows) { + + $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)) { @@ -290,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) { @@ -348,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) { @@ -485,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 %> % } % } @@ -517,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) { - + +% } +% $total += $t->{Total}; +% my $span= 0 + keys %{ $t->{Stalls} }; +% my $td= "td rowspan=$span"; + +<<% $td %>><% $collectdeliver %> +<<% $td %>><% $t->{'commodname'} |h %> +% +% my @stalls= sort keys %{ $t->{Stalls} }; +% my $pstall= sub { +% my $name= $stalls[$_[0]]; + +% $pstall->($stallix); +% } +% +% $dline ^= 1; % } -% } -% } +% }; +% my $show_total= sub { +% my ($totaldesc)= @_; +% if (defined $total) { + +
+
% $iquery->execute($islandids[$i]); % my ($islandname) = $iquery->fetchrow_array(); % if (!$i) { @@ -530,21 +575,109 @@ Start at <% $islandname |h %> Sail to <% $islandname |h %> % } -% foreach my $od (qw(dst org)) { -% my $sign= $od eq 'dst' ? -1 : +1; -% foreach my $f (sort { -% $a->{'commodname'} cmp $b->{'commodname'} -% or $sign * ($a->{"${od}_price"} <=> $b->{"${od}_price"}) -% or $a->{"${od}_stallname"} cmp $b->{"${od}_stallname"} -% } @flows) { -% next if $f->{Suppress}; -% next unless $f->{"${od}_id"} == $islandids[$i]; -% next unless $f->{OptQty}; -
Buy or sell flow +<%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", ($od eq 'dst' ? + 9999999-$price : $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; +
<% $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) { +
+<% $totaldesc %> +<% $total |h %> total +% } +% $total= undef; +% $dline= 0; +<%perl> + }; + + $show_flows->('dst',0,'Deliver'); $show_total->('Proceeds'); + $show_flows->('org',1,'Collect'); $show_total->('(Arbitrage) outlay'); + $show_flows->('dst',1,'Deliver'); $show_total->('(Arbitrage) proceeds'); + $show_flows->('org',0,'Collect'); $show_total->('Outlay'); + +} +
+<& query_age:dataages, id2age => \%da_ages &> % % } # ========== TRADING PLAN ==========