답변완료
지표문의
1.아래는 수식지님이 만든 rsi band 라는 지표에 쓰는 사용자 함수입니다
이걸 사용자함수없이 합쳐 지표식 하나로 만 으로 표현되개 좀 해주세요.
Inputs: Length(NumericSimple),TargetUpLevel(NumericSimple),TargetDnLevel(NumericSimple),
NxtYn(NumericSimple), // 다음 봉의 값을 구하려면 1을 아니면 0을 넣어준다.
oUpBand(NumericRef), // 주소전달방식임을 선언
oDnBand(NumericRef), // 값을 입력받는게 아니라 여기에 결과값을 채워서 반환한다.
oMidLine(NumericRef); // 변수명 앞에 소문자를 o를 붙인 것은 output 변수입을 나타냅니다.
Variables: Counter(0), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0),MidLevel(0);
If CurrentBar == 1 AND Length > 0 Then Begin
UpSum = 0;
DownSum = 0;
For Counter = 0 To Length - 1 Begin
UpAmt = C[Counter] - C[Counter+1];
If UpAmt >= 0 Then
DownAmt = 0;
Else Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
End;
UpAvg = UpSum / Length;
DownAvg = DownSum / Length;
End
Else
If CurrentBar > 1 AND Length > 0 Then Begin
UpAmt = C[0] - C[1];
If UpAmt >= 0 Then
DownAmt = 0;
Else Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpAvg = (UpAvg[1] * (Length - 1) + UpAmt) / Length;
DownAvg = (DownAvg[1] * (Length - 1) + DownAmt) / Length;
End;
If UpAvg + DownAvg <> 0 Then
Value1 = 100 * UpAvg / (UpAvg + DownAvg);
Else
Value1 = 0;
If nxtYn == 1 Then // 다음 봉 여부가 1일 경우
{
If Value1 > TargetUpLevel Then // 상단밴드
oUpBand = (((TargetUpLevel - 100) / TargetUpLevel * UpAvg) + DownAvg) * (Length - 1) + C;
Else
oUpBand = ((TargetUpLevel / (100 - TargetUpLevel) * DownAvg) - UpAvg) * (Length - 1) + C;
If Value1 > TargetDnLevel Then // 하단밴드
oDnBand = (((TargetDnLevel - 100) / TargetDnLevel * UpAvg) + DownAvg) * (Length - 1) + C;
Else
oDnBand = ((TargetDnLevel / (100 - TargetDnLevel) * DownAvg) - UpAvg) * (Length - 1) + C;
MidLevel = (TargetUpLevel + TargetDnLevel) / 2; // 중간라인
If Value1 > MidLevel Then
oMidLine = (((MidLevel - 100) / MidLevel * UpAvg) + DownAvg) * (Length - 1) + C;
Else
oMidline = ((MidLevel / (100 - MidLevel) * DownAvg) - UpAvg) * (Length - 1) + C;
}
Else // 다음 봉 여부가 0인 경우
{
If Value1[1] > TargetUpLevel Then
oUpBand = (((TargetUpLevel - 100) / TargetUpLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + C[1];
Else
oUpBand = ((TargetUpLevel / (100 - TargetUpLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + C[1];
If Value1[1] > TargetDnLevel Then
oDnBand = (((TargetDnLevel - 100) / TargetDnLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + C[1];
Else
oDnBand = ((TargetDnLevel / (100 - TargetDnLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + C[1];
MidLevel = (TargetUpLevel + TargetDnLevel) / 2;
If Value1[1] > MidLevel Then
oMidLine = (((MidLevel - 100) / MidLevel * UpAvg[1]) + DownAvg[1]) * (Length - 1) + C[1];
Else
oMidline = ((MidLevel / (100 - MidLevel) * DownAvg[1]) - UpAvg[1]) * (Length - 1) + C[1];
}
RSI_BAND = 1; //사용자함수는 반환값이 있어야 한다고 했습니다.
// oUpBand, oDnBand, oMidLine 는 메모리 주소이지 반환값이 아닙니다.
// 그래서 마지막에 아무 값이나 넘겨 줘야 하기 때문에 그냥 1을 넣어 줬습니다.
이것 저것 마구 집어 넣었더니 좀 길어졌네요.
사용자 함수를 이용한 지표식입니다.
Input:Length(14),UpLevel(70),DnLevel(30);
Var:Upband(0),DnBand(0),MidLine(0);
RSI_BAND(Length,UpLevel,DnLevel,0,UpBand,DnBand,MidLine); // 현재 봉에서의 밴드 값
Plot1(UpBand);
Plot2(MidLine);
Plot3(DnBand);
2.그럼 수고하세요
2020-10-01
967
글번호 142800
지표
답변완료
시스템작성을 해서 시뮬에적용을 했는데 이상하게 나와요.
뭐가 잘못되었는지 모르겠어요.
7일간 최고값을 넘어갔는데도 청산이 안되고, 금욜만 청산되거나 스탑 둘 중 하나만 되네요.
로직에 어디가 문제인지 모르겠어요.
제가 의도하는 조건은 이렇습니다.
1. 일주일에 한번만 거래하며, 청산신호가 안나오면 금요일 무조건 청산(금욜 오바 없음)
2. 전주 주봉의 종가를 돌파하면 매수
3. 7일간의 최고값의 90% 근접하면 청산
var : BandHigh(0), cnt(0);
cnt = 0;
BandHigh = max(DayHigh(1),DayHigh(2),DayHigh(3),DayHigh(4),DayHigh(5),DayHigh(6),DayHigh(7));
BandHigh = BandHigh*0.9;
if marketposition==0 then
{
if cnt == 0 then
{
if CrossUp(C, WeekClose(1)) Then
buy("Wbuy1",AtStop,Weekclose(1)+1);
cnt = 1;
}
}
if marketposition==1 then
{
setstoploss(1,PercentStop);
if cnt > 1 then
{
if Highest(H,BarsSinceEntry+1) > BandHigh or Crossup(Highest(H,BarsSinceEntry+1),BandHigh) Then
ExitLong("out",AtStop,BandHigh+PriceScale*1);
}
if dayofweek(bdate) == 5 then
{
cnt = 0;
SetStopEndofday(151500);
}
else
{
SetStopEndofday(0);
}
}
2020-09-29
748
글번호 142793
시스템