양적 거래에서 자산 관리에 대한 절대적인 이익의 CTA 전략 개발

저자: , 2019-06-26 10:27:41, 업데이트: 2023-10-30 20:30:50

[TOC]

img

전문

왜 이 수업을 해야 할까요?이 수업을 배우는 것은 무엇을 의미합니까? 첫째, 이 과정은 자바스크립트와 파이썬 프로그래밍 언어를 기반으로합니다. 언어는 단지 기술입니다. 결국 우리는 기술을 산업에 적용해야합니다. 양적 거래는 급성장하고 인재 수요가 많은 신흥 산업입니다.

이 과정의 체계적인 학습은 양량 거래에 대한 더 깊은 이해를 도울 수 있습니다. 양량 거래 분야로 진입 할 준비가 된 동료가 있다면 도움이 될 수 있습니다. 주식 또는 선물 투자 애호가라면 양량 거래는 주체 거래에 완전히 도움이 될 수 있습니다. 거래 전략을 개발하여 금융 시장에서 이익을 얻을 수 있습니다. 또한 투자 자금의 채널과 플랫폼을 확장하십시오.

이보다 먼저, 제 개인적인 거래 경험에 대해 말씀드리겠습니다. 저는 금융 전문가가 아닌 통계 전문가를 배웠습니다. 처음에는 학생 시절부터 주식 주체 거래로 시작했고, 나중에 우연한 요인으로 국내 민간 자금의 정량 거래 전문가가되었습니다. 주로 전략 연구와 전략 개발을했습니다.

이 거래 사이클에서 전후 10여 년 동안 다양한 유형의 전략을 개발했습니다. 나의 투자 사상은: 위험 통제가 무엇보다 절대 수익에 초점을 맞추는 것입니다. 우리의 강좌 주제는: 양적 거래에서 자산 관리에 이르기까지 절대 수익에 대한 CTA 전략을 개발하는 것입니다.

1, 미래에 대한 CTA 전략, 수익 논리

1.1 선물 CTA를 인식

CTA는 외국에서는 상품 거래 자문가라고 불리고 국내에서는 일반적으로 투자 관리자라고 불린다. 전통적인 CTA는 대규모 투자자의 자금을 집중하여 전문 투자 기관에 위탁하고 마지막으로 거래 자문가 (즉 CTA) 를 통해 주식 선물, 상품 선물, 국채 선물 투자를 한다.

그러나 실제로, 글로벌 선물 시장이 계속 성장함에 따라, CTA의 개념도 계속 확대되고 있으며, 전통적인 선물 시장보다 훨씬 넓습니다. 그것은 선물 시장뿐만 아니라 금리 시장, 주식 시장, 외환 시장 및 옵션 시장 등에 투자 할 수 있습니다. 이 품종에 양적 인 역사적 데이터가있는 한, 이러한 역사적 데이터에 따라 대응하는 CTA 전략을 개발 할 수 있습니다.

1980년대 이전까지 전자판 기술은 아직 성숙하지 않았으며, 당시 대부분의 거래자는 윌리엄 지표,KDJ,RSI,MACD,CCI 등의 기술 지표를 수동으로 그리는 방식으로 상품 선물의 미래 행보를 판단했다. 이후 거래자들이 고객들의 자산을 관리하는 데 도움이 되는 CTA 펀드를 설립했다. 1980년대 전자판이 보편화 된 후야 진정한 의미의 CTA 펀드가 등장하기 시작했다.

CTA 펀드 관리 규모의 변화 img 단위: 10억 달러

이 그래프를 보면, 특히 양적 거래의 증가로 인해, CTA 펀드의 규모는 2005년 130.6억 달러에서 2015년에 3천억 달러 이상으로 증가했습니다. 그리고 CTA 전략은 글로벌 헤지펀드의 가장 주류 투자 전략 중 하나입니다.

크기와 함께 CTA 펀드의 성과도 상승했다. 아래 그림에서 볼 수 있는 발레크 CTA 지수는 글로벌 상품 거래 자문가의 대표적인 산업 기준이다. 1979년 말부터 2016년 말까지 발레크 CTA 펀드 지수는 연간 수익률 9.59%, 셔프 비율 0.37, 최대 회수율 15.66%로 28.95배까지 누적 수익률을 올렸다.

CTA 전략은 일반적으로 자산 분배 포트폴리오에서 다른 전략과 매우 낮은 관련성을 유지하기 때문에; 아래 그림자 원에서는 2000~2002년 글로벌 주식熊市 및 2008년 글로벌 서부 대출 위기 기간 동안, 발레크 CTA 펀드 지수가 감소하지 않고 긍정적 인 수익을 달성했을 뿐만 아니라, 주식 시장과 채권 시장이 위기를 맞을 때 CTA가 강력한 수익을 제공 할 수 있습니다. 또한 우리는 많은 Barclays CTA 상품 지수가 1980 년 이후의 수익 수준을 계속하고 있으며, 또한 500 지표보다 낮게 굴러 왔음을 볼 수 있습니다.

img

우리나라의 CTA의 발전은 또한 거의 10년 만의 일이다. 그러나 그 추진력은 매우 강력하다. 이는 국내 상품 선물 거래 환경이 상대적으로 개방되어 있고 거래 자본 문턱이 낮고, 보증금 제도가 더 많은 양방향 거래를 허용하고, 거래 수수료가 저렴하고, 거래소의 기술 구조가 주식보다 더 진보되어 있고, 시스템 거래가 더 쉽기 때문이었다.

2010년 이후 CTA 펀드는 주로 민간 펀드 형태로 존재했다. 국내 정책이 펀드 독자 투자 범위를 점차 개방함에 따라 CTA 펀드는 펀드 독자 형태로 존재하기 시작했으며, 더 투명하고 공개적인 운영 방식은 더 많은 투자자의 자산 배치를 위한 필수 도구가 되었다.

img

위 그림에서 알 수 있듯이, 접근성, 자본 한계, 거래 전략 실행 방식 및 API 연동의 차원에서도 CTA 전략은 다른 거래 전략에 비해 개인 거래자에게도 더 적합합니다. 국내 선물 품종 계약은 매우 작습니다. 예를 들어, 1 대의 옥수수 또는 콩에 몇 천 달러를 거래 할 수 있으며 자본 한계도 거의 없습니다. CTA 전략의 또 다른 부분은 전통적인 기술 분석에서 유래하기 때문에 다른 전략에 비해 더 쉽습니다.

img

