Tutoriel pour débutant FMZ

Auteur:Le foin, Créé: 2019-04-09 11:29:07, Mis à jour: 2024-02-06 17:35:38

[TOC] Je vous en prie.

img

1.Commencez par la plateforme FMZ

C'est une instruction de base pour les débutants, pour une version complète de notre documentation API, consultezL'API FMZIl y a beaucoup de spécifications évidentes qui ne sont pas couvertes dans ce tutoriel laissé pour vous de découvrir.

Après avoir appris tout le tutoriel, vous saurez comment fonctionne FMZ et être en mesure d'écrire quelques stratégies de base.

1.1 À propos de la plateforme FMZ

C'est quoi la plateforme FMZ?

FMZ est une plateforme de trading automatisée pour les traders de crypto-monnaie avec support pour de nombreux marchés d'échange de bitcoins / et / altcoins.

Que peut faire FMZ pour vous?

Vous pouvez apprendre à écrire vos bots ((stratégies) à partir de notre stratégie carré qui contient beaucoup de code source ouvert, partager votre stratégie s code avec d'autres, demander de l'aide professionnelle à tout moment, exécuter votre stratégie sur de nombreux échanges, contrôler votre bot sur le site avec un ordinateur ou un téléphone portable, vendre vos stratégies si vous le souhaitez, communiquer avec de nombreux autres amateurs de trading automatique dans notregroupeEn un mot, FMZ est une plateforme parfaite pour ceux qui veulent faire du trading automatisé.

Quels échanges de crypto-monnaie est-ce que FMZ prend en charge?

FMZ prend en charge presque tous les échanges populaires, tels queBinance, Bitfinex, Bitstamp, OKEX, Huobi, Poloniex, etc. vous pouvez également négocier des contrats à terme surOKEXetBitMEXVérifiez la liste complète de soutien surAppareils électroniquesVous n'avez qu'à écrire une stratégie et l'exécuter sur tous les échanges sans aucun changement.

Quels langages de programmation est-ce que FMZ prend en charge?

FMZ prend en charge JavaScript, Python, C++ (JavaScript et Python sont recommandés) pour le codage de vos stratégies.

Votre clé API est en sécurité?

En effet, vos clés API sont sauvegardées après le chiffrement.

  • Vous devez entrer le mot de passe FMZ Lorsque vous ajoutez la clé.https.
  • Vous devez entrer le mot de passe FMZ lorsque vous exécutez le dock sur votre serveur ou ordinateur.
  • FMZ enverra la clé chiffrée à votre docker en utilisant https lorsque vous démarrez un bot. Le docker décryptera pour obtenir la clé.
  • FMZ n'enregistre pas votre mot de passe (seulement le mot de passe Hash).
  • Vous devez protéger votre propre mot de passe et le serveur docker. Il est préférable d'utiliser une deuxième connexion de vérification FMZ.

Liste des fonctionnalités actuelles:

  • 1.Cross-platform, prise en charge de tous les principaux échanges de crypto-monnaie plus bientôt
  • 2.Soutien à l'échange simulé. https://wex.app/
  • 3. dispose d'un système efficace de simulation des tests antérieurs.
  • 4.Prise en charge de l'envoi d'e-mails, de la diffusion de messages vers votre compte Telegram.
  • 5.Contrôle basé sur le Web accessible par téléphone.
  • 6.Prise en charge de la programmation Python\C++\JavaScript.
  • 7.Le coût est extrêmement bas. 0,125 RMB par heure, soit environ 0,018 dollar.
  • 8.NoFMZ fonctionne depuis plus de quatre ans sans aucun problème de sécurité.

1.2 Un démarrage rapide de l'utilisation de la plateforme FMZ

Pour exécuter un bot, vous devez avoir une stratégie, ajouter un échange, déployer un docker d'abord. le docker est l'exécuteur de votre stratégie qui s'exécute sur votre propre ordinateur ou serveur.

Un rapide coup d'œil sur la page principale

img

  • 1.Votre page de commande principale
  • 2.Gérer tous vos robots (démarrer,arrêter,supprimer,ouvrir,etc.)
  • 3.Gérer toutes vos stratégies code
  • 4.Déployer et gérer votre docker
  • 5.Ajouter de nouveaux échanges
  • 6.Trading manuel sur les bourses que vous avez ajoutées
  • 7.Payez votre facture
  • 8.Faites n'importe quelle question ici
  • 9.Échange simulé des FMZ
  • 10.Outil de débogage où vous pouvez exécuter un bloc de code sans démarrer un bot.
  • 11.Tous les types de messages
  • 12.Cadrée de stratégie où sont énumérées les stratégies de source ouverte et de recharge
  • 13.Robots en direct où tous les robots en direct sont répertoriés.
  • 14.Forums où vous pouvez publier un post pour discuter de toute question connexe.
  • 15.Demandez à quelqu'un d'écrire du code pour vous ou de fournir ce service à d'autres.
  • 16.Produits destinés aux bourses et aux agences.
  • 17.Documentation sur les API.
  • 18.Certains outils utiles, vérifiez par vous-même.
  • 19.Vos informations de compte.

Ajouter un échange

Ajouter àhttps://www.fmz.com/m/add-platform, ou cliquezPlatformétiquette. Votre clé d'accès et votre clé secrète peuvent être appliquées à l'échange de crypto-monnaie. API-KEY est utilisé pour échanger et obtenir les informations privées de l'échange. Vous pouvez vous inscrire sur les FMZéchange simuléet l'ajouter pour les tests.

img

déployer un docker

FMZ n'exécute pas de bots pour vous, vous devez déployer un docker par vous-même en tant qu'exécuteur, ce qui est plus flexible et sûr puisque notre service ne participe pas à l'exécution de vos bots.

Pour les fenêtres, c'est assez facile, il suffit de suivre les instructions surhttps://www.fmz.com/m/add-node

img

Pour Linux, vous pouvez louer un VPS sur notre site Web, qui déploiera le docker automatiquement. Voici les étapes à suivre pour déployer sur votre propre serveur Linux (recommandé):

  • 1.Achetez un serveur en nuage (VPS) chez Amazon ou Google, la configuration la plus basse et la moins chère suffit. Vous pouvez souvent avoir un essai gratuit pendant une longue période.
  • 2. Connectez-vous à votre serveur, suivez les instructions de votre fournisseur de serveur ou recherchez-le sur Google.
  • Choisissez le docker qui correspond à votre version de système, la plupart du temps, il est 64 bits.
  • 4. Pour des centaines, courezwget www.fmz.com/dist/robot_linux_amd64.tar.gzLa commande n'a pas été trouvée?yum install wget -y.
  • 5.Run tar -xzvf robot_linux_amd64.tar.gzPour décompresser.
  • 6.Run ./robot -s node.fmz.com/xxxxx -p -p yourFMZpasswordVous devriez voir quelque chose comme2018/07/05 05:04:10 Login OK, SID: 62086, PID: 7226, Name: host.localdomain, ce qui signifie que tout est travaillé.node.fmz.com/xxxxxest unique pour chaque utilisateur, trouvez votre proprehttps://www.fmz.com/m/add-node.
  • 7.Maintenant, le docker n'est pas exécuté en arrière-plan, si vous fermez le client SHH, le docker s'arrêtera. Appuyez surctrl + Cpour arrêter le docker.
  • 8.Run nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &Cette étape peut également être effectuée parScreen command.
  • 9.Vérifierhttps://www.fmz.com/m/nodes, si tout va bien, vous pouvez trouver le docker déployé là-bas.

Écrivez une stratégie

Vous devriez écrire votre propre stratégie ou acheter à partir du carré. Ici, nous allons utiliser une stratégie JavaScript simple comme une démo pour montrer comment utiliser la page d'édition.https://www.fmz.com/strategy/125482Je suis désolée. Ce tutoriel ne couvrira pas comment utiliser JavaScript car vous pouvez trouver beaucoup de tutoriels en ligne.

img

  • 1.Modifier votre code
  • 2.Le backtesting, nous couvrirons cette partie dans un tutoriel intermédiaire
  • 3.Le langage de programmation de votre code, JavaScript a été utilisé dans cette démo
  • 4.Le titre, , est divisé en chinois et en anglais. Le choix du titre qui sera affiché dépend de la langue du site Web de la FMZ.
  • 5.Le type de votre stratégie, le défaut est fréquent
  • 6.La catégorie de votre stratégie.Vous pouvez diviser vos stratégies en différentes catégories si vous en avez trop
  • 7.Modifier à distance votre code à partir de votre propre IDE au lieu de notre site web
  • 8.Un lien vers le document API
  • 9.Notes de la stratégie (seulement visible par vous-même).
  • 10.Descriptions de la stratégie: si vous partagez ou vendez votre stratégie sur Square, d'autres personnes verront les descriptions.
  • 11.Manuel de la stratégie, ne peut être consulté que lorsque quelqu'un a acheté votre stratégie.
  • 12.Enregistrer votre code, ouCtrl+Sen mode édition.
  • 13.Enregistrer la configuration de backtesting dans le code.
  • 14.Downloadle fichier de stratégie
  • 15.Exporter et importer la stratégie tout en maintenant tous les paramètres
  • 16.Changer la taille de la police et modifier le thème
  • 17.Formatiser le code automatiquement
  • 18.Utilisez le mode VIM pour éditer.

Pour envoyer le message sur votre téléphone, vous devez lier le télégramme à votre compte àhttps://www.fmz.com/m/account

/*
This strategy will send a message to your telegram when the price is higher or lower than
the set price.
All strategies must have a main function as the entrance.
*/
function main() {
     //change symbol,will cover the default symbol which was set when start a bot.Currency is a strategy arguments
    exchange.IO("currency", Currency)   
    var lastPushTime = 0    //the variable of last push timestamp.
    while(true){    //run a infinite loop, which is the basic structure
        //_C() function can retry the request automatically after failure. not necessary. var ticker = exchange.GetTicker() is ok.
        var ticker = _C(exchange.GetTicker) // for information about GetTicker, check on https://fmz-docs.readthedocs.io/en/latest/code_Instruction/Market%20API.html#getticker
        if(ticker.Last > UpPrice || ticker.Last < LowPrice){    //ticker.Last represents the last deal price
            if(Date.now() - lastPushTime > 300*1000){    //only push once in 5 mins, Date.now() return ms.
                lastPushTime = Date.now()    //update lastPushTime
                Log(Currency, 'Price is: ', ticker.Last, '@')    //Log the price on the bot's page and sent the message. '@' in the end means push message
            }
        }
        Log(Currency, 'Price is: ', ticker.Last) //just log the price
        Sleep(Interval*1000)    //check the last price again after Interval seconds
    }
}

Faites tourner le robot.

Enfin, il est temps de lancer un robot. Sur leRobotpage, cliquezAdd robot, ou visiterhttps://www.fmz.com/m/add-robotdirectement pour ajouter un bot.img

  • 1. Nom du robot
  • 2. Le docker pour exécuter ce bot
  • 3.La stratégie à mettre en œuvre
  • 4.Les paramètres, la valeur par défaut peuvent être modifiés.
  • 5.Période Kline par défaut lors de l'utilisation de l'échange.GetRecords(
  • 6.Exchange
  • 7.Tradingsymbole ou paires
  • 8.Si le symbole de négociation dont vous avez besoin ne figure pas sur la liste, vous pouvez le taper vous-même.
  • 9.Clickpour ajouter l'échange
  • 10.L'échange a déjà été ajouté. Plusieurs échanges peuvent être ajoutés à un bot, accès parexchanges[0], exchanges[1]
  • 11.Clickpour faire tourner le robot!

Gérer le bot

Sur leRobotPage, vous pouvez voir le bot est en cours d'exécution.img

  • 1.Nom du bot, cliquez ici pour accéder à la page du bot.
  • 2.Stratégie exécutée par le bot, cliquez ici pour accéder à la page de stratégie.
  • 3.L'état du bot. peut être en cours d'exécution, arrêté, erreur.
  • 4.Le bénéfice des robots, passé parLogProfit(), peut être n'importe quel nombre que vous voulez.
  • 5.La date de création peut être modifiée à la dernière heure de communication.
  • 6.Surveillez le bot. FMZ vous enverra un message lorsque le bot a été arrêté accidentellement
  • Arrêtez le robot.

Cliquez sur le nom du bot sur la page du bot pour plus d'informations:img

2.L'introduction de l'API la plus couramment utilisée

Cette partie présentera quelques API les plus couramment utilisés, pour une version complète de notre documentation API, consultezL'API FMZ- Je ne sais pas. Il est fortement recommandé pour les débutants d'exécuter le code de démonstration surPage de débogage.

2.1 Journaux

Utiliser: Log(msg) Paramètres:des chaînes ou des nombresDéfinition:Enregistrez un message sur la page du journal du robot.Retour:AucuneDémo:

function main() {
    var msg = 'msg string'
    Log(msg)
    Log('hello', 'world', 123)
    Log("red color message", "#FF0000")
    Log("push this message to telegram!@") // won't push on debug page
}

2.2 GetTicker

Utiliser: exchange.GetTicker() Paramètres:AucuneDécrit:Il est temps d'apprendre le marché.Retour:

{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}

Démo:

function main() {
    var ticker = exchange.GetTicker()
    Log(ticker)
    Log('Last Price: ',ticker.Last, 'Bid Price: ', ticker.Buy)
}

2.3 Apprendre la profondeur

Utiliser: exchange.GetDepth() Paramètres:AucuneDécrit:Obtenez le carnet de commandes actuel du marché.Retour:

{
    "Info":null,
    "Asks":[
        {"Price":5866.38,"Amount":0.068644},
        {"Price":5866.39,"Amount":0.263985},
        {"Price":5866.73,"Amount":0.05},
        {"Price":5866.77,"Amount":0.05},
        {"Price":5867.01,"Amount":0.15},
        {"Price":5875.89,"Amount":0.05},
        ......
        ]
    "Bids":[
        {"Price":5865.13,"Amount":0.001898},
        {"Price":5865,"Amount":0.085575},
        {"Price":5864.15,"Amount":0.013053},
        {"Price":5863.65,"Amount":0.016727},
        {"Price":5863.51,"Amount":0.128906},
        {"Price":5863.15,"Amount":0.2}
        ......
        ],
    "Time":1530241857399
}

Démo:

function main() {
    var depth = exchange.GetDepth()
    Log(depth)
    Log('Bid one: ', depth.Bids[0].Price, 'Ask one: ', depth.Asks[0].Price)
}

2.4 GetRecords

Utiliser: exchange.GetRecords(), exchange.GetRecords(Period) Paramètres:

Nom Le type Le montant de l'aide Définition
Période le verbe global Je ne veux pas. Le cycle de Klines, paramètres optionnels, cycle de ligne K par défaut est réglé lors du démarrage du robot.

Tous les paramètres possibles:PERIOD_M11 minute,PERIOD_M5Cinq minutes.PERIOD_M1515 minutes,PERIOD_M3030 minutes,PERIOD_H11h,PERIOD_D1Je vous en prie.Décrit:Prends des barres Kline/bougies pour le marché actuel.Retour:

[
    {"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
    {"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
    {"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
    ......
]

Démo:

//A useful JavaScript example using Records to get a close array:
function main(){
    var close = []
    var records = exchange.GetRecords(PERIOD_H1)
    Log('total bars: ', records.length)
    for(var i=0;i<records.length;i++){
        close.push(records[i].Close)
    }
    return close
}

2.5 Compte

Utiliser: exchange.GetAccount() Paramètres:AucuneDécrit:Obtenez les informations du compteRetour:

{
    "Stocks":0.38594816,// free base asset
    "FrozenStocks":0,    //locked base asset
    "Balance":542.858308,//free quote asset
    "FrozenBalance":0     //locked quote asset
    "Info":{} //the raw data
}

Démo:

//A useful JavaScript example of Log your account value for a certain trading pair:
function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var account = exchange.GetAccount()
        var price = ticker.Buy
        var stocks = account.Stocks + account.FrozenStocks
        var balance = account.Balance + account.FrozenBalance
        var value = stocks*price + balance
        Log('Account value is: ', value)
        LogProfit(value)
        Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
        //when run in debug tool, add a break here
    }
}

2.6 Acheter

Utiliser: exchange.Buy(Price, Amount), exchange.Buy(Price, Amount, Msg) Paramètres:

Nom Le type Le montant de l'aide Définition
Le prix Numéro - Oui, oui. Prix d'achat de l'ordre limite
Montant Numéro - Oui, oui. Montant de l'ordre limite
Msg Chaîne Je ne veux pas. Ajouter un message supplémentaire à la page du journal

Décrit:Envoyez un ordre d'achat et un journal d'achat à la page des robotsRetour:retourner l'ID de commande en cas de succès,nullSi ce n'est pas le cas.Démo:

//A useful JavaScript example of Buy for buy certain amount of bitcoin at a certain price:
function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Sell
        if(price >= 7000){
            exchange.Buy(price+5, 1, 'BTC-USDT')
        }
        Sleep(3000)//Sleep 3000ms
    }
}

2.7 Vendre

Utiliser: exchange.Sell(Price, Amount), exchange.Sell(Price, Amount, Msg) Paramètres:

Nom Le type Le montant de l'aide Définition
Le prix Numéro - Oui, oui. Prix de vente de l'ordre limite
Montant Numéro - Oui, oui. le montant de la commande limite
Msg Chaîne Je ne veux pas. Ajouter un message supplémentaire à la page du journal

Décrit:Envoyez un ordre de vente et un journal de vente à la page des robotsRetour:retourner l'ID de commande en cas de succès,nullSi ce n'est pas le cas.Démo:

//A useful JavaScript example of Buy for buy certain amount of bitcoin at a certain price:
function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Buy
        if(price >= 7000){
            var id = exchange.Sell(price-5, 1, 'BTC-USDT')
            Log('OrderId: ', id)
        }
        Sleep(3000)
    }
}

