[TOC]
हमारे मंच का उपयोग करने के लिए धन्यवाद. यह शुरुआती के लिए एक बुनियादी निर्देश है, हमारे एपीआई प्रलेखन के पूर्ण संस्करण के लिए, पर जाँच करेंएफएमजेड एपीआई. कई स्पष्ट विनिर्देश हैं जो इस ट्यूटोरियल में शामिल नहीं हैं आप के लिए खोज करने के लिए छोड़ दिया.
पूरे ट्यूटोरियल को सीखने के बाद, आप जानते हैं कि एफएमजेड कैसे काम करता है और कुछ बुनियादी रणनीतियों को लिखने में सक्षम होगा।
एफएमजेड प्लेटफार्म क्या है?
एफएमजेड क्रिप्टोक्यूरेंसी व्यापारियों के लिए एक स्वचालित ट्रेडिंग प्लेटफॉर्म है जिसमें कई बिटकॉइन / एथ / अल्टकोइन एक्सचेंज बाजारों का समर्थन है।
एफएमजेड आपके लिए क्या कर सकता है?
आप सीख सकते हैं कि कैसे अपने बॉट लिखने के लिए ((रणनीतियाँ) से हमारे रणनीतियों
एफएमजेड कौन से क्रिप्टोकरेंसी एक्सचेंजों का समर्थन करता है?
FMZ लगभग सभी एक्सचेंजों का समर्थन करता है जो लोकप्रिय हैं, जैसे किBinance
, Bitfinex
, Bitstamp
, OKEX
, Huobi
, Poloniex
, आदि पर भी आप वायदा व्यापार कर सकते हैंOKEX
औरBitMEX
. पर पूर्ण समर्थन सूची देखेंएपीआईआपको केवल एक रणनीति लिखने की आवश्यकता है और बिना किसी परिवर्तन के सभी एक्सचेंजों पर इसे चलाएं।
एफएमजेड किस प्रोग्रामिंग भाषा का समर्थन करता है?
एफएमजेड आपकी रणनीतियों को कोड करने के लिए जावास्क्रिप्ट, पायथन, सी ++ (जावास्क्रिप्ट और पायथन की सिफारिश की जाती है) का समर्थन करता है। पूरी भाषाओं का समर्थन करने से लाभ उठाते हुए ((एक कस्टम भाषा केवल एक मंच के लिए उपयोग की जा सकती है), आप अपने प्रोग्रामिंग कौशल में सुधार कर सकते हैं और साथ ही रणनीतियों को लिखना सीख सकते हैं।
क्या आपका एपीआई कुंजी सुरक्षित है?
वास्तव में. आपके एपीआई-कुंजी एन्क्रिप्शन के बाद सहेजे जाते हैं. यहाँ यह कैसे काम करता है.
https
.वर्तमान सुविधा सूचीः
एक बॉट चलाने के लिए, आप एक रणनीति की जरूरत है, एक विनिमय जोड़ें, पहले एक डॉकर तैनात. डॉकर अपने स्वयं के कंप्यूटर या सर्वर पर चल रही अपनी रणनीति
मुख्य पृष्ठ पर एक त्वरित नज़र
एक विनिमय जोड़ें
में जोड़ेंhttps://www.fmz.com/m/add-platform, या क्लिक करेंPlatform
लेबल।
आपकी एक्सेस कुंजी और गुप्त कुंजी क्रिप्टोक्यूरेंसी एक्सचेंज पर लागू की जा सकती है। एपीआई-की का उपयोग एक्सचेंज से व्यापार और निजी जानकारी प्राप्त करने के लिए किया जाता है। हम अपने सर्वर पर कोई एपीआई-की या पासवर्ड नहीं सहेजते हैं।
आप एफएमजेड पर पंजीकरण कर सकते हैंसिमुलेटेड एक्सचेंजऔर इसे परीक्षण के लिए जोड़ें।
एक डॉकर तैनात करें
FMZ आपके लिए बॉट्स नहीं चलाता है, आपको एक्जीक्यूटर के रूप में अपने आप को एक डॉकर तैनात करने की आवश्यकता है, जो अधिक लचीला और सुरक्षित है क्योंकि हमारी सेवा आपके बॉट्स को चलाने में भाग नहीं लेती है। यद्यपि हम सार्वजनिक डॉकर भी प्रदान करते हैं, इसका उपयोग केवल परीक्षण के लिए किया जाना चाहिए।
खिड़कियों के लिए, यह काफी आसान है, बस निर्देशों का पालन करेंhttps://www.fmz.com/m/add-node
लिनक्स के लिए, आप हमारी वेबसाइट पर एक वीपीएस किराए पर ले सकते हैं, जो डॉकर को स्वचालित रूप से तैनात करेगा। यहां अपने स्वयं के लिनक्स सर्वर पर तैनात करने के लिए चरण दिए गए हैं (अनुशंसित):
wget www.fmz.com/dist/robot_linux_amd64.tar.gz
, कमांड नहीं मिला? पहले स्थापित करेंyum install wget -y
.tar -xzvf robot_linux_amd64.tar.gz
अनज़िप करने के लिए।./robot -s node.fmz.com/xxxxx -p -p yourFMZpassword
, आप कुछ इस तरह देखना चाहिए2018/07/05 05:04:10 Login OK, SID: 62086, PID: 7226, Name: host.localdomain
, जिसका अर्थ है कि सब कुछ काम कर रहा है।node.fmz.com/xxxxx
प्रत्येक उपयोगकर्ता के लिए अद्वितीय है, पर अपने स्वयं के खोजेंhttps://www.fmz.com/m/add-node.ctrl + C
डॉकर को रोकने के लिए।nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &
पृष्ठभूमि में चलाने के लिए. यह कदम भी द्वारा किया जा सकता हैScreen
command.एक रणनीति लिखें
आपको अपनी रणनीति लिखनी चाहिए या वर्ग से खरीदना चाहिए. यहाँ हम एक सरल जावास्क्रिप्ट रणनीति का उपयोग करेंगे एक डेमो के रूप में यह दिखाने के लिए कि संपादन पृष्ठ का उपयोग कैसे करें. रणनीति से कॉपी की जा सकती हैhttps://www.fmz.com/strategy/125482. यह ट्यूटोरियल जावास्क्रिप्ट का उपयोग करने के तरीके को कवर नहीं करेगा क्योंकि आप ऑनलाइन बहुत सारे ट्यूटोरियल पा सकते हैं.
Ctrl+S
संपादन मोड पर।नीचे रणनीति का पूरा विवरण दिया गया है. संदेश को अपने फ़ोन पर भेजने के लिए, आपको टेलीग्राम को अपने खाते से जोड़ना होगा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
}
}
बॉट चलाएँ
अंत में, यह एक बॉट चलाने का समय है.
परRobot
पृष्ठ, क्लिक करेंAdd robot
, या यात्राhttps://www.fmz.com/m/add-robotसीधे एक बॉट जोड़ने के लिए।
exchanges[0]
, exchanges[1]
बॉट प्रबंधित करें
परRobot
पृष्ठ, आप देख सकते हैं कि बॉट चल रहा है।
LogProfit()
, जो भी संख्या आप चाहते हैं हो सकता है.अधिक जानकारी के लिए बॉट पृष्ठ पर बॉट के नाम पर क्लिक करें:
इस भाग में कुछ सबसे आम तौर पर इस्तेमाल एपीआई का परिचय होगा, हमारे एपीआई प्रलेखन के पूर्ण संस्करण के लिए, पर जाँच करेंएफएमजेड एपीआई. यह अत्यधिक शुरुआत के लिए डेमो कोड चलाने के लिए सिफारिश की है परडिबग पृष्ठ.
2.1 लॉग
प्रयोग करेंः Log(msg)
पैरामीटरःस्ट्रिंग या संख्याएँविवरण:रोबोट लॉग पृष्ठ पर एक संदेश लॉग करें.वापसीःकोई नहींडेमोः
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
प्रयोग करेंः exchange.GetTicker()
पैरामीटरःकोई नहींविवरण:वर्तमान बाजार का टिकर प्राप्त करें।वापसीः
{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}
डेमोः
function main() {
var ticker = exchange.GetTicker()
Log(ticker)
Log('Last Price: ',ticker.Last, 'Bid Price: ', ticker.Buy)
}
2.3 गहराई प्राप्त करें
प्रयोग करेंः exchange.GetDepth()
पैरामीटरःकोई नहींविवरण:वर्तमान बाजार की ऑर्डर बुक प्राप्त करें।वापसीः
{
"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
}
डेमोः
function main() {
var depth = exchange.GetDepth()
Log(depth)
Log('Bid one: ', depth.Bids[0].Price, 'Ask one: ', depth.Asks[0].Price)
}
2.4 GetRecords
प्रयोग करेंः exchange.GetRecords()
, exchange.GetRecords(Period)
पैरामीटरः
नाम | प्रकार | अनिवार्य | विवरण |
---|---|---|---|
अवधि | वैश्विक वारबल | नहीं | रोबोट को चालू करते समय क्लाईन्स चक्र, वैकल्पिक पैरामीटर, डिफ़ॉल्ट के लाइन चक्र सेट किया जाता है। |
सभी संभावित पैरामीटरःPERIOD_M1
1 मिनट,PERIOD_M5
पांच मिनट,PERIOD_M15
15:15 मिनट,PERIOD_M30
:30 मिनट,PERIOD_H1
1 घंटा,PERIOD_D1
1d.विवरण:वर्तमान बाजार के लिए क्लाईन / कैंडलस्टिक बार प्राप्त करें।वापसीः
[
{"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},
......
]
डेमोः
//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
प्रयोग करेंः exchange.GetAccount()
पैरामीटरःकोई नहींविवरण:खाता जानकारी प्राप्त करेंवापसीः
{
"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
}
डेमोः
//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 खरीदें
प्रयोग करेंः exchange.Buy(Price, Amount)
, exchange.Buy(Price, Amount, Msg)
पैरामीटरः
नाम | प्रकार | अनिवार्य | विवरण |
---|---|---|---|
मूल्य | संख्या | हाँ | सीमा आदेश की खरीद मूल्य |
राशि | संख्या | हाँ | सीमा आदेश की खरीद राशि |
Msg | स्ट्रिंग | नहीं | लॉग पृष्ठ पर अतिरिक्त संदेश जोड़ें |
विवरण:बॉट्स के पृष्ठ पर खरीद आदेश और खरीद लॉग भेजेंवापसीःसफलता के मामले में OrderID लौटाएँ,null
यदि नहीं।डेमोः
//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 बेचना
प्रयोग करेंः exchange.Sell(Price, Amount)
, exchange.Sell(Price, Amount, Msg)
पैरामीटरः
नाम | प्रकार | अनिवार्य | विवरण |
---|---|---|---|
मूल्य | संख्या | हाँ | सीमा आदेश की बिक्री मूल्य |
राशि | संख्या | हाँ | लिमिट ऑर्डर की मात्रा बेचना |
Msg | स्ट्रिंग | नहीं | लॉग पृष्ठ पर अतिरिक्त संदेश जोड़ें |
विवरण:बॉट्स के पृष्ठ पर एक बिक्री आदेश और एक बिक्री लॉग भेजेंवापसीःसफलता के मामले में OrderID लौटाएँ,null
यदि नहीं।डेमोः
//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
प्रयोग करेंः exchange.GetOrder(OrderId)
पैरामीटरः
नाम | प्रकार | अनिवार्य | विवरण |
---|---|---|---|
आदेश | संख्या | हाँ | आदेश आईडी |
विवरण:आदेश आईडी द्वारा आदेश विवरण प्राप्त करें।वापसीः
{
"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
}
}
डेमोः
//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
प्रयोग करेंः exchange.GetOrders()
पैरामीटरःकोई नहींविवरण:अपने ट्रेडिंग प्रतीकों के लिए सभी खुले आदेश प्राप्त करें.वापसीःखुले आदेशों की एक सूची, परिणाम का एक ही अर्थ हैGetOrder()
[
{
"Info":{},
"Id":16387538,
"Amount":1123,
"Price":0.00012826,
"DealAmount":0,
"AvgPrice":0,
"Status":0,
"Type":1,
"ContractType":""
}
]
डेमोः
//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 आदेश रद्द करें
प्रयोग करेंः exchange.CancelOrder(OrderId)
पैरामीटरः
नाम | प्रकार | अनिवार्य | विवरण |
---|---|---|---|
आदेश | संख्या | हाँ | आदेश आईडी |
विवरण:ऑर्डर आईडी से ऑर्डर रद्द करें।वापसीःbool प्रकार,true
इसका अर्थ है कि आदेश अनुरोध को रद्द करने में सफलता मिली।false
आदेश अनुरोध रद्द करने में विफलता का अर्थ है।
2.11 SetContractType
प्रयोग करेंः exchange.SetContractType(ContractType)
पैरामीटरः
नाम | प्रकार | अनिवार्य | विवरण |
---|---|---|---|
अनुबंध प्रकार | स्ट्रिंग | हाँ | अनुबंध प्रकार |
विवरण:वायदा व्यापार के लिए अनुबंध प्रकार सेट करें. अन्य निजी एपीआई का उपयोग करने से पहले पहले सेट किया जाना चाहिए.वापसीःकोई नहींडेमोः
exchange.SetContractType("this_week") //OKEX future has “this_week”, “next_week”, “quarter” , "swap"
exchange.SetContractType("XBTUSD") //BitMEX future has "XBTUSD","XBTM19",etc
2.12 स्थिति प्राप्त करें
प्रयोग करेंः exchange.GetPosition()
पैरामीटरःकोई नहींविवरण:वर्तमान स्थिति की जानकारी प्राप्त करें, केवल वायदा व्यापार के लिए।वापसीःपदों की सूची, रिक्त सूची लौटाएगा यदि खाते में कोई पद नहीं है।डेमोः
// 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 दिशा निर्धारित करें
प्रयोग करेंः exchange.SetDirection(Direction)
पैरामीटरः
नाम | प्रकार | अनिवार्य | विवरण |
---|---|---|---|
दिशा | स्ट्रिंग | हाँ | हो सकता हैbuy , closebuy , sell , closesell . |
विवरण:केवल वायदा व्यापार के लिए खरीद या बिक्री आदेश प्रकार सेट करें।वापसीःकोई नहींडेमोः
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 अन्य सामान्य रूप से उपयोग किया जाने वाला कार्यः
एफएमजेड पर उन कार्यों के बारे में अधिक जानकारी की जाँच करेंएपीआई दस्तावेज
नाम | विवरण | उदाहरण |
---|---|---|
LogStatus |
बॉट की स्थिति पट्टी पर संदेश या तालिकाओं को लॉग करें,हर बार ताज़ा होगा | LogStatus('msg') |
_C |
पुनः प्रयास फ़ंक्शन | _C(exchange.GetRecords,PERIOD_H1) ,_C(exchange.GetTicker) |
_N |
स्थिति फलन | _N(4001.512,2) ,_N(num,0) |
_G |
वैश्विक शब्दकोश जिसे रोबोट को पुनरारंभ करने के बाद सहेजा जा सकता है। | _G('initValue', 1000);_G('initValue') |
_D |
टाइमस्टैम्प लौटाता है | _D() , _D(1478570053241) |
TA |
टीए-लिब इंडिकेटर लाइब्रेरी. समर्थनMACD , EMA , KDJ आदि... |
TA.MACD(records) |
Math |
मैथ्स फंक्शन का समर्थन करें, जाँच करेंhttps://mathjs.org/ | Math.min(1,2) , Math.sqrt(2) |
शिक्षा में बहुत सी रणनीति हैhttps://www.fmz.com/square/s:tag:Study/1, जो शुरुआती लोगों के लिए सरल और आसान है।
यह एक सरल लेकिन शक्तिशाली रणनीति है जो वास्तविक बीटीसी स्पॉट बाजारों में सैकड़ों गुना कमाई करती थी। यह उच्च व्यापार शुल्क वाले एक्सचेंजों पर नहीं चल सकती है।
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)
}
}
एक क्लासिक भागने की रणनीति, चेक परhttps://www.fmz.com/strategy/103247कॉन्फ़िगरेशन के लिए। आप सीख सकते हैं कि स्रोत कोड से सुविधाओं का व्यापार कैसे करें और चार्ट कैसे बनाएं।
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);
}
}
घासइस पोस्ट पर अपडेट रखें, कोई भी सवाल पूछने के लिए स्वतंत्र महसूस करें