Si je n'avais pas encore écrit de stratégie en utilisant le langage Pine, si facile à apprendre, alors je...

Auteur:Le petit rêve, Créé à partir de: 2022-06-01 17:37:55, Mis à jour à partir de: 2023-09-18 20:19:45

img

Si vous n'avez pas encore écrit de stratégie en utilisant le langage Pine, si facile à apprendre, alors je...

C'est dommage que tant de bonnes stratégies, idées et indicateurs ne puissent pas être mis en œuvre dans TradingView. C'est dommage que FMZ, qui s'efforce d'offrir des techniques de trading quantitatives à un grand nombre de traders, ne puisse pas contenir l'impulsion de résoudre ce problème!

Il est impossible de supporter cette demande!

Ainsi, dans le monde du code de programmation, après avoir traversé des montagnes, traversé des milliers de montagnes, traversé 9 * 9 = 81 fosses, passé d'innombrables nuits sans sommeil, les angles des murs se sont accumulés après avoir construit des coquillages de bœufs rouges typiques des collines. FMZ a finalement pris en charge la compatibilité avec le langage Pine, et tous les scripts Pine de TradingView peuvent être utilisés.

J'ai appris le langage Pine par moi-même récemment. Cependant, le langage Pine est vraiment simple et facile à utiliser et à apprendre. Pourquoi? Tu ne crois pas? Regarde mes oignons qui t'écrivent une stratégie de grille.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

FMZ dispose d'une plate-forme physique, d'outils de retouche, de nombreuses fonctionnalités, ainsi que de la facilité d'utilisation du langage Pine.

Bien sûr, cette stratégie est une stratégie de filet, la stratégie de filet a aussi des blessures, et non pas une machine à imprimer gagnant-gagnant, il est essentiel de voir l'utilisation, les paramètres. Cela ne suffit pas à décrire, nous nous concentrons davantage sur la façon dont il est facile d'écrire des stratégies, de réaliser sa propre logique de transaction, d'écrire des stratégies de transaction pour gagner de l'argent, sans demander à personne.

L'explication du code

Je suis ici pour vous expliquer, le code est simple et facile à comprendre, et si vous n'avez pas encore écrit une stratégie dans ce langage facile à apprendre, je vais vous en parler en détail!

Le début/*backtestet*/Le contenu enveloppé est le code de configuration de la réévaluation de FMZ, qui est une fonctionnalité de FMZ, et non le contenu de la langue Pine. Bien sûr, vous pouvez ne pas écrire cette partie du contenu, vous devez cliquer manuellement sur le contrôleur de paramètres pour configurer la configuration et les paramètres de la réévaluation.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

Le code suivant:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
  • strategy(overlay=true)Les options utilisées pour définir le script, overlay=true, sont de donner des paramètresoverlayLa valeur de true est attribuée à la figure principale du graphique (la figure K est la figure principale, c'est si simple à comprendre).
  • varip beginPrice = 0: le mot clé varip déclare que la variable beginPrice a une valeur initiale de 0, qui est la valeur initiale de la grille utilisée.
  • var spacing = input.float(-1, title="间距价格")Paramètre de stratégie: définir un paramètre de stratégie appelé l'intervalle de prix de l'intervalle de prix, soit l'intervalle de chaque point de la grille, définir 100 est le prix sur 100, une transaction.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): définir un paramètre de stratégie, appelé le paramètre de direction de la grille, ce paramètre est une option avec une barre d'attraction, vous pouvez choisir long, short, both.
  • var amount = input.float(-1, title="下单量"): définit un paramètre pour contrôler la quantité de transactions effectuées à chaque transaction de point de la grille.
  • var numbers = input.int(-1, title="网格数量"): le nombre de points de la grille, 20 est 20 points de la grille dans une direction.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: définir un paramètre pour contrôler la rentabilité de chaque point de la grille et la différence de prix pour l'équilibre.

Le code suivant:

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

Cela signifie que si l'un des paramètres spacing, amount, numbers, profit n'est pas défini par défaut sur -1, la stratégie s'arrête (pas de paramètre défini ne fonctionne pas - haha!)

Allez, allez!

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

Cela signifie que lorsque la stratégie est à la phase de la ligne K en temps réel et que le prix de début == 0, la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification de la valeur de la modification.

Quelle est la phase BAR de l'histoire?

Par exemple, à partir du moment A, la stratégie commence à fonctionner, elle obtient une base de données de 100 BARs de lignes K, et au fil du temps, 100 BARs deviennent 101, 102... N. À partir du moment A, la 101e barre est la phase de la ligne K en temps réel, ce qui est la dernière phase de la ligne K en temps réel.

barstate.ishistoryC'est une variable intégrée au langage Pine, si le BAR actuel est le BAR de l'étape historique, alors il est possible de modifier la valeur de la variable.barstate.ishistorySi le bar est vrai, il est faux s'il n'est pas dans la phase historique. Ainsi, si le barstate.ishistory est vrai, il est dans la phase de ligne K en temps réel.

Ensuite, nous avons créé une fonction.

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

Le rôle de cette fonction est de rechercher si un id est présent dans tous les ordres actuellement en cours d'exécution. Si tel est le cas, la fonction findTradeId renvoie l'ID de la souris existante (Notez que cet ID n'est pas l'ID de l'ordre de l'échange, mais le nom ou la balise de la stratégie à l'ordre), si ce n'est pas le cas, elle renvoie la chaîne "notFound".

Il y a eu un autre débat sur la façon de créer un réseau:

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

Le cycle for est utilisé pour déterminer le nombre de cycles, c'est-à-dire la mise en place d'ordres correspondant à des nombres; le paramètre dir est utilisé pour définir la direction; la fonction findTradeId est utilisée pour déterminer si les ordres étiquetés à la position actuelle de la grille ont été ouverts et ne peuvent être déplacés que lorsqu'ils ne sont pas ouverts; le sous-commande est utilisé pour définir le paramètre limit de la stratégie.

img

img

img

img

Si vous regardez la courbe des bénéfices, vous savez que le filet est risqué et non gagnant-gagnant, mais que le risque est relativement faible à une grande échelle.

Donc, si vous n'avez pas encore écrit de stratégie en utilisant le langage Pine, qui est si facile à apprendre, alors je...


Relationnée

Plus de

Le harceleurCe type de tutoriel au niveau de l'enseignement maternel peut-il y en avoir plusieurs, il est préférable d'en avoir un spécifique pour le pin (pour les connaissances payantes)hhh │ rêve total v587

artronMerci beaucoup.

Il est mort en 2009.Le rêve total V5

Le petit rêveOui, une série de tutoriels sur le pin a déjà été faite à la station B: https://www.bilibili.com/video/BV1sU4y1B71i/

Le petit rêveMerci pour votre soutien à FMZ.

Le petit rêveUne vidéo d'introduction à la langue PINE est également disponible sur la chaîne B.