Écrire un outil de trading semi-automatique en utilisant le langage Pine

Auteur:Je ne sais pas., Créé: 2022-11-08 09:56:48, Mis à jour: 2023-09-15 20:52:26

img

Bien qu'il y ait de plus en plus de traders qui écrivent des programmes pour le trading entièrement automatisé, le plus grand groupe de traders sont toujours des traders manuels. En fait, les traders subjectifs manuels peuvent également écrire de petits outils pour les aider dans leur trading subjectif. Par exemple, parfois, vous trouvez une bonne position d'entrée et prévoyez de définir un stop loss fixe et un profit de trailing sur la position initiale. Ensuite, débarrassez-vous des choses plus énergivores comme la surveillance ultérieure du marché, suivez exactement votre propre plan établi de stop loss et de take profit, et laissez le programme faire la surveillance du marché pour vous. Stop loss pour les paris perdants, profit de trailing pour les paris gagnants pour aider le trading manuel.

Conception des paramètres

La stratégie pour concevoir de telles exigences en utilisant le langage Pine est très simple. Les paramètres suivants doivent être conçus pour atteindre la fonction selon les exigences:

  1. Compte tenu de l'évolution de la valeur de l'échange, le prix de l'échange est calculé en fonction de l'évolution de la valeur de l'échange.
  2. Limite: Paramètres utilisés pour contrôler - A. Position de base initiale pour acheter directement, B. Prix spécifié à attendre pour acheter, C. Ne rien faire.
  3. montant: le montant des ordres passés lors de l'ouverture de la position de base.
  4. Perte: points de rupture.
  5. La différence de prix qui compense le prix d'ouverture lorsqu'un stop-profit est déclenché.
  6. minTick: Unité minimale de fluctuation des prix.
  7. direction: direction d'ouverture de la position de base.

Conception de la stratégie

/*backtest
start: 2022-09-24 00:00:00
end: 2022-09-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["v_input_1",20],["v_input_2",0],["v_input_4",50],["v_input_5",20],["RunMode",1,358374],["ZPrecision",0,358374],["XPrecision",3,358374]]
*/

strategy("Tracking loss and profit stopping entrustment", overlay = true)

varip targetPrice = na
varip high_lowPrice = na
varip isTrade = false 
varip isAlert = false
varip isAlertMinTick = false
varip isAlertFinished = false 

varip offset = input(30, "offset", "Tracking stop loss and stop profit offset")
varip limit = input(-1, "limit", "Initial opening price: - 1 means no opening, 0 means immediate opening, and other specific values are price limits")
varip amount = input(1, "amount", "amount of opening positions")
varip loss = input(30, "loss", "stop loss")
varip targetOffset = input(30, "targetOffset", "trigger tracking profit and loss stop offset")
varip minTick = input(1, "minTick", "the minimum unit of price fluctuation")
tradeType = input.string("long", "direction", tooltip="order direction, long: go long, short: go short", options=["long", "short"])

if not barstate.ishistory and not isAlertMinTick
    runtime.log("check whether syminfo.mintick is correct! syminfo.mintick:", syminfo.mintick, "#FF0000")
    if syminfo.mintick < minTick 
        runtime.error("system syminfo.mintick < minTick parameter", "#FF0000")
    isAlertMinTick := true 

if not barstate.ishistory and limit == -1 and not isAlert
    runtime.log("No open price is set, current limit is -1 (to prevent false openings, initial default limit is -1), openings are prohibited", "#FF0000")
    isAlert := true 

if isTrade and strategy.position_size == 0 and not isAlertFinished
    runtime.log("All order processes executed, position is 0", "#FF0000")
    isAlertFinished := true 

if not barstate.ishistory and not isTrade and limit != -1
    if limit == 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount)
    else if limit > 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount, limit=limit)
    
    if tradeType == "long"
        targetPrice := (limit == 0 ? close : limit) + targetOffset
    else 
        targetPrice := (limit == 0 ? close : limit) - targetOffset
    strategy.exit("exit", "open", amount, loss=loss, trail_price=targetPrice, trail_offset=offset)
    runtime.log("The price per point is:", syminfo.mintick, ", current close:", close)
    isTrade := true 

if ((close > targetPrice and strategy.position_size > 0) or (close < targetPrice and strategy.position_size < 0)) and not barstate.ishistory
    high_lowPrice := na(high_lowPrice) ? close : high_lowPrice
    if strategy.position_size > 0 
        high_lowPrice := close > high_lowPrice ? close : high_lowPrice
    else 
        high_lowPrice := close < high_lowPrice ? close : high_lowPrice

plot(targetPrice, "trail_price trigger line")    
plot(strategy.position_size!=0 ? high_lowPrice : na, "current highest/lowest price")
plot(strategy.position_size!=0 ? (strategy.position_size > 0 ? high_lowPrice-syminfo.mintick*offset : high_lowPrice+syminfo.mintick*offset) : na, "moving stop loss trigger line")

La conception de la stratégie n'est pas compliquée, mais elle doit être configurée comme un "modèle de prix en temps réel", car le prix doit être surveillé à tout moment.

img

Remarquez que le stop loss est exprimé en points (minTick) et le décalage est également exprimé en points (minTick). Le décalage de la ligne de déclenchement du stop profit de l'objectif d'offset est exprimé en termes de distance de prix (par exemple, réglé sur 30, qui est RMB30 pour la distance). Lorsque le minTick est 1, 30 signifie RMB30 pour la distance.

Cette stratégie de commission est conçue pour permettre non seulement aux positions de base initiales d'aller longues, mais aussi aux positions de base initiales d'aller courtes.

Démontrons la mise en œuvre de la conception comme suit:

1. Lorsque la stratégie est en cours d'exécution, la position de base sera ouverte et entrée immédiatement, puis le stop loss et le stop profit de suivi seront définis en fonction des paramètres.

img

direction est réglée sur long, le paramètre limite est réglé sur 0, c'est-à-dire que la stratégie entre et va long immédiatement quand elle est exécutée, le montant est réglé sur 1, c'est-à-dire que la stratégie ouvre une position de 1 contrat.

img

2. spécifier le paramètre limite, spécifier le prix d'entrée

Les autres paramètres restent inchangés, sauf que le prix limite du paramètre spécifié est: 1276

img

Le paramètre limite par défaut est -1, qui ne fonctionne pas et empêche l'ouverture accidentelle des positions

img

La fin

Lors de l'utilisation de la stratégie de langage Pine, il est important de prêter une attention particulière aux données minTick.

img

Le paramètre Pricing Currency Accuracy est défini sur 0, ce qui signifie que la valeur des données de prix est précise à un seul chiffre (c'est-à-dire 0 décimales). Puis l'unité minimale de changement de prix est 1. Puisque certains paramètres sont liés au nombre exact de minTicks, cela nécessite une attention supplémentaire.

OK, ce qui précède est la conception complète de cette stratégie de commission semi-automatique, bien que je l'utilise également pour le trading de robots réels. Mais ces outils doivent également être utilisés en fonction de vos propres habitudes de trading pour comprendre, des modifications spécifiques, l'optimisation peut être effectuée par vous-même. Ici, le code de stratégie est uniquement pour le partage public, la conception et la logique d'apprentissage d'échange.

Comme nous pouvons le voir, le langage Pine est très facile à utiliser, et il est pratique et facile à apprendre. Nous pouvons utiliser le langage Pine pour concevoir les outils que nous voulons rapidement, sans avoir à nous soucier de la programmation compliquée, et utiliser le langage Pine pour faciliter le trading quantitatif sur la plateforme de trading quantitative FMZ.


Relationnée

Plus de