Deployed dfc1193 to develop in en with MkDocs 1.6.1 and mike 2.1.3

This commit is contained in:
github-actions[bot]
2025-05-25 07:14:01 +00:00
parent 9971e1cb6e
commit 5add686272
2 changed files with 239 additions and 1 deletions

File diff suppressed because one or more lines are too long

View File

@@ -729,6 +729,72 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#custom-roi" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI
</span>
</a>
<nav class="md-nav" aria-label="Custom ROI">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#custom-roi-examples" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI examples
</span>
</a>
<nav class="md-nav" aria-label="Custom ROI examples">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#custom-roi-per-side" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI per side
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-roi-per-pair" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI per pair
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-roi-per-entry-tag" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI per entry tag
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-roi-based-on-atr" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI based on ATR
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
@@ -2214,6 +2280,72 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#custom-roi" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI
</span>
</a>
<nav class="md-nav" aria-label="Custom ROI">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#custom-roi-examples" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI examples
</span>
</a>
<nav class="md-nav" aria-label="Custom ROI examples">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#custom-roi-per-side" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI per side
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-roi-per-pair" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI per pair
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-roi-per-entry-tag" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI per entry tag
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-roi-based-on-atr" class="md-nav__link">
<span class="md-ellipsis">
Custom ROI based on ATR
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
@@ -2453,6 +2585,7 @@ Depending on the callback used, they may be called when entering / exiting a tra
<li><a href="#stake-size-management"><code>custom_stake_amount()</code></a></li>
<li><a href="#custom-exit-signal"><code>custom_exit()</code></a></li>
<li><a href="#custom-stoploss"><code>custom_stoploss()</code></a></li>
<li><a href="#custom-roi"><code>custom_roi()</code></a></li>
<li><a href="#custom-order-price-rules"><code>custom_entry_price()</code> and <code>custom_exit_price()</code></a></li>
<li><a href="#custom-order-timeout-rules"><code>check_entry_timeout()</code> and <code>check_exit_timeout()</code></a></li>
<li><a href="#trade-entry-buy-order-confirmation"><code>confirm_trade_entry()</code></a></li>
@@ -2904,6 +3037,111 @@ For futures, we need to adjust the direction (up or down), as well as adjust for
</code></pre></div>
</details>
<hr />
<h2 id="custom-roi">Custom ROI<a class="headerlink" href="#custom-roi" title="Permanent link">&para;</a></h2>
<p>Called for open trade every iteration (roughly every 5 seconds) until a trade is closed.</p>
<p>The usage of the custom ROI method must be enabled by setting <code>use_custom_roi=True</code> on the strategy object.</p>
<p>This method allows you to define a custom minimum ROI threshold for exiting a trade, expressed as a ratio (e.g., <code>0.05</code> for 5% profit). If both <code>minimal_roi</code> and <code>custom_roi</code> are defined, the lower of the two thresholds will trigger an exit. For example, if <code>minimal_roi</code> is set to <code>{"0": 0.10}</code> (10% at 0 minutes) and <code>custom_roi</code> returns <code>0.05</code>, the trade will exit when the profit reaches 5%. Also, if <code>custom_roi</code> returns <code>0.10</code> and <code>minimal_roi</code> is set to <code>{"0": 0.05}</code> (5% at 0 minutes), the trade will be closed when the profit reaches 5%.</p>
<p>The method must return a float representing the new ROI threshold as a ratio, or <code>None</code> to fall back to the <code>minimal_roi</code> logic. Returning <code>NaN</code> or <code>inf</code> values is considered invalid and will be treated as <code>None</code>, causing the bot to use the <code>minimal_roi</code> configuration.</p>
<h3 id="custom-roi-examples">Custom ROI examples<a class="headerlink" href="#custom-roi-examples" title="Permanent link">&para;</a></h3>
<p>The following examples illustrate how to use the <code>custom_roi</code> function to implement different ROI logics.</p>
<h4 id="custom-roi-per-side">Custom ROI per side<a class="headerlink" href="#custom-roi-per-side" title="Permanent link">&para;</a></h4>
<p>Use different ROI thresholds depending on the <code>side</code>. In this example, 5% for long entries and 2% for short entries.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Default imports</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">use_custom_roi</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># ... populate_* methods</span>
<span class="k">def</span><span class="w"> </span><span class="nf">custom_roi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pair</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">trade</span><span class="p">:</span> <span class="n">Trade</span><span class="p">,</span> <span class="n">current_time</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">trade_duration</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
<span class="n">entry_tag</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">side</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Custom ROI logic, returns a new minimum ROI threshold (as a ratio, e.g., 0.05 for +5%).</span>
<span class="sd"> Only called when use_custom_roi is set to True.</span>
<span class="sd"> If used at the same time as minimal_roi, an exit will be triggered when the lower</span>
<span class="sd"> threshold is reached. Example: If minimal_roi = {&quot;0&quot;: 0.01} and custom_roi returns 0.05,</span>
<span class="sd"> an exit will be triggered if profit reaches 5%.</span>
<span class="sd"> :param pair: Pair that&#39;s currently analyzed.</span>
<span class="sd"> :param trade: trade object.</span>
<span class="sd"> :param current_time: datetime object, containing the current datetime.</span>
<span class="sd"> :param trade_duration: Current trade duration in minutes.</span>
<span class="sd"> :param entry_tag: Optional entry_tag (buy_tag) if provided with the buy signal.</span>
<span class="sd"> :param side: &#39;long&#39; or &#39;short&#39; - indicating the direction of the current trade.</span>
<span class="sd"> :param **kwargs: Ensure to keep this here so updates to this won&#39;t break your strategy.</span>
<span class="sd"> :return float: New ROI value as a ratio, or None to fall back to minimal_roi logic.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="mf">0.05</span> <span class="k">if</span> <span class="n">side</span> <span class="o">==</span> <span class="s2">&quot;long&quot;</span> <span class="k">else</span> <span class="mf">0.02</span>
</code></pre></div>
<h4 id="custom-roi-per-pair">Custom ROI per pair<a class="headerlink" href="#custom-roi-per-pair" title="Permanent link">&para;</a></h4>
<p>Use different ROI thresholds depending on the <code>pair</code>.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Default imports</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">use_custom_roi</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># ... populate_* methods</span>
<span class="k">def</span><span class="w"> </span><span class="nf">custom_roi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pair</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">trade</span><span class="p">:</span> <span class="n">Trade</span><span class="p">,</span> <span class="n">current_time</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">trade_duration</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
<span class="n">entry_tag</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">side</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">stake</span> <span class="o">=</span> <span class="n">trade</span><span class="o">.</span><span class="n">stake_currency</span>
<span class="n">roi_map</span> <span class="o">=</span> <span class="p">{</span>
<span class="sa">f</span><span class="s2">&quot;BTC/</span><span class="si">{</span><span class="n">stake</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">:</span> <span class="mf">0.02</span><span class="p">,</span> <span class="c1"># 2% for BTC</span>
<span class="sa">f</span><span class="s2">&quot;ETH/</span><span class="si">{</span><span class="n">stake</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">:</span> <span class="mf">0.03</span><span class="p">,</span> <span class="c1"># 3% for ETH</span>
<span class="sa">f</span><span class="s2">&quot;XRP/</span><span class="si">{</span><span class="n">stake</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">:</span> <span class="mf">0.04</span><span class="p">,</span> <span class="c1"># 4% for XRP</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">roi_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">pair</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span> <span class="c1"># 1% for any other pair</span>
</code></pre></div>
<h4 id="custom-roi-per-entry-tag">Custom ROI per entry tag<a class="headerlink" href="#custom-roi-per-entry-tag" title="Permanent link">&para;</a></h4>
<p>Use different ROI thresholds depending on the <code>entry_tag</code> provided with the buy signal.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Default imports</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">use_custom_roi</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># ... populate_* methods</span>
<span class="k">def</span><span class="w"> </span><span class="nf">custom_roi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pair</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">trade</span><span class="p">:</span> <span class="n">Trade</span><span class="p">,</span> <span class="n">current_time</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">trade_duration</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
<span class="n">entry_tag</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">side</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">roi_by_tag</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;breakout&quot;</span><span class="p">:</span> <span class="mf">0.08</span><span class="p">,</span> <span class="c1"># 8% if tag is &quot;breakout&quot;</span>
<span class="s2">&quot;rsi_overbought&quot;</span><span class="p">:</span> <span class="mf">0.05</span><span class="p">,</span> <span class="c1"># 5% if tag is &quot;rsi_overbought&quot;</span>
<span class="s2">&quot;mean_reversion&quot;</span><span class="p">:</span> <span class="mf">0.03</span><span class="p">,</span> <span class="c1"># 3% if tag is &quot;mean_reversion&quot;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">roi_by_tag</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">entry_tag</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span> <span class="c1"># 1% if tag is unknown</span>
</code></pre></div>
<h4 id="custom-roi-based-on-atr">Custom ROI based on ATR<a class="headerlink" href="#custom-roi-based-on-atr" title="Permanent link">&para;</a></h4>
<p>ROI value may be derived from indicators stored in dataframe. This example uses the ATR ratio as ROI.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Default imports</span>
<span class="c1"># &lt;...&gt;</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="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">use_custom_roi</span> <span class="o">=</span> <span class="kc">True</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">-&gt;</span> <span class="n">DataFrame</span><span class="p">:</span>
<span class="c1"># &lt;...&gt;</span>
<span class="n">dataframe</span><span class="p">[</span><span class="s2">&quot;atr&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ta</span><span class="o">.</span><span class="n">ATR</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">10</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">custom_roi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pair</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">trade</span><span class="p">:</span> <span class="n">Trade</span><span class="p">,</span> <span class="n">current_time</span><span class="p">:</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">trade_duration</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
<span class="n">entry_tag</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">side</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">dataframe</span><span class="p">,</span> <span class="n">_</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">get_analyzed_dataframe</span><span class="p">(</span><span class="n">pair</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeframe</span><span class="p">)</span>
<span class="n">last_candle</span> <span class="o">=</span> <span class="n">dataframe</span><span class="o">.</span><span class="n">iloc</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">squeeze</span><span class="p">()</span>
<span class="n">atr_ratio</span> <span class="o">=</span> <span class="n">last_candle</span><span class="p">[</span><span class="s2">&quot;atr&quot;</span><span class="p">]</span> <span class="o">/</span> <span class="n">last_candle</span><span class="p">[</span><span class="s2">&quot;close&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">atr_ratio</span> <span class="c1"># Returns the ATR value as ratio</span>
</code></pre></div>
<hr />
<h2 id="custom-order-price-rules">Custom order price rules<a class="headerlink" href="#custom-order-price-rules" title="Permanent link">&para;</a></h2>
<p>By default, freqtrade use the orderbook to automatically set an order price(<a href="../configuration/#prices-used-for-orders">Relevant documentation</a>), you also have the option to create custom order prices based on your strategy.</p>
<p>You can use this feature by creating a <code>custom_entry_price()</code> function in your strategy file to customize entry prices and <code>custom_exit_price()</code> for exits.</p>