커뮤니티

수식관련 문의드립니다.

프로필 이미지
jinjin12
2021-03-05 10:58:20
781
글번호 146806
답변완료
시스템 수식관련해서 도움을 받고자 문의를 드립니다. 제가 하고자하는 수식은 해외선물 나스닥 기준으로 단방향 (매수 혹은 매도) 매매만 하는 프로그램을 만들고자 하며 간단하게 규칙을 설명하자면 다음과 같습니다. 규칙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); 현재 시뮬레이션 돌려보면 두번째 진입까지는 진행이되는것 같은데 두번째 진입이 첫번째 청산규칙위치에서 계속 매도가 되는 것 같아 전체적인 수식점검을 해주시면 감사하겠습니다.
시스템
답변 4
프로필 이미지

예스스탁 예스스탁 답변

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"); }