Первая стратегия
Превратите сигналы пересечений в правила входа и выхода для бэктеста.
В главе о пересечениях индикатор рисовал отметку. Теперь то же событие создаст моделируемый приказ. При пересечении вверх программа откроет длинную позицию, вниз закроет её.
Что делает стратегия?
Индикатор считает и отображает. Стратегия также отправляет приказы симулятору. По историческим свечам и правилам тот отслеживает приказы, позиции и результаты.
Это историческое тестирование называется бэктестом. Все приказы главы моделируются; Run Pyne code не отправляет их на реальный торговый счёт.
Позиция является объёмом после исполненного входа. Приказ является инструкцией, исполнение событием создания или изменения позиции. Эти термины не взаимозаменяемы.
Сначала опишите правила
Правила стратегии:
- На каждой свече вычисляются SMA длиной пять и двадцать.
- При пересечении вверх подаётся приказ на длинную позицию в одну единицу.
- При пересечении вниз закрывается позиция входа
Long. - Расчёт использует закрытые исторические свечи.
Длинная позиция растёт в стоимости с ростом цены и падает с её снижением. Коротких позиций здесь нет.
Правило не утверждает, что каждое пересечение прибыльно. Бэктест исследует, что случилось бы на конкретных данных с такими действиями.
Полная программа
Создайте crossover_strategy.py:
"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, strategy, ta
@script.strategy(
"Average Crossing Strategy",
overlay=True,
initial_capital=10000,
default_qty_type=strategy.fixed,
default_qty_value=1,
pyramiding=1,
)
def main(
fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),
):
fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
crosses_up = ta.crossover(fast_average, slow_average)
crosses_down = ta.crossunder(fast_average, slow_average)
if crosses_up:
strategy.entry("Long", strategy.long)
if crosses_down:
strategy.close("Long")
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)@script.strategy обозначает main() как стратегию. Расчёты и линии используются по-прежнему. Новый импорт strategy содержит действия приказов и данные стратегии.
Декоратор записан на нескольких строках. Его настройки управляют исполнением стратегии; параметры main() задают входы наших вычислений.
Начальный капитал и количество
initial_capital=10000 задаёт начальный баланс. Рыночные метаданные DEMO определяют единицы и уровни цен запуска.
default_qty_type=strategy.fixed означает фиксированное количество. default_qty_value=1 запрашивает одну единицу. Это не процент капитала и не обязательно денежная единица.
pyramiding=1 допускает максимум один вход одного направления. Пример не увеличивает открытую позицию дополнительными длинными входами.
Для обучения используем малое фиксированное количество. Так при изменении результата меньше факторов размера для одновременной проверки.
Имена входа и закрытия
Первый аргумент strategy.entry("Long", strategy.long) задаёт идентификатор приказа. Текст Long выбирает программа, направление задаёт второй аргумент.
strategy.close("Long") ссылается на тот же идентификатор. Имена должны совпадать. При входе "Buy" закрытие "Long" не обращается к нему.
Пересечение вниз здесь закрывает, не открывает короткую позицию. Если позиции с этим именем нет, закрывать нечего.
Запуск в PyneIDE
- Сохраните полную программу.
- Выберите Run Pyne code и
demo. - Проверьте две линии SMA и отметки сделок.
- Откройте панель под графиком и Trades.

Если сделок нет, проверьте файл стратегии и @script.strategy, а также фактические inputs. SMA одинаковой длины из одного источника не пересекаются.
Время сигнала и исполнения
При наших настройках программа подаёт рыночный приказ по закрытию свечи. Обычно он исполняется на открытии следующей. Свечи сигнала и входа могут отличаться.
То же относится к рыночному закрытию: приказ при пересечении вниз может закрыть позицию на следующем открытии.
Если приказ появился на последней свече, следующей в файле нет, и он может не исполниться. Ранее открытая позиция тоже может остаться открытой в конце данных.
Способ исполнения задаётся настройкой. В следующей главе проверим её в Properties. Интерпретируйте результат с тем режимом, в котором он получен.
Попробуйте самостоятельно
Установите обе длины в 20 через inputs. Предскажите положение линий и число пересечений, способных вызвать сделки.
Решение
Средние используют одинаковые цены и окна, поэтому совпадают. Ни одна не переходит выше или ниже другой. По этому правилу новых сделок нет.
График покажет это лишь после сохранения inputs и окончания пересчёта. Затем верните 5 и 20.
Выберите вход
Найдите исполненный вход и посмотрите средние на предыдущей свече. Пересечение вверх должно произойти на сигнальной. Цену сделки сравнивайте с открытием свечи входа, не автоматически с закрытием сигнала.