2.8 Obtenir un ordre

Utiliser: exchange.GetOrder(OrderId) Paramètres:

Nom Le type Le montant de l'aide Définition
Commande Numéro - Oui, oui. Nom de la commande

Décrit:Obtenez les détails de la commande par numéro de commande.Retour:

{
    "Id":125723661,
    "Amount":0.01,
    "Price":7000,
    "DealAmount":0,
    "AvgPrice":0,
    "Status":0, // 0:Not filled, 1:Filled, 2:Canceled
    "Type":1,// 0:Buy, 1:Sell
    "ContractType":"",//just for futures contract orders
    "Info":{} //raw info from exchange
    }
}

Démo:

//A JavaScript example of using this API, which will buy until your account has 5 coins:
function main(){
    while(true){
        var amount = exchange.GetAccount().Stocks
        var ticker = exchange.GetTicker()
        var id = null
        if(5-amount>0.01){
            id = exchange.Buy(ticker.Sell, Math.min(10-amount,0.2))
        }else{
            Log('Job completed')
            return //return the main function, bot will stop
        }
        Sleep(3000) //Sleep 3000ms
        if(id){
            var status = exchange.GetOrder(id).Status
            if(Status == 0){
                exchange.CancelOrder(id)
            }
        }
    }
}

2.9 Obtenir des ordres

