mirror of
https://github.com/freqtrade/freqtrade.git
synced 2025-12-02 01:53:05 +00:00
Deployed 00d1f14 to develop in en with MkDocs 1.6.1 and mike 2.1.3
This commit is contained in:
@@ -2722,7 +2722,7 @@ delay as possible, usually by running a low number of pairs and having a CPU wit
|
||||
<p>You should only add the indicators used in either <code>populate_entry_trend()</code>, <code>populate_exit_trend()</code>, or to populate another indicator, otherwise performance may suffer.</p>
|
||||
<p>It's important to always return the dataframe from these three functions without removing/modifying the columns <code>"open", "high", "low", "close", "volume"</code>, otherwise these fields would contain something unexpected.</p>
|
||||
<p>Sample:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">populate_indicators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">populate_indicators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> Adds several different TA indicators to the given DataFrame</span>
|
||||
|
||||
@@ -2812,7 +2812,7 @@ This is capped to 5 total calls to avoid overloading the exchange, or make freqt
|
||||
<p>This method will also define a new column, <code>"enter_long"</code> (<code>"enter_short"</code> for shorts), which needs to contain <code>1</code> for entries, and <code>0</code> for "no action". <code>enter_long</code> is a mandatory column that must be set even if the strategy is shorting only.</p>
|
||||
<p>You can name your entry signals by using the <code>"enter_tag"</code> column, which can help debug and assess your strategy later. </p>
|
||||
<p>Sample from <code>user_data/strategies/sample_strategy.py</code>:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> Based on TA indicators, populates the buy signal for the given dataframe</span>
|
||||
<span class="sd"> :param dataframe: DataFrame populated with indicators</span>
|
||||
@@ -2839,7 +2839,7 @@ Also, make sure you set <a href="#can-short"><code>can_short</code></a> appropri
|
||||
<div class="highlight"><pre><span></span><code><span class="c1"># allow both long and short trades</span>
|
||||
<span class="n">can_short</span> <span class="o">=</span> <span class="kc">True</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">dataframe</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span>
|
||||
<span class="p">(</span>
|
||||
<span class="p">(</span><span class="n">qtpylib</span><span class="o">.</span><span class="n">crossed_above</span><span class="p">(</span><span class="n">dataframe</span><span class="p">[</span><span class="s1">'rsi'</span><span class="p">],</span> <span class="mi">30</span><span class="p">))</span> <span class="o">&</span> <span class="c1"># Signal: RSI crosses above 30</span>
|
||||
@@ -2873,7 +2873,7 @@ Also, make sure you set <a href="#can-short"><code>can_short</code></a> appropri
|
||||
<p>This method will also define a new column, <code>"exit_long"</code> (<code>"exit_short"</code> for shorts), which needs to contain <code>1</code> for exits, and <code>0</code> for "no action".</p>
|
||||
<p>You can name your exit signals by using the <code>"exit_tag"</code> column, which can help debug and assess your strategy later.</p>
|
||||
<p>Sample from <code>user_data/strategies/sample_strategy.py</code>:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">populate_exit_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">populate_exit_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="w"> </span><span class="sd">"""</span>
|
||||
<span class="sd"> Based on TA indicators, populates the exit signal for the given dataframe</span>
|
||||
<span class="sd"> :param dataframe: DataFrame populated with indicators</span>
|
||||
@@ -2899,7 +2899,7 @@ Also, make sure you set <a href="#can-short"><code>can_short</code></a> appropri
|
||||
<div class="highlight"><pre><span></span><code><span class="c1"># allow both long and short trades</span>
|
||||
<span class="n">can_short</span> <span class="o">=</span> <span class="kc">True</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">populate_exit_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_exit_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">dataframe</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span>
|
||||
<span class="p">(</span>
|
||||
<span class="p">(</span><span class="n">qtpylib</span><span class="o">.</span><span class="n">crossed_above</span><span class="p">(</span><span class="n">dataframe</span><span class="p">[</span><span class="s1">'rsi'</span><span class="p">],</span> <span class="mi">70</span><span class="p">))</span> <span class="o">&</span> <span class="c1"># Signal: RSI crosses above 70</span>
|
||||
@@ -2944,9 +2944,9 @@ Also, make sure you set <a href="#can-short"><code>can_short</code></a> appropri
|
||||
<h4 id="using-calculations-in-minimal-roi">Using calculations in minimal ROI<a class="headerlink" href="#using-calculations-in-minimal-roi" title="Permanent link">¶</a></h4>
|
||||
<p>To use times based on candle duration (timeframe), the following snippet can be handy.</p>
|
||||
<p>This will allow you to change the timeframe for the strategy, but the minimal ROI times will still be set as candles, e.g. after 3 candles.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">freqtrade.exchange</span> <span class="kn">import</span> <span class="n">timeframe_to_minutes</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.exchange</span><span class="w"> </span><span class="kn">import</span> <span class="n">timeframe_to_minutes</span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">AwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
|
||||
<span class="k">class</span><span class="w"> </span><span class="nc">AwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
|
||||
|
||||
<span class="n">timeframe</span> <span class="o">=</span> <span class="s2">"1d"</span>
|
||||
<span class="n">timeframe_mins</span> <span class="o">=</span> <span class="n">timeframe_to_minutes</span><span class="p">(</span><span class="n">timeframe</span><span class="p">)</span>
|
||||
@@ -2990,13 +2990,13 @@ Obviously you can add more imports as needed for your strategy.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="c1"># flake8: noqa: F401</span>
|
||||
<span class="c1"># isort: skip_file</span>
|
||||
<span class="c1"># --- Do not remove these imports ---</span>
|
||||
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
|
||||
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
|
||||
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span><span class="p">,</span> <span class="n">timezone</span>
|
||||
<span class="kn">from</span> <span class="nn">pandas</span> <span class="kn">import</span> <span class="n">DataFrame</span>
|
||||
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Tuple</span>
|
||||
<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||||
<span class="kn">import</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pd</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span><span class="p">,</span> <span class="n">timezone</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="kn">import</span> <span class="n">DataFrame</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Tuple</span>
|
||||
|
||||
<span class="kn">from</span> <span class="nn">freqtrade.strategy</span> <span class="kn">import</span> <span class="p">(</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.strategy</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
|
||||
<span class="n">IStrategy</span><span class="p">,</span>
|
||||
<span class="n">Trade</span><span class="p">,</span>
|
||||
<span class="n">Order</span><span class="p">,</span>
|
||||
@@ -3020,8 +3020,8 @@ Obviously you can add more imports as needed for your strategy.</p>
|
||||
|
||||
<span class="c1"># --------------------------------</span>
|
||||
<span class="c1"># Add your lib to import here</span>
|
||||
<span class="kn">import</span> <span class="nn">talib.abstract</span> <span class="k">as</span> <span class="nn">ta</span>
|
||||
<span class="kn">from</span> <span class="nn">technical</span> <span class="kn">import</span> <span class="n">qtpylib</span>
|
||||
<span class="kn">import</span><span class="w"> </span><span class="nn">talib.abstract</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ta</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">technical</span><span class="w"> </span><span class="kn">import</span> <span class="n">qtpylib</span>
|
||||
</code></pre></div>
|
||||
<h2 id="strategy-file-loading">Strategy file loading<a class="headerlink" href="#strategy-file-loading" title="Permanent link">¶</a></h2>
|
||||
<p>By default, freqtrade will attempt to load strategies from all <code>.py</code> files within the <code>userdir</code> (default <code>user_data/strategies</code>).</p>
|
||||
@@ -3042,7 +3042,7 @@ It will also include a "status" field, highlighting potential problems.</p>
|
||||
<p>These pairs will <strong>not</strong> be traded unless they are also specified in the pair whitelist, or have been selected by Dynamic Whitelisting, e.g. <code>VolumePairlist</code>.</p>
|
||||
<p>The pairs need to be specified as tuples in the format <code>("pair", "timeframe")</code>, with pair as the first and timeframe as the second argument.</p>
|
||||
<p>Sample:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="p">[(</span><span class="s2">"ETH/USDT"</span><span class="p">,</span> <span class="s2">"5m"</span><span class="p">),</span>
|
||||
<span class="p">(</span><span class="s2">"BTC/TUSD"</span><span class="p">,</span> <span class="s2">"15m"</span><span class="p">),</span>
|
||||
<span class="p">]</span>
|
||||
@@ -3061,7 +3061,7 @@ to avoid hammering the exchange with too many requests and risk being blocked.</
|
||||
Availability of alternative candle-types will depend on the trading-mode and the exchange.
|
||||
In general, spot pairs cannot be used in futures markets, and futures candles can't be used as informative pairs for spot bots.
|
||||
Details about this may vary, if they do, this can be found in the exchange documentation.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="p">[</span>
|
||||
<span class="p">(</span><span class="s2">"ETH/USDT"</span><span class="p">,</span> <span class="s2">"5m"</span><span class="p">,</span> <span class="s2">""</span><span class="p">),</span> <span class="c1"># Uses default candletype, depends on trading_mode (recommended)</span>
|
||||
<span class="p">(</span><span class="s2">"ETH/USDT"</span><span class="p">,</span> <span class="s2">"5m"</span><span class="p">,</span> <span class="s2">"spot"</span><span class="p">),</span> <span class="c1"># Forces usage of spot candles (only valid for bots running on spot markets).</span>
|
||||
@@ -3081,7 +3081,7 @@ and do not have access to data from other informative pairs. However, all inform
|
||||
<p>When hyperopting, use of the hyperoptable parameter <code>.value</code> attribute is not supported. Please use the <code>.range</code> attribute. See <a href="../hyperopt/#optimizing-an-indicator-parameter">optimizing an indicator parameter</a> for more information.</p>
|
||||
<details class="info">
|
||||
<summary>Full documentation</summary>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">informative</span><span class="p">(</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">informative</span><span class="p">(</span>
|
||||
<span class="n">timeframe</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
|
||||
<span class="n">asset</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">,</span>
|
||||
<span class="n">fmt</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">Any</span><span class="p">],</span> <span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
@@ -3124,11 +3124,11 @@ and do not have access to data from other informative pairs. However, all inform
|
||||
<details class="example">
|
||||
<summary>Fast and easy way to define informative pairs</summary>
|
||||
<p>Most of the time we do not need power and flexibility offered by <code>merge_informative_pair()</code>, therefore we can use a decorator to quickly define informative pairs.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
|
||||
<span class="kn">from</span> <span class="nn">freqtrade.persistence</span> <span class="kn">import</span> <span class="n">Trade</span>
|
||||
<span class="kn">from</span> <span class="nn">freqtrade.strategy</span> <span class="kn">import</span> <span class="n">IStrategy</span><span class="p">,</span> <span class="n">informative</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.persistence</span><span class="w"> </span><span class="kn">import</span> <span class="n">Trade</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.strategy</span><span class="w"> </span><span class="kn">import</span> <span class="n">IStrategy</span><span class="p">,</span> <span class="n">informative</span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">AwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
|
||||
<span class="k">class</span><span class="w"> </span><span class="nc">AwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># This method is not required. </span>
|
||||
<span class="c1"># def informative_pairs(self): ...</span>
|
||||
@@ -3137,7 +3137,7 @@ and do not have access to data from other informative pairs. However, all inform
|
||||
<span class="c1"># method. Available in populate_indicators as 'rsi_30m' and 'rsi_1h'.</span>
|
||||
<span class="nd">@informative</span><span class="p">(</span><span class="s1">'30m'</span><span class="p">)</span>
|
||||
<span class="nd">@informative</span><span class="p">(</span><span class="s1">'1h'</span><span class="p">)</span>
|
||||
<span class="k">def</span> <span class="nf">populate_indicators_1h</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_indicators_1h</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">dataframe</span><span class="p">[</span><span class="s1">'rsi'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ta</span><span class="o">.</span><span class="n">RSI</span><span class="p">(</span><span class="n">dataframe</span><span class="p">,</span> <span class="n">timeperiod</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">dataframe</span>
|
||||
|
||||
@@ -3146,14 +3146,14 @@ and do not have access to data from other informative pairs. However, all inform
|
||||
<span class="c1"># instead of hard-coding actual stake currency. Available in populate_indicators and other </span>
|
||||
<span class="c1"># methods as 'btc_usdt_rsi_1h' (when stake currency is USDT).</span>
|
||||
<span class="nd">@informative</span><span class="p">(</span><span class="s1">'1h'</span><span class="p">,</span> <span class="s1">'BTC/</span><span class="si">{stake}</span><span class="s1">'</span><span class="p">)</span>
|
||||
<span class="k">def</span> <span class="nf">populate_indicators_btc_1h</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_indicators_btc_1h</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">dataframe</span><span class="p">[</span><span class="s1">'rsi'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ta</span><span class="o">.</span><span class="n">RSI</span><span class="p">(</span><span class="n">dataframe</span><span class="p">,</span> <span class="n">timeperiod</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">dataframe</span>
|
||||
|
||||
<span class="c1"># Define BTC/ETH informative pair. You must specify quote currency if it is different from</span>
|
||||
<span class="c1"># stake currency. Available in populate_indicators and other methods as 'eth_btc_rsi_1h'.</span>
|
||||
<span class="nd">@informative</span><span class="p">(</span><span class="s1">'1h'</span><span class="p">,</span> <span class="s1">'ETH/BTC'</span><span class="p">)</span>
|
||||
<span class="k">def</span> <span class="nf">populate_indicators_eth_btc_1h</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_indicators_eth_btc_1h</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">dataframe</span><span class="p">[</span><span class="s1">'rsi'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ta</span><span class="o">.</span><span class="n">RSI</span><span class="p">(</span><span class="n">dataframe</span><span class="p">,</span> <span class="n">timeperiod</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">dataframe</span>
|
||||
|
||||
@@ -3161,11 +3161,11 @@ and do not have access to data from other informative pairs. However, all inform
|
||||
<span class="c1"># column names. A callable `fmt(**kwargs) -> str` may be specified, to implement custom</span>
|
||||
<span class="c1"># formatting. Available in populate_indicators and other methods as 'rsi_upper_1h'.</span>
|
||||
<span class="nd">@informative</span><span class="p">(</span><span class="s1">'1h'</span><span class="p">,</span> <span class="s1">'BTC/</span><span class="si">{stake}</span><span class="s1">'</span><span class="p">,</span> <span class="s1">'</span><span class="si">{column}</span><span class="s1">_</span><span class="si">{timeframe}</span><span class="s1">'</span><span class="p">)</span>
|
||||
<span class="k">def</span> <span class="nf">populate_indicators_btc_1h_2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_indicators_btc_1h_2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">dataframe</span><span class="p">[</span><span class="s1">'rsi_upper'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ta</span><span class="o">.</span><span class="n">RSI</span><span class="p">(</span><span class="n">dataframe</span><span class="p">,</span> <span class="n">timeperiod</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">dataframe</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">populate_indicators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_indicators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="c1"># Strategy timeframe indicators for current pair.</span>
|
||||
<span class="n">dataframe</span><span class="p">[</span><span class="s1">'rsi'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ta</span><span class="o">.</span><span class="n">RSI</span><span class="p">(</span><span class="n">dataframe</span><span class="p">,</span> <span class="n">timeperiod</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span>
|
||||
<span class="c1"># Informative pairs are available in this method.</span>
|
||||
@@ -3176,7 +3176,7 @@ and do not have access to data from other informative pairs. However, all inform
|
||||
<div class="admonition note">
|
||||
<p class="admonition-title">Note</p>
|
||||
<p>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.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">stake</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'stake_currency'</span><span class="p">]</span>
|
||||
<span class="n">dataframe</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span>
|
||||
<span class="p">(</span>
|
||||
@@ -3280,7 +3280,7 @@ It is also not available in <code>populate_entry_trend()</code> and <code>popula
|
||||
<p>Due to the limited available data, it's very difficult to resample <code>5m</code> candles into daily candles for use in a 14 day RSI. Most exchanges limit users to just 500-1000 candles which effectively gives us around 1.74 daily candles. We need 14 days at least!</p>
|
||||
<p>Since we can't resample the data we will have to use an informative pair, and since the whitelist will be dynamic we don't know which pair(s) to use! We have a problem!</p>
|
||||
<p>This is where calling <code>self.dp.current_whitelist()</code> comes in handy to retrieve only those pairs in the whitelist.</p>
|
||||
<div class="highlight"><pre><span></span><code> <span class="k">def</span> <span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<div class="highlight"><pre><span></span><code> <span class="k">def</span><span class="w"> </span><span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># get access to all pairs available in whitelist.</span>
|
||||
<span class="n">pairs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dp</span><span class="o">.</span><span class="n">current_whitelist</span><span class="p">()</span>
|
||||
@@ -3376,17 +3376,17 @@ Identical notifications will only be sent once per candle, unless the 2<sup>nd</
|
||||
<p>You can spam yourself pretty good by setting <code>always_send=True</code> in this method. Use this with great care and only in conditions you know will not happen throughout a candle to avoid a message every 5 seconds.</p>
|
||||
</div>
|
||||
<h3 id="complete-dataprovider-sample">Complete DataProvider sample<a class="headerlink" href="#complete-dataprovider-sample" title="Permanent link">¶</a></h3>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">freqtrade.strategy</span> <span class="kn">import</span> <span class="n">IStrategy</span><span class="p">,</span> <span class="n">merge_informative_pair</span>
|
||||
<span class="kn">from</span> <span class="nn">pandas</span> <span class="kn">import</span> <span class="n">DataFrame</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.strategy</span><span class="w"> </span><span class="kn">import</span> <span class="n">IStrategy</span><span class="p">,</span> <span class="n">merge_informative_pair</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="kn">import</span> <span class="n">DataFrame</span>
|
||||
|
||||
<span class="k">class</span> <span class="nc">SampleStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
|
||||
<span class="k">class</span><span class="w"> </span><span class="nc">SampleStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
|
||||
<span class="c1"># strategy init stuff...</span>
|
||||
|
||||
<span class="n">timeframe</span> <span class="o">=</span> <span class="s1">'5m'</span>
|
||||
|
||||
<span class="c1"># more strategy init stuff..</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">informative_pairs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||
|
||||
<span class="c1"># get access to all pairs available in whitelist.</span>
|
||||
<span class="n">pairs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dp</span><span class="o">.</span><span class="n">current_whitelist</span><span class="p">()</span>
|
||||
@@ -3398,7 +3398,7 @@ Identical notifications will only be sent once per candle, unless the 2<sup>nd</
|
||||
<span class="p">]</span>
|
||||
<span class="k">return</span> <span class="n">informative_pairs</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">populate_indicators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_indicators</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">dp</span><span class="p">:</span>
|
||||
<span class="c1"># Don't do anything if DataProvider is not available.</span>
|
||||
<span class="k">return</span> <span class="n">dataframe</span>
|
||||
@@ -3424,7 +3424,7 @@ Identical notifications will only be sent once per candle, unless the 2<sup>nd</
|
||||
|
||||
<span class="k">return</span> <span class="n">dataframe</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="k">def</span><span class="w"> </span><span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
|
||||
<span class="n">dataframe</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span>
|
||||
<span class="p">(</span>
|
||||
@@ -3459,7 +3459,7 @@ Within <a href="../strategy-callbacks/">callbacks</a>, you'll get the wallet sta
|
||||
<h2 id="additional-data-trades">Additional data (Trades)<a class="headerlink" href="#additional-data-trades" title="Permanent link">¶</a></h2>
|
||||
<p>A history of trades can be retrieved in the strategy by querying the database.</p>
|
||||
<p>At the top of the file, import the required object:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">freqtrade.persistence</span> <span class="kn">import</span> <span class="n">Trade</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.persistence</span><span class="w"> </span><span class="kn">import</span> <span class="n">Trade</span>
|
||||
</code></pre></div>
|
||||
<p>The following example queries trades from today for the current pair (<code>metadata['pair']</code>). Other filters can easily be added.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="n">trades</span> <span class="o">=</span> <span class="n">Trade</span><span class="o">.</span><span class="n">get_trades_proxy</span><span class="p">(</span><span class="n">pair</span><span class="o">=</span><span class="n">metadata</span><span class="p">[</span><span class="s1">'pair'</span><span class="p">],</span>
|
||||
@@ -3494,8 +3494,8 @@ Within <a href="../strategy-callbacks/">callbacks</a>, you'll get the wallet sta
|
||||
<p>Manually locking pairs is not available during backtesting. Only locks via Protections are allowed.</p>
|
||||
</div>
|
||||
<h4 id="pair-locking-example">Pair locking example<a class="headerlink" href="#pair-locking-example" title="Permanent link">¶</a></h4>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">freqtrade.persistence</span> <span class="kn">import</span> <span class="n">Trade</span>
|
||||
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span><span class="p">,</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timezone</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.persistence</span><span class="w"> </span><span class="kn">import</span> <span class="n">Trade</span>
|
||||
<span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">timedelta</span><span class="p">,</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timezone</span>
|
||||
<span class="c1"># Put the above lines a the top of the strategy file, next to all the other imports</span>
|
||||
<span class="c1"># --------</span>
|
||||
|
||||
@@ -3514,7 +3514,7 @@ Within <a href="../strategy-callbacks/">callbacks</a>, you'll get the wallet sta
|
||||
<h2 id="print-the-main-dataframe">Print the main dataframe<a class="headerlink" href="#print-the-main-dataframe" title="Permanent link">¶</a></h2>
|
||||
<p>To inspect the current main dataframe, you can issue a print-statement in either <code>populate_entry_trend()</code> or <code>populate_exit_trend()</code>.
|
||||
You may also want to print the pair so it's clear what data is currently shown.</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">populate_entry_trend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataframe</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span> <span class="n">metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">DataFrame</span><span class="p">:</span>
|
||||
<span class="n">dataframe</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span>
|
||||
<span class="p">(</span>
|
||||
<span class="c1">#>> whatever condition<<<</span>
|
||||
|
||||
Reference in New Issue
Block a user