CTA 전략의 설계 프로세스는 비교적 간단합니다. 먼저 역사적 데이터를 초기 처리하고 양량화 모델에 입력합니다. 양량화 모델에는 수학 모델링, 프로그래밍 디자인 및 기타 도구가 포함되어 거래 전략을 형성하고 있으며, 계산 분석을 통해 거래 신호를 생성합니다. 물론 실제 개발에서는 위의 그림처럼 간단하지 않습니다.

1.2 선물 CTA 전략의 종류

거래 전략의 관점에서 CTA 전략은 또한 다양하다: 그것은 추세 전략 또는 수당 전략일 수 있다. 그것은 큰 주기의 중장선 전략 또는 일내 짧은 라인 전략일 수 있다. 전략 논리는 기술 분석에 기초하거나 근본 분석에 기초할 수 있다. 그것은 주관 거래 또는 시스템 거래일 수 있다.

CTA 전략은 거래 방법에 따라 주관적인 거래와 시스템 거래로 분류될 수 있으며, 해외에서 CTA 전략의 발전은 비교적 진보되어 있으며, 시스템 거래의 CTA 전략은 100%에 가깝다. 분석 방법에 따라 기본 분석과 기술 분석으로 분류될 수 있다. 수익 출처에 따라 트렌드 거래와 충격 거래로 분류될 수 있다.

전체적으로 볼 때, CTA 전략은 전체 거래 시장에서 추세 전략이 약 70%를 차지하고, 평균 회귀 전략은 약 25%를 차지하고, 반 추세 또는 추세 역전 전략은 약 5%를 차지한다. 이 중 가장 큰 비율을 차지하는 추세 전략은 보유 주기에 따라 고주파 거래, 일일 거래, 중간에 짧은 라인 거래, 중간에 긴 라인 거래로 나눌 수 있다.

고 빈도 시장 전략현재 시장에는 두 가지 주류의 고주파 거래 전략이 있습니다. 하나는 고주파 거래 전략이며 다른 하나는 고주파 거래 전략입니다. 시장 전략은 거래 시장에서 유동성을 제공하는 것입니다. 즉, 거래 시장에서 거래자가있는 거래 시장에서 거래자가 거래를 구매하고 판매하려는 사람은 거래자가 거래가 가능하도록 보장해야합니다. 시장의 유동성이 부족하면 거래가 불가능하게됩니다. 시장 거래자는 타인의 상대를 구매하고 판매해야합니다.

하이프레크십 전략하이프레크리트 스은 두 개의 관련성이 강한 주식 또는 ETF와 ETF 포트폴리오를 거래하는 것이다. ETF의 계산 방식에 따라, ETF의 기대 가격을 같은 방법으로 계산할 수 있다. ETF 지수 가격으로 ETF의 기대 가격을 수 있는 경우, 보통 이 가격差가 가격 파널 안에서 동작하는 것을 얻을 수 있다. 이 가격差가 파널을 넘어선다면, 이 가격差를 거래하여, 그 가격差의 반환을 기다리고, 그로부터 수익을 얻을 수 있다.

일내 전략말 그대로, 하루종일 보유하지 않는 한, 하루종일 거래 전략이라고도 할 수 있다. 하루종일 거래는 하루종일 거래의 주기가 짧기 때문에, 보통 시장에 진입한 후 즉시 이익을 얻을 수 없기 때문에, 빠르게 탈퇴한다. 따라서 이 거래 방식은 시장 위험이 낮다. 그러나 시장이 짧은 시간에 빠르게 변하기 때문에, 하루종일 전략은 일반적으로 거래자에게 상대적으로 높은 요구사항을 갖는다.

중장선 전략이론적으로, 보유 주기가 길어질수록 전략적 용량이 커질수록 위험 수익률이 낮아진다. 특히 기관 거래에서, 짧은 전략적 용량이 제한되어 있기 때문에 큰 자본은 짧은 시간에 출입이 불가능하기 때문에 더 많은 중장선 전략이 구성된다. 일반적으로 보유 주기는 며칠, 달 또는 더 길다.

CTA 전략 데이터일반적으로 CTA 전략은 개시 가격, 최고 가격, 최저 가격, 폐쇄 가격, 거래량 등과 같은 분, 시간 및 일선 데이터로 연구 대상이 됩니다. 일부 CTA 전략은 L2 데이터의 구매, 판매, 구매, 판매량 등의 깊이 데이터와 같은 Tick 데이터를 사용합니다.

img

CTA 전략의 기본 아이디어는 전통적인 기술 지표에 기초한 것으로 생각됩니다. 왜냐하면 이 부분에 대한 공개 자료가 더 많고 논리 또한 일반적으로 비교적 간단하기 때문에 대부분 통계적 원칙에 기초합니다. 예를 들어, 모든 사람들이 잘 알고있는 다양한 기술 지표: MA, SMA, EMA, MACD, KDJ, RSI, BOLL, W&R, DMI, ATR, SAR, BIAS, OBV, 등등.

또한 시장에는 여러 가지 전통적인 거래 모델이 있으며, 이를 참고하고 개선할 수 있습니다. 예를 들어, 다중 유동선 포메이션, 듀얼 트러스트, R-브레이커, 해수욕 거래법, 격자 거래법 등이 있습니다.

위의 것들은 전통적인 기술 분석에 기초한 거래 전략이며, 그 과정은 역사적 데이터와 올바른 거래 개념에 기초하여 확률적 우위를 가진 요인 또는 매매 조건을 정제하고 시장이 미래에도 이러한 법칙을 유지할 것으로 가정하여 결국 코드로 거래 전략을 구현하고 자동으로 거래합니다.

CTA 전략의 가장 큰 장점은 현재 시장이 상승하거나 하락하더라도 절대적인 수익을 얻을 수 있다는 것입니다. 특히 시장이 급격히 쇠고기 전환하거나 시장의 흐름이 명백히 유동적 인 경우 이러한 전략의 장점은 매우 크습니다. 결국에는 수익이 있습니다. 시장이 불안한 시장에 있거나 추세가 명확하지 않은 경우 이러한 전략은 높은 지점에서 구매하고 낮은 지점에서 판매하고 지속적으로 손실을 회수 할 수 있습니다.

1.3 선물 CTA 전략의 수익성 원칙

