|
|
@@ -26,7 +26,7 @@ def main() -> None:
|
|
|
for p in profits:
|
|
|
print(f'\033[53;1m{p.output:5} \033[53;32m{p.profit_per_area: 10,.0f} ', end='')
|
|
|
warnings = []
|
|
|
- if p.low_volume:
|
|
|
+ if p.average_traded_7d < p.output_per_day * 20:
|
|
|
warnings.append('low volume')
|
|
|
if p.logistics_per_area > 1.5:
|
|
|
warnings.append('heavy logistics')
|
|
|
@@ -73,7 +73,8 @@ def calc_profit(recipe: Recipe, buildings: typing.Mapping[str, Building], materi
|
|
|
capex=capex,
|
|
|
cost_per_day=cost_per_day,
|
|
|
logistics_per_area=logistics_per_area,
|
|
|
- low_volume=output_price.average_traded < output_per_day * 20)
|
|
|
+ output_per_day=output_per_day,
|
|
|
+ average_traded_7d=output_price.average_traded_7d)
|
|
|
|
|
|
def building_daily_cost(building: Building, prices: typing.Mapping[str, Price]) -> float:
|
|
|
consumption = {
|
|
|
@@ -131,9 +132,9 @@ class RawPrice(typing.TypedDict):
|
|
|
@dataclasses.dataclass(eq=False, frozen=True, slots=True)
|
|
|
class Price:
|
|
|
vwap: float
|
|
|
- average_traded: float
|
|
|
+ average_traded_7d: float
|
|
|
|
|
|
-@dataclasses.dataclass(eq=False, slots=True)
|
|
|
+@dataclasses.dataclass(eq=False, frozen=True, slots=True)
|
|
|
class Profit:
|
|
|
output: str
|
|
|
recipe: str
|
|
|
@@ -142,16 +143,11 @@ class Profit:
|
|
|
capex: float
|
|
|
cost_per_day: float
|
|
|
logistics_per_area: float
|
|
|
- low_volume: bool
|
|
|
- score: float = dataclasses.field(init=False)
|
|
|
-
|
|
|
- def __post_init__(self) -> None:
|
|
|
- self.score = self.profit_per_area
|
|
|
- if self.low_volume:
|
|
|
- self.score *= 0.2
|
|
|
+ output_per_day: float
|
|
|
+ average_traded_7d: float
|
|
|
|
|
|
def __lt__(self, other: Profit) -> bool:
|
|
|
- return self.score < other.score
|
|
|
+ return self.profit_per_area < other.profit_per_area
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
main()
|