Type/to search
8
Follow
1364
Followers
단계별로 전략을 작성하는 방법을 알려드립니다. - 내 언어 전략을 이식하세요
Original
Created 2019-10-21 14:59:12  Updated 2024-12-17 20:37:18
 1
 2971

img

단계별로 전략을 작성하는 방법을 알려드립니다. - 내 언어 전략을 이식하세요

최근에 친구들과 전략에 관해 이야기하면서, 제 언어를 사용해 전략을 작성하는 많은 사람이 유연성 문제로 어려움을 겪고 있다는 사실을 알게 되었습니다. 많은 경우 시스템에서 제공하지 않는 표준 K-라인 기간을 사용해야 합니다. 예를 들어, 가장 많이 요청되는 요구 사항은 4시간 K-라인을 사용하는 것입니다. 이 문제는 기사에서 해결되었습니다. 관심이 있다면 먼저 살펴보세요:링크. 하지만 my language 전략에서는 my language의 고도로 캡슐화된 특성으로 인해 이 문제는 자체적으로 유연하게 데이터를 처리할 수 없습니다. 이 시점에서 전략적 사고를 다른 언어로 이식하는 것이 필요합니다.

트렌드 전략을 이식하는 것은 매우 간단합니다. 샘플 코드를 사용하여 드라이빙 전략의 데이터 계산 부분을 채우고 트레이딩 신호 트리거 조건을 채울 수 있습니다.

재사용 가능한 샘플 코드:

예를 들어 OKEX 선물에 사용되는 전략을 살펴보겠습니다.

javascript
// 全局变量 var IDLE = 0 var LONG = 1 var SHORT = 2 var OPENLONG = 3 var OPENSHORT = 4 var COVERLONG = 5 var COVERSHORT = 6 var BREAK = 9 var SHOCK = 10 var _State = IDLE var Amount = 0 // 记录持仓数量 var TradeInterval = 500 // 轮询间隔 var PriceTick = 1 // 价格一跳 var Symbol = "this_week" function OnTick(){ // 驱动策略的行情处理部分 // 待填充... // 交易信号触发处理部分 // 待填充... // 执行交易逻辑 var pos = null var price = null var currBar = records[records.length - 1] if(_State == OPENLONG){ pos = GetPosition(PD_LONG) // 判断是不是 满足状态,如果满足 修改状态 if(pos[1] >= Amount){ _State = LONG Amount = pos[1] // 更新实际量 return } price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2 Trade(OPENLONG, price, Amount - pos[1], pos, PriceTick) // (Type, Price, Amount, CurrPos, PriceTick) } if(_State == OPENSHORT){ pos = GetPosition(PD_SHORT) if(pos[1] >= Amount){ _State = SHORT Amount = pos[1] // 更新实际量 return } price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2 Trade(OPENSHORT, price, Amount - pos[1], pos, PriceTick) } if(_State == COVERLONG){ pos = GetPosition(PD_LONG) if(pos[1] == 0){ _State = IDLE return } price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2 Trade(COVERLONG, price, pos[1], pos, PriceTick) } if(_State == COVERSHORT){ pos = GetPosition(PD_SHORT) if(pos[1] == 0){ _State = IDLE return } price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2 Trade(COVERSHORT, price, pos[1], pos, PriceTick) } } // 交易逻辑部分 function GetPosition(posType) { var positions = _C(exchange.GetPosition) var count = 0 for(var j = 0; j < positions.length; j++){ if(positions[j].ContractType == Symbol){ count++ } } if(count > 1){ throw "positions error:" + JSON.stringify(positions) } for (var i = 0; i < positions.length; i++) { if (positions[i].ContractType == Symbol && positions[i].Type === posType) { return [positions[i].Price, positions[i].Amount]; } } Sleep(TradeInterval); return [0, 0]; } function CancelPendingOrders() { while (true) { var orders = _C(exchange.GetOrders) for (var i = 0; i < orders.length; i++) { exchange.CancelOrder(orders[i].Id); Sleep(TradeInterval); } if (orders.length === 0) { break; } } } function Trade(Type, Price, Amount, CurrPos, OnePriceTick){ // 处理交易 if(Type == OPENLONG || Type == OPENSHORT){ // 处理开仓 exchange.SetDirection(Type == OPENLONG ? "buy" : "sell") var pfnOpen = Type == OPENLONG ? exchange.Buy : exchange.Sell var idOpen = pfnOpen(Price, Amount, CurrPos, OnePriceTick, Type) Sleep(TradeInterval) if(idOpen) { exchange.CancelOrder(idOpen) } else { CancelPendingOrders() } } else if(Type == COVERLONG || Type == COVERSHORT){ // 处理平仓 exchange.SetDirection(Type == COVERLONG ? "closebuy" : "closesell") var pfnCover = Type == COVERLONG ? exchange.Sell : exchange.Buy var idCover = pfnCover(Price, Amount, CurrPos, OnePriceTick, Type) Sleep(TradeInterval) if(idCover){ exchange.CancelOrder(idCover) } else { CancelPendingOrders() } } else { throw "Type error:" + Type } } function main() { // 设置合约 exchange.SetContractType(Symbol) while(1){ OnTick() Sleep(1000) } }

