本文へ移動
← すべてのサンプル

サンプル 78

Tunable ema cross

an EMA crossover whose parameters say which of them an optimizer may move, with decorators (ADR-0015). It buys when the fast EMA of the closed bars crosses above the slow one and sells when it crosses

カテゴリ
Host:ターミナルのデータとエンジンが必要
権限
orders.submit
実行する前に
a chart in hand on the live market or a replay whose instrument the live feed serves (closed bars)
何をするか
asks the terminal to run the strategy; once running it places orders on the account the person chose.
実行方法
Insert strategy in the Backtests window (backtest and optimize); Add script on a replay or the live market.
言語
>=0.2.0, <0.3.0
ホスト
>=0.1.17, <0.2.0
必要なもの
features >=0.1.8, <0.2.0trade >=0.1.0, <0.2.0

ソース

// Purpose: an EMA crossover whose parameters say which of them an optimizer may move, with decorators (ADR-0015). It buys when the fast EMA of the closed bars crosses above the slow one and sells when it crosses
// back; the *rule* is fixed, the numbers are not. `@param(min:, max:, step:, …)` before a parameter gives the range it is searched in and the grid it moves on; `above: fast` keeps `slow` above `fast` in every
// configuration tried; `size` has no decorator, so it is a fixed value the optimizer never touches. The value `main` passes (9, 21) is where the terminal's Parameters panel starts; a decorator never changes what
// the strategy does, so this runs exactly as `ema_cross(9, 21, qty(0.01))` without them.
// In the Backtests window: add the strategy, open its Parameters, tick Optimize on `fast` and `slow`, and use the Optimize tab to search them on a dataset.
// HONEST NOTE: an EMA crossover has no known edge after fees on a short timeframe; this is a template for the mechanism, not a signal. Every backtest of the search replays the tape, so a search takes a while:
// keep the window short and the budget small, and read the best result as the most flattering one.
// Category: host
// Permissions: orders.submit
// Preconditions: a chart in hand on the live market or a replay whose instrument the live feed serves (closed bars)
// Side effects: asks the terminal to run the strategy; once running it places orders on the account the person chose.
// Run: Insert strategy in the Backtests window (backtest and optimize); Add script on a replay or the live market.

lang ">=0.2.0, <0.3.0";
host "ttt" ">=0.1.17, <0.2.0";
requires "features" ">=0.1.8, <0.2.0";
requires "trade" ">=0.1.0, <0.2.0";

strategy ema_cross(
    @param(label: "Fast EMA", min: 3, max: 30, step: 1, group: "Signal", hint: "Bars of the fast average.") fast: Int,
    @param(label: "Slow EMA", min: 20, max: 200, step: 5, above: fast, group: "Signal", hint: "Bars of the slow average; always above the fast one.") slow: Int,
    size: Quantity,
) version "1.0.0" {
    let fast_ma = features.ema(fast);
    let slow_ma = features.ema(slow);

    rule enter when cross_above(fast_ma, slow_ma) && exposure_is(Exposure.Flat)
        => order(Side.Buy, Intent.Open, OrderType.Market, Sizing.Fixed(size));
    rule exit when cross_below(fast_ma, slow_ma) && exposure_is(Exposure.Open)
        => order(Side.Sell, Intent.Close, OrderType.Market, Sizing.Fixed(size));
    flatten_on_stop;
}

fn main() -> Result<Unit, Error> {
    // 9 over 21 bars, a hundredth of a coin.
    let run = trade.run(ema_cross(9, 21, qty(0.01)))?;
    print(run.name + " on " + run.target + ": " + run.state);
    return Ok(());
}