미래에 대한 CTA 전략이 돈을 버는 이유는 다음과 같습니다.

  1. 가격운동은 반체적이며, 그것은 항상 추세 방식으로 계속됩니다. 투자자는 가격이 상승하는 것을 관찰할 때 바람에 따라 구매하고 결과적으로 가격이 더 상승합니다. 가격 하락도 마찬가지입니다. 투자자는 비합리적인 행동으로 더 많기 때문에 때때로 우리는 가격이 상승할 때 오락, 하락할 때 오락을 볼 수 있습니다.
  2. 각 투자자의 이익과 손실 비율에 대한 관용은 비대칭적이며, 위험에 대한 수용 능력도 다릅니다. 대부분의 소매업자에게는 더 보수적인 순환 거래 방식을 선호하고 시장이 추세에 따라 움직일 수 있습니다.
  3. 가격 형성은 거래에 의해 결정되며, 거래의 뒤에는 사람이 추진하는 것이 사실이지만, 인간의 성격은 변경하기가 어렵기 때문에 고정된 형태가 반복되는 이유는 전략이 역사적인 데이터에 대한 예측에 효과적이면서도 미래에 효과적일 수 있음을 예측하기 때문입니다.

또 다른 트렌드 추적 거래의 특징은 시장이 없을 때 작은 돈을 잃고 시장이 올 때 큰 돈을 버는 것입니다. 그러나 거래를 한 사람들은 시장이 대부분의 시간 동안 불안한 시장으로 인해 트렌드 시장이 일부 시간 동안만 있다는 것을 알고 있습니다. 따라서 트렌드 추적 전략은 거래에서 승률이 낮지만 전체적으로 매 거래의 이익과 손실이 크다는 것을 알고 있습니다.

트렌드 추적 전략이 수익에 불안정하기 때문에 많은 투자 기관은 다양한 다중 전략을 사용하여 포트폴리오를 구성하며, 그 중에서도 일정 양의 반전 전략을 구성합니다. 반전 전략은 가격의 시간 순서가 존재하는 계수와 음의 자기관계 관계, 즉 높은 유출과 낮은 흡수입니다.

CTA와 전통적인 자산의 연관성 img

위의 그림에서 볼 수 있듯이, 이론적으로 다양한 스타일의 다른 또는 상대적으로 낮은 관련성 있는 전략은 시장 가격의 다양한 변화에 직면하면서 동시에 서로 다른 거래 신호를 만들 것이다. 여러 가지 수익 곡선이 서로 겹치기 때문에 전체 수익이 상호 보완적으로 형성되기 때문에, 수익 곡선은 더 평탄해지며, 이로 인해 수익의 변동성이 감소한다.

위의 관점에서, 하나의 마스터 레벨의 전략을 개발하는 것이 아니라 여러 개의 중추 계기 전략을 개발하는 것이 더 낫다는 것을 알 수 있습니다. 여기서 우리는 기계 학습의 무작위 숲 알고리즘을 통해 무작위 숲이 독립적인 알고리즘이 아니라 여러 가지 의사결정 나무를 포함하는 의사결정 프레임워크라는 것을 배울 수 있습니다.

다음으로 필요한 것은 전체 상품 선물 시장의 다양한 품종의 유동성, 수익성 및 안정성을 평가하여 수익성이 낮은 변동률을 가진 상품 선물 품종 조합을 필터링하고, 산업중립적 필터링을 수행하고, 포트폴리오의 산업 분포를 통해 전체 변동도를 더 낮출 수 있는 모 전략을 설계하고, 마지막으로 시장 가치 매칭을 통해 실제 상품 선물 품종 복합 조합을 구축하여 거래를 수행하는 것입니다.

각 품종은 또한 여러 매개 변수 전략을 구성할 수 있으며, 재검토가 잘 수행되는 가까운 매개 변수 조합을 선택할 수 있으며, 시장 추세가 분명할 때, 여러 매개 변수 전략은 일반적으로 일치하여, 상승하는 것과 같다; 시장이 불안정한 시장을 누릴 때, 여러 매개 변수 전략은 종종 불일치하여, 각각의 과잉 또는 공백으로 위험을 감수하여, 하락하는 것과 같다. 이것은 포트폴리오의 최대 재검토율을 추가로 낮추고, 전체 수익률을 동일하게 유지할 수 있다.

2., 클래식 선물 CTA 전략 사례

뉴턴은 "내가 다른 사람들보다 더 멀리 볼 수 있는 것은 거인의 어깨에 서 있기 때문"이라고 말했다.

시장에 공개된 CTA 전략에는 일률적인 전략, 브린 벨트 전략, 해수욕 거래법, 동력 전략, 유치 전략 등이 있습니다. 양적 거래 전략은 모두 눈에 띄는 죽음, 전략이 공개되면 천천히 실패하는 특징을 가지고 있습니다. 그러나 이것이 우리가 이러한 전략을 배우고 그 본질을 활용하여 거대한 어깨에 서서 문제를 볼 수 있도록하는 것을 방해하지 않습니다.

2.1 선물 기본 분석 (주식, 기준, 가격)

근본적인 분석은 단기 가격운동에 관심을 가지지 않고 가치가 궁극적으로 가격에 반영될 것이라고 믿는 것이 아니라 가격에 영향을 미치는 요인을 분석하여 품종이 얼마나 가치가 있는지 판단하는 것입니다. 일반적으로 상위 아래 분석 방법을 사용합니다. 거시적 요인, 품종 요인 및 기타 요인.

img

위 그래프를 보면 상품 가격에 영향을 미치는 요소가 많고, 전체적으로 수십 개의 요소가 있으며, 수십 개의 요소가 더 세분화되어 있으며, 이러한 데이터는 끊임없이 변화하고 있습니다.

사실, 상품 선물의 기본 분석은 모든 요소를 분석하는 것이 아니라, 우리는 단지 기본 분석의 핵심 요소를 잡아야 복잡하고 복잡한 정보에서 법칙을 찾아낼 수 있습니다.

거시적 요소거시경제 데이터는 복잡하고 다양하며, 매일, 매 순간, 정치권, 중앙은행, 은행, 공식적, 비공식적, 많은 경제 자료가 발표된다. 정치와 경제 위기를 제외하고는 거시 분석은 대화의 좋은 재료이며 실용적이지 않다. 미국의 유명한 펀드 관리 전문가인 피터 린치는 다음과 같이 말했다. "나는 매년 15분 이상 경제 상황을 분석하지 않는다".

다양한 요소기본적 분석에서 품종 분석은 주로 물 상승, 수요 공급 관계, 상품 재고, 산업 이익 등을 분석하는 것으로, 상품 선물 품종 요소 분석을 습득하면 기본적으로 대부분의 시장 흐름을 판단 할 수 있다고 할 수 있습니다.

