A Trade offer (engine class: trade) is X4’s representation of buy offers, sell offers, and trade orders (deals) . The same trade type covers all three — distinguished via .isbuyoffer / .isselloffer / .isoffer / .isorder flags.
Property Type Description .existsboolean Trade exists .availableboolean Trade exists and is available .isbuyofferboolean Is a buy offer .issellofferboolean Is a sell offer .isofferboolean Is an offer (buy or sell) .isorderboolean Is an order (accepted deal)
Property Type Description .buyercontainer Buyer container .sellercontainer Seller container .ownercontainer Owner (seller or buyer)
Property Type Description .wareware Trade ware .amountinteger Trade amount .desiredamountinteger Trade desired amount (may exceed affordable) .offeramountinteger Trade amount + reserved .offeramount.{$object}integer Trade amount + reserved for $object .minamountinteger Minimum trade amount .transferredamountinteger Wares transferred for this trade .destroyedamountinteger Wares destroyed for this trade .volumeinteger Total volume of trade amount .offervolumeinteger Trade volume + reserved .offervolume.{$object}integer Trade volume + reserved for $object .minvolumeinteger Volume of minimum amount
Property Type Description .pricemoney Total price of trade amount .unitpricemoney Price per single unit .minpricemoney Total price of minimum amount .relativepricefloat Current price between min and max (-1.0 to +1.0) .quantityfactorfloat Current/average price ratio .hasdynamicpriceboolean Price not fixed (e.g., player-set)
Property Type Description .stocklevelfloat Trade amount / target amount ratio .stocklevel.{$amount}float Amount / target amount ratio
Property Type Description .ispricelocked.{$container}boolean Price locked on $container’s trade partner
Property Type Description .bundleboolean Flagged for converting ammo/units → wares on transfer .unbundleboolean Flagged for converting ware → ammo/units on transfer
Property Type Description .ismissionboolean Trade spawned by mission cue .missioncuecue Mission cue used .tradeoffertrade Source trade offer (for orders)
Property Type Description .buyfreeboolean Buyer doesn’t spend money .buyfree.{$object}boolean Free for specific buyer .sellfreeboolean Seller doesn’t receive money .sellfree.{$object}boolean Free for specific seller
< set_value name = " $offers " exact = " $station.tradeoffers.sell.list " />
< do_for_each name = " $offer " in = " $offers " >
< write_to_logbook text = " $offer.ware.name + ': ' + $offer.unitprice + 'Cr' " />
< set_value name = " $price " exact = " $station.sellprices.{ware.advancedcomposites} " />
< do_if value = " $trade.ismission " >
< write_to_logbook text = " 'Mission offer: ' + $trade.missioncue.name " />
< set_value name = " $reserved " exact = " $trade.offeramount.{$myShip} " />
⚠ The same trade type covers offers AND orders. Always check .isoffer vs .isorder before assuming meaning.
⚠ .amount reflects current state; use .offeramount.{$object} for reservation-aware accounting when working with specific buyer/seller.
⚠ .price is the TOTAL — use .unitprice for per-unit calculations.
⚠ .relativeprice ranges -1.0 to +1.0 — not 0..1 or percentage. -1 = minimum price, +1 = maximum.
⚠ Mission trades may be .buyfree or .sellfree — your economy mod’s accounting must handle these.
⚠ .tradeoffer links orders back to source offers — useful for understanding fulfilment.
Action Purpose <create_trade_offer>Spawn a new trade offer <remove_trade_offer>Remove an offer <transfer_money>Money transfer (part of trade flow) <transfer_inventory>Ware transfer (part of trade flow)
Trade offer is the central economic abstraction. Stations expose them as .tradeoffers.*, missions create them programmatically, and the price mechanics drive the entire X4 economy.