Utiliser: exchange.GetOrders() Paramètres:AucuneDécrit:Obtenez tous les ordres ouverts pour vos symboles de trading.Retour:Une liste d'ordres ouverts, le résultat a la même signification queGetOrder()

[
    {
        "Info":{},
        "Id":16387538,
        "Amount":1123,
        "Price":0.00012826,
        "DealAmount":0,
        "AvgPrice":0,
        "Status":0,
        "Type":1,
        "ContractType":""
    }
]

Démo:

//A JavaScript example of using this API, which will cancel all open orders for trading symbol:
fuction CancelAll(){
    var orders = exchange.GetOrders()
    for(var i=0;i<orders.length,i++){
        exchange.CancelOrder(orders[[i].Id) // cancel order by orderID
    }
}
function main(){
    CancelAll()
    while(true){
        //do something
        Sleep(10000)
    }
}

2.10 Annuler la commande

Utiliser: exchange.CancelOrder(OrderId) Paramètres:

Nom Le type Le montant de l'aide Définition
Commande Numéro - Oui, oui. Nom de la commande

Décrit:Annuler une commande par numéro de commande.Retour:type bool,truesignifie que l'annulation de la demande d'ordre a été réussie.falsesignifie que l'annulation de la demande de commande a échoué.

2.11 Type de contrat de jeu

Utiliser: exchange.SetContractType(ContractType) Paramètres:

Nom Le type Le montant de l'aide Définition
Type de contrat Chaîne - Oui, oui. Type de contrat

Décrit:Type de contrat défini pour les contrats à terme. doit être défini en premier avant d'utiliser une autre API privée.Retour:AucuneDémo:

exchange.SetContractType("this_week") //OKEX future has “this_week”, “next_week”, “quarter” , "swap"
exchange.SetContractType("XBTUSD") //BitMEX future has "XBTUSD","XBTM19",etc

2.12 Obtenir une position

Utiliser: exchange.GetPosition() Paramètres:AucuneDécrit:Obtenez les informations de position actuelles, uniquement pour les contrats à terme.Retour:Une liste de positions renvoie une liste vide si le compte n'a pas de position.Démo:

// Note: GetPosition function obtains all positions.
function main(){
    exchange.SetContractType("this_week") //for OKEX future
    var position = exchange.GetPosition()
    if(position.length>0){
        Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
            position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type, "ContractType:",                     position[0].ContractType)
    }
}

