양적 세계로 데려다줍니다-- MACD 쌍방향 조작 슬라이드 스톱 손실 코드 분석

저자:발명가들의 수량화 - 작은 꿈, 2016-04-22 13:53:14, 업데이트: 2023-06-14 10:38:59

양적 세계로 당신을 데려다줍니다 MACD 쌍방향 조작 슬라이드 스톱 손실 코드 분석

지난 기사에서 우리는 30줄의 코드에서 분량화를 위한 간소화 전략에 대해 알아봤습니다. 이 기사에서는 분량화를 시작하는 초보자들도 분량화 전략 설계의 즐거움을 조금 더 가까이 찾아갈 수 있도록 단계적으로 안내합니다. 이 문서는 계속, 이 경우에도 BTC의 현금 거래로 설명합니다. 저자는 금융, 투자, 증권 등에 대해 완전히 불완전합니다. 심지어 선물 거래 과정을 이해하지 못합니다. 또한 눈빛이 혼란스럽고, 낯선 이름이나 용어를 듣고, 머리가 흐트러지는 것, (그것이 실현되는 것도 조금 이해! 조금 이해!); 자신의 백두대간, 정보 확인 등을 통해 한 번 한 번 채워라. 관련 내용을 확인하고, 기본 개념을 가지고, 자신의 약간의 이해와 함께 간단한 JS 언어를 작성했습니다. 처음에는 K 라인, 평균 라인, MACD 지표가 무엇인지 몰랐습니다. 여기서 간단히 말해서, K선은 특정 주기의 시장 시장을 기록하여 시장 동력을 관찰하는 것이 좋습니다. 평균선은 이전 기사에서 사용 된 지표이며 MACD와 마찬가지로 시장 시장을 나타내는 지표입니다. 이 두 가지 지표의 개념, 알고리즘, 공식 추론 등이 모두 설명되어 있습니다. 이해가 안되는 경우 Baidu를 참조하십시오. (나는 Baidu에서보고 있습니다!)

코드는 다음과 같은 범용 변수를 가지고 있습니다. 오래된 규칙, 먼저 설명 한 번, 오래된 새는 무시할 수 있습니다.