전래 상품을 하는 친구들은 국내 상품 전래 상품을 간단하게 구분할 수 있다는 것을 알고 있다. 산업상품과 농산물. 산업상품과 농산물의 분석 방식은 다양하며, 우리는 공급과 수요 양쪽 측면에서 설명한다. 산업상품의 공급은 상대적으로 안정적이며, 주요 기술 돌파구가 없는 한 생산력은 단기간에 큰 변화가 있을 가능성이 거의 없다. 따라서 산업상품 가격에 영향을 미치는 요인은 주로 수요이다. 농업상품의 수요는 상대적으로 안정적이며, 장기적으로 볼 때 농산물의 수요의 변화가 존재하지만, 단기적으로는 농산물의 수요가 안정화되기 때문에, 생산상품 가격에 영향을 미치는 요인은 주로 공급이다.

따라서 경제학의 법칙에 따르면, 상품의 가격을 최종적으로 결정하는 것은 수요와 공급의 관계이며, 이론적으로는 공급과 수요의 데이터를 얻을 수 있을 만큼 상품의 미래 가격을 판단할 수 있다. 산업상품의 경우, 공급의 데이터를 얻는 것이 쉽지만 수요의 데이터를 얻는 것은 어렵다. 농업상품의 경우, 수요의 데이터를 얻는 것이 쉽지만 공급의 데이터를 얻는 것은 어렵다.

사실 우리는 또한 더 많은 절감을 할 수 있습니다. 경제 시장에서 공급과 수요의 상호 결과는 재고입니다. 우리는 재고 데이터를 통해 시장 공급과 수요의 약점 관계를 판단 할 수 있습니다. 만약 어떤 상품의 재고가 높다면 시장 공급의 힘이 수요보다 크다는 것을 보여줍니다. 외부 조건이 변하지 않는 조건에서 상품 가격이 떨어질 것입니다. 만약 어떤 상품의 재고가 낮다면 시장 수요의 힘이 공급보다 크다는 것을 보여줍니다.

상품 재고를 분석하는 것 외에도 현장 시장과 선물 시장의 가격 차이를 분석해야 합니다. 즉, 기하급수라고 합니다. 만약 선물 가격이 현장 가격보다 크다면 우리는 선물 승동이라고 부릅니다. 만약 선물 가격이 현장 가격보다 작다면 우리는 선물 유동이라고 부릅니다. 선물 배달 체제에 따라, 선물 배달 날짜에, 선물 가격은 현장 가격과 같아야 합니다.

img

승화 또는 승화일지라도, 선물 배달 시스템의 제약으로 인해, 이론적으로 배달 날짜의 선물 가격은 현장 가격과 같아야 한다. 배달 날짜가 가까워짐에 따라 현장 가격은 선물 가격과 일치하는 경향이 있다. 하나는 선물로 현장, 다른 하나는 현장으로 환전된다.

위의 원칙에 따라, 우리는 재고와 기준을 동시에 사용하여 미래 선물 가격을 판단할 수 있다. 만약 어떤 상품의 재고가 낮고, 만약 선물 가격이 현장 가격보다 훨씬 낮다면, 우리는 이렇게 판단할 수 있다: 현장 시장의 수요의 힘은 공급의 힘보다 더 크고, 미래 현장 가격 상승의 가능성이 높다. 또한, 미래 선물 거래 체제 때문에, 배달 날짜가 가까워짐에 따라, 선물 가격이 보완되어 현장 가격과 평평하게 유지될 것이고, 미래 선물 가격 상승의 가능성이 더 높다.

마지막으로, 우리는 재고와 기하급수로 미래 가격의 확률 방향을 판단하지만 더 정확한 파는 지점이 없기 때문에 기술 분석과 함께 명확한 입출출 신호를 제공해야합니다. 전체 기본 분석의 구조는 다음과 같습니다. 낮은 재고 + 깊이 물 + 기술 분석 다중 신호 = 더 많은; 높은 재고 + 크게 상승 물 + 기술 분석 공중 신호 = 공허.

2.2 해수욕장 거래법

거래 전략에 관해서는 대표적인 해파리 거래 법칙을 말할 수밖에 없다. 해파리 거래 법칙은 거래의 역사에서 가장 유명한 실험에서 유래했다. 상품 투기자 리처드 데니스 (Richard Dennis) 는 위대한 거래자가 태어나는 것인지 또는 나중에 길러지는지 알아내려고 노력했다. 그래서 1983년에 그는 13명을 모집하여 그들에게 선물 거래의 기본 개념을 가르쳤고, 자신의 거래 방법과 원칙을 가르쳤다. 이 연습생들은 해파리라고 불렸다.

이후 4년 동안 중부 해파리들은 연평균 80%의 수익을 얻었다. 데니스는 또한 간단한 시스템과 규칙으로 적은 경험이나 전혀 거래 경험이 없는 사람들이 훌륭한 거래자가 될 수 있음을 증명했다. 그러나 개별 해파리가 웹사이트에서 해파리 거래 규칙을 판매하는 것이 수익성 있었다. 이러한 행위를 막기 위해, 두 명의 원본 해파리인 코티스 피츠와 아서 마도크는 웹사이트에서 해파리 거래 규칙을 무료로 공개하기로 결정했다.

진실이 밝혀진 후, 해파리 거래법은 최적화 된 도닝안 통로를 사용하고 ATR 지표를 사용하여 포지션을 관리한다는 것이 밝혀졌습니다. 수십 년의 역사 테스트를 거쳐 일반 소매자가 쉽게 돈을 벌 수 있는 거래 방법이 되었으며, 일부 품종에서 여전히 유효합니다.

해수욕장의 핵심 원칙

  • 장점을 확보하십시오: 장기적으로 긍정적 인 수익을 창출 할 수 있기 때문에 기대되는 긍정적 인 거래 전략을 찾습니다.
  • 리스크 관리: 리스크를 통제하고 위치를 지키십시오. 그렇지 않으면 결과를 만들어 낼 때까지 기다릴 수 없습니다.
  • 단호함: 당신의 전략을 단호하게 실행할 때야 진정한 시스템 효과를 얻을 수 있습니다.
  • 그리고 이 모든 것은 매우 간단합니다: 간단한 시스템은 복잡한 시스템보다 장기적으로 더 활발합니다.

