지난 기사에서 우리는 간단한 헤지킹 전략을 함께 구현했고, 다음 기사에서는 이 전략을 어떻게 업그레이드할 수 있는지 배웠습니다. 전략 변경은 크지 않지만 변경된 세부 사항은 주의가 필요합니다. 코드에서 일부 장소의 정의와 이전 변경은 중요하게 이해해야합니다.
A交易所->B交易所
,B交易所->A交易所
이 그래프에서, 이 그래프에서, 이 그래프에서画线类库
그리고 우리는 FMZ를 사용하는 방법을 함께 배웠습니다.模版类库
기능.이 프로젝트가 진행될 예정입니다.
현금 레버리지 모드로 전환하는 코드exchanges[i].IO
, 입력 파라미터trade_normal
리버로 전환, 입력trade_super_margin
리버 풀 포스트로 전환, 재 측정은 지원되지 않습니다. 이것은 실제 포스트에서만 사용됩니다.
이쪽에서main
함수의 시작에 대한 준비 단계가 증가합니다:
// 切换杠杆模式
for (var i = 0 ; i < exchanges.length ; i++) { // 遍历检测所有添加的交易所对象
if (exchanges[i].GetName() == "Binance" && marginType != 0) { // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
if (marginType == 1) {
Log(exchanges[i].GetName(), "设置为杠杆逐仓")
exchanges[i].IO("trade_normal")
} else if (marginType == 2) {
Log(exchanges[i].GetName(), "设置为杠杆全仓")
exchanges[i].IO("trade_super_margin")
}
}
}
이 정책에는 단지 위안 현금에 대한 교환 위안 리버드 모드의 코드가 추가되어 있기 때문에 정책 파라미터에 전환을 설정하면 위안 현금에만 유효합니다.
이미 포장된 그림 템플릿을 사용하면 매우 간단합니다. 우리가 사용하는 템플릿의 이름은画线类库
◎ FMZ 플랫폼 전략 광장에서 직접 검색하여 얻을 수 있습니다.
이 글은 한글로 번역되어 있습니다.https://www.fmz.com/strategy/27293이 템플릿을 복사하는 페이지로 이동하십시오.
버튼을 누르면 이 템플릿 클래스 라이브러리를 자신의 정책 라이브러리로 복사할 수 있습니다.
다음으로 정책 편집 페이지에서, 템플릿 탭에서 필요한 템플릿 클래스 라이브러리를 선택할 수 있습니다. 탭을 클릭한 후 저장 정책을 클릭하면 템플릿이 참조됩니다. 이것은 템플릿 탭의 사용에 대한 간단한 설명입니다. 이 정책은 이미 템플릿을 참조하여 작업을 반복할 필요가 없습니다.画线类库
이 글은 이미 인용되어 있습니다.
우리는 주로 그것을 사용하는 방법을 배우고 있습니다.画线类库
이 함수들은 그림들을 그리기 위한 것입니다.
우리가 계획하는A->B
이 모든 것은 매우 중요합니다.B->A
두 개의 곡선 (현재의 A에서 B, B에서 A의 차이) 과 두 개의 수평선 (시행 가격의 차이) 을 그리는 것이 필요합니다.
우리는 단편적인 헤지킹을 설계하고 있습니다.A->B
그리고B->A
이 글의 트리거 라인은 다릅니다.
지난 기사에서:
var targetDiffPrice = hedgeDiffPrice
if (diffAsPercentage) {
targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
}
이 모든 것은 단지 하나의 트리거입니다targetDiffPrice
ᅳ
그래서 여기서 우리는 코드를 수정하고, 먼저 변수를 수정합니다.
그리고 코드를 수정합니다:
var targetDiffPriceA2B = hedgeDiffPriceA2B
var targetDiffPriceB2A = hedgeDiffPriceB2A
if (diffAsPercentage) {
targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
}
그리고 이 차이는 전보다 훨씬 더 높습니다.targetDiffPrice
한 줄은 두 줄로 바뀌었습니다.targetDiffPriceA2B
、targetDiffPriceB2A
ᅳ
다음으로, 그림줄 클래스 라이브러리의 그림줄 함수를 사용하여 이 데이터를 그래프에 그려낼 수 있습니다.
// 画图
$.PlotHLine(targetDiffPriceA2B, "A->B") // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
$.PlotHLine(targetDiffPriceB2A, "B->A")
이 전략이 실행되면 다음과 같은 그래프가 나타납니다.
다음으로, 과도한 그래프 라인을 피하기 위해 실시간 스피리치 곡선을 그리십시오. 실시간 스피리치 데이터 그래프 곡선의 코드를 균형 검사에 넣으십시오.
if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
nowAccs = _C(updateAccs, exchanges)
var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
cancelAll()
if (isBalance) {
lastKeepBalanceTS = ts
if (isTrade) {
var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
isTrade = false
}
}
$.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price) // 画实时差价曲线
$.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price) // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
}
이 그래프 코드가 4줄에 불과하기 때문에, 실행 중일 때 그래프가 표시됩니다.
이 문서는 가격 차이 트리거 라인을 두 개의 라인으로 변경했다고 언급했습니다.A->B
이 모든 것은 우리가 할 수 있는 일입니다.B->A
이 경우 이전 주문 가격 알고리즘을 사용할 수 없으며, 매매 가격 유동화 방법을 사용합니다.
if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) { // A -> B 盘口条件满足
var priceSell = depthA.Bids[0].Price - slidePrice
var priceBuy = depthB.Asks[0].Price + slidePrice
var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks) // 提示信息
hedge(exB, exA, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
} else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) { // B -> A 盘口条件满足
var priceBuy = depthA.Asks[0].Price + slidePrice
var priceSell = depthB.Bids[0].Price - slidePrice
var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks) // 提示信息
hedge(exA, exB, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
}
매수값이 두 개의 데이터로 분리되어 있기 때문에hedge
이 글은 다른 글과 비교해 볼 수 있습니다.
function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
var sellRoutine = sellEx.Go("Sell", priceSell, amount)
Sleep(500)
buyRoutine.wait()
sellRoutine.wait()
}
이 변경 사항에 따라 약간의 변경 사항이 있습니다. 이 내용은 설명되지 않습니다.
전략에 상호작용을 추가하여 전략이 실시간으로 차이 트리거 라인을 수정할 수 있도록 한다. 이것은 반자동 전략의 설계 요구이며, 여기에 함께 교육 예시로 구현되었다. 정책의 상호 작용 디자인은 매우 간단합니다. 먼저 정책 편집 페이지에서 정책에 상호 작용 컨트롤을 추가하십시오.
두 개의 컨트롤이 추가되었습니다. 하나는 A2B, 하나는 B2A. 컨트롤의 입력 상자에 값을 입력 한 후 입력 상자 오른쪽의 버튼을 클릭하십시오. 즉시 정책에 명령이 보내집니다. 예를 들어: 입력 상자에 값을 입력하십시오.123
클릭하세요.A2B
이 버튼은 정책에 즉각적인 명령을 보내줍니다.
A2B:123
전략 코드에서 디자인에 대한 상호 탐지, 처리 코드.
// 交互
var cmd = GetCommand() // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
if (cmd) { // 检测到有交互指令,例如:A2B:123
Log("接收到命令:", cmd)
var arr = cmd.split(":") // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
if (arr[0] == "A2B") { // 判断触发的交互控件是不是A2B
Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageB2A = parseFloat(arr[1]) // 修改触发差价线
} else {
hedgeDiffPriceA2B = parseFloat(arr[1]) // 修改触发差价线
}
} else if (arr[0] == "B2A") { // 检测到触发的控件是B2A
Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageA2B = parseFloat(arr[1])
} else {
hedgeDiffPriceB2A = parseFloat(arr[1])
}
}
}
더 정규화되고 관찰하기 쉬운 상태 표시 표시 표시를 위해.
var tbl = {
"type" : "table",
"title" : "数据",
"cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"],
"rows" : [],
}
tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
재검토는 단지 테스트 전략, 초기 탐지 기능이며, 많은 BUG들이 재검토 단계에서 실제로 테스트될 수 있다. 재검토 결과를 너무 신경쓰지 않아도, 최종 전략은 실제 환경에서 실제 총알을 필요로 한다.
이 전략의 소스 코드는:https://www.fmz.com/strategy/302834
15570686905이 거래 전략은 계약 기능에 추가됩니다. 그냥 영구 계약과 거래율 계약이 추가됩니다.
가벼운 구름문장, 재검토 팁 main:127:9 - TypeError: Cannot read property 'SetPrecision of undefined'
다른 화폐에 대한 현금 헤지킹 전략 Ver1.1
발명가들의 수량화 - 작은 꿈좋은 기회입니다.
가벼운 구름이해가 됐어요, 감사합니다.
발명가들의 수량화 - 작은 꿈두 개의 거래소 객체를 추가합니다.