지난 기사에서 우리는 프로그래밍 거래 스크립트에 대해 이야기했습니다. 실제로 거래 전략은 거래 스크립트입니다. 이 글은 주로 거래 스크립트가 하드웨어 운반자가 있어야한다는 것에 대해 이야기합니다. (프로그램이 실행되는 곳), 이 스크립트 거래 프로그램은 컴퓨터 프로그래밍 언어로 작성 될 수 있습니다. (발명자가 양적 거래 플랫폼에서 사용하는 세 가지 프로그래밍 언어를 나열합니다. 물론 프로그램 거래 자체는 모든 프로그래밍 언어를 사용하여 구현 할 수 있습니다.)
거래 전략의 종류 초보적인 프로그램화 거래, 양량화 거래의 초보자들은 다양한 트렌드 전략, 오트레이스 전략, 고주파 전략, 격자 전략 등의 명칭으로 가득 차있을 수 있습니다. 실제로 프로그램화 거래, 양량화 거래의 일반적인 전략 유형은 간단하게 몇 가지 방향으로 나타납니다.
위는 거래 전략의 관점에서 분류되어 있으며, 발명자의 양적 거래 플랫폼에서 전략 설계의 관점에서 전략은 다음과 같이 나눌 수 있습니다.
거래소 API 인터페이스 프로그래밍 거래 스크립트는 거래소 계정을 어떻게 작동합니까? 답은 거래소에서 열리는 API 인터페이스입니다. 그렇다면 거래소에서 개방된 인터페이스의 종류는 무엇입니까? 이전 기사에서 우리는 "거래소" 섹션에서 거래소에는 일반적으로 REST, Websocket 인터페이스가 있다고 이야기했습니다. 여기서 우리는 전략 프로그램 수준에서 개념을 약간 추가했습니다. 거래소 인터페이스가 검증 여부에 따라 분류됩니다. (REST, Websocket 모두) 검증 및 검증되지 않습니다.
인증이 필요 없는 인터페이스
일반적으로 API KEY
(API KEY가 무엇인지 잊고 이전 기사를 뒤집을 수 있습니다.);; 이러한 인터페이스는 일반적으로 시장 인터페이스입니다. 예를 들어, 심층 시장, K 라인 데이터, 자본 요금, 거래 품종에 관한 정보, 거래소 서버 시간표 등을 검색하는 인터페이스입니다.
간단하게 말하면, 당신의 계정과 거의 관련이 없는 인터페이스가 공용 인터페이스라는 것을 대략적으로 확인할 수 있습니다. (인증이 필요하지 않습니다.)
발명자 양자 거래 플랫폼에서, 인증되지 않은 API 함수를 호출할 때 (폐쇄 거래소 인증되지 않은 인터페이스, 공공 인터페이스) API KEY가 잘못 구성되어 있더라도 인터페이스로 돌아오는 데이터를 정상적으로 얻을 수 있습니다.
확인해야 하는 인터페이스 간단히 말해서, 인증이 필요한 인터페이스 (API KEY를 통해 인증), 이러한 인터페이스는 개인 인터페이스라고 불립니다. 이러한 인터페이스는 일반적으로 귀하의 계정에 대한 일부 동작이나 정보와 관련이 있습니다. 예를 들어 계정 자산을 검색, 계정 보유를 검색, 쿼리 연결, 단일 쿼리 전송, 송금, 통화 조정 레버, 보유 모드를 설정 등. 이 모든 작업은 검증되어야 합니다. 발명자 양자 거래 플랫폼에서, 확인을 필요로 하는 API 함수를 호출할 때 (폐쇄된 거래소의 확인을 필요로 하는 인터페이스, 개인 인터페이스) API KEY가 잘못 구성되면 인터페이스 호출에 오류가 발생하고 빈값을 반환한다.
그렇다면 이러한 인터페이스는 발명가들의 양적 거래 플랫폼에서 어떻게 사용되고 있을까요?
발명가 양자 거래 플랫폼은 거래소 동작을 포괄하고, 일관성 있는 인터페이스를 정의합니다 (예를 들어, K 라인 인터페이스, 깊이 시장 인터페이스, 현재 자산 인터페이스를 쿼리, 아래单 인터페이스, 주문 철회 인터페이스 등) 이 인터페이스는 발명가 양자 거래 플랫폼에서 발명가 양자 거래 플랫폼 API 함수라고 불리며 API 문서를 쿼리하여 열람할 수 있습니다.https://www.fmz.com/api )。
그렇다면 어떤 행동이나 정의가 일치하지 않는 거래소 인터페이스는 발명가의 양적 거래 플랫폼에서 어떻게 사용될까요?
이러한 거래소 인터페이스는 예를 들어: 자산 분할, 조건부 위탁, 대량 주문, 대량 철회, 변경 주문 등이다. 이러한 인터페이스는 일부 거래소에서 갖추고 있으며 일부 거래소에서는 갖추지 않으며 기능 및 사용 세부 사항이 크게 다를 수 있으므로 이러한 인터페이스는 발명자의 양적 거래 플랫폼에서 통과됩니다.exchange.IO
이 함수를 액세스하기 위한 자세한 내용은 발명자의 양적 거래 플랫폼 API 문서를 참조하십시오:https://www.fmz.com/api#exchange.io...);; 또한 발명가들의 양적 거래 플랫폼 전략 광장에서 실용적인 IO의 예시 전략이 있습니다.
발명자의 양적 거래 플랫폼 API 문서에 있는 모든 API 함수들이 네트워크 요청을 발생시키는가?
먼저 거래소 API 인터페이스에 접근 빈도가 제한되어 있다고 가정하자면 (예를 들어 초당 5회나) 접근이 너무 자주 되지 않으면 http 429 오류를 보고 접속을 거부한다 (대부분의 거래소는 429을 보고한다). 그렇다면 발명자의 양자 거래 플랫폼에서 포장된 거래소 인터페이스를 호출하는 데도 동일한 제한이 있으며, 발명자의 양자 거래 플랫폼에서 네트워크 요청을 생성하지 않는 API 기능에는 이러한 제한이 없습니다. 모든 발명가들의 API 함수가 네트워크 요청을 생성하는 것은 아니며, 일부 발명가들의 API 함수는 현재 거래 쌍을 설정하는 것, 계약 코드를 설정하는 것, 지표 계산 함수를 설정하는 것, 거래소 개체 이름을 얻는 것 등 일부 로컬 설정을 수정하는 것뿐이다. 기본적으로 함수의 용도로 인해 네트워크 요청이 발생했는지 여부를 판단 할 수 있습니다. 거래소 데이터를 획득하거나 거래소 계정 작업을 수행하는 경우 네트워크 요청이 발생합니다. 이러한 인터페이스는 호출 주파수를 고려해야합니다.
이제 몇 가지 일반적인 질문과 경험에 대해 이야기 해 보겠습니다.
실수하는 것 이것은 가장 흔한 실수입니다. 수많은 새로운 것을 괴롭히고, 항상 모든 것이 정상으로 돌아가는 전략을 수행합니다. 왜 실제 디스크가 잠시 동안 실행되는지 (언제든 유발 될 수 있습니다.)
우리는 인터페이스가 반환하는 데이터에 대한 검증을 판단해야 할 정책을 작성할 때, 예를 들어 발명자의 양적 거래 플랫폼에서 이러한 코드를 얻을 수 있습니다 (자신의 프로그램을 직접 거래소 인터페이스에 액세스하는 것과 동일합니다):var ticker = exchange.GetTicker()
그리고 만약 우리가 이것을 사용해야 한다면,ticker
변수 (GetTicker 함수의 반환 구조를 참조)Last
(최근의 가격) 이 데이터를 사용해야 합니다.var newPrice = ticker.Last
이렇게 데이터를 얻을 수 있습니다 ((newPrice is???new: 최신,Price: 가격, 맞아요! 결합!)GetTicker()
이 함수는 정상 데이터를 반환하지만 요청 시간이 지남, 네트워크 오류, 거래소에서 연결이 끊어지고, 케이블이 끊어지고, 곰아이가 전기를 당기는 등이 발생하면 발생합니다.GetTicker()
함수 반환null
ᅳ 지금 이 순간ticker
이 값은null
저는 그 곳을 다시 방문합니다.Last
이 경우, 정책 프로세스가 중단되는 것을 초래하는 절차의 오차가 발생할 수 있습니다.
따라서, 인터페이스 호출 실패 (GetTicker 호출 실패 null을 반환) 가 실제 디스크가 중단되는 정책의 직접적인 원인이 아닙니다.null
변수의 속성), 인터페이스 호출 실패 보고 오류는 실제 디스크를 멈추게하지 않습니다 ((중점).).
그래서 어떻게 하면 디스크가 비정상적으로 정지되는 것을 방지할 수 있을까요?
답은 인터페이스에서 반환된 데이터를 잘못 처리하는 것입니다. 간단합니다.null
자바스크립트 언어의 예, 다른 언어는 거의
코드의 짧은 단락을 작성하여 설명하십시오. (이것은 단지 설명입니다. 직접 실행하는 것은 불가능합니다.)
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("打印最新价格:", newPrice)
} else {
// 数据为null,不做操作就不会出问题
}
그 이상입니다.GetTicker
인터페이스는 오류를 허용해야 합니다. 네트워크 요청이 있는 인터페이스는 반환값에 대해 오류를 허용해야 합니다.
실수에 대한 용서는 다양하고 사용할 수 있습니다._C()
함수 (cf. FMZ API 문서를 참조), 자체적으로 오류 허용 함수, 자체적으로 오류 허용 메커니즘, 논리를 설계.
에 대해_C()
함수 사용, 많은 신입생들이 잘못 사용했을 가능성이 높습니다._C()
함수의 매개변수는 함수 참조가 아니라 함수 호출이다._C(funcName, param1, param2)
, 호출이 맞고, funcName는 대괄호가 없고, param1, param2는 funcName에 전달되는 매개변수이다._C(funcName(param1, param2))
FMZ API 문서를 제대로 읽지 않은 경우, 일반적으로 이 문서를 작성하는 것은 잘못된 호출입니다.
현시장 가격에 주문한 다음 주문량
현시장 가격 청구서 부수 또한 많은 신조가 쉽게 틀릴 수 있습니다. 이전 기사에서 언급한 것처럼 현시장 가격 청구서 부수는 일반적으로 금액입니다. (특별한 거래소가 다른 설정이 될 수 있습니다. 일반적으로 FMZ에서 이러한 특별한 거래소 설정은 FMZ API 문서에서 설명됩니다.) 예를 들어, 나는 OKEX V5 모형 디스크를 사용하여 테스트했습니다:
거래 쌍은 다음과 같이 설정됩니다.LTC_USDT
function main() {
exchange.IO("simulate", true) // 切换为OKEX交易所的模拟盘
exchange.Buy(-1, 1) // 价格是-1,表示下的订单为市价单,数量为1表示下单量是1USDT
}
거래소는 일반적으로 주문 금액 제한을 가지고 있기 때문에, 제한 이하의 주문은 사전 주문이 되지 않습니다 (예를 들어, 비안 현금은 5USDT 이상의 모든 주문이 성공하기 위해 주문을 요구합니다). 그래서 이렇게 주문은 오류를 반환합니다:
错误 Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
미래 거래 시 방향 미래에 대한 전략을 세울 때 단 하나의 방향은 또한 새로운 사람들이 종종 실수로 문제를 일으키는 것입니다. 발명가들의 양적 거래 플랫폼에서 전략을 작성하는 것을 예로 들 수 있습니다. 이 글은 한 번 더 읽어보겠습니다.https://www.fmz.com/api#exchange.setdirection...
이 함수들은Buy
,Sell
그러나 선물 (현재 상품은 물론 문제가 없다, 현재 상품은 단지 파는 것뿐) 에 대해 많은, 많은, 많은, 많은, 빈, 빈 방향이 있는 경우, 분명히 구매/판매는 그렇게 많은 방향의 동작을 나타내지 않습니다.exchange.SetDirection()
ᅳ
FMZ에서exchange.SetDirection("buy")
(선택된 방향)exchange.Buy
함께 사용하는 경우, 아래 나열은 더 많은 거래 주문을 나타냅니다.
이 글은 다른 글과도 같습니다.exchange.SetDirection("sell")
그리고exchange.Sell
함께 사용하면 아래의 문자는 빈 상장 주문을 나타냅니다.exchange.SetDirection("closebuy")
그리고exchange.Sell
함께 사용하는 경우, 아래의 문자는 평형 복수 주문을 나타냅니다.exchange.SetDirection("closesell")
그리고exchange.Buy
함께 사용하면 아래의 문자는 평평한 빈 상장 주문을 나타냅니다.
보통 신규 모임exchange.SetDirection("sell")
그리고exchange.Buy
그리고 그 다음에는 오류가 나타납니다. (재검토는 오류를 나타내지 않을 수도 있지만, 이것은 분명히 논리 오류이며, 강박증은 참을 수 없습니다.)
또 다른
function main() {
exchange.SetContractType("quarter") // 设置当前合约为季度合约
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("看我市价单下单了,成交了,就有持仓了", exchange.GetPosition())
exchange.SetDirection("closebuy") // closebuy 和Sell 搭配使用,嗯没错~
exchange.Sell(-1, 1)
}
여기 보시면 묻습니다: 왜 내가 지분을 가지고 있고 Closebuy와 Sell도 함께 사용했는지, 왜 잘못 보고되어 지분을 매립하지 못하는가?
위와 같은 오류가 발생할 수 있는 다른 경우도 있다. 평면 방향 설정이 옳고, 하부 문항 함수의 사용도 옳고, 또한 이 방향의 포지션을 보유하지만, 여전히 이 오류를 보고한다.
그 이유는 당신의 프로그램이 여러 번 주문을 받았을 수도 있고, 초기 주문이 거래되지 않았으며, 평형 주문이 거래 대기 중인 화면에 매달려 있을 수도 있기 때문에, 이 시점에 프로그램이 계속 평형으로 갈 때 평형 포지션을 초과하는 오류가 표시될 수 있습니다.
로그 출력, 거래 정보 표시
설계 작성 프로그램화, 거래 전략을 정량화 하는 것은 열리지 않는 데이터를 표시하는 print
ᅳ
자바스크립트console.log
ᅳ
골랑어fmt.Println()
ᅳ
C++ 사용cout
또한, FMZ 플랫폼의 정보는 발명자의 양적 거래 플랫폼에서 정보를 표시하는 두 가지 주요 위치를 보여줍니다.
상태 버튼 디스크가 실행되면, 디스크 페이지가 아래와 같습니다.
표시되는 부분은 상태 표시줄 정보로, 상태 표시줄은 주로 실시간으로 변경되는 데이터를 표시하기 위해 사용된다. (실제 변경 사항은 실시간 관찰이 필요하고 매번 로그로 인쇄할 수 없기 때문에 이러한 데이터는 상태 표시줄에서 표시될 수 있습니다.
상태 탭에서 데이터 사용LogStatus
FMZ의 API 문서를 참조하십시오.
일기
표시되는 부분은 로그 탭으로, 로그 탭은 주로 특정 데이터를 특정 시점에 영구적으로 기록하거나 특정 시기의 정책을 기록하는 작업을 위한 것입니다. 로그에는 여러 종류가 있습니다. 1, 일반 로그, FMZ의 정책에서 로그 함수를 사용하여 출력, 정책 로그에 인쇄.
2, 다음 단기 로그, FMZ의 전략에서 사용exchange.Sell
/exchange.Buy
로그에서 자동으로 기록을 출력합니다.
3, FMZ의 전략에서 사용 된 exchange.CancelOrder
, 로그에서 자동으로 삭제 로그를 출력합니다.
4, 오류 로그, FMZ의 정책 실행 중, 네트워크 요청을 수행하는 인터페이스에 호출 오류가 발생하면, 예외를 던지면 (예를 들어, 던지기 같은 문장) 자동으로 로그에 오류 로그를 출력합니다.
FMZ의 API 함수는 로그 출력 함수를 생성할 수 있습니다. 예를 들어 Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id) 등은 필요한 매개 변수 뒤에 추가된 출력 매개 변수와 함께 사용할 수 있습니다. 예를 들어: exchange.CancelOrder ((orders[j].Id, orders[j]) 같은 경우.
function main() {
Log("数据1", "数据2", "数据3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "附带数据1", data2, "...")
exchange.CancelOrder(id, "附带数据1", data2, "...")
LogProfit(100, "附带数据1", data2, "...")
}
지표 함수의 사용
지표기능에 대해 이야기하기 전에, 지표가 무엇인지, 간단히 말해서 평평선, MACD, ATR 등에 대해 알아보자.
질문: 이 지표들은 어떻게 나타났나요?
A: 물론 계산됩니다.
질문: 어떤 기준으로 계산되었나요?
답: K선 데이터에 따라 계산됩니다.
질문: 예를 들어요?
답: 가장 간단한 지표평선 지표의 예로, 우리가 지표 계산의 데이터 소스로 일일 K선을 (즉, 일일 (日) 을 나타내는 일일선 또는 음선) 을 사용한다면. 지표평선 지표의 매개 변수는 10이고, 계산된 지표평선은 10일평선이다.
질문: K 직선 BAR의 수가 10 개 미만인 경우 평선 지표를 계산할 수 있습니까?
답: 평선 지표가 계산되지 않을 뿐만 아니라, 어떤 지표도 K선 데이터 BAR의 수가 지표 주기의 매개 변수를 만족하지 않을 때 유효한 지표 값을 계산할 수 없습니다. 계산된 배열의 대응 위치에 빈값을 채울 것입니다. 예를 들어,JavaScript
언어 전략은 인쇄된 지표 데이터를 표시합니다.null
。
이 교육의 예는 바로 전략 광장입니다.https://www.fmz.com/strategy/125770이 교육 예제 전략을 재검토하면 재검토 시스템에서 생성된 그래프와 10주기 평균을 볼 수 있습니다.
트릭: 사용자 정의 그래프, K 라인 및 직선 그래프:
질문: 만약 제가 10시간의 평균시간을 원한다면요? 답: K선 데이터와 시간 주기의 K선 데이터가 좋습니다.
통상적으로 우리가 보는 K줄은, 우리가 그것을 데이터화한 후에 배열이다 (배열의 개념은 이해되지 않습니다, 백도 아래로 내려갈 수 있습니다), 각각의 요소는 K줄 기둥이며, 순서대로 배열되어 있으며, 배열의 첫 번째 요소는 현재 시간에서 가장 멀리 떨어져 있으며, 배열의 마지막 요소는 현재 시간에서 가장 가깝습니다. 일반적으로 K선 데이터의 마지막 선 기둥은 현재 주기의 선 기둥이며, 실시간으로 변하고, 완료되지 않았습니다. 계산된 지표는 또한 K선 기둥과 일치합니다. 위의 예제에서는 한 지표의 숫자가 K선 기둥에 대응하는 것을 볼 수 있습니다. 마지막 K선 기둥이 실시간으로 변하고 계산된 지표는 또한 K선 기둥의 변화에 따라 변합니다.
발명자 양적 거래 플랫폼에서는 TA 라이브러리 (FMZ 플랫폼에서 구현된 라이브러리, 호스트에 통합되어 다양한 언어로 직접 사용할 수 있습니다) 또는 Talib 라이브러리 (Talib 구 브랜드 지표 라이브러리, JS, C ++ 통합, Python 자체 설치가 필요합니다) 를 사용할 수 있습니다. 예를 들어, 위의 예제에서 계산 평균선을 계산합니다. TA 라이브러리를 사용하세요:
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // 打印均线
}
탈리브 자료를 사용함:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // 打印均线
}
계산된 지표 데이터 ma는 각 요소가 하나씩 대응하는 K선 수 (records) 의 배열이다.ma[ma.length -1]
대응records[records.length - 1]
그리고 그 후에도,
다른 더 복잡한 지표는 또한 동화되어 있으며 MACD와 같은 지표에 주의를 기울여야합니다.
var macd = TA.MACD(records) // 这样只传入K线数据,不传入指标参数,指标参数采用的就是默认值,其它指标函数也是同理
이 때 macd라는 변수는 2차원 행렬이다 (개념이 이해되지 않는다). 2차원 행렬은 간단히 말해서 행렬이고 그 모든 요소는 행렬이다. Q: MACD 지표 데이터가 왜 2차원 대수열일까요? 답: macd 지표는 두 줄 (dif 줄, dea 줄) 과 한 집합의 양대 기둥 (macd 양대 기둥, 사실 이 양대 기둥 데이터도 한 줄로 볼 수 있다) 으로 구성되어 있기 때문에 macd 변수는 다음과 같이 분할할 수 있다.
var dif = macd[0]
var dea = macd[1]
var macdColumn = macd[2]
이 강의의 한 예는 다음과 같습니다.https://www.fmz.com/strategy/151972