그럼 다음으로 해수욕 거래법이 실제로 무엇을 말하는지 살펴보죠. 1, 시장 - 무엇을 사거나, 어떤 시장에서 거래하는지는 기본적으로 파인입니다. 파인들은 선물 거래자입니다. 그들은 거래량이 많은 유동성 높은 시장을 선택합니다. 왜냐하면 거래가 활발하지 않은 시장을 선택하면 출입에 추가적인 슬라이드 가격을 증가시키고 많은 트렌드 기회를 놓칠 것이기 때문입니다. 2., 포지션 크기 - 얼마나 많이 팔고 구매하는 것이 전체 전략의 매우 중요한 부분이며, 보통 대부분의 사람들은 이것을 무시하거나 잘못 취급합니다. 파리즈 거래법은 ATR, 즉 평균 실제 변동 폭 지표를 사용하여 포지션을 열고, 상승 신호, 중단 신호를 계산합니다. 이것은 시장의 절대 변동 폭에 따라 포지션 크기를 조정하려는 매우 현명한 디자인입니다. 시장의 변동이 높을 때 보유량을 줄이고, 시장의 변동이 약할 때 보유량을 증가시킵니다. 먼저 단위를 정의합니다. 이 단위의 공식은: ((총자산*1%) / ATR). 초기 포지션은 1 단위이며, 당일 여러 상품이 ATR 수준에 도달하더라도 당일 손실은 전체 생산량의 1% 수준 내에서 제어됩니다. 3, 시장 진입 --- 해파리의 시장 진입은 도치안 통로를 도출하여, 가격이 상위 20개 또는 55개 K 라인의 최고 가격을 넘을 때 더 많이 진입하고, 가격이 상위 20개 또는 55개 K 라인의 최저 가격을 넘을 때 공백으로 진입합니다. 신호가 나타나면 마감 또는 하위 K 라인과 상관없이 시장 진입 거래를합니다. 4, 스톱 러스 --- 장기적으로는 스톱 러스 하지 않는 거래는 성공할 수 없지만 대부분의 거래자는 손실 입장을 잡고 시장이 뒤집어 오기를 바라고 있다. 해파리는 손실 입장을 언제 탈퇴해야 하는지 엄격하게 규정하고, 만약 다수의 주문을 보유하고 있고 가격이 2원씩 떨어지면, 다수의 머리가 평점을 손상시킨다. 만약 빈 주문을 보유하고 있고 가격이 2원씩 상승하면, 빈 머리가 평점을 중단한다. 5, 중단 - 파이의 중단은 많은 파워를 잃는 것을 의미하며 많은 거래자가 받아들이기 어려운 부분입니다. 현재 많은 주문을 보유하고 있으며 가격이 10 일 도 통로 궤도에 떨어지면 모든 주문을 평정합니다. 현재 빈 주문을 보유하고 있으며 가격이 10 일 도 통로 궤도에 올라갈 경우 모든 빈 주문을 평정합니다.

여기서 우리는 해수욕 거래법이 단순해 보이지만 실제로는 진정한 의미의 거래 시스템 형태를 형성해 왔다는 것을 알 수 있다. 이는 전체 거래 시스템의 모든 측면을 포괄하고 있으며, 거래자에게 주관적인 상상력적 의사결정을 할 수 있는 공간을 남겨주지 않고, 이 시스템을 절차적으로 운영하는 것의 장점을 발휘하게 한다.

해수욕 거래법의 가장 큰 장점은 우리에게 효과적인 거래 방법을 구축하는 데 도움이된다는 것입니다. 그것은 분산 포스트 구축, 동적 중지 및 손실을 결합하고 시장에 대한 트렌드 추적 전략을, 특히 ATR 값의 사용 및 포지션 관리의 개념을 결합하는 것이 매우 배울 가치가 있습니다. 물론 그것은 또한 트렌드 추적 전략의 공통 문제도 있습니다.

3., 실제 개발 시상식 CTA 전략

3.1 메이어 기반의 CTA 트렌드 전략 개발

지난 세기 후반에 미국의 금융 투자 분야에서는 엄청난 거래 방법이 유행하기 시작했고, 수천 명의 사람들이 그것을 실행한 후, 이 방법이 효과적이고 엄청난 실용적 가치가 있다는 것을 알게 되었고, 많은 투자 전문가와 전문 거래자들에 의해 인정받았고, 현재까지 거의 모든 금융 투자 분야에 완벽하게 적용될 수 있습니다. 외환, 금, 주식, 선물, 원유, 지수 및 채권이든, 이것은 카오스 조작법입니다.

카오스 (chaos) 라는 단어는 원래 우주 혼란 상태의 설명을 가리키는데, 그 생각은 다음과 같다: 결과는 필연적이지만, 기존 지식으로 인해 결과를 계산할 수 없으며, 계산 자체가 결과도 변화하기 때문에, 결국에는 최대 또는 최소의 결과가 발생할 수 있지만 필연적인 결과는 없다. 이것은 거래 시장과 매우 유사하며, 참여자가 시장을 분석하고 거래를 구매하고 거래할 때도 시장을 변화시킨다. 시장은 영구적인 변동성을 가지고 있으며, 시장의 새로운 형태를 참여자가 알게 될 때 시장은 또한 참여자가 인식하는 것으로 인식되는 것으로 변동한다. 그리고 그것은 참여자가 알지 못하는 방향으로 변동하는 경향이 있어야 하며, 참여자가 그것의 변화의 법칙을 포착하는 것을 막기 위해 충분한 지능을 가지고 있다. 즉, 시장은 안정적이지 않으며, 시장에 대한 인식은 미래를 대표할 수 없다.

카오스 조작법 (Chaos Operating Method) 은 빌 윌리엄스가 발명한 완전한 투자 아이디어, 거래 전략 및 입출구 신호의 집합이다. 현재 국제적으로 많은 투자자들이 카오스 조작법으로 시장 거래에 참여하고 있으며, 우리나라 금융 시장의 발전이 늦어지면서 카오스 이론은 비교적 신세 아이디어이기 때문에 국내에서도 카오스 조작법을 연구하는 사람들이 거의 없다. 카오스 조작법은 거의 모든 금융 투자 분야에 적용될 수 있는 매우 보편적인 거래 전략이며, 주식, 채권, 외환, 외환, 디지털 상품을 포함한 거의 모든 금융 투자 분야에 적용될 수 있기 때문에 이 강의의 간소화된 버전은 카오스를 전략으로 활용하여 투자자들의 관심과 수익을 높인다.

이름에서 알 수 있듯이, 카오스 조작법의 이론적 기초는 카오스 이론이다. 카오스 이론은 기상학자 에드워드 로렌즈 (Edward Lorenz) 가 제안한 것으로, 20세기 후반의 가장 위대한 과학적 발견 중 하나이다. 유명한 나비 효과 (Butterfly effect mush) 은 그가 제시한 것이다. 빌 윌리엄스는 카오스 이론을 금융 투자 분야에 창의적으로 적용하고, 분자 기하학, 비선형 역학 등의 학문을 결합하여 매우 효과적인 기술 분석 지표를 만들었습니다.

