La stratégie de grille, la stratégie Martingale, qui préfèrent les fluctuations du marché, ont leurs propres inconvénients, et ils ont été testés depuis un certain temps sur le marché des contrats ETH.FMZ.COMUne chose à propos de ce genre de stratégie est très d'accord avec un ami, c'est que, comme pour les contrats, aller long a moins de risque que d'aller court sur le marché de la monnaie numérique.
Donc, Martingale, Grille et d'autres stratégies vont juste long, pas court, et répartir le risque de la pêche au fond dans une longue distance sera mieux que la position bilatérale? Cette idée semble très bonne, mais personne ne sait si elle peut être mise en pratique. Mais, au moins, nous pouvons backtest simplement.
Le code pour mettre en œuvre cette idée est vraiment simple, grâce à la flexibilité de la plateforme, l'encapsulation de l'interface, le système de backtesting puissant et ainsi de suite.
L'idée de conception de la stratégie est très simple. Placez l'ordre d'achat à des intervalles en bas en fonction du prix initial au début de la logique et si le prix continue de baisser, nous continuons à placer l'ordre d'achat et continuons à pêcher en bas. Ensuite, nous plaçons l'ordre de position de clôture basé sur le prix de la position augmentant une certaine marge bénéficiaire, et attendons la fermeture de la position. Si la position est fermée, la logique ci-dessus sera répétée avec le prix actuel comme prix initial. La stratégie ne sera pas courte pour maintenir la position, mais aller long seulement.
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:
Avec ces 6 paramètres seulement.
Réglez la plage de temps de backtesting au hasard:
Test de retour:
Il ressemble beaucoup à la stratégie de grille, la stratégie de Martingale ~. Les étudiants qui sont débutants ont généralement peur de la stratégie avec un code long, ce qui est facile à dissuader. Une stratégie courte et concise pour commencer est plus facile et plus appropriée pour comprendre les idées de stratégie et apprendre la conception logique.
Le code de stratégie est uniquement à des fins d'étude et de recherche.