2.13 Définir la direction

Utiliser: exchange.SetDirection(Direction) Paramètres:

Nom Le type Le montant de l'aide Définition
Direction Chaîne - Oui, oui. peut êtrebuy, closebuy, sell, closesell.

Décrit:Les ordres d'achat ou de vente sont définis uniquement pour les contrats à terme.Retour:AucuneDémo:

function main(){
    exchange.SetContractType("this_week");
    exchange.SetMarginLevel(5) // Set the leverage to 5 times
    exchange.SetDirection("buy") // Set the order type to buy long
    exchange.Buy(5000, 2) //buy long at the price 1000, quantity of 2
    exchange.SetDirection("closebuy")
    exchange.Sell(4999, 2) //close long position
}

2.14 Autres fonctions couramment utilisées:

Vérifiez plus de détails sur ces fonctions sur FMZDocuments de l'API

Nom Définition Exemple
LogStatus Enregistrez un message ou des tables sur la barre d'état des robots, seront actualisés à chaque fois LogStatus('msg')
_C Fonction de réessayer _C(exchange.GetRecords,PERIOD_H1),_C(exchange.GetTicker)
_N Fonction de position _N(4001.512,2),_N(num,0)
_G Un dictionnaire mondial qui peut être sauvegardé après le redémarrage du robot. _G('initValue', 1000);_G('initValue')
_D Retourne l'horodatage _D(), _D(1478570053241)
TA Bibliothèque d'indicateurs TA-Lib.MACD, EMA, KDJet ainsi de suite... TA.MACD(records)
Math Je suis en train d'étudier les maths.https://mathjs.org/ Math.min(1,2), Math.sqrt(2)