전체적인 카오스 운영 방식은 다섯 가지 차원 (기술 지표) 로 구성되어 있습니다.

  • 호랑이 라인 (Alligator)

  • 프랙탈

  • 동력.

  • 가속 (Acceleration)

  • 균형선

    img

위 그림에서 볼 수 있듯이, 오징어 선은 분자 기하학과 비선형 역학을 적용한 균형 선의 집합이며, 본질적으로 확장 지수 가중 이동 평균의 일종이며, 평평선에 속하지만 계산 방법은 일반 평평선보다 약간 더 복잡하다. 다음으로 오징어 선을 Mac어로 정의하는 방법을 살펴보자:

// 参数
N1:=11;
N2:=21;

// 定义价格中线
N3:=N1+N2;
N4:=N2+N3;
HL:=(H+L)/2;

// 鳄鱼线
Y^^SMA(REF(HL,N3),N4,1);
R:=SMA(REF(HL,N2),N3,1);
G:=SMA(REF(HL,N1),N2,1);

먼저 2개의 외부 매개 변수 N1과 N2를 정의하고, 외부 매개 변수에 따라 최고 가격과 최저 가격의 평균 HL를 계산하고, 그 다음 다른 매개 변수로 각각 HL의 평균을 계산합니다.

카오스 연산법에서 매우 형상적으로 정의되는 분포의 개념은 다음과 같은 예로 할 수 있다: 손바닥을 열고 손가락을 위로 향하고, 중손가락은 상부 분포이며, 왼쪽의 작은손가락과 지명손가락, 오른쪽의 사인손가락과 엄지손가락은 각각 혁신되지 않은 높은 K선을 나타낸다. 기본 분포는 이러한 5개의 K선을 구성한다. 그러면 다음 코드를 사용하여 분포를 정의할 수 있다:

// 分形
TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2;
BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2;

TOP:=REF(H,TOP_N);
BOTTOM:=REF(L,BOTTOM_N);

MAX_YRG^^MAX(MAX(Y,R),G); 
MIN_YRG^^MIN(MIN(Y,R),G); 

TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP);
BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);

생선선과 분포를 계산하면, 우리는 이 두 조건에 따라 간단한 혼돈 연산 전략을 작성할 수 있고, 지수 중량화 이동 평균을 지수와 분포 지표로 계산하는 기준 가격으로 집계할 수 있다. 물론 원본의 혼돈 연산 전략은 좀 더 복잡할 것이다. 코드는 다음과 같다:

// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1);
// 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓
SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1);

// 如果收盘价跌破鳄鱼的下巴时,多头平仓
C<Y,SP(BKVOL);
// 如果收盘价升破鳄鱼的下巴时,空头平仓
C>Y,BP(SKVOL);

이 전략의 거래 논리는 다음과 같이 간단하게 정리할 수 있습니다.

  • 멀티 헤드 오픈: 현재 많은 주문이 없으며, 종료 가격이 상위 분포를 깨고 상위 분포가 해파리 라인 위에있는 경우.
  • 빈 포지션 개설: 현재 빈 오더가 없다면, 그리고 닫기 가격은 하위 분포를 넘어, 하위 분포가 해파리 라인 아래에 있는 경우.
  • 다중 평형: 만약 마감 가격이 고래 턱을 부러뜨리면.
  • 빈 상장: 종결 가격이 상승하면 고래의 턱을 찢는다.

다음으로, 이 간단한 혼돈 연산방법 전략 리모델링의 결과는 어떻게 되는지 살펴보자. 리모델링을 실제 환경에 더 가깝게 하기 위해, 여기서 절차 요금을 거래소의 2배로 설정하고, 개시와 중점 각각 2개의 점프의 슬라이드를 추가한다. 리모델링의 데이터 종류는 스크리트 스틸 지수, 거래 종류는 스크리트 스틸 주력 연속, 고정 1개의 오픈이다. 다음은 1시간 수준에서의 초기 리모델링 성과 보고이다.

img img img

자본곡선 및 재검사 성과 데이터에서 이 전략은 잘 수행되고 전체 자본곡선이 안정적으로 상승하고 있다. 그러나 2016년 말 이후 스 ن트 스틸 품종의 시장 특성은 변화하고 있으며, 이전 고 파동률의 일방적인 움직임에서 광범위한 기동적인 움직임으로 전환되었다. 자본곡선에서 볼 때 2017년 현재까지의 수익은 명백히 약하다.

결국, 카오스 조작의 핵심은 시장이 어떻게 진행되는지 걱정할 필요도 없고, 가짜 돌파구를 걱정할 필요도 없이 전환점을 찾는 것입니다. 돌파구가 분포되면 바로 진입합니다. 결코 시장을 예측하려고 시도하지 말고, 관찰자이자 추종자입니다.

3.2 자바스크립트 기반의 CTA 패키지 전략 개발

소로스는 1987년에 쓴?? 금융의 알키마틱?? 에서 중요한 주장을 한 적이 있다. 그는 시장의 가격들이 미래에 대한 편견을 가지고 있다는 의미에서 항상 틀린다고 믿는다. 그는 시장의 유효성 가설은 이론적인 가설에 불과하며, 실제로 시장 참여자는 항상 합리적이지 않으며, 모든 정보를 완전히 접근하고 객관적으로 해석하는 것은 불가능하며, 모든 사람들이 동일한 정보를 가지고 있지만, 모든 사람들의 피드백은 동일하지 않다. 즉, 가격이 자체는 시장 참여자의 잘못된 기대를 포함하고 있기 때문에 본질적으로 시장 가격이 항상 틀린 것이다. 이것은 아마도 유치자의 이익의 근원일 것이다.

위의 원칙에 따라, 우리는 또한 비효율적인 선물 시장에서, 서로 다른 기간의 거래율 계약이 시장의 영향을 받거나 항상 동시화되지 않으며, 그 가격 결정도 완전히 효과적이지 않다는 것을 알고 있습니다. 따라서, 같은 거래 지표의 서로 다른 기간의 거래율 계약 가격에 따라, 두 가격에 큰 가격 범위를 나타낸 경우, 서로 다른 기간의 선물 계약을 동시에 사고 팔고, 연장 이자를 할 수 있습니다.

