[TOC] Je vous en prie.
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.
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
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 surOKEX
etBitMEX
Vé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.
https
.Liste des fonctionnalités actuelles:
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
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
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
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é):
wget www.fmz.com/dist/robot_linux_amd64.tar.gz
La commande n'a pas été trouvée?yum install wget -y
.tar -xzvf robot_linux_amd64.tar.gz
Pour décompresser../robot -s node.fmz.com/xxxxx -p -p yourFMZpassword
Vous 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/xxxxx
est unique pour chaque utilisateur, trouvez votre proprehttps://www.fmz.com/m/add-node.ctrl + C
pour arrêter le docker.nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &
Cette étape peut également être effectuée parScreen
command.É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.
Ctrl+S
en mode édition.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 leRobot
page, cliquezAdd robot
, ou visiterhttps://www.fmz.com/m/add-robotdirectement pour ajouter un bot.
exchanges[0]
, exchanges[1]
Gérer le bot
Sur leRobot
Page, vous pouvez voir le bot est en cours d'exécution.
LogProfit()
, peut être n'importe quel nombre que vous voulez.Cliquez sur le nom du bot sur la page du bot pour plus d'informations:
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 Kline |
Tous les paramètres possibles:PERIOD_M1
1 minute,PERIOD_M5
Cinq minutes.PERIOD_M15
15 minutes,PERIOD_M30
30 minutes,PERIOD_H1
1h,PERIOD_D1
Je 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,null
Si 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,null
Si 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,true
signifie que l'annulation de la demande d'ordre a été réussie.false
signifie 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 , KDJ et 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) |
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.
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)
}
}
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);
}
}
Le foinContinuez à mettre à jour sur ce post, n'hésitez pas à poser des questions