리소스 로딩... 로딩...

FMZ 초보자 튜토리얼

저자:초목, 2019-04-09 11:29:07에서 제작, 2024-02-06 17:35:38에서 업데이트

[TOC]

img

1.FMZ 플랫폼을 시작

우리의 플랫폼을 사용 주셔서 감사합니다. 이것은 초보자를 위한 기본 지침입니다. 우리의 API 문서의 전체 버전을 위해, 확인FMZ API이 튜토리얼에서 다루지 않은 많은 명백한 사양이 있습니다.

전체 튜토리얼을 배운 후, FMZ가 어떻게 작동하는지 알고 몇 가지 기본적인 전략을 쓸 수 있습니다.

1.1 FMZ 플랫폼에 대해

FMZ 플랫폼이란 무엇인가요?

FMZ는 많은 비트코인/에스/알트코인 거래소 시장을 지원하는 암호화폐 거래자를 위한 자동화 거래 플랫폼이다.

FMZ는 당신을 위해 무엇을 할 수 있습니까?

당신은 많은 오픈 소스 코드를 포함하는 우리의 전략 광장에서 당신의 봇을 작성하는 방법을 배울 수 있습니다, 다른 사람들과 당신의 전략의 코드를 공유, 언제든지 전문적인 도움을 요청, 많은 거래소에서 전략을 실행, 컴퓨터 또는 휴대 전화로 웹 사이트에서 당신의 봇을 제어, 원하는 경우 당신의 전략을 판매, 우리의 많은 다른 자동 거래 애호가와 통신그룹한 마디로, FMZ는 자동화 거래를 원하는 사람들에게 완벽한 플랫폼입니다.

FMZ는 어떤 암호화폐 거래소를 지원합니까?

FMZ는 거의 모든 거래소를 지원합니다.Binance, Bitfinex, Bitstamp, OKEX, Huobi, Poloniex, 등에 대한 선물도 거래할 수 있습니다OKEX그리고BitMEX전체 지원 목록을 확인하세요API하나의 전략을 작성하고 모든 거래소에 변경 없이 실행해야 합니다.

FMZ는 어떤 프로그래밍 언어를 지원합니까?

FMZ는 자바스크립트, 파이썬, C ++ (자바스크립트와 파이썬이 권장됩니다) 를 지원합니다. 완료 된 언어 지원 (단 한 플랫폼에 사용자 지정 언어만 사용할 수 없습니다) 을 활용하여 프로그래밍 기술을 향상시킬 수 있으며 전략을 작성하는 법을 배울 수 있습니다.

네 API 키가 안전해?

네, 네 API 키는 암호화 후 저장됩니다.

  • 당신은 FMZ 암호를 입력해야 합니다 키를 추가 할 때. 웹 브라우저는 당신의 API 키를 암호화 하 고 암호화된 키를 FMZ 서버에 전달https.
  • 서버나 컴퓨터에서 도커를 실행할 때 FMZ 암호를 입력해야 합니다.
  • FMZ는 봇을 시작할 때 https를 사용하여 암호화된 키를 도커에 전송합니다. 도커는 키를 얻기 위해 암호를 해독합니다.
  • FMZ는 암호를 저장하지 않습니다. 그래서 우리는 API 키를 모릅니다.
  • 자신의 비밀번호와 도커 서버를 보호해야 합니다. 두 번째 확인 로그인 FMZ를 사용하는 것이 좋습니다.

현재 기능 목록:

  • 1.크로스 플랫폼, 모든 주요 암호화폐 거래소를 지원합니다
  • 2.시뮬레이션 교환을 지원합니다. https://wex.app/
  • 3.효율적 인 시뮬레이션 백테스팅 시스템을 갖추고 있습니다.
  • 4.e-mail을 보내거나 Telegram 계정으로 메시지를 푸싱하는 것을 지원합니다.
  • 5.웹 기반의 제어, 휴대폰을 통해 액세스 할 수 있습니다.
  • 6. 파이썬\C++\자바스크립트 프로그래밍을 지원합니다.
  • 7.비용은 매우 낮습니다. 시간당 0.125 RMB, 약 0.018 달러입니다.
  • 8.NoAPI-KEY 또는 비밀번호는 우리의 서버에 저장됩니다. FMZ는 보안 문제없이 4 년 이상 실행되었습니다.