예: 이중 이동 평균 전략의 이식

Mai 언어 백테스트:
img

Mai 언어 전략 코드:

MA5^^MA(C,5); MA15^^MA(C,15); CROSSUP(MA5,MA15),BPK; CROSSDOWN(MA5,MA15),SPK;

JavaScript 전략으로 마이그레이션

먼저 재사용 가능한 샘플 코드에 시장 인수 및 지표 계산 부분을 입력합니다.

// 驱动策略的行情处理部分 var records = _C(exchange.GetRecords) if (records.length < 15) { return } var ma5 = TA.MA(records, 5) var ma15 = TA.MA(records, 15) var ma5_pre = ma5[ma5.length - 3] var ma15_pre = ma15[ma15.length - 3] var ma5_curr = ma5[ma5.length - 2] var ma15_curr = ma15[ma15.length - 2]

보시다시피, 이중 이동 평균 전략은 매우 간단합니다. 먼저 K-라인 데이터를 얻기만 하면 됩니다.records, 그런 다음 사용하세요TA函数库이동 평균 함수TA.MA5일 이동평균선과 15일 이동평균선을 계산합니다. (백테스트 인터페이스에서 K-라인 기간이 일간 K-라인으로 설정되어 있음을 확인할 수 있습니다.TA.MA(records, 5)5일 이동평균을 계산합니다.TA.MA(records, 15)15일 이동평균).
그럼 얻으세요ma5지표 데이터의 두 번째에서 마지막 지점ma5_curr(지표값), 세번째에서 마지막 지점ma5_pre(지표값),ma15이는 지표 데이터에도 적용됩니다. 그런 다음 그림과 같이 이러한 지표 데이터를 사용하여 골든 크로스와 데드 크로스를 판단할 수 있습니다.
img
이런 상태가 형성되면 그것은 확정된 골든 크로스 또는 데드 크로스입니다.

그러면 신호 판단 부분은 다음과 같이 쓸 수 있습니다.

if(_State == IDLE && ma5_pre < ma15_pre && ma5_curr > ma15_curr){ _State = OPENLONG Amount = 1 } if(_State == IDLE && ma5_pre > ma15_pre && ma5_curr < ma15_curr){ _State = OPENSHORT Amount = 1 } if(_State == LONG && ma5_pre > ma15_pre && ma5_curr < ma15_curr){ _State = COVERLONG Amount = 1 } if(_State == SHORT && ma5_pre < ma15_pre && ma5_curr > ma15_curr){ _State = COVERSHORT Amount = 1 }

이는 이식이 정상이라는 의미이며, 돌아가서 테스트할 수 있습니다.
JavaScript 전략 백테스팅
백테스트 구성:
img

回测结果: [/upload/asset/16baa65d35e034e06a58.png](/upload/asset/16baa65d35e034e06a58.png)

내 언어 백테스팅
img

백테스트 결과는 기본적으로 동일한 것으로 볼 수 있으므로 전략에 대화형 기능을 계속 추가하고 데이터 처리(예: K-라인 합성)를 추가하고 사용자 정의 차트 그리기 및 표시를 추가하려면 다음을 수행할 수 있습니다. 그것.

관심 있는 학생은 시도해 볼 수 있습니다.

Related Recommendations
Comment
All comments (1)

    学习下

    7 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)