3.Deux stratégies réelles complètes

Il y a beaucoup de stratégies d'enseignement danshttps://www.fmz.com/square/s:tag:Study/1, ce qui est simple et facile pour les débutants.

3.1 Stratégie au comptant des opérateurs de marché à haute fréquence

Il s'agit d'une stratégie simple mais puissante qui gagnait des centaines de fois sur les marchés au comptant de BTC réels.

var floatAmountBuy = 20
var floatAmountSell = 20
var diffPrice = 3
var Interval = 3000

function CancelPendingOrders() {
    var orders = _C(exchange.GetOrders);
    for (var j = 0; j < orders.length; j++) {
        exchange.CancelOrder(orders[j].Id, orders[j])
    }
}

function GetPrice(depth) {
    var price = {buy:0, sell:0}
    var askAmount = 0
    var bidAmount = 0
    for(var i=0; i<depth.Bids.length; i++){
        askAmount += depth.Asks[i].Amount
        bidAmount += depth.Bids[i].Amount
        if(askAmount >= floatAmountBuy && !price.buy){
            price.buy = depth.Asks[i].Price
        }
        if(bidAmount >= floatAmountSell && !price.sell){
            price.sell = depth.Bids[i].Price
        }
    }
    if(!price.buy || !price.sell){
        price = {buy:depth.Asks[depth.Asks.length-1].Price, sell:depth.Bids[depth.Bids.length-1].Price}
    }
    return price
}

