This Mason component is the core trade planner for a specific route.
+========== TODO ==========
+16:36 <ceb> alpha,byrne,papaya,turtle,jorvik,luthien is my example
+
+16:39 <ceb> Also, maybe colour to highlight the suggested trades?
+
+16:40 <ceb> columns should be sortable with the small arrows as before
+
+16:46 <ceb> Also trading plan not functional but I guess you know that :-)
+
+use POST for update. Hrrm.
+
+LATER OR NOT AT ALL
+
+adjustable potential cost of losses (rather than fixed 1e-BIG per league)
+
+max volume/mass
+
+16:38 <ceb> I don't know how hard this is, but can you show only the suggested
+ trades to start ith and have a button to show all?
+========== TODO ==========
+
</%doc>
<%args>
$dbh
</%args>
<%perl>
+my $loss_per_league= 1e-7;
+
my @flow_conds;
my @query_params;
commods.commodid commodid,
commods.unitmass unitmass,
commods.unitvolume unitvolume,
+ dist dist,
buy.price - sell.price unitprofit
FROM commods
JOIN buy on commods.commodid = buy.commodid
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)."
}
$addcols->({ Text => 1 }, qw(commodname));
$addcols->({},
- qw( org_qty org_price dst_qty dst_price
+ qw( org_price org_qty dst_price dst_qty
Margin unitprofit MaxQty
MaxCapital MaxProfit
));
$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'};
+
my @uid= $f->{commodid};
foreach my $od (qw(org dst)) {
push @uid,
die "$f->{UidLong} = $f->{UidShort} = $recons_long ?";
}
- if ($qa->{"R$f->{UidShort}"} && !$qa->{"T$f->{UidShort}"}) {
+ if (defined $qa->{"R$f->{UidShort}"} &&
+ !defined $qa->{"T$f->{UidShort}"}) {
$f->{Suppress}= 1;
}
totalprofit:
".(join " +
- ", map { "$_->{unitprofit} $_->{Var}" } @flows)."
+ ", map {
+ sprintf "%.20f %s", $_->{ExpectedUnitProfit}, $_->{Var}
+ } @flows)."
Subject To
";
<th colspan=2>Profit
<th colspan=3>Max
% if ($optimise) {
-<th colspan=3>Suggested
+<th colspan=3>Planned
% }
<tr>
<th>Island <% $cdstall %>
<th>Island <% $cdstall %>
<th>Commodity
-<th>Qty
<th>Price
<th>Qty
<th>Price
+<th>Qty
<th>Margin
<th>Unit
<th>Qty
<input type=submit name=update value="Update">
+% if ($optimise) { # ========== TRADING PLAN ==========
+%
+% my $iquery= $dbh->prepare('SELECT islandname FROM islands
+% WHERE islandid = ?');
+%
+<h1>Voyage trading plan</h1>
+<table>
+% foreach my $i (0..$#islandids) {
+<tr><td colspan=4><strong>
+% $iquery->execute($islandids[$i]);
+% my ($islandname) = $iquery->fetchrow_array();
+% if (!$i) {
+Start at <% $islandname |h %>
+% } else {
+Sail to <% $islandname |h %>
+% }
+</strong>
+% 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};
+<tr>Buy or sell flow
+% }
+% }
+% }
+</table>
+%
+% } # ========== TRADING PLAN ==========
+
<%init>
use CommodsWeb;
use Commods;