1.2 FMZ 플랫폼을 사용하기 위한 빠른 시작

봇을 실행하려면 전략이 필요하고, 교환을 추가하고, 먼저 도커를 배포해야 합니다. 도커는 자신의 컴퓨터나 서버에서 실행되는 전략의 실행자입니다.

본 페이지의 빠른 보기

img

  • 1.당신의 주요 컨트롤 페이지
  • 2.모든 봇을 관리합니다 (시작, 중지, 삭제, 오픈 등)
  • 3.모든 전략을 관리하세요
  • 4.Docker를 배포하고 관리합니다.
  • 5.새로운 거래소를 추가
  • 6.당신이 추가한 거래소에서 수동 거래
  • 7. 계좌를 지불
  • 8.이곳에서 궁금한 것을 물어보세요
  • 9.FMZ의 시뮬레이션 교환
  • 10.보트를 시작하지 않고 코드 블록을 실행할 수 있는 디버그 도구.
  • 11.모든 종류의 메시지
  • 12.오픈 소스 및 요금 전략이 나열된 전략 광장
  • 13. 라이브 로봇, 라이브로 작동하는 모든 로봇이 나열되어 있습니다.
  • 14. 게시물을 게시하여 관련 문제를 논의할 수 있는 포럼.
  • 15.누구에게 코드를 작성하거나 다른 사람들에게이 서비스를 제공하도록 요청하십시오.
  • 16.거래소 및 에이전시용 제품.
  • 17.API 문서.
  • 18.자신으로 확인해 보세요.
  • 19.계산정보

교환을 추가합니다

여기에 추가합니다https://www.fmz.com/m/add-platform, 또는 클릭Platform표지판 귀하의 액세스 키와 비밀 키는 암호화폐 거래소에서 적용할 수 있습니다. API-KEY는 거래 및 거래소에서 개인 정보를 얻기 위해 사용됩니다. 우리는 서버에 API-KEY 또는 암호를 저장하지 않습니다. FMZ에 등록하실 수 있습니다시뮬레이션 교환그리고 테스트를 위해 추가합니다.

img

도커를 배포

FMZ는 당신을 위해 봇을 실행하지 않습니다, 당신은 실행자로서 스스로 도커를 배포해야합니다. 우리의 서비스가 당신의 봇을 실행하는 데 참여하지 않기 때문에 더 유연하고 안전합니다. 우리는 또한 공개 도커를 제공하지만, 그것은 테스트를 위해만 사용되어야합니다.

윈도우에서는 아주 간단합니다.https://www.fmz.com/m/add-node

img

리눅스를 위해, 당신은 우리의 웹 사이트에서 VPS를 빌릴 수 있습니다, 자동으로 도커를 배포합니다. 다음은 자신의 리눅스 서버에 배포하는 단계입니다 (보증):

  • 1.아마존이나 구글에서 클라우드 서버 (VPS) 를 구입하면 가장 낮고 저렴한 구성이 충분합니다.
  • 2.서버에 로그인하여 서버 제공자의 지침을 따르거나 구글에 검색하세요.
  • 3.시스템 버전과 일치하는 도커를 선택하세요. 대부분의 경우 64비트입니다.
  • 4.센토를 위해 달라wget www.fmz.com/dist/robot_linux_amd64.tar.gz, 명령어 찾을 수 없습니다? 먼저 설치yum install wget -y.
  • 5.Run tar -xzvf robot_linux_amd64.tar.gz잠자리를 풀고
  • 6.Run ./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.
  • 7.Docker가 백그라운드에서 실행되지 않으면 SHH 클라이언트를 닫으면 도커가 멈출 것입니다. 누르세요ctrl + C도커를 막기 위해서요.
  • 8.Run nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &이 단계는 또한 수행 할 수 있습니다Screen command.
  • 9. 확인https://www.fmz.com/m/nodes, 모든 것이 괜찮다면, 당신은 도커를 찾을 수 있습니다.

전략 작성

당신은 자신의 전략을 작성하거나 사각형에서 구입해야합니다. 여기 우리는 간단한 자바스크립트 전략을 데모로 사용하여 편집 페이지를 사용하는 방법을 보여줍니다. 전략은 복사 할 수 있습니다https://www.fmz.com/strategy/125482- 네 이 튜토리얼은 자바스크립트를 사용하는 방법을 다루지 않습니다. 온라인에서 많은 튜토리얼을 찾을 수 있기 때문입니다.