상품 선물과 마찬가지로, 디지털 화폐에는 이와 관련한 장기간 배당계약 포메이션도 있다. 예를 들어 OkEX 거래소에서 볼 수 있는 것처럼: ETC 그 주, ETC 다음 주, ETC 분기. 예를 들어, ETC 그 주와 ETC 분기 사이의 가격 차이는 장기적으로 약 5에 유지되는 것을 가정한다. 만약 하루 가격 차이는 7에 도달한다면, 우리는 차이는 미래에 어느 시점에 5로 돌아갈 것으로 예상한다. 그러면 그 주 동안 ETC를 팔고, ETC 분기에 동시에 구매하여 그 차이를 공허하게 할 수 있다. 그리고 반대로.

이러한 가격차이는 존재하지만, 인공 조작의 시간과 정확성의 저하와 가격변화의 영향으로 인공수익은 종종 많은 불확실성이 존재한다. 양적 모델로 수익 기회를 포착하고 수익 거래 전략을 세우는 것, 그리고 프로그래밍 알고리즘으로 자동으로 거래 명령을 거래소에 내려주는 것, 신속하고 정확한 기회를 포착하고 효율적으로 안정적으로 수익을 얻는 것이 양적 수익의 매력이다.

이 과목은 디지털 화폐 거래에서 발명가 양적 거래 플랫폼과 OkEX 거래소에서 ETC 선물 계약을 활용하여 순간적 제약 기회를 포착하고 가시적인 수익을 포착하는 동시에 헤딩 할 수있는 위험을 감수하는 간단한 제약 전략을 어떻게 보여줄 수 있는지 알려줍니다.

디지털 화폐를 위한 장기화 전략을 만드는 것난이도: 중간 수준전략적 환경

  • 거래 지표: 이더 클래식 (ETC)
  • 가격 차이 데이터: ETC 주간 - ETC 분기 (협동성 검사를 제외)
  • 거래 주기는: 5분
  • 头寸匹配:1:1
  • 거래 유형: 같은 품종에 걸쳐

전략적 논리

  • 오버다리프 오픈 조건: 현재 계정이 보유되지 않고, 가격의 오버다리프는 boll 아래로 내려가면 오버다리프한다. 즉: ETC를 일주일 동안 구매하고, ETC를 분기 동안 판매한다.
  • 적폐사업 조건: 현재 계좌가 보유되지 않고, 가격의 적폐가 boll보다 커진다면 적폐사업을 한다. 즉: ETC를 주간에 팔고, ETC를 분기에 구매한다.
  • 오버 디퍼시드 이화 조건: 현재 계정이 주중의 오버 주문을 보유하고, 주중의 오버 주문을 보유하고, 가격의 오버 주문이 boll 중간에 있는 것보다 더 큰 경우, 오버 가격 이화 조건이다. 즉: 주중의 오버 주문을 판매하고, 주중의 오버 주문을 구매한다.
  • 공백 가격 격차 조립 조건: 현재 계정이 그 주간에 공백 ETC를 보유하고 있고, 4분기 동안 여러 ETC 주문을 보유하고 있으며, 가격 격차가 boll 중간에 적어지면, 공백 가격 격차이다. 즉: 그 주간에 공백 ETC를 구매하고, 4분기 동안 공백 ETC를 판매한다.

위는 간단한 디지털 화폐 중장기 유예 전략의 논리 설명입니다. 어떻게 프로그램을 통해 자신의 아이디어를 구현 할 수 있습니까? 우리는 발명자가 거래 플랫폼을 정량화하기 전에 프레임워크를 구축하려고 노력했습니다.

function Data() {}  // 基础数据函数
Data.prototype.mp = function () {}  // 持仓函数
Data.prototype.boll = function () {}  // 指标函数
Data.prototype.trade = function () {}  // 下单函数
Data.prototype.cancelOrders = function () {}  // 撤单函数
Data.prototype.isEven = function () {}  // 处理单只合约函数
Data.prototype.drawingChart = function () {}  // 画图函数

function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB);  // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks;  // 账户余额
    var boll = data.boll(dataLength, timeCycle);  // 计算boll技术指标
    data.trade();  // 计算交易条件下单
    data.cancelOrders();  // 撤单
    data.drawingChart(boll);  // 画图
    data.isEven();  // 处理持有单个合约
}

//入口函数
function main() {
    while (true) {  // 进入轮询模式
        onTick();  // 执行onTick函数
        Sleep(500);  // 休眠0.5秒
    }
}

우리가 주관 거래에서 거래 프로세스가 어떤 것인지 상상해보세요. 시스템 거래에서 본질적인 차이는 없습니다. 데이터 획득, 계산 데이터, 주문 거래, 주문 후 처리. 프로그램에서도 마찬가지입니다. 먼저 프로그램은 20 행 main 함수를 실행합니다. 이것은 계약 된 통상 규칙입니다. 프로그램이 거래 전략을 처리 한 후 (예제 경우) 실행하면 무한 순환 모드로, 즉 라운드 모드로, 라운드 모드에서는 반복적으로 실행되는 onTick 함수를 실행합니다.

그래서 onTick 함수에서는 우리가 주체 거래에서 하는 거래 과정입니다: 먼저 기본 가격 데이터를 얻습니다. 그 다음 계정 잔액을 얻습니다. 그 다음 지표를 계산합니다. 그 다음 거래 조건을 계산하고 주문을 시작합니다. 마지막으로 주문 후 처리입니다.

전략적 아이디어와 거래 프로세스를 비교하여 전략적 프레임워크를 쉽게 구축할 수 있습니다. 전체 전략은 세 단계로 단순화 될 수 있습니다.

  • 거래 전 사전 처리.
  • 이 자료를 수집하고 계산합니다.
  • 이 문서는 모든 문서를 공유합니다.

거래 전략 프레임워크가 구축된 후 실제 거래 프로세스와 거래 세부 사항에 따라 필요한 세부 코드를 전략 프레임워크에 채워야 합니다.

1) 거래 전 사전 처리

1. 필요한 범변수를 선언합니다.

  • 그래프 구성에 대한 chart 객체를 선언합니다var chart = {}
  • Chart 함수를 호출하여 차트를 초기화합니다.var ObjChart = Chart ( chart )
  • 값차기 순서를 저장하기 위한 빈 배열을 선언합니다var bars = []
  • 기록된 역사 데이터의 시간 변수를 선언합니다var oldTime = 0

2. 설정 정책의 외부 매개 변수

var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

