커뮤니티
수식 부탁드립니다.
2015-05-22 13:47:09
158
글번호 86346
안녕하십니까? 매번 성의있는 답변 감사드립니다.
1.
방금전 아래의 1번 질문에 대해 답을 해주셨는데,
답변해주신 식으로 하니 다시, 16시 장대봉이 나왔을때 그 봉에서는 진입을 안하네요.
1. 기존 질문
아래 식에서 16시 봉 바로 이전 봉이 15시 50분인 경우도 있지만,
다른 종목에서 16시 바로 이전 봉이 14시 라던가 10분전이 아닌 경우도 있습니다.
이럴 때 식이 꼬이게 되는데,
if MarketPosition == 0 and stime == 155000 Then
buy("b",AtStop,round(NextBarOpen*1.01,3));
if MarketPosition == 0 and stime == 155000 Then
sell("s",AtStop,round(NextBarOpen*0.99,3));
위 부분에서 155000 으로 지정하는 부분을 종목마다 일일히 바꿔야 되더군요.
이 부분을 일일히 지정하지 않고 그냥 '16시봉 바로 전의 봉' 으로 바꿀 수 없나요?
input : N(1);
var : loss(0);
if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{
var1 = O;
Loss = 0;
}
if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and
(IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then
loss = loss+1;
if MarketPosition == 0 and stime == 155000 Then
buy("b",AtStop,round(NextBarOpen*1.01,3));
if MarketPosition == 0 and stime == 155000 Then
sell("s",AtStop,round(NextBarOpen*0.99,3));
if loss < N then{
if MarketPosition == 0 and NextBarOpen <= round(var1*1.01,3) Then
buy("b1",AtStop,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen > round(var1*1.01,3) Then
buy("b2",Atlimit,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen >= round(var1*0.99,3) Then
sell("s1",AtStop,round(var1*0.99,3));
if MarketPosition == 0 and NextBarOpen < round(var1*0.99,3) Then
sell("s2",AtLimit,round(var1*0.99,3));
}
if MarketPosition == 1 Then
ExitLong("bx",AtStop,round(EntryPrice*0.99,3));
if MarketPosition == -1 Then
ExitShort("sx",AtStop,round(EntryPrice*1.01,3));
1.답변
시간을 0시 이후에 경과된 분수로 변경후
16시에서 차트주기를 빼서 지정했습니다.
16시가 960이므로
차트가 10분봉이면 950
차트가 5분봉이면 955로 지정이 됩니다.
input : N(1);
var : loss(0);
if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{
var1 = O;
Loss = 0;
}
if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and
(IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then
loss = loss+1;
if MarketPosition == 0 and TimeToMinutes(stime) == TimeToMinutes(160000)+BarInterval Then
buy("b",AtStop,round(NextBarOpen*1.01,3));
if MarketPosition == 0 and TimeToMinutes(stime) == TimeToMinutes(160000)+BarInterval Then
sell("s",AtStop,round(NextBarOpen*0.99,3));
if loss < N then{
if MarketPosition == 0 and NextBarOpen <= round(var1*1.01,3) Then
buy("b1",AtStop,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen > round(var1*1.01,3) Then
buy("b2",Atlimit,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen >= round(var1*0.99,3) Then
sell("s1",AtStop,round(var1*0.99,3));
if MarketPosition == 0 and NextBarOpen < round(var1*0.99,3) Then
sell("s2",AtLimit,round(var1*0.99,3));
}
if MarketPosition == 1 Then
ExitLong("bx",AtStop,round(EntryPrice*0.99,3));
if MarketPosition == -1 Then
ExitShort("sx",AtStop,round(EntryPrice*1.01,3));
2.
아래의 2번 질문에 대해서, 16시 봉의 전봉이 없어서 그렇다고 하셔서,
15시 50분 봉도 나오도록 설정을 했는데,
그래도 여전히 첫봉의 경우는 16시 봉이 장봉이라서
그 안에서 신호가 떠야 될 때는 안뜹니다.
하지만 그 이후에는 잘 작동합니다.
다만, 위 1번 질문의 답변대로 하니 16시 장봉의 경우 신호가 걸리지 않아서,
16시 바로전의 봉의 시간을 정확히 써주면,
예를들어 15시 50 분이아니라 14시 30분이면 143000 으로 정확히 써주면
원하는대로 작동합니다. 하지만 이 때도 역시 첫봉은 안됩니다.
여하튼 첫봉이 문제네요. 전봉 몇개가 보이도록 띄워도 여전히 안됩니다.
2. 기존 질문
그리고 위의 1번 질문에서 짜준식은 "if loss < N then{" 이 부분에서
"loss < N 이라는 조건이
15시 50분에 셋팅되는 식까지 포함을 시켜서 신호가 나오지 않았습니다"
라고 말슴해 주셔서 수정된 식인데,
저렇게 수정하니 원하던 대로 16시 봉이 장대봉이 나와서 16시 봉 안에서
바로 진입신호가 나오면 신호가 잘 잡힙니다.
그런데 이상하게도 제일 첫봉은 그게 안되네요.
무슨 말씀이냐면, 시뮬레이션 화면에서 예를들어 5월 1일 16시 봉부터 나오도록
봉의 건수를 예를들어 1500 봉으로 잡았는데,
그렇게 했을 때, 제일 첫봉이 아까 말씀드린 그런 장대봉이 나오면,
역시 그 장대봉 안에서는 신호가 안잡히네요. 하지만 뒤에서는 정상 작동합니다.
건수로 안잡고 날짜로 잡으면 첫 신호가 엉뚱한 기준에 의해서 잡히기 때문에,
저렇게 딱 건수로 맞춰서 해야만 됩니다.
2. 답변
말씀하신 설정상태이면 첫봉이 16시 봉이므로 15시50분봉이 없어
신호를 낼 방법이 없습니다.
16시봉 미완성시에서 신호를 발생하기 전봉에서 가격을 셋팅을 하게 되는데
전봉이 없으므로 신호를 발생할수가 없습니다.
- 1. 333.png (0.02 MB)
답변 1
예스스탁 예스스탁 답변
2015-05-22 14:48:58
안녕하세요
예스스탁입니다.
모든 수식은 계산에 필요한 최소 봉갯수(MaxBarsBack)라는 것이 있습니다.
시스템식 하단에 아래 로그 추가하시고
MessageLog("%.f",MaxBarsBack);
출력해서 보시면 2라는 값이 리턴됩니다.
차트상 최소 2개봉 이후부터 조건만족해야 신호가 발생합니다.
그러므로 현재 지정한 봉수보다 2개는 더 지정하셔야 합니다.
봉갯수를 지정하시는 방법은 추후에 오류의 여지가 있습니다
특정주기라고 해도 하루의 봉수가 일정한 것은 아닙니다.
거래가 없거나 하면 해당 시간에 봉이 생기지 않으므로
차트 첫봉의 시간이 유동적이게 됩니다.
차트의 봉수는 넉넉히 주시고 차트상 15시50분봉이
처음으로 생길때 부터 신호가 발생하게 하시면 됩니다.
첫번째 16시 이전에는 var1값이 0이므로
b1,b2,s1,s2신호의 조건문에 var1의 값이 0보다 크다라는 조건을 추가했습니다.
input : N(1);
var : loss(0),Start(false);
if stime == 155000 Then
Start = true;
if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{
var1 = O;
Loss = 0;
}
if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and
(IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then
loss = loss+1;
if MarketPosition == 0 and stime == 155000 and Start == true Then
buy("b",AtStop,round(NextBarOpen*1.01,3));
if MarketPosition == 0 and stime == 155000 and Start == true Then
sell("s",AtStop,round(NextBarOpen*0.99,3));
if loss < N and Start == true then{
if MarketPosition == 0 and NextBarOpen <= round(var1*1.01,3) and var1 > 0 Then
buy("b1",AtStop,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen > round(var1*1.01,3) and var1 > 0 Then
buy("b2",Atlimit,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen >= round(var1*0.99,3) and var1 > 0 Then
sell("s1",AtStop,round(var1*0.99,3));
if MarketPosition == 0 and NextBarOpen < round(var1*0.99,3) and var1 > 0 Then
sell("s2",AtLimit,round(var1*0.99,3));
}
if MarketPosition == 1 Then
ExitLong("bx",AtStop,round(EntryPrice*0.99,3));
if MarketPosition == -1 Then
ExitShort("sx",AtStop,round(EntryPrice*1.01,3));
즐거운 하루되세요
> spek 님이 쓴 글입니다.
> 제목 : 수식 부탁드립니다.
>
안녕하십니까? 매번 성의있는 답변 감사드립니다.
1.
방금전 아래의 1번 질문에 대해 답을 해주셨는데,
답변해주신 식으로 하니 다시, 16시 장대봉이 나왔을때 그 봉에서는 진입을 안하네요.
1. 기존 질문
아래 식에서 16시 봉 바로 이전 봉이 15시 50분인 경우도 있지만,
다른 종목에서 16시 바로 이전 봉이 14시 라던가 10분전이 아닌 경우도 있습니다.
이럴 때 식이 꼬이게 되는데,
if MarketPosition == 0 and stime == 155000 Then
buy("b",AtStop,round(NextBarOpen*1.01,3));
if MarketPosition == 0 and stime == 155000 Then
sell("s",AtStop,round(NextBarOpen*0.99,3));
위 부분에서 155000 으로 지정하는 부분을 종목마다 일일히 바꿔야 되더군요.
이 부분을 일일히 지정하지 않고 그냥 '16시봉 바로 전의 봉' 으로 바꿀 수 없나요?
input : N(1);
var : loss(0);
if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{
var1 = O;
Loss = 0;
}
if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and
(IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then
loss = loss+1;
if MarketPosition == 0 and stime == 155000 Then
buy("b",AtStop,round(NextBarOpen*1.01,3));
if MarketPosition == 0 and stime == 155000 Then
sell("s",AtStop,round(NextBarOpen*0.99,3));
if loss < N then{
if MarketPosition == 0 and NextBarOpen <= round(var1*1.01,3) Then
buy("b1",AtStop,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen > round(var1*1.01,3) Then
buy("b2",Atlimit,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen >= round(var1*0.99,3) Then
sell("s1",AtStop,round(var1*0.99,3));
if MarketPosition == 0 and NextBarOpen < round(var1*0.99,3) Then
sell("s2",AtLimit,round(var1*0.99,3));
}
if MarketPosition == 1 Then
ExitLong("bx",AtStop,round(EntryPrice*0.99,3));
if MarketPosition == -1 Then
ExitShort("sx",AtStop,round(EntryPrice*1.01,3));
1.답변
시간을 0시 이후에 경과된 분수로 변경후
16시에서 차트주기를 빼서 지정했습니다.
16시가 960이므로
차트가 10분봉이면 950
차트가 5분봉이면 955로 지정이 됩니다.
input : N(1);
var : loss(0);
if stime == 160000 or (stime > 160000 and stime[1] < 160000) Then{
var1 = O;
Loss = 0;
}
if MarketPosition == 0 and CurrentContracts < CurrentContracts[1] and
(IsExitName("bx",1) == true or IsExitName("sx",1) == true) Then
loss = loss+1;
if MarketPosition == 0 and TimeToMinutes(stime) == TimeToMinutes(160000)+BarInterval Then
buy("b",AtStop,round(NextBarOpen*1.01,3));
if MarketPosition == 0 and TimeToMinutes(stime) == TimeToMinutes(160000)+BarInterval Then
sell("s",AtStop,round(NextBarOpen*0.99,3));
if loss < N then{
if MarketPosition == 0 and NextBarOpen <= round(var1*1.01,3) Then
buy("b1",AtStop,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen > round(var1*1.01,3) Then
buy("b2",Atlimit,round(var1*1.01,3));
if MarketPosition == 0 and NextBarOpen >= round(var1*0.99,3) Then
sell("s1",AtStop,round(var1*0.99,3));
if MarketPosition == 0 and NextBarOpen < round(var1*0.99,3) Then
sell("s2",AtLimit,round(var1*0.99,3));
}
if MarketPosition == 1 Then
ExitLong("bx",AtStop,round(EntryPrice*0.99,3));
if MarketPosition == -1 Then
ExitShort("sx",AtStop,round(EntryPrice*1.01,3));
2.
아래의 2번 질문에 대해서, 16시 봉의 전봉이 없어서 그렇다고 하셔서,
15시 50분 봉도 나오도록 설정을 했는데,
그래도 여전히 첫봉의 경우는 16시 봉이 장봉이라서
그 안에서 신호가 떠야 될 때는 안뜹니다.
하지만 그 이후에는 잘 작동합니다.
다만, 위 1번 질문의 답변대로 하니 16시 장봉의 경우 신호가 걸리지 않아서,
16시 바로전의 봉의 시간을 정확히 써주면,
예를들어 15시 50 분이아니라 14시 30분이면 143000 으로 정확히 써주면
원하는대로 작동합니다. 하지만 이 때도 역시 첫봉은 안됩니다.
여하튼 첫봉이 문제네요. 전봉 몇개가 보이도록 띄워도 여전히 안됩니다.
2. 기존 질문
그리고 위의 1번 질문에서 짜준식은 "if loss < N then{" 이 부분에서
"loss < N 이라는 조건이
15시 50분에 셋팅되는 식까지 포함을 시켜서 신호가 나오지 않았습니다"
라고 말슴해 주셔서 수정된 식인데,
저렇게 수정하니 원하던 대로 16시 봉이 장대봉이 나와서 16시 봉 안에서
바로 진입신호가 나오면 신호가 잘 잡힙니다.
그런데 이상하게도 제일 첫봉은 그게 안되네요.
무슨 말씀이냐면, 시뮬레이션 화면에서 예를들어 5월 1일 16시 봉부터 나오도록
봉의 건수를 예를들어 1500 봉으로 잡았는데,
그렇게 했을 때, 제일 첫봉이 아까 말씀드린 그런 장대봉이 나오면,
역시 그 장대봉 안에서는 신호가 안잡히네요. 하지만 뒤에서는 정상 작동합니다.
건수로 안잡고 날짜로 잡으면 첫 신호가 엉뚱한 기준에 의해서 잡히기 때문에,
저렇게 딱 건수로 맞춰서 해야만 됩니다.
2. 답변
말씀하신 설정상태이면 첫봉이 16시 봉이므로 15시50분봉이 없어
신호를 낼 방법이 없습니다.
16시봉 미완성시에서 신호를 발생하기 전봉에서 가격을 셋팅을 하게 되는데
전봉이 없으므로 신호를 발생할수가 없습니다.
다음글
이전글