초보자가 암호화폐 양적 거래 전략을 설계할 때, 종종 다양한 기능 요구 사항이 있습니다. 프로그래밍 언어와 플랫폼에 관계없이 모두 다양한 설계 요구 사항에 직면 할 것입니다. 예를 들어, 때로는 여러 가지 거래 종류가 회전이 필요하며, 때로는 멀티 플랫폼 헤딩이 필요하며, 때로는 다른 거래 종류가 동시다발적으로 필요합니다. 전략 회전 요구 사항을 구현 할 때 설계 경험의 일부를 공유하십시오.
학습 플랫폼은 여전히 FMZ Quant 거래 플랫폼을 사용합니다 (https://www.fmz.com), 그리고 시장은 암호화폐 시장으로 선택됩니다.
이러한 수요 상황의 대부분은 다양한 암호화폐 트렌드 및 그리드 전략을 위해 준비되어 있으며, 다른 거래 반복 방법을 사용하여 시장에서 실행되어야합니다.
보통 이렇게 설계됩니다.
function Process (symbol) {
exchange.IO("currency", symbol)
var ticker = _C(exchange.GetTicker)
Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
// ...
// ..
// .
}
function main(){
var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
while (true) {
for (var i = 0 ; i < symbols.length; i++) {
Process(symbols[i])
Sleep(500)
}
}
}
우리는 로봇을 구성합니다.
이것은 로봇에 교환 객체가 구성되고 거래 쌍이 전환되고, 다른 거래 쌍의 시장이 얻어지고, 다중 거래 다양성 시장이 실행되고, 전략 논리에 따라 실행된다는 것을 인식한다는 것을 알 수 있습니다.
우리가 정의한 세 개의 거래 쌍인 BTC_USDT, LTC_USDT, ETH_USDT가 루프에서 반복적으로 시장 코트를 얻고 정보를 얻은 후 시장을 구체적으로 감지하고 전략에 의해 설계된 거래 논리를 유발할 수 있음을 볼 수 있습니다.
어떤 독자 들 은 이렇게 질문 할 수 있습니다. "나는 거래 쌍을 바꾸기를 좋아하지 않습니다. 그것은 약간 귀찮게 느껴지고 전략 논리는 명확하지 않습니다".
실제로 다른 디자인 옵션이 있습니다. 아래에서 소개하겠습니다.
다른 거래 쌍의 시장 데이터는 여러 교환 객체를 통해 얻으며 반복 전략 논리에서 실행됩니다.
예를 들어, 로봇을 위해 세 개의 교환 객체를 구성하여 로봇을 구성합니다. 거래 쌍은 각각 BTC_USDT, LTC_USDT 및 ETH_USDT로 설정됩니다.
이름은
다 됐어
우리는 이 코드를 조금 바꾸었습니다. 왜냐하면 이번에는 로봇에 여러 개의 교환 객체를 추가했기 때문입니다. 거래 쌍인 BTC_USDT, LTC_USDT, ETH_USDT의 교환 객체들입니다.
function Process (e) {
var ticker = _C(e.GetTicker)
Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
// ...
// ..
// .
}
function main(){
while (true) {
for (var i = 0 ; i < exchanges.length; i++) {
Process(exchanges[i])
Sleep(500)
}
}
}
로봇을 실행해
우리가 위에서 설명 한 예제, 거래 쌍을 전환하거나 구성 계정의 여러 다른 거래 쌍에 대한 거래 객체를 추가하는 것. 이 모든 것은 단지 교환 계정 구성 (구성된 교환을 사용하는) 을 사용합니다.
어떻게 여러 거래 계좌를 하나의 전략으로 사용할 수 있을까요?
일부 전략은 다중 거래소, 단일 거래소 내의 다중 계정 전략과 같은 것입니다.
예를 들어, 우리는 대시보드 -> 교환 -> 교환 페이지를 추가하는 데 2 개의 교환을 구성했습니다.
이 두 거래소에서 구성된 계좌의 자산 정보에 접근할 수 있습니다.
function main(){
Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}
물론, 저는 또한 교환에 두 번째와 세 번째 계정 교환 구성을 추가할 수 있습니다.
예를 들어, 우리는 Huobi Futures에 대한 다른 계정을 추가합니다.
보시다시피, 이것은 두 개의
전략이 생성되면 Huobi 선물 거래소 객체가 Robot
예를 들어, 이것은 두 개의 계정을 먼저 판매하고 다음 전형적인 그리드 전략 (올림) 또는 먼저 구매하고 판매 (하락) 으로 구매하도록 허용합니다.
위의 두 가지 예를 통해
로봇에서 여러 교환 객체를 구성하는 것과 로봇의 동일한 교환 계정에 대해 여러 교환 객체를 구성하는 차이점은 다음과 같습니다:
이
차이점은 위의 예제에서 교환 구성, 즉:
로봇이 교환 객체를 구성할 때 항상
이 구성.
단지 교환 객체를 추가하면 거래 쌍 설정이 달라집니다.
GetAccount 함수가 호출되면, 같은 계정의 자산 정보에 항상 액세스 됩니다.
그러나:
이렇게 구성된 두 huobi 선물 교환 대상은 모두 huobi 선물이지만 서로 다른 교환 계좌를 나타냅니다.
때때로 암호화폐 계약 헤지 전략에서, 단숨의 거래 기회를 잡기 위해, 많은 시나리오가 동시에 배치되어야 합니다. 그러나 계약이 다르기 때문에 시장 코트를 받고 주문을 할 때 해당 계약으로 전환해야합니다.exchange.Go
위치 주문 기능을 실행하거나 요금을 얻는 기능, 동기화와 함께 문제가 있습니다, 매우 빠르지 않습니다. 그리고 스위치 계약의 디자인은 또한 논리를 그렇게 간단하지 않습니다. 더 나은 방법이 있습니까?
물론, 우리는 로봇에 두 개의 교환 객체를 추가할 수 있습니다. 같은 교환 계정에서 로봇을 위한 여러 교환 객체를 구성합니다.
이 교환 구성을 사용하여 다른 교환 객체를 추가합니다.
명령 상자가 팝업됩니다!
교환 계좌 구성, 당신은 같은 통화 또는 거래 쌍의 교환 객체를 추가할 수 없습니다.
어떻게 해야 할까요? 전략 로봇이 두 개의 교환 객체를 사용할 수 없는 것 같습니다. 그리고 교환 객체는 교환 계좌 번호와 연결되어 있습니다.
아직 방법이 있어요!
설정이 완료되면 저장을 클릭합니다.
이 방법으로 우리는 두 개의 교환 구성이 있지만 동일한 API KEY 구성 정보가 사용됩니다.
이것 의 유익 은 무엇 입니까?
전략을 작성할 때, 디자인은 매우 간단할 것입니다!
function main(){
exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
while (true) {
var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
var diff = tickerA.Last - tickerB.Last // calculate the difference
$.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
// Hedging
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
Sleep(500)
}
이 설계 전략이 훨씬 더 간단하고 명확한가요?
실제 시장 운영:
보시다시피, 두 개의 계약의 가격을 매번 얻는 데는 약 50 밀리초가 걸립니다.