mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-12-18 20:25:45 +01:00
Minor rebalancing to stock market. Updated documentation and tests for recent changes
This commit is contained in:
parent
7301946236
commit
931de230ae
@ -28,6 +28,27 @@ a stock.
|
|||||||
.. note:: Shorting stocks is not available immediately, and must be unlocked later in the
|
.. note:: Shorting stocks is not available immediately, and must be unlocked later in the
|
||||||
game.
|
game.
|
||||||
|
|
||||||
|
Forecast & Second-Order Forecast
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
A stock's forecast is its likelihood of increasing or decreasing in value. The
|
||||||
|
forecast is typically represented by its probability of increasing in either
|
||||||
|
a decimal or percentage form. For example, a forecast of 70% means the stock
|
||||||
|
has a 70% chance of increasing and a 30% chance of decreasing.
|
||||||
|
|
||||||
|
A stock's second-order forecast is the target value that its forecast trends towards.
|
||||||
|
For example, if a stock has a forecast of 60% and a second-order forecast of 70%,
|
||||||
|
then the stock's forecast should slowly trend towards 70% over time. However, this is
|
||||||
|
determined by RNG so there is a chance that it may never reach 70%.
|
||||||
|
|
||||||
|
Both the forecast and the second-order forecast change over time.
|
||||||
|
|
||||||
|
A stock's forecast can be viewed after purchasing Four Sigma (4S) Market Data
|
||||||
|
access. This lets you see the forecast info on the Stock Market UI. If you also
|
||||||
|
purchase access to the 4S Market Data TIX API, then you can view a stock's forecast
|
||||||
|
using the :js:func:`getStockForecast` function.
|
||||||
|
|
||||||
|
A stock's second-order forecast is always hidden.
|
||||||
|
|
||||||
.. _gameplay_stock_market_spread:
|
.. _gameplay_stock_market_spread:
|
||||||
|
|
||||||
Spread (Bid Price & Ask Price)
|
Spread (Bid Price & Ask Price)
|
||||||
@ -53,11 +74,14 @@ in the short position will occur at the stock's ask price.
|
|||||||
|
|
||||||
Transactions Influencing Stock Forecast
|
Transactions Influencing Stock Forecast
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
In addition to influencing stock price, buying or selling a large number of shares
|
Buying or selling a large number of shares
|
||||||
of a stock will also influence that stock's "forecast". The forecast is the likelihood
|
of a stock will influence that stock's forecast & second-order forecast.
|
||||||
that the stock will increase or decrease in price. The magnitude of this effect depends
|
The forecast is the likelihood that the stock will increase or decrease in price.
|
||||||
on the number of shares being transacted. More shares will have a bigger effect on the
|
The magnitude of this effect depends on the number of shares being transacted.
|
||||||
stock forecast.
|
More shares will have a bigger effect.
|
||||||
|
|
||||||
|
The effect that transactions have on a stock's second-order forecast is
|
||||||
|
significantly smaller than the effect on its forecast.
|
||||||
|
|
||||||
.. _gameplay_stock_market_order_types:
|
.. _gameplay_stock_market_order_types:
|
||||||
|
|
||||||
@ -109,16 +133,6 @@ A Stop Order to buy will execute if the stock's price <= order's price
|
|||||||
|
|
||||||
A Stop Order to sell will execute if the stock's price >= order's price.
|
A Stop Order to sell will execute if the stock's price >= order's price.
|
||||||
|
|
||||||
.. note:: Stop Orders do **not** take into account the fact that transactions can
|
|
||||||
influence a stock's price. Limit Orders, however, do take this into account.
|
|
||||||
|
|
||||||
For example, assume you have a Limit Order set to purchase a stock at
|
|
||||||
$5. Then, the stock's price drops to $5 and your Limit Order executes.
|
|
||||||
However, the transaction causes the stock's price to increase before
|
|
||||||
the order finishes executing all of the shares. Your Limit Order will
|
|
||||||
stop executing, and will continue only when the stock's price drops back to
|
|
||||||
$5 or below.
|
|
||||||
|
|
||||||
.. _gameplay_stock_market_player_actions_influencing_stock:
|
.. _gameplay_stock_market_player_actions_influencing_stock:
|
||||||
|
|
||||||
Player Actions Influencing Stocks
|
Player Actions Influencing Stocks
|
||||||
@ -127,8 +141,8 @@ It is possible for your actions elsewhere in the game to influence the stock mar
|
|||||||
|
|
||||||
Hacking
|
Hacking
|
||||||
If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff
|
If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff
|
||||||
stock), then hacking that server can
|
stock), then hacking that server can decrease the stock's second-order
|
||||||
cause the corresponding stock's forecast to trend downwards in value
|
forecast. This causes the corresponding stock's forecast to trend downwards in value
|
||||||
over time.
|
over time.
|
||||||
|
|
||||||
This effect only occurs if you set the *stock* option to
|
This effect only occurs if you set the *stock* option to
|
||||||
@ -142,7 +156,8 @@ Hacking
|
|||||||
|
|
||||||
Growing
|
Growing
|
||||||
If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff
|
If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff
|
||||||
stock), then growing that server's money can cause the corresponding stock's
|
stock), then growing that server's money can increase the stock's
|
||||||
|
second-order forecast. This causes the corresponding stock's
|
||||||
forecast to trend upwards in value over time.
|
forecast to trend upwards in value over time.
|
||||||
|
|
||||||
This effect only occurs if you set the *stock* option to true when calling the
|
This effect only occurs if you set the *stock* option to true when calling the
|
||||||
@ -155,11 +170,12 @@ Growing
|
|||||||
|
|
||||||
Working for a Company
|
Working for a Company
|
||||||
If a company has a corresponding stock, then working for that company will
|
If a company has a corresponding stock, then working for that company will
|
||||||
cause the corresponding stock's forecast to (slowly) trend upwards in value
|
increase the corresponding stock's second-order forecast. This will
|
||||||
|
cause the stock's forecast to (slowly) trend upwards in value
|
||||||
over time.
|
over time.
|
||||||
|
|
||||||
The potency of this effect is based on how "effective" you are when you work
|
The potency of this effect is based on how "effective" you are when you work
|
||||||
(i.e. its based on your stats).
|
(i.e. its based on your stats and multipliers).
|
||||||
|
|
||||||
Automating the Stock Market
|
Automating the Stock Market
|
||||||
---------------------------
|
---------------------------
|
||||||
|
@ -71,7 +71,7 @@ export function influenceStockThroughCompanyWork(company: Company, performanceMu
|
|||||||
}
|
}
|
||||||
if (!(stock instanceof Stock)) { return; }
|
if (!(stock instanceof Stock)) { return; }
|
||||||
|
|
||||||
if (Math.random() < 0.001 * cyclesOfWork) {
|
if (Math.random() < 0.002 * cyclesOfWork) {
|
||||||
const change = forecastForecastChangeFromCompanyWork * performanceMult;
|
const change = forecastForecastChangeFromCompanyWork * performanceMult;
|
||||||
stock.changeForecastForecast(stock.otlkMagForecast + change);
|
stock.changeForecastForecast(stock.otlkMagForecast + change);
|
||||||
}
|
}
|
||||||
|
@ -185,9 +185,7 @@ export function stockMarketCycle() {
|
|||||||
if (!(stock instanceof Stock)) { continue; }
|
if (!(stock instanceof Stock)) { continue; }
|
||||||
|
|
||||||
const roll = Math.random();
|
const roll = Math.random();
|
||||||
if (roll < 0.1) {
|
if (roll < 0.45) {
|
||||||
stock.flipForecastForecast();
|
|
||||||
} else if (roll < 0.55) {
|
|
||||||
stock.b = !stock.b;
|
stock.b = !stock.b;
|
||||||
stock.flipForecastForecast();
|
stock.flipForecastForecast();
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,9 @@ export function StockTickerHeaderText(props: IProps): React.ReactElement {
|
|||||||
let plusOrMinus = stock.b; // True for "+", false for "-"
|
let plusOrMinus = stock.b; // True for "+", false for "-"
|
||||||
if (stock.otlkMag < 0) { plusOrMinus = !plusOrMinus }
|
if (stock.otlkMag < 0) { plusOrMinus = !plusOrMinus }
|
||||||
hdrText += (plusOrMinus ? "+" : "-").repeat(Math.floor(Math.abs(stock.otlkMag) / 10) + 1);
|
hdrText += (plusOrMinus ? "+" : "-").repeat(Math.floor(Math.abs(stock.otlkMag) / 10) + 1);
|
||||||
hdrText += ` - ${stock.getAbsoluteForecast()} / ${stock.otlkMagForecast}`;
|
|
||||||
|
// Debugging:
|
||||||
|
// hdrText += ` - ${stock.getAbsoluteForecast()} / ${stock.otlkMagForecast}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
let styleMarkup = {
|
let styleMarkup = {
|
||||||
|
@ -1293,7 +1293,7 @@ describe("Stock Market Tests", function() {
|
|||||||
|
|
||||||
// Use 1e3 for numCycles to force a change
|
// Use 1e3 for numCycles to force a change
|
||||||
// (This may break later if numbers are rebalanced);
|
// (This may break later if numbers are rebalanced);
|
||||||
influenceStockThroughCompanyWork(company, 1, 1e3);
|
influenceStockThroughCompanyWork(company, 1, 500);
|
||||||
expect(stock.otlkMagForecast).to.equal(oldSecondOrderForecast + forecastForecastChangeFromCompanyWork);
|
expect(stock.otlkMagForecast).to.equal(oldSecondOrderForecast + forecastForecastChangeFromCompanyWork);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user