La stratégie de grille et la stratégie de Martingale, qui aime osciller les cotations du marché, ont des inconvénients inhérents, et des stratégies similaires ont été testées sur le marché des contrats ETH pendant une période de temps.FMZ.COMIl y a une chose que je suis vraiment d'accord avec un ami à propos de ce type de stratégie. c'est de faire des contrats dans le cercle de la monnaie, et le risque de faire long est inférieur à celui de faire court. ou simplement, la pire chute est de revenir à zéro, mais la hausse est infinie.
Donc, des stratégies comme la Martingale et la Grille ne font-elles que de longues, mais pas de courtes? Est-il préférable de répartir le risque de pêche au fond sur une longue distance plutôt que de le faire bilatéralement? Cette idée semble très bonne, mais personne ne sait si elle peut résister au combat réel. Mais au moins, nous pouvons simplement backtest cette idée. Par conséquent, nous avons le sujet de l'article d'aujourd'hui - Concevoir une stratégie de pêche au fond du contrat.
Le code pour mettre en œuvre cette idée est très simple, grâce à la flexibilité, l'encapsulation de l'interface et le puissant système de backtest de la plate-forme FMZ, etc. Le code entier est de seulement 60 lignes (pour les spécifications de rédaction de code, de nombreuses lignes qui peuvent être abrégées, ne sont pas abrégées).
La conception de l'idée de la stratégie est très simple. Selon le prix initial au début de la logique, placez un ordre d'achat, si la distance d'intervalle diminue. Si le prix continue de diminuer, continuez à placer un ordre d'achat et gardez la pêche au fond. Ensuite, attendez l'ordre de position ferme après le prix de la position ajoutant un certain spread de profit, et attendez de fermer. Si la position est fermée, la logique ci-dessus est répétée avec le prix actuel comme prix initial.
Le code source de la stratégie:
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)
}
}
La conception des paramètres est également très simple:
Il n'y a que quelques paramètres.
Réglez la plage de temps de backtest aléatoirement:
Test de retour:
Il ressemble à une stratégie de type grille ou Martingale. Les nouveaux apprenants qui commencent tout juste ont-ils très peur de ce genre de longues stratégies et sont-ils facilement persuadés d'abandonner? Une introduction de stratégie brève et concise est plus appropriée, et il est plus facile de digérer les idées de stratégie et d'apprendre la conception logique.
Les codes stratégiques ci-dessus sont utilisés uniquement pour l'étude et la recherche.