3. 데이터 처리 함수를 정의합니다.

  • 기본 데이터 함수: Data () 구성 함수 Data를 생성하고 내부 속성을 정의합니다. 계정 데이터, 보유 데이터, K 라인 데이터 시간 , 유치 A/B 계약의 구매/판매 가격, 양/반대 유치 가격 차이.
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
  • 저장 함수:mp () 를 가져옵니다. 전체 보유 배열을 탐색하여 특정 계약, 지정 방향의 보유 수를 반환합니다. 그렇지 않으면 false를 반환합니다.
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}
  • K선과 지표 함수:boll () 양/반대 가격차차 데이터에 따라 새로운 K 라인 서열을 합성한다. 그리고 Boll 지표에 의해 계산된 상승, 중간, 하락 데이터를 반환한다.
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}
  • 하위 함수:trade () 하부계약 이름과 하부계약 유형을 입력하고 대가 하부계약으로 하부계약 결과를 반환한다. 두 개의 다른 방향의 하부계약이 동시에 필요하기 때문에 하부계약 이름에 따라 한 구매/판매 가격을 함수 내에서 변환한다.
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}
  • 주문 취소 함수:cancelOrders () 모든 미수 주문 배열을 검색하고 개별적으로 취소합니다. 미수 주문이 있다면 false를 반환하고 미수 주문이 없으면 true를 반환합니다.
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}
  • 단일 계약을 보유:isEven () 이매 거래 처리에서 단발적인 상황이 발생하는데, 여기서 모든 포지션을 간단하게 평정 처리하는 방식으로 직접 처리합니다. 물론, 또한 추출 방식으로 변경할 수 있습니다.
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
            if (positionData[i].Type == 0) { // 如果是多单
                type = 10; // 设置下单参数
            } else if (positionData[i].Type == 1) { // 如果是空单
                type = -10; // 设置下单参数
            }
            // 平掉所有仓位
            this.trade(positionData[i].ContractType, type, positionData[i].Amount);
        }
    }
}
  • 그림 차트 함수:drawingChart () ObjChart.add () 방법을 호출하여 차트에 필요한 시장 데이터와 지표 데이터를 그리십시오: 상승, 중간, 하락, 긍정적 / 반대 가격 차차.
Data.prototype.drawingChart = function (boll) {
    var nowTime = new Date().getTime();
    ObjChart.add([0, [nowTime, boll.up]]);
    ObjChart.add([1, [nowTime, boll.middle]]);
    ObjChart.add([2, [nowTime, boll.down]]);
    ObjChart.add([3, [nowTime, this.basb]]);
    ObjChart.add([4, [nowTime, this.sabb]]);
    ObjChart.update(chart);
}

4. 입력 함수 main () 안의 트랜잭션 사전 처리 코드를 실행한다. 이 코드들은 프로그램이 시작된 후 한 번만 실행된다.

  • 필터 컨트롤러에는 중요한 정보가 없습니다.SetErrorFilter ( )
  • 거래가 가능한 디지털 화폐를 설정합니다.exchange.IO ( )
  • 프로그램이 시작되기 전에 비워지기 전에 그려진 그래프ObjChart.reset ( )
  • 프로그램이 시작되기 전에 정지 표시기 정보가 비워집니다.LogProfitReset ( )

위와 같은 트랜잭션 사전 처리를 정의한 다음 다음 단계로 이동하여 턴트 모드에 들어가 onTick () 함수를 반복 실행하고 Sleep () 턴트에서 휴식 시간을 설정합니다. 일부 디지털 통화 거래소의 API는 일정 시간 동안의 접속 횟수를 내장하여 제한합니다.

function main() {
    // 过滤控制台中不是很重要的信息
    SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
    exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
    ObjChart.reset(); //程序启动前清空之前绘制的图表
    LogProfitReset(); //程序启动前清空之前的状态栏信息
    while (true) { // 进入轮询模式
        onTick(); // 执行onTick函数
        Sleep(500); // 休眠0.5秒
    }
}

두 번째, 데이터를 수집하고 계산합니다.

  1. 기본 데이터 객체, 계좌 잔액,boll 지표 데이터를 거래 논리를 위해 사용한다.
function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks; // 账户余额
    var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
    if (!boll) return; // 如果没有boll数据就返回
}

세 번째, 신청서를 제출하고 후속 처리

  1. 위의 전략적 논리에 따라, 사매 동작을 실행한다. 먼저 가격과 지표 조건이 유효한지 판단하고, 그 다음 보유 조건이 유효한지 판단하고, 마지막으로 trade () 하위 함수를 실행한다.
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
    if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
        data.trade(tradeTypeA, "closebuy"); // 合约A平多
    }
    if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
        data.trade(tradeTypeB, "closesell"); // 合约B平空
    }
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
    if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
        data.trade(tradeTypeA, "closesell"); // 合约A平空
    }
    if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
        data.trade(tradeTypeB, "closebuy"); // 合约B平多
    }
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
    if (data.basb < boll.down) { // 如果basb价差低于下轨
        if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
            data.trade(tradeTypeA, "buy"); // 合约A开多
        }
        if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
            data.trade(tradeTypeB, "sell"); // 合约B开空
        }
    } else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
        if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
            data.trade(tradeTypeA, "sell"); // 合约A开空
        }
        if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
            data.trade(tradeTypeB, "buy"); // 合约B开多
        }
    }
}
  1. 하위 주문이 완료되면 미수 주문, 단일 계약을 보유하는 것과 같은 비정상적인 상황을 처리하고 그래프를 그리는 것이 필요합니다.
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约

이 글의 200+줄을 통해 우리는 간단한 디지털 화폐 중장기 유치 전략을 완전히 완성했습니다.

// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
    __isStock: true,
    tooltip: {
        xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
    },
    title: {
        text: '交易盈亏曲线图(详细)'
    },
    rangeSelector: {
        buttons: [{
            type: 'hour',
            count: 1,
            text: '1h'
        }, {
            type: 'hour',
            count: 2,
            text: '3h'
        }, {
            type: 'hour',
            count: 8,
            text: '8h'
        }, {
            type: 'all',
            text: 'All'
        }],
        selected: 0,
        inputEnabled: false
    },
    xAxis: {
        type: 'datetime'
    },
    yAxis: {
        title: {
            text: '价差'
        },
        opposite: false,
    },
    series: [{
        name: "上轨",
        id: "线1,up",
        data: []
    }, {
        name: "中轨",
        id: "线2,middle",
        data: []
    }, {
        name: "下轨",
        id: "线3,down",
        data: []
    }, {
        name: "basb",
        id: "线4,basb",
        data: []
    }, {
        name: "sabb",
        id: "线5,sabb",
        data: []
    }]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳

// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}

// 获取持仓
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}

// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}

// 下单
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}

// 取消订单
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}

// 处理持有单个合约
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数

관련

더 많은

다이안완99배우기

아빠배우기

펑91배우기