function onTick() {
    var price = GetPrice(_C(exchange.GetDepth))
    var buyPrice = price.buy + 0.01
    var sellPrice = price.sell - 0.01
    if ((sellPrice - buyPrice) <= diffPrice){
        buyPrice -= 10
        sellPrice += 10
    }
    CancelPendingOrders()
    var account = _C(exchange.GetAccount)
    var amountBuy = _N((account.Balance / buyPrice-0.01), 2)
    var amountSell = _N((account.Stocks), 2)
    if (amountSell > 0.02) {
        exchange.Sell(sellPrice, amountSell)
    }
    if (amountBuy > 0.02) {
        exchange.Buy(buyPrice, amountBuy)
    }
}

function main() {
    while (true) {
        onTick()
        Sleep(Interval)
    }
}

3.2 fonctionnalité OKEX à double poussée

Une stratégie classique d'évasion.https://www.fmz.com/strategy/103247pour les configurations. Vous pouvez apprendre à échanger des fonctionnalités et à dessiner des graphiques à partir du code source.

var ChartCfg = {
    __isStock: true,
    title: {
        text: 'Dual Thrust Up-Down Track'
    },
    yAxis: {
        plotLines: [{value: 0,
            color: 'red',
            width: 2,
            label: {
                text: 'Up Track',
                align: 'center'}
                },
            {value: 0,
            color: 'green',
            width: 2,
            label: {
                text: 'Down Track',
                align: 'center'},
            }
        ]
    },
    series: [{type: 'candlestick',
        name: 'current cycle',
        id: 'primary',
        data: []
        },
        {type: 'flags',
        onSeries: 'primary',
        data: [],
        }
    ]
};

