Стратегии, которые предпочитают волатильным рынкам, такие как стратегия сетки и стратегия Мартингейла, имеют присущие им недостатки. Подобные стратегии были опробованы на рынке контрактов ETH в течение некоторого времени. Я также часто общаюсь и делюсь опытом с новыми и старыми игроками на FMZ.COM. Что касается такого рода стратегии, есть один момент, в котором я полностью согласен с тем, что сказал мой друг. То есть при заключении контрактов в криптовалютном цикле риск открытия длинной позиции немного ниже, чем риск открытия короткой позиции. Или, проще говоря, худшее возможное падение равно нулю, а потенциал роста неограничен.
Итак, будут ли такие стратегии, как Мартингейл и сетка, ориентированные только на длинные позиции и не ориентированные на короткие, а также распределяющие риски выбора дна на большом расстоянии, лучше, чем двусторонняя торговля? Эта идея звучит хорошо, но никто не знает, выдержит ли она практического воплощения. Но, по крайней мере, мы можем просто проверить эту идею. Итак, тема сегодняшней статьи — разработка стратегии выбора наиболее выгодных контрактов.
Код для реализации этой идеи на самом деле очень прост благодаря гибкости платформы, инкапсуляции интерфейса, мощной системе бэктестинга и т. д. Весь код занимает всего 60 строк (в целях соблюдения стандартов написания кода многие сокращения не используются).
Стратегия очень проста. Согласно начальной цене в начале логики, ордера на покупку размещаются с интервалами вниз. Если цена продолжает падать, продолжайте размещать ордера на покупку, чтобы продолжить ловлю на дне. Затем разместите ордер на закрытие, рассчитанный на основе цены позиции плюс определенная разница в прибыли, и дождитесь закрытия позиции. Если позиция закрыта, то вышеописанная логика будет повторена с текущей ценой в качестве начальной. Стратегия не предполагает открытия коротких позиций, только длинных.
Исходный код стратегии:
function cancelAll() {
while (true) {
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
break
}
for (var i = 0 ; i < orders.length ; i++) {
exchange.CancelOrder(orders[i].Id, orders[i])
Sleep(interval)
}
}
}
function getLong(arr, kind) {
var ret = null
for (var i = 0 ; i < arr.length ; i++) {
if (arr[i].Type == (kind == "pos" ? PD_LONG : ORDER_TYPE_BUY)) {
ret = arr[i]
}
}
return ret
}
function pendingBidOrders(firstPrice) {
var index = 0
var amount = baseAmount
while (true) {
var pos = _C(exchange.GetPosition)
var price = firstPrice - index * baseSpacing
amount *= ratio
index++
exchange.SetDirection("buy")
exchange.Buy(price, amount)
if (pos.length != 0) {
var longPos = getLong(pos, "pos")
if (longPos) {
exchange.SetDirection("closebuy")
exchange.Sell(longPos.Price + profitTarget, longPos.Amount)
}
}
while (true) {
Sleep(interval)
if (!getLong(_C(exchange.GetOrders), "orders")) {
cancelAll()
break
}
if (!getLong(_C(exchange.GetPosition), "pos")) {
cancelAll()
return
}
}
}
}
function main() {
exchange.SetContractType(symbol)
while (true) {
pendingBidOrders(_C(exchange.GetTicker).Last)
}
}
Конструкция параметров также очень проста:
Есть только эти несколько параметров.
Просто установите временной диапазон бэктеста:
Тестирование на исторических данных:
Это очень похоже на стратегию типа сетки или Мартина~. Боятся ли новые студенты, которые только начинают учиться, длинных стратегий и легко ли они отчаиваются? Более подходящим будет краткое и лаконичное введение в стратегии, которое облегчит усвоение стратегических идей и изучение логического проектирования.
Код стратегии предназначен только для учебных и исследовательских целей.