최근에는 많은 거래소가 디지털 화폐 옵션의 파생물 거래 기능을 연속적으로 열고 있으며, 전통적인 옵션과 유사한 옵션 거래와 선물 거래 등이 결합되어 많은 거래 전략, 거래 방법을 결합 할 수 있습니다. 시장에 많은 오픈 소스 양적 거래 도구가 있지만, 이러한 도구는 프레임워크의 기초를 이해하고 프레임워크의 프로그래밍 언어를 익숙하게 작성하거나 복잡한 설정을 수동으로 수행해야합니다.
发明者量化(FMZ.COM)在早期架构设计时,就考虑了各种金融衍生品量化、程序化交易的支持,非常快捷的接入了期权交易。期权交易基本上和期货交易类似,甚至更加简单。并且没有增加新接口,熟悉使用FMZ的用户不会增加其它学习成本,只用把期权合约当做期货合约一样设置,就可以对期权合约进行行情获取,下单、撤单、查询持仓等操作。
예를 들어, 우리가 현재 어떤 옵션 계약의 지수 가격을 얻고자 하는 데리빗 거래소 옵션 계약을 예로 들 수 있습니다.
이 프로젝트의 목표는
package main
import "net/http"
import "io/ioutil"
import "fmt"
import "encoding/json"
func main() {
// 获取行情, 访问接口:https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-27DEC19-7250-P
resp, err := http.Get("https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-27DEC19-7250-P")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
ret := string(body)
fmt.Println("这只是字符串数据ticker:", ret)
fmt.Println("需要转换为JSON格式")
type js struct {
data interface{}
}
ticker := new(js)
json.Unmarshal([]byte(ret), &ticker.data)
fmt.Println("ticker:", ticker)
fmt.Println("ticker 中的标记价格数据index_price:", ticker.data.(map[string]interface{})["result"].(map[string]interface{})["index_price"])
}
이 자료를 얻기 위해 N개의 코드들이 쓰여졌다는 것을 알 수 있습니다.
우리는 FMZ를 사용하여 간단한 두 단어로 해결했습니다.
function main() {
exchange.IO("base", "https://test.deribit.com") # 切换为 交易所提供的模拟盘
exchange.SetContractType("BTC-3JAN20-7250-P") # 设置期权合约
var ticker = exchange.GetTicker() # 获取期权行情
Log(ticker.Info.result.index_price) # 打印需要的数据,观察
}
이 자료는 몇 줄의 코드만으로 필요한 데이터를 쉽게 얻을 수 있습니다.
이것은 단지 거래소의 비서명 공개 API 인터페이스에 접근하는 것인데, 사적인 인터페이스에 접근하면 서명보다 더 복잡할 수 있다.
각 인터페이스는 서명, 매개 변수 등을 처리합니다.
strBody := ""
strQuery := ""
ts := toString(time.Now().UnixNano() / 1e6)
nonce := toString(time.Now().UnixNano() / 1e6)
uri := resource
if httpMethod == "GET" {
strQuery = encodeParams(params, false)
uri = fmt.Sprintf("%s?%s", resource, strQuery)
} else if httpMethod == "POST" {
if len(raw) > 0 && len(raw[0]) > 0 {
strBody = raw[0]
} else {
strBody = json_encode(params)
}
}
strRequestDate := fmt.Sprintf("%s\n%s\n%s\n", httpMethod, uri, strBody)
strToSign := fmt.Sprintf("%s\n%s\n%s", ts, nonce, strRequestDate)
h := hmac.New(sha256.New, []byte(p.secretKey))
h.Write([]byte(strToSign))
strSign := hex.EncodeToString(h.Sum(nil))
req := Request{
Method: httpMethod,
Uri: fmt.Sprintf("%s%s", p.apiBase, uri),
Timeout: p.timeout,
Body: strBody,
}
뿐만 아니라, 동시화, 비동시적 취득, 하부 명령 작업, 그리고 비동시적인 코드베이스 처리를 필요로 하는 경우, 더 복잡한 비동시 처리 논리를 작성해야 하며, 단 한 번은 로크 데드 등의 논리 설계 문제를 야기할 수 있다. 그래프 표시를 다시 사용할 필요가 있다면, 큰 데이터베이스 사용에 대해 배우는 것은 심지어 프로그래밍 기반의 정량 트레이더도 학습하는 데 약간의 시간이 필요합니다. 그러나 발명자 수치를 사용하는 것은 간단합니다.
function main(){
exchange.IO("base", "https://test.deribit.com")
exchange.SetContractType("BTC-27DEC19-7250-P")
while(1){
var records = exchange.GetRecords()
Log(records)
$.PlotRecords(records, "K")
Sleep(1000)
}
}
K선 그래프를 그리는 것은 플랫폼에서 제공하는 템플릿 라이브러리 "Draw Line Class Library"를 사용하여 간단하게 가능합니다.
그리고 더 많은 기능들을 개발할 수 있습니다!
만약 바로 위와 같은 go 언어 (또는 python 등) 로 구현한다면, 아마도 새로운 동료들은 곧바로 >_<로 회피될 것입니다. 더리빗 옵션 운영에 대한 예시 전략은 다음과 같습니다.https://www.fmz.com/strategy/179475