var STATE_IDLE = 0;
var STATE_LONG = 1;
var STATE_SHORT = 2;
var State = STATE_IDLE;

var LastBarTime = 0;
var UpTrack = 0;
var BottomTrack = 0;
var chart = null;
var InitAccount = null;
var LastAccount = null;
var Counter = {
    w: 0,
    l: 0
};

function GetPosition(posType) {
    var positions = exchange.GetPosition();
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].Type === posType) {
            return [positions[i].Price, positions[i].Amount];
        }
    }
    return [0, 0];
}

function CancelPendingOrders() {
    while (true) {
        var orders = exchange.GetOrders();
        for (var i = 0; i < orders.length; i++) {
            exchange.CancelOrder(orders[i].Id);
            Sleep(Interval);
        }
        if (orders.length === 0) {
            break;
        }
    }
}

function Trade(currentState, nextState) {
    var pfn = nextState === STATE_LONG ? exchange.Buy : exchange.Sell;
    if (currentState !== STATE_IDLE) {
        exchange.SetDirection(currentState === STATE_LONG ? "closebuy" : "closesell");
        while (true) {
            var amount = GetPosition(currentState === STATE_LONG ? PD_LONG : PD_SHORT)[1];
            if (amount === 0) {
                break;
            }
            // pfn(amount);
            pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, amount);
            Sleep(Interval);
            CancelPendingOrders();
        }
        var account = exchange.GetAccount();

        if (account.Stocks > LastAccount.Stocks) {
            Counter.w++;
        } else {
            Counter.l++;
        }

        LogProfit(_N(account.Stocks - InitAccount.Stocks), "Profit rate:", _N((account.Stocks - InitAccount.Stocks) * 100 / InitAccount.Stocks) + '%');
        LastAccount = account;
    }
    exchange.SetDirection(nextState === STATE_LONG ? "buy" : "sell");
    while (true) {
        var pos = GetPosition(nextState === STATE_LONG ? PD_LONG : PD_SHORT);
        if (pos[1] >= AmountOP) {
            Log("Average Price", pos[0], "amount:", pos[1]);
            break;
        }
        // pfn(AmountOP-pos[1]);
        pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, AmountOP-pos[1]);
        Sleep(Interval);
        CancelPendingOrders();
    }
}

