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

Автор:Маленькие мечты, Создано: 2022-06-01 17:37:55, Обновлено: 2023-09-18 20:19:45

img

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

Очень жаль, что так много хороших стратегий, идей и индикаторов не могут быть реализованы. Это очень печально. ФМЗ, как и многие другие трейдеры, которые стремятся распространить квантовые технологии торговли, не может сдержать желания решить эту проблему!

Это требование абсолютно невыносимо!

Таким образом, в мире разработки программного кода после того, как мы прошли через горы, прошли через тысячи гор, прошли через 9 * 9 = 81 ямы, проспали бесчисленные бессонные ночи, мы наконец-то получили поддержку FMZ для совместимости с языком Pine, различные сценарии Pine для TradingView могут быть использованы.

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

/*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="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

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 

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        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)
        // 做空
        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.

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

Кодовые инструкции

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

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

/*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="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
  • strategy(overlay=true)Некоторые параметры, которые используются для настройки сценария: overlay=true, то есть параметры.overlayПрисвоение значения true, чтобы при рисовании, рисовать в графике главного диаграфа (К-прямая карта является основным диаграммой, так просто понять).
  • varip beginPrice = 0: с помощью ключевого слова varip объявляется начальное назначение переменной beginPrice на 0, это значение является начальным ценом, используемым в качестве сетки.
  • var spacing = input.float(-1, title="间距价格")Настройка параметра политики: параметр называется диапазоном цены диапазона диапазона, то есть диапазоном цены на каждой точке сетки, настройка 100 означает, что цена через 100 будет торговаться один раз.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): настроить параметр политики, называемый параметром направленности решетки, параметр, который является опцией с затяжной рамкой, вы можете выбрать длинный, короткий, и оба.
  • var amount = input.float(-1, title="下单量"): устанавливает параметр для управления количеством сделок на каждой точке сетки.
  • var numbers = input.int(-1, title="网格数量")Количество точек сетки: 20 точек сетки в одном направлении.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintickНастройка параметров, которые контролируют, насколько выгодно держать цену в каждой точке сетки.

Следующая запись:

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

Это означает, что если параметры spacing, amount, numbers, profit не установлены по умолчанию на -1, политика прекращается ((не устанавливая параметры не может бежать вслепую - ха-ха!)).

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

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

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

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

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

barstate.ishistoryЭто встроенная переменная языка Pine, если текущий BAR - это BAR исторического этапа, то это означает, что он не имеет значения.barstate.ishistoryЕсли true, то BAR будет false, если не является исторической стадией.

А затем мы создаем функцию.

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 выполняется для того, чтобы найти, есть ли какой-либо ID среди всех заказов, которые в настоящее время находятся на рынке. При вызове функции findTradeId, если он существует, возвращается ID существующего элемента (примечание: этот ID не является ИД ордера биржи, а имя или тег, который используется для указания ордера), если он не существует, возвращается строка "notFound".

В следующий раз мы начинаем разрабатывать сеть:

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        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)
        // 做空
        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 для определения количества циклов, то есть размещения соответствующих отдельных заказов на основе параметров numbers. Используется параметр dir для установки направления. Используется функция findTradeId для поиска того, были ли заказы, помеченные на текущее местоположение решетки, уже открытыми, и переходить в план только при отсутствии открытых позиций. Используется функция strategy.order для определения параметров limit в качестве плана. Используется параметр strategy.order для определения параметров limit в качестве плана. Используется параметр strategy.order для определения точки прибыли.

img

img

img

img

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

Так что, если я не пишу стратегии с таким простым языком для обучения, как Pine, то я...


Связанные

Больше

ПреследовательУроки такого уровня могут быть несколько, предпочтительнее специальное обучение для пина ((знания платные)hhh 、 сон в общей сложности v587

артронаСпасибо.

БбббвввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввДрем-то В5

Маленькие мечтыДа, на станции B уже была сделана серия учебников Pine: https://www.bilibili.com/video/BV1sU4y1B71i/

Маленькие мечтыНеприветливо, спасибо за поддержку FMZ.

Маленькие мечтыНа B-станции также есть видео, посвященное знакомству с языком PINE.