예스스탁
예스스탁 답변
2021-03-05 14:42:38
안녕하세요
예스스탁입니다.
AtLimit이나 atstop은 if조건이 만족하면 그 다음봉에서 지정한 값 이상이나 이하의 시세가 발생하면
신호가 발생하는 타입입니다. 구현하시는 내용에서는 onclose로 작성하셔야 합니다.
적용시 피라미딩은 다른진입신호만 허용으로 설정하고 적용하시면 됩니다.
Input : short(12), long(26), signal(9);
Var : MACDV(0) , MACDsig(0) ;
MACDV = MACD(short, long);
MACDsig = ema(MACDV,signal);
if CrossUp(macdv,MACDsig) Then
Buy("b");
if MarketPosition == 1 Then
{
if MaxEntries == 1 and C <= EntryPrice-500 and CrossUp(macdv,MACDsig) Then
buy("bb");
if MaxEntries == 1 and C >= avgEntryPrice+30 and CrossDown(macdv,MACDsig) Then
exitlong("bx1");
if MaxEntries == 2 and C >= avgEntryPrice+10 and CrossDown(macdv,MACDsig) Then
exitlong("bx1");
}
즐거운 하루되세요
> jinjin12 님이 쓴 글입니다.
> 제목 : 수식관련 문의드립니다.
> 시스템 수식관련해서 도움을 받고자 문의를 드립니다.
제가 하고자하는 수식은 해외선물 나스닥 기준으로 단방향 (매수 혹은 매도) 매매만 하는
프로그램을 만들고자 하며 간단하게 규칙을 설명하자면 다음과 같습니다.
규칙1: MACD 골드 크로스가 나면 진입을 해라
규칙2: MACD 데드 크로스가 나면 매도를 하되 진입가격보다 일정수치 이상 높을 경우에만 매도해라 (익절만 하고 손절은 없음 데드크로스 떠도 손절위치면 그냥 물량 보유)
규칙3: 첫 번째 진입한 계약이 익절이 안되고 손절이나고 있는 상태면 첫번째 진입가격의 예를 들어 -500포인트 이하이면서 MACD 골드크로스가 뜨면 추가 매수를 해라
규칙4: 추가매수분에 대해 규칙2와 같이 데드크로스가 뜨면 매도를 하나 익절위치가 아니면 그냥 보유
이런식의 프로그램을 짜고 싶으며 이를 반영하기 위해 제가 짠 수식은 다음과 같습니다.
Input : shortPeriod(12), longPeriod(26), Period(9);
Var : MACDv(0), MACDsig(0),macdosc(0), Value1(0), value2(0), cnt(0) ;
MACDv = MACD(shortPeriod, longPeriod);
MACDsig = ema(MACDv,Period);
macdosc = MACDv-ema(MACDv,Period);
if crossup(MACDv,MACDsig) then {
BuY("첫쨰",AtLimit,c);
Value1=c;
}
if isentryname("첫쨰") and CrossDown(MACDv,MACDsig) then
ExitLong("청산1",AtLimit,EntryPrice+30);
if MarketPosition == 1 and crossup(MACDv,MACDsig) and c < EntryPrice(1)-500 then {
BuY("둘쨰",AtLimit,c);
Value2=c;
}
if isentryname("둘쨰") and CrossDown(MACDv,MACDsig) then
ExitLong("청산2",AtLimit,EntryPrice+10);
현재 시뮬레이션 돌려보면 두번째 진입까지는 진행이되는것 같은데 두번째 진입이
첫번째 청산규칙위치에서 계속 매도가 되는 것 같아 전체적인 수식점검을 해주시면
감사하겠습니다.
jinjin12
2021-03-05 15:30:17
선생님 안녕하세요 친절하게 알려주셔서 감사드립니다. 추가적인 질문이 있어 여쭙고자 합니다.
짜주신 식에 진입명만 바꿔서 다시 돌려보니 진입은 제가 원하는대로 되는것 같은데
청산이 원하는대로 시뮬레이션이 안되는 것 같습니다.
제가 아래 붙이 식에서 저는 진입1은 청산1조건으로 청산되고
진입2는 청산2 조건으로만 청산되었으면 하는데 시뮬레이션을 돌려보면
진입1이 청산2조건으로 손절되면서 청산되는 경우가 생기는 것 같습니다.
원하는 것은 진입1은 청산1조건으로 무조건 익절시에만 청산이 나가고
진입2는 진입1과 별개로 청산 2조건으로 무조건 익절시에만 청산이 나갔으면 합니다.
짜주신 식에 avgEntryprice 쪽이 엃히는 문제 같긴한데.. 체크해주시면 감사하겠습니다.
Input : short(12), long(26), signal(9);
Var : MACDV(0) , MACDsig(0) ;
MACDV = MACD(short, long);
MACDsig = ema(MACDV,signal);
if CrossUp(MACDv,MACDsig) Then
Buy("진입1");
if MarketPosition == 1 Then
{
if MaxEntries == 1 and C <= EntryPrice-300 and CrossUp(MACDv,MACDsig) Then
buy("진입2");
if MaxEntries == 1 and C >= avgEntryPrice+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산1");
if MaxEntries == 2 and C >= avgEntryPrice+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산2");
}
예스스탁
예스스탁 답변
2021-03-05 15:59:53
안녕하세요
예스스탁입니다.
청산함수에 이름을 지정하면 해당진입만 청산이 됩니다.
또한 청산에 각 진입별로 진입가를 사용하도록 변경했습니다.
Input : short(12), long(26), signal(9);
Var : MACDV(0) , MACDsig(0),EP1(0),EP2(0);
MACDV = MACD(short, long);
MACDsig = ema(MACDV,signal);
if CrossUp(MACDv,MACDsig) Then
Buy("진입1");
if MarketPosition == 1 Then
{
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "진입1" Then
EP1 = LatestEntryPrice(0);
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "진입2" Then
EP2 = LatestEntryPrice(0);
if MaxEntries == 1 and C <= EntryPrice-300 and CrossUp(MACDv,MACDsig) Then
buy("진입2");
if MaxEntries == 1 and C >= EP1+30 and CrossDown(MACDv,MACDsig) Then
exitlong("청산1",OnClose,DEF,"진입1");
if MaxEntries == 2 and C >= EP2+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산2",OnClose,DEF,"진입2");
}
즐거운 하루되세요
> jinjin12 님이 쓴 글입니다.
> 제목 : Re : Re : 수식관련 문의드립니다.
> 선생님 안녕하세요 친절하게 알려주셔서 감사드립니다. 추가적인 질문이 있어 여쭙고자 합니다.
짜주신 식에 진입명만 바꿔서 다시 돌려보니 진입은 제가 원하는대로 되는것 같은데
청산이 원하는대로 시뮬레이션이 안되는 것 같습니다.
제가 아래 붙이 식에서 저는 진입1은 청산1조건으로 청산되고
진입2는 청산2 조건으로만 청산되었으면 하는데 시뮬레이션을 돌려보면
진입1이 청산2조건으로 손절되면서 청산되는 경우가 생기는 것 같습니다.
원하는 것은 진입1은 청산1조건으로 무조건 익절시에만 청산이 나가고
진입2는 진입1과 별개로 청산 2조건으로 무조건 익절시에만 청산이 나갔으면 합니다.
짜주신 식에 avgEntryprice 쪽이 엃히는 문제 같긴한데.. 체크해주시면 감사하겠습니다.
Input : short(12), long(26), signal(9);
Var : MACDV(0) , MACDsig(0) ;
MACDV = MACD(short, long);
MACDsig = ema(MACDV,signal);
if CrossUp(MACDv,MACDsig) Then
Buy("진입1");
if MarketPosition == 1 Then
{
if MaxEntries == 1 and C <= EntryPrice-300 and CrossUp(MACDv,MACDsig) Then
buy("진입2");
if MaxEntries == 1 and C >= avgEntryPrice+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산1");
if MaxEntries == 2 and C >= avgEntryPrice+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산2");
}
jinjin12
2021-03-05 16:42:30
고생스러우시게 계속 질문드려 죄송합니다.
현재 화면캡쳐를 첨부하였는데 파일을 보시면
시뮬레이션 시 초기단계에서 거래가 몇번이어지다가 시뮬레이션이 안되고 있습니다.
코딩을 열심히 봤는데 뭐가 문제인지 잘 모르겠네요.. 시간 되실때 답변주심 감사하겠습니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : Re : Re : 수식관련 문의드립니다.
> 안녕하세요
예스스탁입니다.
청산함수에 이름을 지정하면 해당진입만 청산이 됩니다.
또한 청산에 각 진입별로 진입가를 사용하도록 변경했습니다.
Input : short(12), long(26), signal(9);
Var : MACDV(0) , MACDsig(0),EP1(0),EP2(0);
MACDV = MACD(short, long);
MACDsig = ema(MACDV,signal);
if CrossUp(MACDv,MACDsig) Then
Buy("진입1");
if MarketPosition == 1 Then
{
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "진입1" Then
EP1 = LatestEntryPrice(0);
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "진입2" Then
EP2 = LatestEntryPrice(0);
if MaxEntries == 1 and C <= EntryPrice-300 and CrossUp(MACDv,MACDsig) Then
buy("진입2");
if MaxEntries == 1 and C >= EP1+30 and CrossDown(MACDv,MACDsig) Then
exitlong("청산1",OnClose,DEF,"진입1");
if MaxEntries == 2 and C >= EP2+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산2",OnClose,DEF,"진입2");
}
즐거운 하루되세요
> jinjin12 님이 쓴 글입니다.
> 제목 : Re : Re : 수식관련 문의드립니다.
> 선생님 안녕하세요 친절하게 알려주셔서 감사드립니다. 추가적인 질문이 있어 여쭙고자 합니다.
짜주신 식에 진입명만 바꿔서 다시 돌려보니 진입은 제가 원하는대로 되는것 같은데
청산이 원하는대로 시뮬레이션이 안되는 것 같습니다.
제가 아래 붙이 식에서 저는 진입1은 청산1조건으로 청산되고
진입2는 청산2 조건으로만 청산되었으면 하는데 시뮬레이션을 돌려보면
진입1이 청산2조건으로 손절되면서 청산되는 경우가 생기는 것 같습니다.
원하는 것은 진입1은 청산1조건으로 무조건 익절시에만 청산이 나가고
진입2는 진입1과 별개로 청산 2조건으로 무조건 익절시에만 청산이 나갔으면 합니다.
짜주신 식에 avgEntryprice 쪽이 엃히는 문제 같긴한데.. 체크해주시면 감사하겠습니다.
Input : short(12), long(26), signal(9);
Var : MACDV(0) , MACDsig(0) ;
MACDV = MACD(short, long);
MACDsig = ema(MACDV,signal);
if CrossUp(MACDv,MACDsig) Then
Buy("진입1");
if MarketPosition == 1 Then
{
if MaxEntries == 1 and C <= EntryPrice-300 and CrossUp(MACDv,MACDsig) Then
buy("진입2");
if MaxEntries == 1 and C >= avgEntryPrice+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산1");
if MaxEntries == 2 and C >= avgEntryPrice+10 and CrossDown(MACDv,MACDsig) Then
exitlong("청산2");
}