function onTick(exchange) {
    var records = exchange.GetRecords();
    if (!records || records.length <= NPeriod) {
        return;
    }
    var Bar = records[records.length - 1];
    if (LastBarTime !== Bar.Time) {
        var HH = TA.Highest(records, NPeriod, 'High');
        var HC = TA.Highest(records, NPeriod, 'Close');
        var LL = TA.Lowest(records, NPeriod, 'Low');
        var LC = TA.Lowest(records, NPeriod, 'Close');

        var Range = Math.max(HH - LC, HC - LL);

        UpTrack = _N(Bar.Open + (Ks * Range));
        DownTrack = _N(Bar.Open - (Kx * Range));
        if (LastBarTime > 0) {
            var PreBar = records[records.length - 2];
            chart.add(0, [PreBar.Time, PreBar.Open, PreBar.High, PreBar.Low, PreBar.Close], -1);
        } else {
            for (var i = Math.min(records.length, NPeriod * 3); i > 1; i--) {
                var b = records[records.length - i];
                chart.add(0, [b.Time, b.Open, b.High, b.Low, b.Close]);
            }
        }
        chart.add(0, [Bar.Time, Bar.Open, Bar.High, Bar.Low, Bar.Close]);
        ChartCfg.yAxis.plotLines[0].value = UpTrack;
        ChartCfg.yAxis.plotLines[1].value = DownTrack;
        ChartCfg.subtitle = {
            text: 'Up Track: ' + UpTrack + '  Down Track: ' + DownTrack
        };
        chart.update(ChartCfg);
        chart.reset(PeriodShow);

        LastBarTime = Bar.Time;
    } else {
        chart.add(0, [Bar.Time, Bar.Open, Bar.High, Bar.Low, Bar.Close], -1);
    }

    LogStatus("Price:", Bar.Close, "Up:", UpTrack, "Down:", DownTrack, "Wins: ", Counter.w, "Losses:", Counter.l, "Date:", new Date());
    var msg;
    if (State === STATE_IDLE || State === STATE_SHORT) {
        if (Bar.Close >= UpTrack) {
            msg  = 'Long Price: ' + Bar.Close + ' Up Track:' + UpTrack;
            Log(msg);
            Trade(State, STATE_LONG);
            State = STATE_LONG;
            chart.add(1, {x:Bar.Time, color: 'red', shape: 'flag', title: 'Long', text: msg});
        }
    }

    if (State === STATE_IDLE || State === STATE_LONG) {
        if (Bar.Close <= DownTrack) {
            msg = 'Short Price: ' + Bar.Close + ' Down Track:' + DownTrack;
            Log(msg);
            Trade(State, STATE_SHORT);
            chart.add(1, {x:Bar.Time, color: 'green', shape: 'circlepin', title: 'Short', text: msg});
            State = STATE_SHORT;
        }
    }
}

function onexit() {
    var pos = exchange.GetPosition();
    if (pos.length > 0) {
        Log("Warning, has positions when exiting", pos);
    }
}

function main() {
    if (exchange.GetName() !== 'Futures_OKCoin') {
        throw "Only support OKEX features";
    }
    exchange.SetRate(1);
    exchange.SetContractType(["this_week", "next_week", "quarter"][ContractTypeIdx]);
    exchange.SetMarginLevel([10, 20][MarginLevelIdx]);

    if (exchange.GetPosition().length > 0) {
        throw "Can't have Positions when start.";}

    CancelPendingOrders();

    InitAccount = LastAccount = exchange.GetAccount();
    LoopInterval = Math.min(1, LoopInterval);
    Log('Exchange Name:', exchange.GetName(), InitAccount);
    LogStatus("Ready...");

    LogProfitReset();
    chart = Chart(ChartCfg);
    chart.reset();

    LoopInterval = Math.max(LoopInterval, 1);
    while (true) {
        onTick(exchange);
        Sleep(LoopInterval * 1000);
    }
}


Plus de

Le foinContinuez à mettre à jour sur ce post, n'hésitez pas à poser des questions