변수 이름 초기 값 설명
간격 2000 이 변수는 라운치 사이클, 즉 프로그램이 일시 중지되는 대기 시간입니다. 단위는 밀리 초이고 1000 밀리 초는 1 초입니다. 따라서 이 변수의 초기 값은 2 초입니다.
STATE_FREE 0 이것은 상태 표시 변수이며, 빈자리를 나타냅니다. 상태 판단을 위해 사용됩니다.
STATE_BUY 1 이것은 상태 변수를 나타내는 것으로, 여러 개의 지분을 나타냅니다.
STATE_SELL 2 상태변수, 빈자두를 표시합니다.
ORDER_INVALID 3 보관 상태 변수는 보관되지 않은 것을 나타냅니다.
ORDER_VALID 4 그리고 그 다음에는
국가 STATE_FREE 상태변수, 빈 상태로 초기화.
신호 지연 0 원래 계획된 신호 지연, 일시적으로 쓸모없다.
stopProfit 0.002 이 변수는 더 중요하고, 중지 손실 비율, 예를 들어 자본 * 중지 손실 비율 ((0.002) 는 최대 손실의 0.002 배의 자본을 나타냅니다.
발걸음 0.5 슬라이드 스톱 손실의 단계 길이 값. 상승, 하락, 스톱 손실 가격의 차원.
op액 1 고정된 작업량.
이익 0

글로벌 객체, 보관 정보를 기록하는 데 사용되는, 몇 가지 방법을 포함, 주로 실현 슬라이드 스톱 손실.

    var holdOrder = {//持仓信息对象
	    orderState: ORDER_INVALID,// 持仓状态
	    price: 0, //持仓均价
	    amount: 0, //持仓量
	    time: null, // 操作时间
	    stopPrice: 0, // 止损价
	    level: 1,   //止损等级
	    updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏
	        if(state === STATE_SELL){//当前 空头持仓
	        	return (lastPrice - this.price) * amount;
	        }
	        if(state === STATE_BUY){//当前 多头持仓
	        	return - (lastPrice - this.price) * amount;
	        }
	    },
	    SetStopPrice: function(ticker,stopState){//更新止损价
	    	if(stopState === STATE_FREE){ //更新止损时状态 为空闲
	    		return this.stopPrice;
	    	}
	    	if(stopState === STATE_BUY){ //更新止损时状态 为多仓
	            if(this.orderState === ORDER_INVALID){
	        	    return this.stopPrice;
	            }
	            if(this.stopPrice === 0){//初始 止损价为0 时 
	            	this.stopPrice = this.price * ( 1 - stopProfit );
	            }
	            if( ticker.Last <= this.price ){ //最后成交价 小于等于  持仓均价时
	                this.stopPrice = this.price * ( 1 - stopProfit );
	                this.level = 1;
	            }else{//其它情况
	        	    if( ticker.Last - this.price > this.level * step ){//超出当前等级   设置滑动止损
	                    this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price );
	                    //更新止损价为滑动后的止损价
	                    this.level++;//上调止损等级
	        	    }else{//其它
	        	    	this.stopPrice = this.stopPrice;//保持当前止损价不变
	        	    }
	            }
	    	}else if( stopState === STATE_SELL){//空头持仓类似
	    		if(this.orderState === ORDER_INVALID){
	        	    return this.stopPrice;
	            }
	            if(this.stopPrice === 0){
	            	this.stopPrice = this.price * ( 1 + stopProfit );
	            }
	            if( ticker.Last >= this.price ){
	                this.stopPrice = this.price * ( 1 + stopProfit );
	                this.level = 1; 
	            }else{
	        	    if( this.price - ticker.Last > this.level * step ){
	                    this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last );
	                    this.level++;
	        	    }else{
	        	    	this.stopPrice = this.stopPrice;
	        	    }
	            }
	    	}
	        return this.stopPrice;//返回止损价
	    },
	    initHoldOrder: function(){//平仓后  用于 初始化持仓信息的  函数
	        this.orderState = ORDER_INVALID;
	        this.price = 0;
	        this.amount = 0;
	        this.time = null;
	        this.stopPrice = 0;
	        this.level = 1;
	    }
	};
  • 기트허브에서 코드를 업로드합니다. 클릭하세요github

  • 공식 QQ 그룹에 가입하지 않은 사람은 가입하십시오: 309368835


    이 함수들은 어떤 함수들이 사용되고 있는지

    function MACD_Cross() {// MACD 지표, 교차 상태의 함수를 탐지한다 var records = exchange.GetRecords (();// K줄 데이터를 얻는다 while ((!records 를 기록.length < 45) { //K 줄 데이터가 null이 될 수 없습니다. 45개 이상의 기둥이 있어야 기준에 맞지 않습니다. records = exchange.GetRecords (); 잠자리 (Interval); ♪ ♪ var macd = TA.MACD ((records,12,26,9);// 지표 함수를 호출, 매개 변수는 MACD의 기본 변수이다. var dif = macd[0]; //dif 라인 var dea = macd[1]; //dea 라인 var column = macd[2]; // MACD 기둥 var len = records.length; //K 줄의 주기의 길이가 if (( (dif[len-1] > 0 && dea[len-1] > 0) && dif[len-1] > dea[len-1] && dif[len-2] < dea[len-2] && column[len-1] > 0.2) { // 골드포크 조건을 판단한다: dif와 dea는 현재 모두 0보다 크며, dif는 아래에서 위로 dea를 통과하며, MACD 양 기둥은 0.2보다 크다. return 1; // return 1 은 금포 신호를 나타냅니다. ♪ ♪ if (( (dif[len-1] < 0 && dea[len-1] < 0) && dif[len-1] < dea[len-1] && dif[len-2] > dea[len-2] && column[len-1] < -0.2) { //죽은 포크 조건을 판단합니다: return 2;// return 2는 죽음의 포크 신호를 나타냅니다. ♪ ♪
    return 0; // 골드포크, 데드포크 신호 이외의 신호는 0을 기다립니다. ♪ ♪ function getTimeByNormal(time) {// 시간을 얻는 함수 밀리 초 시간 표준 시간 변환 var timeByNormal = new Date ((); 시간ByNormal.setTime ((시간); var strTime = timeByNormal.toString (); var showTimeArr = strTime.split (-); var showTime = showTimeArr[3]+-+showTimeArr[1]+-+showTimeArr[2]+-+showTimeArr[4]; return showTime; ♪ ♪


    아래는 정책의 메인 함수로 시작되며, 이 정책은 이전 30 줄의 직선 정책과 마찬가지로 거래 템플릿 클래스 라이브러리를 사용하여 거래 세부 사항을 포괄하고 있으며, 관심있는 친구들은 발명자 정량화에서 코드를 찾을 수 있으며, 공식 QQ 그룹 공유, github에서 코멘트 버전을 찾을 수 있습니다.

    주요 함수 var init계산 =\(.GetAccount ((exchange);// 먼저 우리는 초기 계정 정보를 기록합니다. 여기서 템플릿 클래스 라이브러리의 출력 함수를 호출합니다. var nowAccount = initAccount;// 다시 변수를 선언 하 고 현재 계정 정보를 표시 var diffMoney = 0; // 돈 차이 var diffStocks = 0;// 동전 차이 var repair = 0; // 연산 당황 때 수정할 수 있는 금액 var ticker = exchange.GetTicker ((); // 현재 시장을 얻는다 Log (("초기 계정:",initAccount); // 출력 초기 계정 정보를 표시합니다。 while ((true) {// 주 함수 루킹 scan ((); // 스캔 함수, 나중에 설명할 것, 주로 판단하기 위해 오픈 포지션, 평형 포지션 및 작업 오픈 포지션, 평형 포지션. ticker = exchange.GetTicker (();// while 루프에서 시장 시장을 얻습니다 if ((!ticker) {// if (null) 으로 도달하지 않으면 다음을 넘어서 다시 반복합니다 계속하세요. ♪ ♪ if ((holdOrder.orderState == ORDER_VALID) {// 현재가 있는지 판단합니다. Log (("현재 보유:",holdOrder); // 만약 현재 보유 출력 보유 정보 ♪ ♪ if ((holdOrder.orderState == ORDER_INVALID) {// 만약 보유되지 않았다면 (예) 평형) 이제Account = \).GetAccount ((exchange); // 현재 계정 정보를 얻는다 diffMoney = nowAccount.Balance - initAccount.Balance; // 현재 계정과 초기 계정 사이의 돈을 계산합니다 diffStocks = nowAccount.Stocks - initAccount.Stocks; // 현재 계정과 초기 계정 사이의 화폐 차이를 계산한다 repair = diffStocks * ticker.Last; // 동전의 차이 * 마지막 거래 가격, 동등한 돈으로 변환, 계산하기 위해 사용된다. LogProfit ((diffMoney + repair, RMB, 현재 계정:,nowAccount, 이번이익:,profit);// 출력 손실 정보 ♪ ♪ Sleep (Interval);// 라운지 ♪ ♪ ♪ ♪


    다음은 전략의 주요 부분, 오픈 플라시드 검사, 오픈 플라시드 작업이다.

    function scan (() { var sellInfo = null; // 선언 평형 정보를 저장하는 변수, 초기화 null var buyInfo = null; // 선언 오픈, 초기화null var opFun = null;// 오픈 포지션 함수, 두 상태, 오픈 멀티 포지션, 오픈 빈 포지션. var singal = 0; // 신호 while ((true) {// 검출 및 동작 var ticker = exchange.GetTicker ((); // 시장 시장을 얻는다 if ((!ticker) { // 판단 함수 실패 다음을 건너가 순환 함수를 계속합니다 계속하세요. ♪ ♪ holdOrder.SetStopPrice ((ticker,state); // 설정 보관 중지 손실 가격 if(state === STATE_FREE && (singal = MACD_Cross())!== 0) { // 정책 실행 상태가 비공식인지 판단, 현재 MACD 지표 신호가 비공식인지 판단, 정책 실행 상태가 비공식인지 판단하고 금포크 또는 정형포크가 실행되는 경우와 일치한다. holdOrder.initHoldOrder (();// 초기화 보관 정보 opFun = singal === 1?\(.Buy: \).Sell ;// MACD_Cross 함수에서 반환된 결과를 통해, 많은 포즈를, 빈 포즈를 판단한다. buyInfo = opFun ((opAmount);//상장 운영 holdOrder.orderState = ORDER_VALID;// 보유 정보를 설정하고, 상태는 보유 holdOrder.price = buyInfo.price; // 보유평가를 설정한다. holdOrder.amount = buyInfo.amount; // 보유량을 설정합니다 holdOrder.time = getTimeByNormal (((new Date (()))) getTime (()));// 보유 시작 시간을 설정 state = singal === 1? STATE_BUY : STATE_SELL; // 정책 상태를 복수화 또는 빈화로 업데이트합니다 var 계정 =\(.GetAccount ((exchange); // 계정 정보를 얻는다 if ((singal === 1) {// 열기 방향과 현재 계정 정보를 출력합니다 로그 (("다양한 거래를 한다。","계정:",account); 다른 사람 로그 (("공개된 채용물들。","계정:",account); ♪ ♪ 브레이크; 다른 사람 var lastPrice = holdOrder.price;// 보유 평균 가격을 lastPrice로 부여합니다 if(state === STATE_BUY && holdOrder.orderState === ORDER_VALID && ticker.Last < holdOrder.stopPrice ) { // 다중 포지션과 포지션 정보가 포지션이고 최종 거래 가격은 중지 손실 가격보다 작으면 다음을 수행합니다. Log (("다중 StopLoss 평점","초기 StopLoss 가격:",holdOrder.price * (1 - stopProfit)," - 슬라이드 중지 가격:",holdOrder.stopPrice," 마지막 거래 가격:",ticker.Last," 중지 손실 레벨:",holdOrder.level);//다중 중단 평점 정보 sellInfo = \).Sell (hold) Order (order) Amount (금) holdOrder.orderState = ORDER_INVALID;// 평상시 정보 객체 업데이트 holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount);// 업데이트 부동 수익 손실 state = STATE_FREE;// 업데이트 상태 break;//뛰어나가는 ♪ ♪ if(state === STATE_SELL && holdOrder.orderState === ORDER_VALID && ticker.Last > holdOrder.stopPrice) {//또한, 이것은 공백 중지 손실 청산입니다. Log (空头停止损失平仓, 초기停止损失价格:,holdOrder.price * (1 + stopProfit),滑动停止损失价格:,holdOrder.stopPrice, 최종 거래 가격:,ticker.Last,停止损失级别:,holdOrder.level);// 테스트 sellInfo = 판매 정보\(.Buy(holdOrder.amount); \(.Buy(holdOrder.amount); \(.Buy(holdOrder.amount); \(.Buy(holdOrder.amount); holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime))); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount)); state = STATE_FREE; 브레이크; ♪ ♪ if(state === STATE_BUY && MACD_Cross() === 2 ) {// 너무 많이 하면 MACD 지표가 마차 - 마차 평형 sellInfo = \)[Sell (hold) Order.amount) ] Log (,holdOrder.price * (1 - stopProfit), ,holdOrder.stopPrice, 마지막 거래 완료 가격:,ticker.Last, ,holdOrder.level);// 테스트 holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime ((()); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount)); state = STATE_FREE; 브레이크; ♪ ♪ if(state === STATE_SELL && MACD_Cross() === 1 ) {// 공백 시, MACD 지표 금포 sellInfo = $.Buy ((holdOrder.amount)); Log (,holdOrder.price * (1 + stopProfit), ,holdOrder.stopPrice, 마지막 거래가 완료된 가격:,ticker.Last, ,holdOrder.level);// 테스트 holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime ((()); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount)); state = STATE_FREE; 브레이크; ♪ ♪ ♪ ♪ sleep (interval);// 상담 간격, 즉 프로그램을 잠시 중단하는 것입니다. ♪ ♪ ♪ ♪


코드는 지쳤고, 물도 마시지 않았습니다.

먼저, 슬라이드 스톱의 원리에 대해 말씀드리겠습니다.

이 코드는 슬라이드 스톱에 관한 것입니다.SetStopPrice이 함수들은stopState그리고 그 다음에는ticker(시장 데이터) Stop Loss 가격을 업데이트합니다.stopState === STATE_BUY다른 상황에 따라 판단하고 정지값을 갱신합니다.orderState무효 상태 (즉, 유효한 포지션이 보유되지 않은 상태) 로 현재의 스톱 손실 가격을 반환한다. 만약 스톱 손실 가격이 0이라면, 그것을 매입 평균 가격으로 곱하여 초기화한다.(1 - stopProfit)◎ 다음으로, 최종 거래 가격에 따라 ◎ticker.Last그리고 보유가격this.price이 값은 현재 스톱손실 등급과 차이가 있습니다.this.level) 는 걸음의 곱셈과 비교된다. 만약 현재 순위를 초과한다면, 스리드 후값으로 정지 손실 가격을 업데이트하고, 동시에 정지 손실 순위를 증가시킨다. 그렇지 않으면 현재 정지 손실 가격을 그대로 유지한다.stopState === STATE_SELL), 논리는 비슷하지만, 마지막 거래 가격과 보유 가격의 차이에 대해 부정적인 값을 취하고, 중지 손실 가격을 업데이트 할 때 그 차이를 니다. 마지막으로, 업데이트 된 중지 손실 가격을 반환합니다.

슬라이드 스톱 손실은 위험 관리 전략입니다.

보유 과정에서 손실을 줄이거나 이익을 보호하기 위해 시장 가격의 변동에 따라 정지 가격을 조정합니다. 코드 논리에 따르면 슬라이드 정지 실현을위한 다음의 핵심 포인트를 볼 수 있습니다.updateCurrentProfit방법: 현재 수익/손실을 업데이트하여 보유 상태 (state) 와 최신 가격 (lastPrice) 에 따라 현재 수익/손실을 계산한다. 보유 상태가 빈 상태 (STATE_SELL) 이면 수익/손실은 최신 가격과 보유 가격의 차이에 의해 보유량으로 곱한다. 다중 상태 (STATE_BUY) 이면 수익/손실이 마이너스이다. SetStopPrice 방법은 중지/손실 가격을 업데이트하여 입력된 매개 변수 StopState (stopState) 와 최신 현상 가격 (ticker.Last) 에 따라 손실/손실 가격을 조정한다. 중지/손실 상태가 빈 상태 (STATE_FREE) 이면 현재 수익/손실 가격을 유지한다. 만약 보유 상태가 빈 상태 (STATE_BUY) 이면 손실/손실이 많으면 보유/손실 가격을 다른 상황에 따라 조정한다.1 - stopProfit이 경우, StopLoss가 1로 설정됩니다. 만약 마지막 거래 가격이 현재 차원보다 더 길다면 StopLoss가 슬라이드 이후의 StopLoss가로 설정되고 StopLoss가 상승합니다. 다른 경우 StopLoss가 변경되지 않습니다. 만약 StopLoss 상태가 STATE_SELL인 경우, 논리가 비슷합니다. initHoldOrder 방법은 평형 이후 보유 정보를 초기화하여 보유 상태, 평균 가격, 수, 운영 시간 StopLoss 가격 및 StopLoss 차원을 초기 상태로 다시 설정합니다.

모든 사람들이 먼저 다시 테스트를 실행 할 수 있습니다. 디지털 통화 거래 도서관 의 템플릿을 참조하는 것을 기억하십시오.

참고 자료


관련 내용

더 많은 내용

미드스키안녕하세요, 저는 www.banbiren.com에서 돈을 옮기는 사람이고, 거래 플랫폼을 옮기는 사람이고, 양적 거래를 배우고 있습니다. 제qq 번호:39866099입니다.

제로"이봐요, 이봐요, 이봐요.

무아정말 힘듭니다.

발명가들의 수량화 - 작은 꿈좋은 ^^, 당신은 바로 신청, MAC QQ는 초대 장소를 찾을 수 없습니다 >_<, 1 그룹 번호: 309368835 현재 몇 개의 위치가 있습니다.

발명가들의 수량화 - 작은 꿈젠장, 젠장

발명가들의 수량화 - 작은 꿈함께 공부하고요.