[TOC]
Dies ist eine grundlegende Anleitung für Anfänger, für eine vollständige Version unserer API-Dokumentation, überprüfen Sie aufFMZ-APIEs gibt viele offensichtliche Spezifikationen, die in diesem Tutorial nicht behandelt werden.
Nachdem Sie das gesamte Tutorial gelernt haben, werden Sie wissen, wie FMZ funktioniert und in der Lage sein, einige grundlegende Strategien zu schreiben.
Was ist die FMZ-Plattform?
FMZ ist eine automatisierte Handelsplattform für Kryptowährungshändler mit Unterstützung für viele Bitcoin/eth/altcoin-Börsen.
Was kann FMZ für Sie tun?
Sie können lernen, wie Sie Ihre Bots schreiben ((Strategie) s von unserem Strategies
Welche Kryptowährungsbörsen unterstützt FMZ?
FMZ unterstützt fast alle bekannten Börsen, wieBinance
, Bitfinex
, Bitstamp
, OKEX
, Huobi
, Poloniex
, etc. können Sie auch Futures aufOKEX
undBitMEX
Die vollständige Liste der Unterstützungsangebote finden Sie unterAPISie müssen nur eine Strategie schreiben und sie ohne Änderungen auf allen Börsen ausführen.
Welche Programmiersprachen unterstützt FMZ?
FMZ unterstützt JavaScript, Python, C++ (JavaScript und Python werden empfohlen) für die Codierung Ihrer Strategien.
Ist dein API-Schlüssel sicher?
Ja, Ihre API-Schlüssel werden nach der Verschlüsselung gespeichert.
https
.Aktuelle Funktionsliste:
Um einen Bot auszuführen, müssen Sie eine Strategie haben, einen Austausch hinzufügen, zuerst einen Docker bereitstellen. Der Docker ist der Exekutor Ihrer Strategie, der auf Ihrem eigenen Computer oder Server läuft.
Ein kurzer Blick auf die Hauptseite
Ein Austausch hinzufügen
Hinzufügen beihttps://www.fmz.com/m/add-platform, oder klickenPlatform
Etikett.
Ihr Zugangsschlüssel und Ihr geheimer Schlüssel können an der Kryptowährungsbörse angewendet werden. API-KEY wird zum Handel und zur Erfassung der privaten Informationen von der Börse verwendet. Wir speichern keine API-Key oder Passwörter auf unserem Server.
Sie können sich in FMZs registrierensimulierter Austauschund es zum Testen hinzufügen.
Einsatz eines Dockers
FMZ betreibt keine Bots für Sie, Sie müssen einen Docker selbst als Ausführungsbeauftragten bereitstellen, was flexibler und sicherer ist, da unser Service nicht an der Ausführung Ihrer Bots beteiligt ist.
Für Windows ist es ganz einfach, folgen Sie einfach den Anweisungen aufhttps://www.fmz.com/m/add-node
Für Linux können Sie einen VPS auf unserer Website mieten, der den Docker automatisch bereitstellt.
wget www.fmz.com/dist/robot_linux_amd64.tar.gz
Installieren Sie zuerstyum install wget -y
.tar -xzvf robot_linux_amd64.tar.gz
Um den Zipper zu öffnen../robot -s node.fmz.com/xxxxx -p -p yourFMZpassword
Sie sollten etwas sehen wie2018/07/05 05:04:10 Login OK, SID: 62086, PID: 7226, Name: host.localdomain
Das heißt, alles ist geregelt.node.fmz.com/xxxxx
ist einzigartig für jeden Benutzer, finden Sie Ihre eigenen aufhttps://www.fmz.com/m/add-node.ctrl + C
um den Docker zu stoppen.nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &
Dieser Schritt kann auch durchScreen
command.Schreiben Sie eine Strategie
Sie sollten Ihre eigene Strategie schreiben oder aus dem Quadrat kaufen. Hier werden wir eine einfache JavaScript-Strategie als Demo verwenden, um zu zeigen, wie Sie die Bearbeitungsseite verwenden.https://www.fmz.com/strategy/125482- Ich weiß. In diesem Tutorial wird nicht beschrieben, wie man JavaScript benutzt, da man viele Tutorials online finden kann.
Ctrl+S
im Bearbeitungsmodus.Um die Nachricht auf Ihr Telefon zu schicken, müssen Sie das Telegramm an Ihr Konto anhttps://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
}
}
Führen Sie den Bot aus.
Endlich ist es Zeit, einen Bot zu starten.
Auf derRobot
Seite, klickenAdd robot
, oder Besuchhttps://www.fmz.com/m/add-robotdirekt einen Bot hinzufügen.
exchanges[0]
, exchanges[1]
Verwalten Sie den Bot
Auf derRobot
Seite, Sie können sehen, dass der Bot läuft.
LogProfit()
, kann jede Zahl sein, die Sie wollen.Klicken Sie auf den Namen des Bots auf der Bot-Seite für weitere Informationen:
Dieser Teil wird einige der am häufigsten verwendeten API, für eine vollständige Version unserer API-Dokumentation, überprüfen Sie aufFMZ-API- Ich weiß. Für Anfänger wird dringend empfohlen, den Demo-CodeDebug-Seite.
2.1 Protokoll
Verwenden: Log(msg)
Parameter:Zeichenfolgen oder ZahlenBeschreibung:Melden Sie eine Nachricht auf der Roboterprotokollseite ein.Zurück:KeineDemo:
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
Verwenden: exchange.GetTicker()
Parameter:KeineBeschreibung:Erhalten Sie den aktuellen Markt.Zurück:
{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
Demo:
function main() {
var ticker = exchange.GetTicker()
Log(ticker)
Log('Last Price: ',ticker.Last, 'Bid Price: ', ticker.Buy)
}
2.3 Die Tiefe
Verwenden: exchange.GetDepth()
Parameter:KeineBeschreibung:Erhalten Sie das aktuelle Auftragsbuch des Marktes.Zurück:
{
"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
}
Demo:
function main() {
var depth = exchange.GetDepth()
Log(depth)
Log('Bid one: ', depth.Bids[0].Price, 'Ask one: ', depth.Asks[0].Price)
}
2.4 GetRecords
Verwenden: exchange.GetRecords()
, exchange.GetRecords(Period)
Parameter:
Name | Typ | Zwingend | Beschreibung |
---|---|---|---|
Dauer | Weltweite Variante | Nein. | Kline |
Alle möglichen Parameter:PERIOD_M1
1 Minute,PERIOD_M5
Fünf Minuten.PERIOD_M15
15 Minuten.PERIOD_M30
30 Minuten.PERIOD_H1
1h,PERIOD_D1
1d.Beschreibung:Holen Sie Kline/Candlestick Bars für den aktuellen Markt.Zurück:
[
{"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},
......
]
Demo:
//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 GetAccount
Verwenden: exchange.GetAccount()
Parameter:KeineBeschreibung:Erhalten Sie KontoinformationenZurück:
{
"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
}
Demo:
//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 Kaufen
Verwenden: exchange.Buy(Price, Amount)
, exchange.Buy(Price, Amount, Msg)
Parameter:
Name | Typ | Zwingend | Beschreibung |
---|---|---|---|
Preis | Zahl | - Ja, das ist es. | Kaufpreis der Limitorder |
Betrag | Zahl | - Ja, das ist es. | Kaufbetrag der Limitorder |
Msg | String | Nein. | Hinzufügen einer zusätzlichen Nachricht auf der Protokollseite |
Beschreibung:Senden Sie einen Kaufbefehl und ein Kaufprotokoll auf der Seite der BotsZurück:Rückgabe der OrderID bei Erfolg,null
Wenn nicht.Demo:
//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 Verkaufen
Verwenden: exchange.Sell(Price, Amount)
, exchange.Sell(Price, Amount, Msg)
Parameter:
Name | Typ | Zwingend | Beschreibung |
---|---|---|---|
Preis | Zahl | - Ja, das ist es. | Verkaufspreis der Limitorder |
Betrag | Zahl | - Ja, das ist es. | Verkaufsbetrag der Limitorder |
Msg | String | Nein. | Hinzufügen einer zusätzlichen Nachricht auf der Protokollseite |
Beschreibung:Senden Sie einen Verkaufsbefehl und ein Verkaufsprotokoll auf der Seite der BotsZurück:Rückgabe der OrderID bei Erfolg,null
Wenn nicht.Demo:
//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 GetOrder
Verwenden: exchange.GetOrder(OrderId)
Parameter:
Name | Typ | Zwingend | Beschreibung |
---|---|---|---|
Bestellung | Zahl | - Ja, das ist es. | Bestellnummer |
Beschreibung:Holen Sie sich die Bestelldetails nach der Bestell-ID.Zurück:
{
"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
}
}
Demo:
//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 GetOrders
Verwenden: exchange.GetOrders()
Parameter:KeineBeschreibung:Holen Sie alle offenen Aufträge für Ihre Handelssymbole.Zurück:Eine Liste offener Aufträge, das Ergebnis hat die gleiche Bedeutung wieGetOrder()
[
{
"Info":{},
"Id":16387538,
"Amount":1123,
"Price":0.00012826,
"DealAmount":0,
"AvgPrice":0,
"Status":0,
"Type":1,
"ContractType":""
}
]
Demo:
//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 Bestellung stornieren
Verwenden: exchange.CancelOrder(OrderId)
Parameter:
Name | Typ | Zwingend | Beschreibung |
---|---|---|---|
Bestellung | Zahl | - Ja, das ist es. | Bestellnummer |
Beschreibung:Stornieren Sie eine Bestellung per Bestell-ID.Zurück:bool-Typtrue
bedeutet, dass die Stornierung des Auftragsersuchens erfolgreich erfolgte.false
bedeutet, dass die Stornierung des Auftragsantrags fehlgeschlagen ist.
2.11 SetContractType
Verwenden: exchange.SetContractType(ContractType)
Parameter:
Name | Typ | Zwingend | Beschreibung |
---|---|---|---|
Vertragstyp | String | - Ja, das ist es. | Vertragstyp |
Beschreibung:Kontrakttyp für den Futures-Handel festlegen. muss zuerst festgelegt werden, bevor andere private API verwendet werden.Zurück:KeineDemo:
exchange.SetContractType("this_week") //OKEX future has “this_week”, “next_week”, “quarter” , "swap"
exchange.SetContractType("XBTUSD") //BitMEX future has "XBTUSD","XBTM19",etc
2.12 GetPosition
Verwenden: exchange.GetPosition()
Parameter:KeineBeschreibung:Erhalten Sie die aktuellen Positionsinformationen, nur für den Futures-Handel.Zurück:Eine Liste der Positionen, wird eine leere Liste zurückgeben, wenn das Konto keine Position hat.Demo:
// 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 SetDirection
Verwenden: exchange.SetDirection(Direction)
Parameter:
Name | Typ | Zwingend | Beschreibung |
---|---|---|---|
Richtung | String | - Ja, das ist es. | kann seinbuy , closebuy , sell , closesell . |
Beschreibung:Einrichtung von Kauf- oder Verkaufsbestellungen, nur für den Futures-Handel.Zurück:KeineDemo:
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 Andere häufig verwendete Funktionen:
Überprüfen Sie mehr Details über diese Funktionen auf FMZAPI-Dokumente
Name | Beschreibung | Beispiel |
---|---|---|
LogStatus |
Log eine Nachricht oder Tabellen auf der Statusleiste der Bots, wird jedes Mal aktualisiert | LogStatus('msg') |
_C |
Wiederholungsfunktion | _C(exchange.GetRecords,PERIOD_H1) ,_C(exchange.GetTicker) |
_N |
Positionsfunktion | _N(4001.512,2) ,_N(num,0) |
_G |
Ein globales Wörterbuch, das nach dem Neustart gespeichert werden kann. | _G('initValue', 1000);_G('initValue') |
_D |
Gibt den Zeitstempel zurück | _D() , _D(1478570053241) |
TA |
TA-Lib-Indikatorbibliothek. UnterstützungMACD , EMA , KDJ Und so weiter. |
TA.MACD(records) |
Math |
Ich unterstütze die mathematische Funktion.https://mathjs.org/ | Math.min(1,2) , Math.sqrt(2) |
Es gibt viele Lehrstrategien inhttps://www.fmz.com/square/s:tag:Study/1Das ist einfach und einfach für Anfänger.
Dies ist eine einfache, aber leistungsfähige Strategie, die in echten BTC-Spotmärkten hunderte Male verdient hat.
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)
}
}
Eine klassische Fluchtstrategie.https://www.fmz.com/strategy/103247für Konfigurationen. Sie können lernen, wie man Funktionen austauscht und Diagramme aus dem Quellcode zeichnet.
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);
}
}
Das GrasHalten Sie diesen Beitrag auf dem Laufenden, fragen Sie gerne.