В процессе загрузки ресурсов... загрузка...

Если ты не знаешь, как написать стратегию на таком простом для изучения и использования языке Пайн...

Автор:FMZ~Lydia, Создано: 2023-02-16 14:55:00, Обновлено: 2023-09-18 20:18:52

img

Если вы не знаете, как написать стратегию на таком простом для изучения и использования языке Пайн...

Количество стратегий с открытым исходным кодом на TradingView велико. Жаль, что столько отличных стратегий, идей и индикаторов не могут быть использованы в реальном боте. Увидев это, FMZ, который стремится популяризировать количественную торговую технологию для многих трейдеров, естественно, не может подавить это стремление решить проблему!

Этот обмен опытом абсолютно необходим!

Итак, после путешествия по миру программирования и разработки кода, прохождения через 9*9=81 ямы, выживания бесчисленных бессонных ночей и накопления горы пустых банок Red Bull в углу.

Когда дело доходит до языка Пайн, я только недавно научился самостоятельно. Но, честно говоря, язык Пайн для количественной торговли действительно прост в использовании и легко учиться. Позвольте мне написать вам стратегию сетки:

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit spreads") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("Parameter errors")

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

// Real-time K-line stage
if not barstate.ishistory
    // Retrieve grid
    for i = 1 to numbers
        // Going long
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // Going short
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

FMZ реальный бот, инструменты для обратного тестирования и многочисленные функции в сочетании с простотой языка Pine являются отличным дополнением! Включая настройку параметров и код конфигурации обратного тестирования, общий код составляет менее 50 строк.

Конечно, эта стратегия - это сетевая стратегия, которая также имеет недостатки, и это не машина для печати денег, которая всегда выигрывает. Ключ зависит от использования и параметров. Мы больше сосредоточимся на том, как легко написать стратегии для реализации нашей собственной логики торговли и заработать деньги, написав стратегии и торгуя сами. Это так круто, не просить о помощи!

Пояснение кода

Я объясню вам все, код прост и легко понять, с таким легким для изучения и использования язык Пайн, если вы все еще не можете написать стратегию, то я буду... рассказать вам подробно!

Содержание/*backtestи*/в начале есть код конфигурации backtest FMZ. Это функция FMZ, а не содержание языка Pine. Конечно, вы можете оставить эту часть, и вы будете нажать на параметр управления вручную, чтобы установить конфигурацию backtest и параметры во время backtesting.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

Следующий код:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit points") / syminfo.mintick
  • strategy(overlay=true): Он используется для настройки некоторых опций скрипта, overlay=true, что означает присвоение истинного значения параметруoverlay, так что при рисовании диаграммы, она рисуется на основной диаграмме (K-линейный график является основной диаграммой, он может быть понят так просто).
  • varip beginPrice = 0: переменная beginPrice декларируется с помощью ключевого слова varip с начальным значением 0, который используется в качестве начальной цены для сетки.
  • var spacing = input.float(-1, title="Spacing prices"): Установите параметр стратегии, название параметра spacing price, который является расстоянием между каждой точкой сетки, установка 100 означает, что цена будет торговаться один раз в 100.
  • var dir = input.string("long", title="Directions", options = ["long", "short", "both"]): Установите параметр стратегии под названием direction, этот параметр представляет собой выпадающее окно с опциями длинный, короткий и оба, что означает, что сетка является длинной только, короткой только и оба, соответственно.
  • var amount = input.float(-1, title="Order quantity"): Установите параметр для управления объемом сделок на каждой точке сделок сетки.
  • var numbers = input.int(-1, title="Number of grids"): количество точек сетки, установка 20 - 20 точек сетки в одном направлении.
  • var profit = input.int(-1, title="Profit spreads") / syminfo.mintick: Установите параметр для контроля маржи прибыли каждой позиции в точке сетки перед закрытием позиции.

Далее, посмотрите на код:

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("Parameter errors")

Это означает, что если какие-либо параметры, такие как расстояние, сумма, числа и прибыль не установлены, по умолчанию -1, и стратегия остановится (вы не можете работать слепо без установки параметров)

Давай, давай!

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

Это означает, что когда стратегия находится на стадии K-линии в режиме реального времени и startPrice == 0, изменить значение startPrice на текущую последнюю цену. Можно понять, что когда стратегия официально работает, начальная текущая цена является начальной ценой сетки. Поскольку сценарий имеет историческую стадию K-линии BAR, стратегия будет выполнять логику один раз на стадии исторического BAR, и определенно бессмысленно расположить сетку на историческом BAR.

Что такое исторический этап BAR?

Чтобы привести простой пример, в текущий момент A стратегия начинает работать, и стратегия получает данные со 100 K-линией BAR. Со временем 100 BAR станут 101, 102...N. Когда она начинает работать с момента A, 101-й BAR - это этапа K-линии в реальном времени, и это время - последние данные в реальном времени. Затем с 1-го BAR до 100-го BAR - это исторические рыночные цены, которые прошли, но стратегия также будет работать на этих исторических рыночных ценах, поэтому этот этап является историческим этапом K-линии.

barstate.ishistoryэто встроенная переменная в языке Pine,barstate.ishistoryявляется истинным, если текущий BAR является историческим BAR, и ложным, если он не является историческим BAR. Так что, когда не barstate.ishistory является истинным, он находится на стадии K-линии в реальном времени.

Далее, функция создается

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

Если есть вызов функции findTradeId, он вернет идентификатор существующего ордера (обратите внимание, что этот идентификатор не является идентификатором ордера биржи, это название, данное ордеру стратегией или понимаемое как этикетка), если он не существует, возвращается строка notFound.

Следующий шаг - запустить сетку:

// Real-time K-line stage
if not barstate.ishistory
    // Retrieve grid
    for i = 1 to numbers
        // Going long
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // Going short
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

Используется петля for, и количество петлей определяется в соответствии с значением параметра числа, то есть соответствующее количество заказов расположены. Установите направление в соответствии с параметром dir. Используйте функцию findTradeId, чтобы узнать, был ли открыт заказ на этикетке на текущей позиции сетки, и разместите запланированный заказ только в том случае, если нет открытой позиции (если позиция открыта, она не может быть повторена). Для размещения заказа, используйте функцию strategy.order, чтобы указать лимитный параметр как запланированный заказ. Установите соответствующий заказ закрытия, размещая запланированный заказ. Заказ закрытия используетstrategy.exitфункция, указывает параметр прибыли и указывает точки прибыли.

img

img

Если посмотреть на кривую прибыли, то можно увидеть, что сеть тоже рискованна. Это не гарантированная выгода. Просто риск расширения сети в больших масштабах немного меньше.

Ну, если ты не знаешь, как написать стратегию на таком простом для изучения и использования языке Пайна, то я...


Связанные

Больше