diff --git a/docs/bot-basics.md b/docs/bot-basics.md index 9f4ef8277..3f16cbc4c 100644 --- a/docs/bot-basics.md +++ b/docs/bot-basics.md @@ -29,7 +29,7 @@ By default, loop runs every few seconds (`internals.process_throttle_secs`) and * Call `bot_loop_start()` strategy callback. * Analyze strategy per pair. * Call `populate_indicators()` - * Call `populate_buy_trend()` + * Call `populate_entry_trend()` * Call `populate_sell_trend()` * Check timeouts for open orders. * Calls `check_buy_timeout()` strategy callback for open buy orders. @@ -55,7 +55,7 @@ This loop will be repeated again and again until the bot is stopped. * Load historic data for configured pairlist. * Calls `bot_loop_start()` once. * Calculate indicators (calls `populate_indicators()` once per pair). -* Calculate buy / sell signals (calls `populate_buy_trend()` and `populate_sell_trend()` once per pair). +* Calculate buy / sell signals (calls `populate_entry_trend()` and `populate_sell_trend()` once per pair). * Loops per candle simulating entry and exit points. * Confirm trade buy / sell (calls `confirm_trade_entry()` and `confirm_trade_exit()` if implemented in the strategy). * Call `custom_entry_price()` (if implemented in the strategy) to determine entry price (Prices are moved to be within the opening candle). diff --git a/docs/hyperopt.md b/docs/hyperopt.md index bab81fb31..f67616a02 100644 --- a/docs/hyperopt.md +++ b/docs/hyperopt.md @@ -180,7 +180,7 @@ Hyperopt will first load your data into memory and will then run `populate_indic Hyperopt will then spawn into different processes (number of processors, or `-j `), and run backtesting over and over again, changing the parameters that are part of the `--spaces` defined. -For every new set of parameters, freqtrade will run first `populate_buy_trend()` followed by `populate_sell_trend()`, and then run the regular backtesting process to simulate trades. +For every new set of parameters, freqtrade will run first `populate_entry_trend()` followed by `populate_sell_trend()`, and then run the regular backtesting process to simulate trades. After backtesting, the results are passed into the [loss function](#loss-functions), which will evaluate if this result was better or worse than previous results. Based on the loss function result, hyperopt will determine the next set of parameters to try in the next round of backtesting. @@ -190,7 +190,7 @@ Based on the loss function result, hyperopt will determine the next set of param There are two places you need to change in your strategy file to add a new buy hyperopt for testing: * Define the parameters at the class level hyperopt shall be optimizing. -* Within `populate_buy_trend()` - use defined parameter values instead of raw constants. +* Within `populate_entry_trend()` - use defined parameter values instead of raw constants. There you have two different types of indicators: 1. `guards` and 2. `triggers`. @@ -274,7 +274,7 @@ The last one we call `trigger` and use it to decide which buy trigger we want to So let's write the buy strategy using these values: ```python - def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: conditions = [] # GUARDS AND TRENDS if self.buy_adx_enabled.value: @@ -301,7 +301,7 @@ So let's write the buy strategy using these values: return dataframe ``` -Hyperopt will now call `populate_buy_trend()` many times (`epochs`) with different value combinations. +Hyperopt will now call `populate_entry_trend()` many times (`epochs`) with different value combinations. It will use the given historical data and simulate buys based on the buy signals generated with the above function. Based on the results, hyperopt will tell you which parameter combination produced the best results (based on the configured [loss function](#loss-functions)). @@ -364,7 +364,7 @@ class MyAwesomeStrategy(IStrategy): return dataframe - def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: conditions = [] conditions.append(qtpylib.crossed_above( dataframe[f'ema_short_{self.buy_ema_short.value}'], dataframe[f'ema_long_{self.buy_ema_long.value}'] diff --git a/docs/strategy-advanced.md b/docs/strategy-advanced.md index b5d0ef8b9..35faa9a9c 100644 --- a/docs/strategy-advanced.md +++ b/docs/strategy-advanced.md @@ -83,7 +83,7 @@ When your strategy has multiple buy signals, you can name the signal that trigge Then you can access you buy signal on `custom_sell` ```python -def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: +def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['rsi'] < 35) & diff --git a/docs/strategy-customization.md b/docs/strategy-customization.md index 4261eeda9..38da3e6b1 100644 --- a/docs/strategy-customization.md +++ b/docs/strategy-customization.md @@ -101,7 +101,7 @@ With this section, you have a new column in your dataframe, which has `1` assign Buy and sell strategies need indicators. You can add more indicators by extending the list contained in the method `populate_indicators()` from your strategy file. -You should only add the indicators used in either `populate_buy_trend()`, `populate_sell_trend()`, or to populate another indicator, otherwise performance may suffer. +You should only add the indicators used in either `populate_entry_trend()`, `populate_sell_trend()`, or to populate another indicator, otherwise performance may suffer. It's important to always return the dataframe without removing/modifying the columns `"open", "high", "low", "close", "volume"`, otherwise these fields would contain something unexpected. @@ -201,7 +201,7 @@ If this data is available, indicators will be calculated with this extended time ### Entry signal rules -Edit the method `populate_buy_trend()` in your strategy file to update your entry strategy. +Edit the method `populate_entry_trend()` in your strategy file to update your entry strategy. It's important to always return the dataframe without removing/modifying the columns `"open", "high", "low", "close", "volume"`, otherwise these fields would contain something unexpected. @@ -210,7 +210,7 @@ This method will also define a new column, `"enter_long"`, which needs to contai Sample from `user_data/strategies/sample_strategy.py`: ```python -def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: +def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Based on TA indicators, populates the buy signal for the given dataframe :param dataframe: DataFrame populated with indicators @@ -236,7 +236,7 @@ def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: Please make sure to set [`can_short`]() appropriately on your strategy if you intend to short. ```python - def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (qtpylib.crossed_above(dataframe['rsi'], 30)) & # Signal: RSI crosses above 30 @@ -397,7 +397,7 @@ Disabling of this will have short signals ignored (also in futures markets). ### Metadata dict -The metadata-dict (available for `populate_buy_trend`, `populate_sell_trend`, `populate_indicators`) contains additional information. +The metadata-dict (available for `populate_entry_trend`, `populate_sell_trend`, `populate_indicators`) contains additional information. Currently this is `pair`, which can be accessed using `metadata['pair']` - and will return a pair in the format `XRP/BTC`. The Metadata-dict should not be modified and does not persist information across multiple calls. @@ -567,7 +567,7 @@ for more information. Use string formatting when accessing informative dataframes of other pairs. This will allow easily changing stake currency in config without having to adjust strategy code. ``` python - def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: stake = self.config['stake_currency'] dataframe.loc[ ( @@ -782,7 +782,7 @@ class SampleStrategy(IStrategy): return dataframe - def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( @@ -1050,11 +1050,11 @@ if self.config['runmode'].value in ('live', 'dry_run'): ## Print created dataframe -To inspect the created dataframe, you can issue a print-statement in either `populate_buy_trend()` or `populate_sell_trend()`. +To inspect the created dataframe, you can issue a print-statement in either `populate_entry_trend()` or `populate_sell_trend()`. You may also want to print the pair so it's clear what data is currently shown. ``` python -def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: +def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( #>> whatever condition<<<