Ստրատեգիաներ և թեստեր
Ինչպես գրել ստրատեգիա LootScript-ով և ստուգել այն պատմության վրա թեստերում՝ հայտարարում `strategy()`, հայտերը, կատարման մոդելը, ծախսերը, հաշվետվության ներդիրները եւ բեքթեստի սահմանափակումները։
Ստրատեգիան սկրիպտ է, որը գրաֆիկի վրայի գծերից բացի կադրում է հայտեր։ Հենց հայտերն չի իրականացնում բորսան, այլ տերմինալի ներսի սիմուլյատորը՝ այն անցկացնում է ստրատեգիան գրաֆիկի պատմության վրա՝ հաշվի առնելով կոմիսիաները, slippage- ը եւ funding rate-ը, եւ ցույց է տալիս արդյունքը Ստրատեգիայի թեստեր պատուհանում։
Հայտարարում strategy()
Ստրատեգիան ի տարբերություն ինդիկատորի սկսվում է առաջին տողում strategy(...)-ով՝ ոչ indicator(...)-ով։ Մնացածը — կարգավորումները, գրաֆիկական արտապատկերը եւ շուկայի տվյալները — գործում են նույն կերպ։ Ֆունկցիաները strategy.* ինդիկատորում չեն կոմպիլացվում՝ «strategy.* հասանելի է միայն strategy(...)-ում»։
| Պարամետր | Լռելյայն | Ինչ է սահմանում |
|---|---|---|
initialCapital |
10000 |
Սկիզբային կապիտալ |
defaultQtyType, defaultQtyValue |
strategy.qty.fixed, 1 |
Հայտի չափը, եթե հայտում չի նշվել qty |
commissionType, commissionValue |
տոկոս, նշված չէ | Կոմիսիա: strategy.commission.percent — շրջանառության տոկոս (0.05 = 0.05 %), strategy.commission.cash_per_contract — գումար մեկ կոնտրակտի համար, strategy.commission.cash_per_order — մեկ իրականացման համար |
slippageTicks |
0 |
Slippage տիկերով |
pyramiding |
0 |
Քանի էնտրին մեկ կողմում կարող է բաց մնալ; 0 — մեկ |
positionModel |
strategy.model.netting |
Մի ընդհանուր դիրք կամ առանձին երկար/կարճ (strategy.model.hedging) |
processOrdersOnClose |
false |
Իմաստ ունի նկարվել market հայտերը ընթացիկ բարի փակման պահին |
calcOnEveryTick |
false |
Թույլատրել հայտեր ձևավորվող բարի վրա |
marginLong, marginShort, leverage |
0, 0, 1 |
Մարժա տոկոսներով կամ leverage; при 0՝ լիկվիդացիա չի մոդելավորվում |
applyFunding |
true |
Ուշադիր լինել funding rate-ին |
fillModel |
strategy.fill.conservative |
Գնի ուղու ենթադրություն բարի ներսում |
Պարամետրերի արժեքները թույլատրվում են միայն թվեր եւ կայուն կոնստանտներ პირდაპირ տեքստում։ Հ uttryck կամ input.* հայտման մեջ՝ դա կոմպիլացիոն սխալ է։ Պարամետր calcOnOrderFills ընդունվում է, բայց այս build-ում չի գործում. թեստերի «Свойства» ներդիրում այն նշված է՝ «не действует в этой сборке»։
Եթե հայտի qty = na, ապա հայտի չափը որոշվում է defaultQtyType-ով՝
| Տիպ | defaultQtyValue նշանակում է |
|---|---|
strategy.qty.fixed |
Քանակը մետաղադրամներով (բազային արժույթ) |
strategy.qty.cash |
Գումարը ծածկագրված դիմացկուն արժույթով |
strategy.qty.percent_of_equity |
Տոկոս ներկայիս կապիտալից |
strategy.qty.risk_percent |
Կապիտալի տոկոսը, որով ռիսկ եք կրել մինչև պաշտպանական stop-ը |
s trategy.qty.risk_percent օգտագործելու համար պարտադիր է ունենալ strategy.exit stop-ով (loss կամ stop), հակառակ դեպքում կոմպիլյատորը կանգնեցնում է կոմպիլացիան՝ «պահանջվում է стоп, ըստ որի հաշվարկել չափը»։ Քանակը կկրքերանա ստորակայ ստորակետով՝ դեպի գործիքի քանակի քայլը։ Եթե կտրատելուց հետո մնում է զրո, հայտը մերժվում է եւ մեծանում է թեստերի ցուցիչը «Отвергнуто заявок (размер)»։
Հայտեր
| Ֆունկցիա | Ինչ է անում |
|---|---|
strategy.entry(id, direction, qty, limit, stop, …) |
Բերում է դիրք կամ կատարում է տարանցում (reverse). Ունի հաշվի position model-ը եւ pyramiding-ը |
strategy.order(id, direction, qty, limit, stop, …) |
Նույնը՝ առանց position model-ի եւ pyramiding-ի հաշվի |
strategy.exit(id, from_entry, qty, qty_percent, profit, limit, loss, stop, trail_price, trail_points, trail_offset, …) |
Պարզաբանում է ելքը — take-profit, stop-loss կամ trailing՝ բացված դիրքի համար |
strategy.close(id, comment, qty, qty_percent) |
Փակում է դիրքը market order-ով |
strategy.close_all(comment) |
Փակում է բոլոր դիրքերը |
strategy.cancel(id), strategy.cancel_all() |
Հանում է դեռևս չիրականացված հայտերը |
Ուղղությունը — strategy.long կամ strategy.short։ Բոլոր ֆունկցիաների մոտ հնարավոր է ունենալ ընտրովի when՝ when = false նշելով կանչը բաց է թողնվում։ Մուտքերին, ելքներին եւ փակարարներին կարելի է տալ comment — հայտի տեքստային թեգ։
- Մուտքի տեսակը. Առանց
limitեւstop— market order;limit-ով — limit order;stop-ով — stop order; երկուսի առկայությամբ՝ stop-limit։ Սույնid-ով կրկնվածstrategy.entryփոխարինում է դեռ չիրականացված հայտը։ - Ռիվերս (reverse).
nettingմոդելում հակառակ ուղղությամբ մուտքը փակելիս մի հրամանքով փակվում է ընթացիկ դիրքը եւ բացվում նորը։ - Ելքի միավորները.
profitեւlossնշվում են tick-երով մուտքի գնի հանդեպ,limitեւstop— ուղղակի արժեքներով (absolute prices). Trailing-ը սահմանվում է զույգով՝trail_offsetեւtrail_priceկամtrail_points։ - Ելք առանց մակարդակների ոչինչ չի անում. Կոմպիլյատորը զգուշացնում է՝ «strategy.exit առանց միևնույն մակարդակի (profit/loss/stop/limit/trail) — դատարկ գործողություն»։
- Stop-ի տեղափոխում. Նույն
id-ով կրկնվածstrategy.exitփոխարինում է գոյություն ունեցող ելքը — այս եղանակով շարժում են stop-ը։
Ստրատեգիայի վիճակը կարելի է կարդալ ռեժիսորների միջոցով՝ strategy.position_size (ստորագրով, կարճ դիրքը բացասական է), strategy.position_avg_price, strategy.equity, strategy.netprofit, strategy.openprofit, strategy.opentrades, strategy.closedtrades, strategy.funding_paid եւ այլն — ամբողջ ցանկը՝ ըստ ուղեցույցի։
Ինչպես թեստերը իրականացնում են հայտերը
Հայտը, որը հայտված է վրա բարի, չի իրականացվում շուտ քան հաջորդ բարը։ Պ_DECISION-ը ընդունվում է բարի փակման պահին, եւ իրականացնելը նույն գնով կնշանակեր “զարկ տալ ապագային նայել”։
| Заявка | Исполнение |
|---|---|
| Рыночная | Հաջորդ բարի բացման ժամանակ՝ գումարած slippage։ Եթե processOrdersOnClose = true — ընթացիկ բարի փակման պահին |
| Лимитная | Երբ գինը անցնում է լիմիթը՝ ըստ լիմիթի արժեքի։ Եթե բարը բացվել է լիմիթից այն կողմ — ըստ բացման |
| Стоп | Երբ գինը անցնում է стопը՝ ըստ стопի գնի, գումարած slippage։ Գեպի դեպքում — ըստ բացման գումարած slippage |
Գնի ուղին բարի ներսում. Տեսական ուղին բարի ներսում թեստերը իրականում չի գիտի և ենթադրում է այն։ Մոդել strategy.fill.conservative (Լռելյայն) ընդունում է, որ գինը նախ գնացել է ավելի վատուկ ծայրի՝ աճող բարի համար՝ բացում → նվազագույն → առավելագույն → փակել; նվազող բարի համար՝ հակառակն։ Եթե մեկ բարի մեջ հայտնվեցին եւ стоп, եւ тейք, նախ-ինկում կհապաղի стоп-ը։ Մոդել strategy.fill.optimistic ենթադրում է հակառակն՝ ծառայում է միայն համեմատության համար։ Այս build-ում մոլորակի փոքր таймֆрейմով проигрывания չկա՝ «Ուղին» սյունակում յուրաքանչյուր գործարք նշված է որպես մոդելով ենթադրյալ։
Ծախսերը.
- Կոմիսիա. Եթե
commissionValueնշված չէ, թեստերը կիրառելու են լռելյայն տարկը՝ 0.02% limit executions-ի համար եւ 0.05% market/stop executions-ի համար։ Ձեր հաշվի տարկները եւ ռիբեյթները տերմինալին անհայտ են։ Վրայով նշված թիվը տարածվում է բոլոր իրագործումների վրա։ - Slippage —
slippageTicksընդդիմությամբ ձեր վրա market եւ stop اجرا-ների ժամանակ։ Limit executions-ը չեն проскальзывают։ - Funding rate գանձվում է յուրաքանչյուր իրական հաշվարկի պահին՝ ըստ փաստացի rate-ի եւ հաշվարկի բարի փակման գնի։ Դա պահանջում է funding rate տվյալներ՝ ֆյուչերսների համար նշվածը покрытия աղյուսակում։
- Մարժա. Երբ ներկայանում են
marginLong/marginShortկամ leverage>1, թեստերը մոդելավորում է պարզեցված isolated margin։ Լոնգ դիրքը լիկվիդացվում է երբ արժեքը ընկնում է դեպի entry × (1 − m/2), կարճը՝ երբ արժեքը բարձրանում է դեպի entry × (1 + m/2), որտեղ m — սկիզբային մարժայի մասնաբաժինը։ Լիկվիդացված գործարքը կորցնում է ամբողջ սկիզբային մարժան։
Գործարքները, որոնք չեն փակվել մինչ պատմության վերջը, փակվում են վերջին բարի փակման գնով՝ պատճառով «վերջ տվյալների»։
Ստրատեգիայի թեստեր
Ավելացրեք ստրատեգիան գրաֆիկին
Խմբագրիչում սեղմեք Ավելացնել գրաֆիկին (Ctrl+Enter): սխալներով սկրիպտը գրաֆիկ չի հայտնվի։
Բացեք թեստերը
Խմբագրիչի գործիքների վահանակում սեղմեք Ստրատեգիայի թեստեր… — կոճակը ակտիվ է միայն այն սկրիպտների համար, որտեղ կա strategy(...)։ Մյուս ճանապարհը՝ ստրատեգիայի կարգավորումների шестерёнка-ից գրաֆիկի լեգենդում՝ կոճակը Ստրատեգիայի թեստեր…։
Սպասեք պրոցեսին
Թեստերը հաշվում են միայն այն մոմերի հիման վրա, որոնք բեռված են գրաֆիկում։ Առանց դրանց պատուհանը ցույց է տալիս «Стратегия ещё не считалась: дождитесь загрузки свечей»։ Երբ գալիս են նոր մոմերը, արդյունքը ինքնաբերաբար վերակենսանացվում է; Пересчитать կոճակը սկսում է լրիվ պրագոնը ձեռքով։
Եթե գրաֆիկում մի քանի ստրատեգիաներ կան, անհրաժեշտը կարելի է ընտրել թեստերի պատուհանում։
| Վкладка | Ինչ կա դրա մեջ |
|---|---|
| Аմփոփում | Պլիտներ՝ «Чистая прибыль», «Профит-фактор», «Макс. просадка (по закрытиям)», «Доля прибыльных», «SQN»; տող Чего этот бэктест не знает; կապիտալի կորեր, «купил-и-держи», կապիտալ առանց funding rate եւ երկու просадка |
| Ցուցանիշներ | Արդյունք, ռիսկ (просадка по закрытиям եւ բարի ներսում առանձին, Sharpe, Sortino, Calmar), գործարքներ (փաստացի շահութաբերների մասնաբաժինը, միջին եւ ամենամեծ, շարքեր), ծախսեր (կոմիսիա եւ funding rate) |
| Գործարքներ | Գործարքների աղյուսակ՝ մուտք, ելք, պատճառ, ծավալ, P&L, run-up, просадка, կոմիսիա, funding rate։ Սեղմումը տողի վրա կենտրոնացնում է գրաֆիկը մուտքի բարի վրա; Ctrl+C պատճենում է ընտրված տողերը |
| Սեփականություններ | Հայտի պարամետրերը, բարերի տիրույթը, գնային քայլը, քանակի քայլը, նվազագույն լոտը, կոմիսիան, պրագոնի հաշվիչները՝ մերժված հայտեր, пропущенные ըստ pyramiding, լիկվիդացիաներ, funding հաշվարկներ |
Վերնագրում՝ կատարման մոդելի նշանները՝ conservative կամ optimistic, եւ close-fill եթե processOrdersOnClose = true է։ Նշանները optimistic եւ close-fill նշանակում են, որ իրականում արդյունքը, ամենայն հավանականությամբ, ավելի վատ կլինի։
Ի՞նչ չի կարող կարդալ ստրատեգիան
Կենդանի order book եւ time and sales (լենտա). Ստրատեգիան, որը կարդում է book.* կամ tape.*, չի կոմպիլացվի՝ «Стратегия читает … у стакана и ленты нет истории, бэктест был бы вымыслом»։ Для истории order book-ի համար պետք է օգտագործել depth.*, իսկ գործարքների պատմության համար՝ delta.* եւ cluster.* (footprint cluster-ներ)։
Screener. screener.* նույնպես հասանելի է միայն վերջին բարի վրա, սակայն կոմպիլյատորը թույլատրում է такую стратегию։ Պատմության մեջ screener-ի արժեքները na են, հետեւաբար պայմանները այնտեղ չեն կատարվում եւ հաշվետվությունում դրանցից գործարքներ չեն հայտնվի։
Ապագային նայելը. request.security(..., lookahead = true) ստրատեգիայի դեպքում խմբագրիչը ցույց է տալիս նախազգուշացում՝ «Стратегия заглядывает вперёд … отчёт помечен как недостижимый в реальном времени»։ Տեսեք այս հաշվետվությունը որպես վերագնահատված՝ պատմությունում ստրատեգիան կարող է տեսնել արժեքներ, որոնք իրական ժամանակում դեռ գոյություն չեն ունեցել։ Մանրամասներ՝ Շուկայի տվյալներ բաժնում։
Օրինակ
Պրոբոյ ալիք՝ delta-ով հաստատմամբ. Մուտք՝ փակման պահին այն կողմում, որը դուրս է եկել len վերջին բարերից, եթե բարի delta-ն նույն ուղղությանն է. Stop՝ ATR-ում, take՝ կրկնակի։
strategy("Пробой канала с дельтой", overlay = true,
initialCapital = 10000,
defaultQtyType = strategy.qty.percent_of_equity, defaultQtyValue = 20,
commissionValue = 0.05, slippageTicks = 2)
len = input.int(20, "Канал, баров", minval = 5, maxval = 200)
stopAtr = input.float(1.5, "Стоп, ATR", minval = 0.5, maxval = 10, step = 0.1)
needFlow = input.bool(true, "Подтверждать дельтой")
upper = ta.highest(high, len)[1]
lower = ta.lowest(low, len)[1]
atr = ta.atr(14)
flowLong = not needFlow or (delta.available and delta.value > 0)
flowShort = not needFlow or (delta.available and delta.value < 0)
if close > upper and flowLong and strategy.position_size <= 0 {
strategy.entry("L", strategy.long, comment = "пробой вверх")
}
if close < lower and flowShort and strategy.position_size >= 0 {
strategy.entry("S", strategy.short, comment = "пробой вниз")
}
stopTicks = math.round(atr * stopAtr / sym.tick_size)
strategy.exit("L-x", from_entry = "L", loss = stopTicks, profit = stopTicks * 2)
strategy.exit("S-x", from_entry = "S", loss = stopTicks, profit = stopTicks * 2)
plot(upper, "Верх канала", color = color.teal)
plot(lower, "Низ канала", color = color.red)Եթե բորսան չունի delta (օրինակ՝ Binance Alpha) եւ միացված է «Подтверждать дельтой», ստրատեգիան չի կատարի ոչ մի գործարք՝ delta.available այնտեղ կեղծ է։ Դա na-ի օրենքն է աշխատում, ոչ թե սխալ։
Սահմանափակումներ
- Մեկայն սիմուլյացիա — իրական հայտեր գոյություն չունեն։
- Limit հայտերը իրականացվում են այնպես, կարծես դուք առաջինն եք հերթում. սա՝ maker-աստրատեգիաների հիմնական աղբյուրն է՝ վերագնահատված արդյունքների համար։
- Ձեր գործարքները գինը չեն շարժում, մաս-իրականացումներ չկան — հայտը կամ ամբողջովին իրականացվում է, կամ ոչ մի կերպ։
- Գնի ուղին բարի ներսում ենթադրվում է մոդելով, ոչ թե վերցված փոքրեռի timeframe-ից։
- Լիկվիդացիան պարզեցված է — բորսայի լիկվիդացիոն շարժիչը, ADL եւ ապահովագրական ֆոնդը չեն մոդելավորվում։
- Կոմիսիան — լռելյայն տարկ է, ոչ ձեր հաշվի տարկը։
- Տվյալների բացակայությունը չի նշանակում շարժմամունք: մոմը առանց footprint cluster-ների նույնպես ենթադրում է շարժում։
- Արդյունքը կախված է նրանից, որքան պատմություն բեռված է գրաֆիկում։