[TOC]
우리의 플랫폼을 사용 주셔서 감사합니다. 이것은 초보자를 위한 기본 지침입니다. 우리의 API 문서의 전체 버전을 위해, 확인FMZ API이 튜토리얼에서 다루지 않은 많은 명백한 사양이 있습니다.
전체 튜토리얼을 배운 후, FMZ가 어떻게 작동하는지 알고 몇 가지 기본적인 전략을 쓸 수 있습니다.
FMZ 플랫폼이란 무엇인가요?
FMZ는 많은 비트코인/에스/알트코인 거래소 시장을 지원하는 암호화폐 거래자를 위한 자동화 거래 플랫폼이다.
FMZ는 당신을 위해 무엇을 할 수 있습니까?
당신은 많은 오픈 소스 코드를 포함하는 우리의 전략
FMZ는 어떤 암호화폐 거래소를 지원합니까?
FMZ는 거의 모든 거래소를 지원합니다.Binance
, Bitfinex
, Bitstamp
, OKEX
, Huobi
, Poloniex
, 등에 대한 선물도 거래할 수 있습니다OKEX
그리고BitMEX
전체 지원 목록을 확인하세요API하나의 전략을 작성하고 모든 거래소에 변경 없이 실행해야 합니다.
FMZ는 어떤 프로그래밍 언어를 지원합니까?
FMZ는 자바스크립트, 파이썬, C ++ (자바스크립트와 파이썬이 권장됩니다) 를 지원합니다. 완료 된 언어 지원 (단 한 플랫폼에 사용자 지정 언어만 사용할 수 없습니다) 을 활용하여 프로그래밍 기술을 향상시킬 수 있으며 전략을 작성하는 법을 배울 수 있습니다.
네 API 키가 안전해?
네, 네 API 키는 암호화 후 저장됩니다.
https
.현재 기능 목록:
봇을 실행하려면 전략이 필요하고, 교환을 추가하고, 먼저 도커를 배포해야 합니다. 도커는 자신의 컴퓨터나 서버에서 실행되는 전략의 실행자입니다.
본 페이지의 빠른 보기
교환을 추가합니다
여기에 추가합니다https://www.fmz.com/m/add-platform, 또는 클릭Platform
표지판
귀하의 액세스 키와 비밀 키는 암호화폐 거래소에서 적용할 수 있습니다. API-KEY는 거래 및 거래소에서 개인 정보를 얻기 위해 사용됩니다. 우리는 서버에 API-KEY 또는 암호를 저장하지 않습니다.
FMZ에 등록하실 수 있습니다시뮬레이션 교환그리고 테스트를 위해 추가합니다.
도커를 배포
FMZ는 당신을 위해 봇을 실행하지 않습니다, 당신은 실행자로서 스스로 도커를 배포해야합니다. 우리의 서비스가 당신의 봇을 실행하는 데 참여하지 않기 때문에 더 유연하고 안전합니다. 우리는 또한 공개 도커를 제공하지만, 그것은 테스트를 위해만 사용되어야합니다.
윈도우에서는 아주 간단합니다.https://www.fmz.com/m/add-node
리눅스를 위해, 당신은 우리의 웹 사이트에서 VPS를 빌릴 수 있습니다, 자동으로 도커를 배포합니다. 다음은 자신의 리눅스 서버에 배포하는 단계입니다 (보증):
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()
원하는 숫자가 될 수 있습니다.더 많은 정보를 얻기 위해 bot의 이름을 클릭합니다:
이 부분은 가장 일반적으로 사용되는 API를 소개합니다. 우리의 API 문서의 전체 버전을 위해,FMZ API... 초보자는 데모 코드를 실행하는 것이 좋습니다.디버그 페이지.
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
5분,PERIOD_M15
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 | 문자열 | 아니 | 로그 페이지에 추가 메시지를 추가합니다 |
설명:bot의 페이지에 구매 주문과 구매 로그를 보내반환:성공한 경우 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)
파라미터:
이름 | 종류 | 의무적 | 설명 |
---|---|---|---|
계약 유형 | 문자열 | 그래요 | 계약 유형 |
설명:선물 거래에 대한 계약 유형을 설정합니다. 다른 개인 API를 사용하기 전에 먼저 설정해야합니다.반환:아무 것도 없습니다데모:
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 다른 일반적으로 사용되는 기능:
FMZ에서 그 기능에 대한 자세한 정보를 확인API 문서
이름 | 설명 | 예제 |
---|---|---|
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 |
TA-Lib 지표 라이브러리 지원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초보자에게는 간단하고 쉬운 방법입니다.
이것은 실제 BTC 스팟 시장에서 수백 배의 수익을 올리는 간단하지만 강력한 전략입니다. 높은 거래 수수료가있는 거래소에서 실행될 수 없습니다.
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);
}
}
초목이 포스트에 대한 업데이트를 계속하십시오.