img

  • 1. 코드 편집
  • 2.Backtesting, 우리는 중간 튜토리얼에서이 부분을 다루겠습니다.
  • 이 데모에서 사용 된 코드, 자바스크립트 프로그래밍 언어
  • 4. 제목, 중국어와 영어 제목을 나눈 다음, 어떤 제목이 표시될지 FMZ 웹사이트의 언어에 따라 결정됩니다.
  • 5.전략의 종류, 부실이 일반적입니다
  • 6.전략의 범주. 너무 많은 경우 전략을 여러 범주로 나눌 수 있습니다.
  • 7.우리의 웹사이트 대신 자신의 IDE에서 코드를 원격 편집
  • 8.API 문서에 대한 링크
  • 9.전략에 대한 메모 (자신만 볼 수 있습니다).
  • 10.전략에 대한 설명. 당신이 스퀘어에서 전략을 공유하거나 판매하면 다른 사람들이 설명을 볼 수 있습니다.
  • 11.전략의 설명서, 누군가가 당신의 전략을 구입했을 때만 볼 수 있습니다.
  • 12.코드를 저장하거나Ctrl+S편집 모드
  • 13.코드에 백테스팅 구성을 저장합니다.
  • 14.Download전략 파일
  • 15.모든 매개 변수를 유지하면서 전략의 수출 및 수입
  • 16. 글꼴 크기를 변경하고 테마를 편집합니다.
  • 17.코드를 자동으로 포맷합니다
  • 18.편집을 위해 VIM 모드를 사용하십시오.

아래는 전략의 완전한 설명입니다. 전화로 메시지를 푸시하기 위해, 당신은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바로 로봇을 추가합니다.img

  • 1.봇의 이름
  • 2.이 봇을 실행하는 도커
  • 3.운영할 전략
  • 4.변수, 기본값은 변경할 수 있습니다.
  • 5. 교환을 사용할 때 기본 클라인 기간.GetRecords()
  • 6.Exchange
  • 7.Trading기호 또는 쌍
  • 8.당신이 필요로 하는 거래 기호가 목록에 없는 경우, 당신은 그것을 직접 입력할 수 있습니다.
  • 9.Click교환을 추가하기 위해
  • 10.이 거래소는 이미 추가되었습니다. 한 봇에 여러 거래소를 추가 할 수 있으며exchanges[0], exchanges[1]
  • 11.Click로봇을 운영하기 위해서요!

봇을 관리합니다

그 위에Robot페이지, 보트가 실행되는 것을 볼 수 있습니다.img

  • 1.봇의 이름, bot 페이지로 이동하기 위해 여기를 클릭하세요.
  • 2.봇이 실행하는 전략, 여기에 클릭하여 전략 페이지로 이동합니다.
  • 3.봇의 상태. 실행, 중지, 오류가 있을 수 있습니다.
  • 4.보트의 이익, 통과LogProfit()원하는 숫자가 될 수 있습니다.
  • 5.창업 날짜, 마지막 통신 시간으로 변경할 수 있습니다.
  • 6.봇을 모니터링하세요. FMZ는 로봇이 실수로 중지되었을 때 메시지를 보낼 것입니다.
  • 7. 로봇을 멈춰라

더 많은 정보를 얻기 위해 bot의 이름을 클릭합니다:img

2.가장 자주 사용되는 API 소개

이 부분은 가장 일반적으로 사용되는 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) 파라미터:

이름 종류 의무적 설명
기간 글로벌 바블 아니 클라인의 사이클, 선택적 매개 변수, 기본 K 라인 사이클은 로봇을 시작하면 설정됩니다.

모든 가능한 매개 변수:PERIOD_M11분,PERIOD_M55분,PERIOD_M1515분,PERIOD_M3030분,PERIOD_H11시간PERIOD_D11d.설명:현재 시장에 대한 클라인/촛대 막대기를 가져와요.반환:

[
    {"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)

3.진실한 두 가지 완전한 전략

많은 교육 전략이 있습니다https://www.fmz.com/square/s:tag:Study/1초보자에게는 간단하고 쉬운 방법입니다.

3.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)
    }
}

3.2 듀얼 스포트 OKEX 기능

고전적인 탈출 전략이야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);
    }
}


더 많은

초목이 포스트에 대한 업데이트를 계속하십시오.