커뮤니티
예스랭귀지 Q&A
답변완료
[공지] 예스랭귀지 AI 어시스턴트, '예스나 AI' 출시 및 무료 체험 안내
안녕하세요, 예스스탁 입니다.복잡한 수식 공부 없이 여러분의 아이디어를 말하면 시스템 트레이딩 언어 예스랭귀지로 작성해주는 서비스예스나 AI(YesNa AI)가 출시되었습니다.지금 예스나 AI를 직접 경험해 보실 수 있도록 20크레딧(질문권 20회)를 무료로 증정해 드리고 있습니다.바로 여러분의 아이디어를 코드로 변환해보세요.--------------------------------------------------🚀 YesNa AI 핵심 기능- 지표식/전략식/종목검색식 생성: 자연어로 요청하면 예스랭귀지 문법에 맞는 코드를 작성합니다.- 종목검색식 변환 지원: K증권의 종목 검색식을 예스랭귀지로 변환 지원합니다.- 컴파일 검증: 작성된 코드가 실행 가능한지 컴파일러를 통해 문법 검증을 거쳐 결과물을 제공합니다.상세한 서비스 개요 및 활용 방법은 [서비스 소개 페이지]에서 확인하실 수 있습니다.▶ 서비스 소개 페이지: 바로가기서비스 사용 유의사항 및 결제 환불정책은 [이용약관]을 참고 부탁드립니다.▶ 서비스 이용약관: 바로가기💬 이용 문의사용 중 문의사항은 [프로그램 사용법 Q&A] 게시판에서 [예스나 AI] 카테고리를 설정 후 문의해 주시면 상세히 안내해 드리겠습니다.--------------------------------------------------앞으로도 AI를 활용한 다양한 트레이딩 기능들을 지속적으로 선보일 예정입니다.많은 관심과 기대 부탁드립니다.
2026-02-27
4510
글번호 230811
답변완료
문의드립니다
1.
var : T(0),TX(0);
var1 = highest(H,20);
if var1 > var1[1] Then
T = 1;
if var1 < var1[1] Then
T = -1;
plot1(var1);
if T == 1 and T[1] != 1 Then{
tx = Text_New(sdate[1],stime[1],var1[1],"상승전환");
Text_SetColor(tx,RED);
Text_SetStyle(tx,2,2);
}
if T == -1 and T[1] != -1 Then{
Text_New(sdate[1],stime[1],var1[1],"하락전환");
Text_SetColor(tx,blue);
Text_SetStyle(tx,2,2);
}
위 상승전환,하락전환 에 매수,매도신호 부탁드립니다
2016-10-18
113
글번호 103054
답변완료
수식 부탁드립니다
안녕하세요
캔들을 이용한 지표를 만들려고 하는데요.
수식이 무언가 부족하여 안되는데 완성되도록 도움 좀 부탁드립니다
--------------------------------------------------------
캔들전체의 길이는 (고가-저가)가 된다.
몸통의 길이는 (종가-시가)가 된다.
뒤의 값을 앞의 값으로 나눠주면 하나의 지수를 구할 수 있다.
이 지수를 가공해 지표를 만들어보자.
편의상 현재 캔들과 앞선 3개 캔들의 평균 길이를 값1 이라고 하고
그중 몸통 길이를 값2 라고 하자.
(현재 캔들이 진행중인 상황에서 단순평균을 구하면 왜곡이 생길 수 있다.
이럴때는 직전 캔들과 직직전 캔들에 가중치을 부여하면 근사값을 구할 수 있다)
그리고 각각의 기간누적을 구한 뒤
다시 앞의 값을 뒤의 값으로 나눠주자.
기간은 10 이 적당하다.
수식은 다음과 같다.
VALUE1 = ((CLOSE - OPEN) + 2 * (CLOSE (1)) – OPEN (1)) + 2*(CLOSE (2)
– OPEN (2)) + (CLOSE (3) – OPEN (3))) / 6
VALUE2 = ((HIGH - LOW) + 2 * (HIGH (1) – LOW (1)) + 2*(HIGH (2)
- LOW (2)) + (HIGH (3) – LOW (3))) / 6
NUM = SUM (VALUE1, N)
DENUM = SUM (VALUE2, N)
RVI = NUM / DENUM
RVISig = (RVI + 2 * RVI (1) + 2 * RVI (2) + RVI (3)) / 6
이 수식들은 거의 모든 HTS에 적용되는 범용함수로 만들어졌기 때문에
바로 따다붙이기를 해서는 제대로 구현되지 않는다.
그러나 위에서 개념을 충분히 설명했으니
초보자를 면한 사람이라면 얼마든지 키움에 맞춰 변환할 수 있다.
-------------------------------------------------------------
완성된 차트가 올라가지 않고 첨부도 안되네요
부탁드립니다
2016-10-18
155
글번호 103047
답변완료
지표문의
1.아래는 수식지님이 만든 당일파동지표 입니다.
에스차트에 보면 차트 뒤집어 보기가 잇는데 그것 말구 지표자체 뒤 집어 보구 싶은데
수정 좀 부탁드립니다.
Input:전환율(0.5),선두께(4),선색(green); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0),
date11(0),date12(0),time11(0),time12(0),TL1(0),
date21(0),date22(0),time21(0),time22(0),TL2(0);
Array:hiVal[2](0),loVal[2](0),hiBar[2](0),loBar[2](0);
upRate = 1 + (전환율/100); //상승률
dnRate = 1 - (전환율/100); //하락률
loBar[1] = loBar[1] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[1] = hiBar[1] + 1; //전고점의 위치
if DayIndex == 0 then {
if trnd == upTr then {
date11 = date[loBar[1]]; //추세선 시작일
time11 = stime[loBar[1]]; //추세선 시작시간
Value11 = loVal[1]; //추세선 시작가격
}
else {
date11 = date[hiBar[1]]; //추세선 시작일
time11 = stime[hiBar[1]]; //추세선 시작시간
Value11 = hiVal[1]; //추세선 시작가격
}
date12 = date[1]; //추세선 종료일
time12 = stime[1]; //추세선 종료시간
Value12 = C[1]; //추세선 종료가격
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12); //TL_New는 신규 추세선을 그려주는 함수
TL_SetSize(TL1,선두께);
TL_SetColor(TL1,선색);
hiVal[1] = O;
hiBar[1] = 0;
loVal[1] = O;
loBar[1] = 0;
hiVal[0] = C;
hiBar[0] = 0;
loVal[0] = C;
loBar[0] = 0;
trnd = 0;
if hiVal[1] * dnRate > C then trnd = dnTr;
else if loVal[1] * upRate < C then trnd = upTr;
}
if hiVal[0] <= C then {
hiVal[0] = C;
hiBar[0] = 0;
}
else {
hiBar[0] = hiBar[0] + 1;
}
if loVal[0] >= C then {
loVal[0] = C;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1;
}
if trnd != dnTr && hiVal[0] * dnRate > C then trnd = dnTr;
else if trnd != upTr && loVal[0] * upRate < C then trnd = upTr;
if trnd[1] != dnTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = C; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = C;
loBar[0] = 0;
//전고점이 새로 생긴 것이니까 전저점에서 전고점까지 추세선을 긋는다.
date11 = date[loBar[1]]; //추세선 시작일. 전저점의 날짜
time11 = stime[loBar[1]]; //추세선 시작시간
Value11 = loVal[1]; //추세선 시작가격
date12 = date[hiBar[1]]; //추세선 종료일. 전고점의 날짜
time12 = stime[hiBar[1]]; //추세선 종료시간
Value12 = hiVal[1]; //추세선 종료가격
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
//TL_New는 신규 추세선을 그려주는 함수
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > C then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = C;
hiBar[0] = 0;
loVal[0] = C;
loBar[0] = 0;
//전고점이 추가된 게 아니고 바뀐 것이므로 종료일,종료시간,종료가격만 바꿔준다.
date12 = date[hiBar[1]]; //추세선 종료일
time12 = stime[hiBar[1]];
Value12 = hiVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
//TL_SetEnd는 기존추세선의 종료지점을 변경해주는 추세선 함수이다.
//TL_Delete 함수를 써서 직전의 추세선을 지우고 다시 TL_New로 추세선을 추가해도 된다.
}
if trnd[1] != upTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = C;
loBar[0] = 0;
hiVal[0] = C;
hiBar[0] = 0;
date11 = date[hiBar[1]];
time11 = stime[hiBar[1]];
Value11 = hiVal[1];
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < C then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = C;
loBar[0] = 0;
hiVal[0] = C;
hiBar[0] = 0;
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
}
TL_SetSize(TL1,선두께);
TL_SetColor(TL1,선색);
if trnd == upTr then {
date21 = date[loBar[1]]; //추세선 시작일
time21 = stime[loBar[1]]; //추세선 시작시간
Value21 = loVal[1]; //추세선 시작가격
}
else {
date21 = date[hiBar[1]]; //추세선 시작일
time21 = stime[hiBar[1]]; //추세선 시작시간
Value21 = hiVal[1]; //추세선 시작가격
}
date22 = date; //추세선 종료일
time22 = stime; //추세선 종료시간
Value22 = C; //추세선 종료가격
TL_Delete(TL2);
TL2 = TL_New(date21,time21,Value21,date22,time22,Value22);
TL_SetSize(TL2,선두께);
TL_SetColor(TL2,선색);
2.그럼 수고 하십시요
2016-10-18
136
글번호 103042
답변완료
부탁드립니다.
5분챠트에서 매시간 마지막 봉 종가가 첫봉 고가보다 높으면 빨간색으로, 첫봉 저가보다 낮으면 파란색으로 칠해 주세요. 감사합니다.
2016-10-18
108
글번호 103041
답변완료
문의드립니다
1.
Input : short(12),long(26),sig(9),시작시간(90000),종료시간(150000),당일수익틱수(10),텍스트표시소숫점자리수(2);
Var : MACDv(0),MACDS(0),MACDO(0),T1(0),tx(0),NP(0),N1(0),Tcond(false),당일수익(0);
var : daypl(0),Xcond(false),Bcond(false),Scond(false);
NP = NetProfit;
MACDv = MACD(short, long);
MACDs = ema(MACDv,sig);
MACDO = MACDV-MACDS;
당일수익 = PriceScale*당일수익틱수;
if MACDV > MACDS Then
T1 = 1;
Else
T1 = -1;
if stime == 시작시간 or (stime > 시작시간 and stime[1] <시작시간) Then{
Tcond = true;
Xcond = false;
N1 = Np;
}
daypl = NP-N1;
if TotalTrades > TotalTrades[1] and IsExitName("bp",1) == true Then{
Xcond = true;
tx = Text_New(sdate,stime,H,"매수청산"+NumToStr(ExitPrice(1),텍스트표시소숫점자리수));
Text_SetStyle(tx,2,2);
Text_SetColor(tx,blue);
}
if TotalTrades > TotalTrades[1] and IsExitName("sp",1) == true Then{
Xcond = true;
tx = Text_New(sdate,stime,H,"매도청산"+NumToStr(ExitPrice(1),텍스트표시소숫점자리수));
Text_SetStyle(tx,2,2);
Text_SetColor(tx,red);
}
if stime == 종료시간 or (stime > 종료시간 and stime[1] < 종료시간) Then{
Tcond = false;
if MarketPosition != 0 then{
tx = Text_New(sdate,stime,H,"당일청산"+NumToStr(ExitPrice(1),텍스트표시소숫점자리수));
Text_SetStyle(tx,2,2);
Text_SetColor(tx,BLACK);
}
}
bcond = T1 == 1;
Scond = T1 == -1;
if Tcond == true and Xcond == false then{
if MarketPosition <= 0 and Bcond == true and Bcond[1] == false Then{
buy("b");
tx = Text_New(sdate,stime,H,"매수진입 :"+NumToStr(C,텍스트표시소숫점자리수));
Text_SetStyle(tx,2,2);
Text_SetColor(tx,RED);
}
if MarketPosition >= 0 and Scond == true and Scond[1] == false Then{
sell("s");
tx = Text_New(sdate,stime,H,"매도진입 :"+NumToStr(C,텍스트표시소숫점자리수));
Text_SetStyle(tx,2,2);
Text_SetColor(tx,blue);
}
if MarketPosition == 1 Then
ExitLong("bp",AtLimit,EntryPrice+당일수익-daypl);
if MarketPosition == -1 Then
ExitShort("sp",AtLimit,EntryPrice-당일수익+daypl);
}
SetStopEndofday(150000);
2.
Input : Period(12),당일수익틱수(50);
var : NP(0),N1(0),dayPl(0),당일수익(0),Xcond(false);
NP = NetProfit;
당일수익 = PriceScale*당일수익틱수;
if bdate != Bdate[1] Then{
N1 = NP;
Xcond = false;
}
dayPl = Np-N1;
value1 = TRIX(Period);
if TotalTrades > TotalTrades[1] and (IsExitName("dbp",1) or IsExitName("sdp",1)) Then
Xcond = false;
# 매수/매도청산
If CrossUP(value1, 0) Then
{
Buy();
}
# 매도/매수청산
If CrossDown(value1, 0) Then
{
Sell();
}
if MarketPosition == 1 Then
ExitLong("bdp",atlimit,EntryPrice+daypl-daypl);
if MarketPosition == -1 Then
ExitShort("sdp",atlimit,EntryPrice-daypl+daypl);
SetStopEndofday(150000);
1번시스템을 2번시스템에 대입을해볼려고 ...손을써봐도
당일수익틱수 가 문제가있는지 신호가 계속 연속적으로 뜹니다
1번시스템을 2번시스템으로 수정좀부탁드리겠습니다..
2016-10-18
126
글번호 103040
답변완료
부탁해요
아래의 지표는 야간장에 적용하고 있는 렌코차트입니다.
00값이 CC보다 작을시 분홍색선으로 나오게 해주시고
00값이 CC보다 클시 검정색선으로 나오게 해주십시요
input:renkoSize(0.5),length(10),NumATRs(1.5);
var:j(0),k(0),renkoCnt(0),gubun(0),Sum(0),trSum(0),atrV(0),time1(0),filename("renko3.txt"),printOK(False);
array:OO[50](0),HH[50](0),LL[50](0),CC[50](0),
TR[50](0), //True Range
upperLine[50](0), //상단채널
lowerLine[50](0), //하단채널
maV[50](0); //이평선
if stime >= 180000 or stime < 090000 then{
If index == 0 or (stime == 180000) or (stime > 180000 and stime[1] < 180000) Then { //break on session에 해당, 즉 일자가 바뀌면 새로 계산
gubun = 0; //방향을 초기화한다. 이후 형성되는 가격에 의해 방향이 계산
For j = 49 DownTo 1 { //금일 시가봉을 신규 추가
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
TR[j] = TR[j-1];
maV[j] = maV[j-1];
upperLine[j] = upperLine[j-1];
lowerLine[j] = lowerLine[j-1];
}
OO[0] = C; //분봉의 종가를 기반으로 계산하기 때문에 당일 시초가 아니다
HH[0] = C;
LL[0] = C;
CC[0] = C;
}
Else {
If gubun == 0 and CC[0] > 0 Then { //일 첫봉이 완성되지 않은 시점
If OO[0] - renkoSize >= C Then {
gubun = -1; //하락 방향
CC[0] = OO[0] - renkoSize; //음봉
HH[0] = OO[0];
LL[0] = CC[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]); //true range 계산식 참조
//macd 계산 당시와 마찬가지로 sum 값이 있을 때만 처리
If sum > 0 Then {
sum = sum + CC[0] - CC[length]; //이평선 계산 원리 그대로, 현재가를 더하고 n봉전 가격 뺌
trSum = trSum + TR[0] - TR[length]; //true range의 합을 계산
maV[0] = Sum / length; //n개의 종가 합을 n으로 나누어 이동평균 계산
atrV = trSum / length; //ATR 계산식 참조
upperLine[0] = maV[0] + atrV * NumATRs; //상단 밴드 계산
lowerLine[0] = maV[0] - atrV * NumATRs; //하단 밴드 계산
}
j = 0;
if printOK then print(filename,"1=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
Else If OO[0] + renkoSize <= C Then {
gubun = 1; //상승 방향
CC[0] = OO[0] + renkoSize; //양봉
HH[0] = CC[0];
LL[0] = OO[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
If sum > 0 Then { //계속 반복되는 공통 루틴이므로 if문 바깥으로 뺄까도 했으나
sum = sum + CC[0] - CC[length]; //더 복잡해지므로 copy & paste로 처리
trSum = trSum + TR[0] - TR[length];
maV[0] = Sum / length;
atrV = trSum / length;
upperLine[0] = maV[0] + atrV * NumATRs;
lowerLine[0] = maV[0] - atrV * NumATRs;
}
j = 0;
if printOK then print(filename,"2=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
If LL[0] - renkoSize >= C Then {
gubun = -1;
renkoCnt = Int(Round((LL[0]-C)/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
TR[j] = TR[j-renkoCnt];
maV[j] = maV[j-renkoCnt];
upperLine[j] = upperLine[j-renkoCnt];
lowerLine[j] = lowerLine[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = LL[j+1];
CC[j] = LL[j+1] - renkoSize;
HH[j] = OO[j];
LL[j] = CC[j];
TR[j] = max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
If sum > 0 Then {
sum = sum + CC[j] - CC[j+length];
trSum = trSum + TR[j] - TR[j+length];
maV[j] = Sum / length;
atrV = trSum / length;
upperLine[j] = maV[j] + atrV * NumATRs;
lowerLine[j] = maV[j] - atrV * NumATRs;
}
if printOK then print(filename,"3=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If HH[0] + renkoSize <= C Then {
gubun = 1;
renkoCnt = Int(Round((C-HH[0])/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
TR[j] = TR[j-renkoCnt];
maV[j] = maV[j-renkoCnt];
upperLine[j] = upperLine[j-renkoCnt];
lowerLine[j] = lowerLine[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = HH[j+1];
CC[j] = HH[j+1] + renkoSize;
HH[j] = CC[j];
LL[j] = OO[j];
TR[j] = max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
If sum > 0 Then {
sum = sum + CC[j] - CC[j+length];
trSum = trSum + TR[j] - TR[j+length];
maV[j] = Sum / length;
atrV = trSum / length;
upperLine[j] = maV[j] + atrV * NumATRs;
lowerLine[j] = maV[j] - atrV * NumATRs;
}
if printOK then print(filename,"4=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If sTime >= 45500 and stime < 090000 Then { //당일 종가봉에서
For j = 49 DownTo 1 {
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
TR[j] = TR[j-1];
maV[j] = maV[j-1];
upperLine[j] = upperLine[j-1];
lowerLine[j] = lowerLine[j-1];
}
If LL[1] > C Then { //종가가 이전 봉보다 아래 형성
OO[0] = LL[1];
CC[0] = C;
HH[0] = OO[0];
LL[0] = CC[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
} Else If HH[1] < C Then { //종가가 이전 봉보다 위에 형성
OO[0] = HH[1];
CC[0] = C;
HH[0] = CC[0];
LL[0] = OO[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
} Else { //종가가 이전 봉의 중간에 형성
OO[0] = C;
CC[0] = C;
HH[0] = C;
LL[0] = C;
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
}
If sum > 0 Then {
sum = sum + CC[0] - CC[length];
trSum = trSum + TR[0] - TR[length];
maV[0] = Sum / length;
atrV = trSum / length;
upperLine[0] = maV[0] + atrV * NumATRs;
lowerLine[0] = maV[0] - atrV * NumATRs;
}
j = 0; //채널 값을 새로이 계산
if printOK then print(filename,"5=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
if sum == 0 and CC[length] > 0 then {
for j = 0 to length - 1 {
sum = sum + CC[j];
trsum = trsum + max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
}
}
}
If OO[0] > 0 Then Plot1(OO[0],"OO"); //지표속성 -> 차트표시 -> 채우기 -> OO < CC 면 빨강 추가
If CC[0] > 0 Then Plot2(CC[0],"CC"); // OO > CC 면 파랑 추가
if upperLine[0] > 100 then plot3(upperLine[0],"UpperBand");
if lowerLine[0] > 100 then plot4(lowerLine[0],"LowerBand");
if maV[0] > 100 then plot5(maV[0],"MidLine");
2016-10-18
137
글번호 103039
답변완료
부탁해요
아래의 지표는 주간장에 적용하고 있는 렌코차트입니다.
현재장이 30분 연장된관계로 연장된 시간의 렌코차트가 이상하게 표현되고 있습니다.
이를 수정하여 주시고
00값이 CC보다 작을시 분홍색선으로 나오게 해주시고
00값이 CC보다 클시 검정색선으로 나오게 해주십시요
input:renkoSize(0.5),
length(10),
NumATRs(1.5);
var:j(0),k(0),renkoCnt(0),gubun(0),Sum(0),trSum(0),atrV(0),time1(0),
filename("renko3.txt"),printOK(False);
array:OO[50](0),HH[50](0),LL[50](0),CC[50](0),
TR[50](0), //True Range
upperLine[50](0), //상단채널
lowerLine[50](0), //하단채널
maV[50](0); //이평선
If DayIndex == 0 Then { //break on session에 해당, 즉 일자가 바뀌면 새로 계산
gubun = 0; //방향을 초기화한다. 이후 형성되는 가격에 의해 방향이 계산
For j = 49 DownTo 1 { //금일 시가봉을 신규 추가
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
TR[j] = TR[j-1];
maV[j] = maV[j-1];
upperLine[j] = upperLine[j-1];
lowerLine[j] = lowerLine[j-1];
}
OO[0] = C; //분봉의 종가를 기반으로 계산하기 때문에 당일 시초가 아니다
HH[0] = C;
LL[0] = C;
CC[0] = C;
}
Else {
If gubun == 0 and CC[0] > 0 Then { //일 첫봉이 완성되지 않은 시점
If OO[0] - renkoSize >= C Then {
gubun = -1; //하락 방향
CC[0] = OO[0] - renkoSize; //음봉
HH[0] = OO[0];
LL[0] = CC[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]); //true range 계산식 참조
//macd 계산 당시와 마찬가지로 sum 값이 있을 때만 처리
If sum > 0 Then {
sum = sum + CC[0] - CC[length]; //이평선 계산 원리 그대로, 현재가를 더하고 n봉전 가격 뺌
trSum = trSum + TR[0] - TR[length]; //true range의 합을 계산
maV[0] = Sum / length; //n개의 종가 합을 n으로 나누어 이동평균 계산
atrV = trSum / length; //ATR 계산식 참조
upperLine[0] = maV[0] + atrV * NumATRs; //상단 밴드 계산
lowerLine[0] = maV[0] - atrV * NumATRs; //하단 밴드 계산
}
j = 0;
if printOK then print(filename,
"1=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
Else If OO[0] + renkoSize <= C Then {
gubun = 1; //상승 방향
CC[0] = OO[0] + renkoSize; //양봉
HH[0] = CC[0];
LL[0] = OO[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
If sum > 0 Then { //계속 반복되는 공통 루틴이므로 if문 바깥으로 뺄까도 했으나
sum = sum + CC[0] - CC[length]; //더 복잡해지므로 copy & paste로 처리
trSum = trSum + TR[0] - TR[length];
maV[0] = Sum / length;
atrV = trSum / length;
upperLine[0] = maV[0] + atrV * NumATRs;
lowerLine[0] = maV[0] - atrV * NumATRs;
}
j = 0;
if printOK then print(filename,
"2=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
If LL[0] - renkoSize >= C Then {
gubun = -1;
renkoCnt = Int(Round((LL[0]-C)/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
TR[j] = TR[j-renkoCnt];
maV[j] = maV[j-renkoCnt];
upperLine[j] = upperLine[j-renkoCnt];
lowerLine[j] = lowerLine[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = LL[j+1];
CC[j] = LL[j+1] - renkoSize;
HH[j] = OO[j];
LL[j] = CC[j];
TR[j] = max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
If sum > 0 Then {
sum = sum + CC[j] - CC[j+length];
trSum = trSum + TR[j] - TR[j+length];
maV[j] = Sum / length;
atrV = trSum / length;
upperLine[j] = maV[j] + atrV * NumATRs;
lowerLine[j] = maV[j] - atrV * NumATRs;
}
if printOK then print(filename,
"3=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If HH[0] + renkoSize <= C Then {
gubun = 1;
renkoCnt = Int(Round((C-HH[0])/renkoSize,9));
if renkoCnt > 49 then renkoCnt = 49;
For j = 49 DownTo renkoCnt {
OO[j] = OO[j-renkoCnt];
HH[j] = HH[j-renkoCnt];
LL[j] = LL[j-renkoCnt];
CC[j] = CC[j-renkoCnt];
TR[j] = TR[j-renkoCnt];
maV[j] = maV[j-renkoCnt];
upperLine[j] = upperLine[j-renkoCnt];
lowerLine[j] = lowerLine[j-renkoCnt];
}
For j = renkoCnt-1 DownTo 0 {
OO[j] = HH[j+1];
CC[j] = HH[j+1] + renkoSize;
HH[j] = CC[j];
LL[j] = OO[j];
TR[j] = max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
If sum > 0 Then {
sum = sum + CC[j] - CC[j+length];
trSum = trSum + TR[j] - TR[j+length];
maV[j] = Sum / length;
atrV = trSum / length;
upperLine[j] = maV[j] + atrV * NumATRs;
lowerLine[j] = maV[j] - atrV * NumATRs;
}
if printOK then print(filename,
"4=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
Else If Time >= 151500 Then { //당일 종가봉에서
For j = 49 DownTo 1 {
OO[j] = OO[j-1];
HH[j] = HH[j-1];
LL[j] = LL[j-1];
CC[j] = CC[j-1];
TR[j] = TR[j-1];
maV[j] = maV[j-1];
upperLine[j] = upperLine[j-1];
lowerLine[j] = lowerLine[j-1];
}
If LL[1] > C Then { //종가가 이전 봉보다 아래 형성
OO[0] = LL[1];
CC[0] = C;
HH[0] = OO[0];
LL[0] = CC[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
} Else If HH[1] < C Then { //종가가 이전 봉보다 위에 형성
OO[0] = HH[1];
CC[0] = C;
HH[0] = CC[0];
LL[0] = OO[0];
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
} Else { //종가가 이전 봉의 중간에 형성
OO[0] = C;
CC[0] = C;
HH[0] = C;
LL[0] = C;
TR[0] = max(CC[1],HH[0]) - min(CC[1],LL[0]);
}
If sum > 0 Then {
sum = sum + CC[0] - CC[length];
trSum = trSum + TR[0] - TR[length];
maV[0] = Sum / length;
atrV = trSum / length;
upperLine[0] = maV[0] + atrV * NumATRs;
lowerLine[0] = maV[0] - atrV * NumATRs;
}
j = 0; //채널 값을 새로이 계산
if printOK then print(filename,
"5=>,%.0f,%.0f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
j,gubun,OO[j],HH[j],LL[j],CC[j]);
}
}
if sum == 0 and CC[length] > 0 then {
for j = 0 to length - 1 {
sum = sum + CC[j];
trsum = trsum + max(CC[j+1],HH[j]) - min(CC[j+1],LL[j]);
}
}
If OO[0] > 0 Then Plot1(OO[0],"OO"); //지표속성 -> 차트표시 -> 채우기 -> OO < CC 면 빨강 추가
If CC[0] > 0 Then Plot2(CC[0],"CC"); // OO > CC 면 파랑 추가
if upperLine[0] > 100 then plot3(upperLine[0],"UpperBand");
if lowerLine[0] > 100 then plot4(lowerLine[0],"LowerBand");
if maV[0] > 100 then plot5(maV[0],"MidLine");
2016-10-18
130
글번호 103038
답변완료
4등분선
틱차트에서 최근 30봉이내의 고가,저가, 1/4, 2/4, 3/4을 가로선으로 나타내는 수식을 부탁드립니다
2016-10-18
164
글번호 103037
답변완료
수식변경 요청드립니다.
안녕하세요.
다음 수식에 Stochastic Slow (10, 5, 5) 의 StochasticsK 값이 85이상일때 매도하는 조건을 추가해 주셨으면 합니다.
input : 거래시간1(1), 시작시간1(200000), 끝시간1(010000),익절틱수1(36),손절틱수1(15);
input : P1(5),P2(20),N(20),X(10);
var : AA(0),BB(0);
if 거래시간1 == 1 then
condition3 = (stime>=시작시간1 or stime<=끝시간1);
Else if 거래시간1 == 2 then
condition3 = (stime>=시작시간1 and stime<=끝시간1);
Else
condition3 = true;
AA = ma(C,P1);
BB = ma(C,P2);
if MarketPosition == 0 and TotalTrades == TotalTrades[3] and
Condition3 == true and
BB > BB[1] and C > AA and C > O and
highest(BB,N) >= Lowest(BB,N)+PriceScale*X Then
Sell();
SetStopProfittarget(PriceScale*익절틱수1,PointStop);
SetStopLoss(PriceScale*손절틱수1,PointStop);
if stime == 끝시간1 or (stime > 끝시간1 and stime[1] < 끝시간1) Then{
if MarketPosition == 1 Then
ExitLong();
if MarketPosition == -1 Then
ExitShort();
}
2016-10-17
108
글번호 103036