커뮤니티

예스랭귀지 Q&A

글쓰기
답변완료

[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내

안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
프로필 이미지
예스스탁
2026-02-27
6138
글번호 230811
지표

수색대대 님에 의해서 삭제되었습니다.

프로필 이미지
수색대대
2018-06-18
19
글번호 119821
지표
답변완료

수식부탁드립니다---------------

var:opc(0),data2opc(0),data3opc(0),sbpbop(0),sscbop(0),hapsb(0),hapss(0); var:pungsb(0),pungss(0); opc= opend(0); data2opc = data2(openD(0)); data3opc = data3(openD(0)); ////시가 plot1(opc,"선물시가"); plot2(data2opc,"콜시가"); plot3(data3opc,"풋시가"); ////현재가 plot4(c,"선물"); plot5(data2(c),"콜"); plot6(data3(c),"풋"); ////선물매수풋매수 sbpbop=(c*250000)-(opc*250000)+((data3(c))*250000*2)-(data3opc*250000*2); ////선물매도콜매수 sscbop=(opc*250000)-(c*250000)+((data2(c))*250000*2)-(data2opc*250000*2); plot7(sbpbop,"합성매수시가비"); plot8(sscbop,"합성매도시가비"); plotbaseline1(0); //합성매수시가비,합성매도시가비가 장시작시 "0" 에서시작해야하는데 차트가그렇게안되네요 0에서시작하게부탁드립니다 (제가그림붙이기가잘안되서 저렇게됬네요 질문의차트는 처음 아래차트입니다)
프로필 이미지
leekss1
2018-06-18
217
글번호 119804
지표
답변완료

확인 질문

밑의 질문이 너무 길어질거 같아서 여기다 씁니다 어쩌면 먼저 물어봤어야할 것이었나 생각되네요 B = sum(if(C >= O*(1+A/100) or (C(1)*1.02<=H and C>=O) or (C(2)>O(2)*1.01 and C(1)>O(1)*1.01 and C>=O) , V, if(C <= O*(1-A/100) or (C < O and C(1)*1.03 <= H) or (C(1)*0.99>=C and C < O) or (C(1)*0.97>=L and C < O) or (H(1)*0.97 > C and O>C) , -V, 0))); D = valuewhen(1, date == 날짜 and date(1) != 날짜, B(1)); B - D 여기서 B = sum(if(C >= O*(1+A/100) ~~~) B = SUM () 이 뜻이 거래량 차감합을 의미하는데 수식을 예스트레이더에 변형하면 SUM 이 없는 수식인데 어떻게 변형하는것이 맞나요?
프로필 이미지
sdsadsa
2018-06-18
180
글번호 119803
지표
답변완료

지표문의...

1.보조지표 말고 수식으로 만들어서 쓰려고하는 것이 있는데 envelope (30.5) 윗라인 (상한가?) , envelope (30.10) 윗라인 만 지표로 만들 수 있을까요?? 둘이 동시에 나타내고 없을때 같이 없애고 싶어요 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 2. 파일첨부의 사진처럼 선들의 밑에 색깔표시하는 방법은 없을까요? 밑의 지표가 위의 사진들이구요 과거에 질문했던 것인데 타증권사에서는 지표이름 앞에 일목균형표이름을 넣으면 됬는데 여기서는 어떻게 해야되는지 모르겟네요 한마디로 일목균형표 식의 색채우기입니다 input : AA(5),시작날짜(20180302),종료날짜(20180302); var : BB(0),DD(0); BB = BB+ iff(C >= O*(1+AA/100) or (C[1]*1.02<=H and C>=O) or (C[2]>O[2]*1.01 and C[1]>O[1]*1.01 and C>=O) , V, iff(C <= O*(1-AA/100) or (C < O and C[1]*1.03 <= H) or (C[1]*0.99>=C and C < O) or (C[1]*0.97>=L and C < O) or (H[1]*0.97 > C and O>C) , -V, 0)); if date == 시작날짜 and date[1] != 시작날짜 Then DD = BB[1]; ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 3. 위의 식에서 절반값을 나타내는 선도 만들고 싶네요 사진의 하늘색 선을 말하는 것인데 밑의 식 1번이 위의 것인데, 2번이 제가 나타내고 싶은 것입니다 1. B = sum(if(C >= O*(1+A/100) or (C(1)*1.02<=H and C>=O) or (C(2)>O(2)*1.01 and C(1)>O(1)*1.01 and C>=O) , V, if(C <= O*(1-A/100) or (C < O and C(1)*1.03 <= H) or (C(1)*0.99>=C and C < O) or (C(1)*0.97>=L and C < O) or (H(1)*0.97 > C and O>C) , -V, 0))); D = valuewhen(1, date == 날짜 and date(1) != 날짜, B(1)); B - D 2. E = B -D; F = highestsince(1, date == 날짜 and date(1) != 날짜, E); F/2 ---> 이 선을 말하는 것입니다
프로필 이미지
sdsadsa
2018-06-18
264
글번호 119802
지표
답변완료

문의

#1 주식에 시스템을 적용한 상태에서(가령 005930 삼성전자) 종목코드를 다른 것으로 변경하면(가령 000020 동화약품) 삼성전자에 적용되던 것이 그대로 동화약품으로 적용되는 것입니까? #2 이 경우 삼성전자에 매수진입한 잔고가 있는 경우 매수청산은 수동으로 해야 하는 것입니까? #3 Buy("신호명", atlimit, 10000, 10) 으로 설정한 뒤에 1개만 매수체결되고 9개가 매수잔량으로 남은 경우 취소 또는 변경하려면 어떻게 해야 합니까?? #4 IOC 혹은 FOK 주문을 구현할수 있나요?? #5 매수진입하여 잔고가 있는 상태에서 정전이나 인터넷 단선으로 인해 YT를 다시 시작한 경우 매수한 잔고는 손매매로 매수한 것과 같이 취급되나요?? 아니면 시스템 다시 적용하면 YT로 자동매도가 가능한가요?? (매수한 정보가 YT에 남아있는지 여부) (잔고함수 작동하는지 여부)
프로필 이미지
gagamel
2018-06-18
255
글번호 119801
시스템
답변완료

수식 에러, 수정 요청드립니다!!

하기와같이 수식 수정해주셨는데요, buy, sell은 전략에서만 사용 가능하다고 에러발생합니다. 자동 매매는 안해도 되니, 화살표와 화살표 발생시 가격만 뜨게 수정해주세요. ========================================================================== 안녕하세요 예스스탁입니다. 올려드린 수식이 시스템수식으로 조건만족시 매수와 매도신호가 화살표로 발생하는 식입니다. 조건만족시 가격이 출력되세 추가해 드립니다. 1. Input : shortPeriod(20), longPeriod(60); value1 = ma(C, shortPeriod); value2 = ma(C, longPeriod); # 매수/매도청산 If CrossUP(value1, value2) Then { Buy("b"); Text_New(sdate,stime,H+PriceScale*2,NumToStr(c,2)); } # 매도/매수청산 If CrossDown(value1, value2) Then { Sell(); Text_New(sdate,stime,L-PriceScale*2,NumToStr(c,2)); } 2 Input : shortPeriod(20), longPeriod(120); value1 = ma(C, shortPeriod); value2 = ma(C, longPeriod); # 매수/매도청산 If CrossUP(value1, value2) Then { Buy("b"); Text_New(sdate,stime,H+PriceScale*2,NumToStr(c,2)); } # 매도/매수청산 If CrossDown(value1, value2) Then { Sell(); Text_New(sdate,stime,L-PriceScale*2,NumToStr(c,2)); } 즐거운 하루되세요
프로필 이미지
hongka21
2018-06-18
174
글번호 119800
강조
답변완료

문의

아래수식으로 자동최적화로 수치를 찾고싶은데 어떻게 바꿔야하나요 // 작성자 : 수식지왕 Input: 원계정(100000000) , S1HiPeriod(20) , S1LoPeriod(10) , S2HiPeriod(55) , S2LoPeriod(20) , AtrPeriod(20) , S2비율(50) , N배수(2) ; Var: 명목계정(0), 계정배분완료(False), S1Hi(0), S1Lo(0), S2Hi(0), S2Lo(0), j(0), SumTr(0), DayAtr(0), Unit(0), 진입구분(0), 진입횟수(0), N(0), 추가진입가격(0), 단기돌파무시(False), sumV0(0), sumV1(0), maV0(0), maV1(0), DeadCnt(0), 휩소여부(False); Array : 손절가격[5](0), 진입가격[5](0), 계정크기[5](0), 계정체크[5](0); /*=============================================*/ /* 계정관리 */ /*=============================================*/ If 계정배분완료 == False Then //최초 한번만 실행 { 계정체크[0] = 원계정 * 0.9; //10% 손실나면 계정크기[0] = 원계정 * 0.8; //명목계정은 20% 감소 시켜서 운용 For j = 0 To 3 { 계정체크[j+1] = 계정크기[j] * 0.9; 계정크기[j+1] = 계정크기[j] * 0.8; } 계정배분완료 = True; } If NetProfit() >= 0 Then { 명목계정 = 원계정; } Else { For j = 0 To 4 { If 원계정 + NetProfit() < 계정체크[j] Then //10% 손실나면 { 명목계정 = 계정크기[j]; //명목계정은 20% 감소시켜서 운용 } } } /*=============================================*/ /* 변동성 계산 */ /*=============================================*/ // 분봉에서 일봉의 ATR계산, 전일의 ATR이 산출됨 SumTr = 0; For j = 1 To AtrPeriod { SumTr = SumTr + Max(DayHigh(j)-DayLow(j),Abs(DayClose(j+1)-DayHigh(j)),Abs(DayClose(j+1)-DayLow(j))); } DayAtr = SumTr/AtrPeriod; /*=============================================*/ /* 채널 계산 */ /*=============================================*/ // 분봉에서 일봉의 고,저점 계산, 전일의 고,저점임 S1Hi = 0; S1Lo = 0; S2Hi = 0; S2Lo = 0; For j = 1 To S2HiPeriod { If j <= S1LoPeriod && (S1Lo == 0 || S1Lo > DayLow(j)) Then S1Lo = DayLow(j); If j <= S2LoPeriod && (S2Lo == 0 || S2Lo > DayLow(j)) Then S2Lo = DayLow(j); If j <= S1HiPeriod && S1Hi < DayHigh(j) Then S1Hi = DayHigh(j); If S2Hi < DayHigh(j) Then S2Hi = DayHigh(j); } /*=============================================*/ /* 휩소 판단 */ /*=============================================*/ //이평선 데드카운트가 일정 수 이상일 때 휩소로 판단 sumV0 = 0; sumV1 = 0; For j = 0 To S1HiPeriod - 1 { sumV0 = sumV0 + DayClose(j); sumV1 = sumV1 + DayClose(j+1); } maV0 = sumV0 / S1HiPeriod; maV1 = sumV1 / S1HiPeriod; DeadCnt = 0; For j = 0 To S1HiPeriod - 1 { if maV1 <= DayClose(j+1) && maV0 > DayClose(j) then DeadCnt = DeadCnt + 1; } ############## # 진입식 # ############## /*=============================================*/ /* 시스템 1(S1) : 20일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S1Hi) && 단기돌파무시 == False Then { 진입구분 = 1; N = DayAtr; Unit = int((명목계정 * 0.01)/N); //거래단위 계산 추가진입가격 = S1Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; If DeadCnt >= 4 Then //이평 데드크로스 횟수를 4회 이상일 경우 휩소로 봄 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S1매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S1 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 1 Then { If 진입횟수 == 1 && //CurrentEntries()함수를 써도 되나 단계를 체크하기 위해 별도 변수 사용 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S1매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S1매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S1매수4",OnClose,DEF,int(Unit/4)); } } /*=============================================*/ /* 시스템 2(S2) : 55일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S2Hi) Then { 진입구분 = 2; N = DayAtr; Unit = (명목계정 * 0.01)/N; //거래단위 계산 Unit = int(Unit * S2비율 * 0.01); //S2거래비중 조정 추가진입가격 = S2Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; 단기돌파무시 = False; //단기돌파무시가 True로 설정되었다면 초기화 If DeadCnt >= 4 Then 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S2매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S2 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 2 Then { If 진입횟수 == 1 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S2매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S2매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S2매수4",OnClose,DEF,int(Unit/4)); } } ############## # 청산식 # ############## /*=============================================*/ /* S1 단기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 1 Then { If C < S1Lo Then { If OpenPositionProfit() < 0 Then //이익이 발생했다면 다음번 단기돌파시 진입 무시 { 단기돌파무시 = False; } Else { 단기돌파무시 = True; } 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S1추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; //추가 진입을 막기 위해 초기화 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; 단기돌파무시 = False; //손절포인트를 돌파했다면 다음번 단기돌파 때 진입 ExitLong("S1손절4",OnClose,DEF,"S1매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; //4번 다 진입하지 못하고 손절포인트 만날 수 있으므로 진입횟수 = 2; //각 청산식마다 초기화 손절가격[3] = 0; 진입가격[3] = 0; 단기돌파무시 = False; ExitLong("S1손절3",OnClose,DEF,"S1매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; 단기돌파무시 = False; ExitLong("S1손절2",OnClose,DEF,"S1매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; 단기돌파무시 = False; ExitLong("S1손절1",OnClose,DEF,"S1매수1",DEF); } } /*=============================================*/ /* S2 장기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 2 Then { If C < S2Lo Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S2추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; ExitLong("S2손절4",OnClose,DEF,"S2매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; 진입횟수 = 2; 손절가격[3] = 0; 진입가격[3] = 0; ExitLong("S2손절3",OnClose,DEF,"S2매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; ExitLong("S2손절2",OnClose,DEF,"S2매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; ExitLong("S2손절1",OnClose,DEF,"S2매수1",DEF); } } If DayAtr >= 명목계정 * 0.01 * N배수 Then { ExitLong(); }
프로필 이미지
렉쳐
2018-06-17
181
글번호 119799
시스템
답변완료

전일의 고가,저가의 이격도표현

안녕하세요 관리자님 고생이 많으십니다. 1.[(전일의 최고가 - 전일의 시가)+오늘의 시가] 의 값을 차트에 선으로 표현하고 이 선에대한 오늘의 주가의 이격도를 표현하고 싶습니다 2.[오늘의 시가-(전일의 시가 - 전일의 최저가)+오늘의 시가] 의 값을 차트에 선으로 표현하고 이 선에대한 오늘의 주가의 이격도를 표현하고 싶습니다. 결국 차트에 선2개가 표현되고 이격도는 2개가 되겠습니다. 도와주십시요
프로필 이미지
카카
2018-06-17
168
글번호 119798
지표
답변완료

수식수정문의

아랫수식은 매수진입으로 하는데 매도진입 매수청산으로선물에서 사용할 수 있게 수정 부탁드리겠습니다. 터틀입니다. --- // 작성자 : 수식지왕 Input: 원계정(100000000) , S1HiPeriod(20) , S1LoPeriod(10) , S2HiPeriod(55) , S2LoPeriod(20) , AtrPeriod(20) , S2비율(50) , N배수(2) ; Var: 명목계정(0), 계정배분완료(False), S1Hi(0), S1Lo(0), S2Hi(0), S2Lo(0), j(0), SumTr(0), DayAtr(0), Unit(0), 진입구분(0), 진입횟수(0), N(0), 추가진입가격(0), 단기돌파무시(False), sumV0(0), sumV1(0), maV0(0), maV1(0), DeadCnt(0), 휩소여부(False); Array : 손절가격[5](0), 진입가격[5](0), 계정크기[5](0), 계정체크[5](0); /*=============================================*/ /* 계정관리 */ /*=============================================*/ If 계정배분완료 == False Then //최초 한번만 실행 { 계정체크[0] = 원계정 * 0.9; //10% 손실나면 계정크기[0] = 원계정 * 0.8; //명목계정은 20% 감소 시켜서 운용 For j = 0 To 3 { 계정체크[j+1] = 계정크기[j] * 0.9; 계정크기[j+1] = 계정크기[j] * 0.8; } 계정배분완료 = True; } If NetProfit() >= 0 Then { 명목계정 = 원계정; } Else { For j = 0 To 4 { If 원계정 + NetProfit() < 계정체크[j] Then //10% 손실나면 { 명목계정 = 계정크기[j]; //명목계정은 20% 감소시켜서 운용 } } } /*=============================================*/ /* 변동성 계산 */ /*=============================================*/ // 분봉에서 일봉의 ATR계산, 전일의 ATR이 산출됨 SumTr = 0; For j = 1 To AtrPeriod { SumTr = SumTr + Max(DayHigh(j)-DayLow(j),Abs(DayClose(j+1)-DayHigh(j)),Abs(DayClose(j+1)-DayLow(j))); } DayAtr = SumTr/AtrPeriod; /*=============================================*/ /* 채널 계산 */ /*=============================================*/ // 분봉에서 일봉의 고,저점 계산, 전일의 고,저점임 S1Hi = 0; S1Lo = 0; S2Hi = 0; S2Lo = 0; For j = 1 To S2HiPeriod { If j <= S1LoPeriod && (S1Lo == 0 || S1Lo > DayLow(j)) Then S1Lo = DayLow(j); If j <= S2LoPeriod && (S2Lo == 0 || S2Lo > DayLow(j)) Then S2Lo = DayLow(j); If j <= S1HiPeriod && S1Hi < DayHigh(j) Then S1Hi = DayHigh(j); If S2Hi < DayHigh(j) Then S2Hi = DayHigh(j); } /*=============================================*/ /* 휩소 판단 */ /*=============================================*/ //이평선 데드카운트가 일정 수 이상일 때 휩소로 판단 sumV0 = 0; sumV1 = 0; For j = 0 To S1HiPeriod - 1 { sumV0 = sumV0 + DayClose(j); sumV1 = sumV1 + DayClose(j+1); } maV0 = sumV0 / S1HiPeriod; maV1 = sumV1 / S1HiPeriod; DeadCnt = 0; For j = 0 To S1HiPeriod - 1 { if maV1 <= DayClose(j+1) && maV0 > DayClose(j) then DeadCnt = DeadCnt + 1; } ############## # 진입식 # ############## /*=============================================*/ /* 시스템 1(S1) : 20일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S1Hi) && 단기돌파무시 == False Then { 진입구분 = 1; N = DayAtr; Unit = int((명목계정 * 0.01)/N); //거래단위 계산 추가진입가격 = S1Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; If DeadCnt >= 4 Then //이평 데드크로스 횟수를 4회 이상일 경우 휩소로 봄 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S1매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S1 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 1 Then { If 진입횟수 == 1 && //CurrentEntries()함수를 써도 되나 단계를 체크하기 위해 별도 변수 사용 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S1매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S1매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S1매수4",OnClose,DEF,int(Unit/4)); } } /*=============================================*/ /* 시스템 2(S2) : 55일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S2Hi) Then { 진입구분 = 2; N = DayAtr; Unit = (명목계정 * 0.01)/N; //거래단위 계산 Unit = int(Unit * S2비율 * 0.01); //S2거래비중 조정 추가진입가격 = S2Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; 단기돌파무시 = False; //단기돌파무시가 True로 설정되었다면 초기화 If DeadCnt >= 4 Then 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S2매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S2 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 2 Then { If 진입횟수 == 1 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S2매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S2매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S2매수4",OnClose,DEF,int(Unit/4)); } } ############## # 청산식 # ############## /*=============================================*/ /* S1 단기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 1 Then { If C < S1Lo Then { If OpenPositionProfit() < 0 Then //이익이 발생했다면 다음번 단기돌파시 진입 무시 { 단기돌파무시 = False; } Else { 단기돌파무시 = True; } 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S1추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; //추가 진입을 막기 위해 초기화 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; 단기돌파무시 = False; //손절포인트를 돌파했다면 다음번 단기돌파 때 진입 ExitLong("S1손절4",OnClose,DEF,"S1매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; //4번 다 진입하지 못하고 손절포인트 만날 수 있으므로 진입횟수 = 2; //각 청산식마다 초기화 손절가격[3] = 0; 진입가격[3] = 0; 단기돌파무시 = False; ExitLong("S1손절3",OnClose,DEF,"S1매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; 단기돌파무시 = False; ExitLong("S1손절2",OnClose,DEF,"S1매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; 단기돌파무시 = False; ExitLong("S1손절1",OnClose,DEF,"S1매수1",DEF); } } /*=============================================*/ /* S2 장기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 2 Then { If C < S2Lo Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S2추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; ExitLong("S2손절4",OnClose,DEF,"S2매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; 진입횟수 = 2; 손절가격[3] = 0; 진입가격[3] = 0; ExitLong("S2손절3",OnClose,DEF,"S2매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; ExitLong("S2손절2",OnClose,DEF,"S2매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; ExitLong("S2손절1",OnClose,DEF,"S2매수1",DEF); } } If DayAtr >= 명목계정 * 0.01 * N배수 Then { ExitLong(); }
프로필 이미지
렉쳐
2018-06-17
176
글번호 119797
시스템