커뮤니티

문의 드립니다.

프로필 이미지
회원
2013-07-24 11:00:36
234
글번호 65674
답변완료
답변 감사합니다. 지난 번 아래와 같이 질문을 드렸었는데요. 몇가지만 수정 반영을 부탁드리고자 다시 질문 드립니다. 1. 진입(매수인 경우) 차트A 그리고 차트B에서 매수신호가 발생하면 시장가로 선물 2개 매수진입한다. 2. 청산(매수청산인 경우) (1) 진입가 대비 선물 1.5pt 평가이익이 발생하면 선물 1개만 바로 청산한다 (2) 챠트A 또는 챠트B에서 매수청산신호(익절) 또는 매도신호가 발생하면 시장가로 현재 보유하고 있는 선물 수량을 전부 청산한다. 감사합니다. ====================================================================== 안녕하세요 예스스탁입니다. 스크립트 객체화면에서 차트객체 2개, 종목객체1개, 계좌객체 1개를 설정하시고 사용하셔야 합니다 차트객체1 --> 객체명 Chart1 --> 속성에서 아이디 연결 차트객체2 --> 객체명 Chart2 --> 속성에서 아이디 연결 종목객체 --> 객체명 MarketData1 --> 속석에서 선물로 지정 계좌객체 --> 객체명 Account1 --> 속송에서 선옵게좌 선택 스팟 수식은 기본틀만 작성해 드립니다. 아래식 참고하셔서 수정 보완해 사용하시기 바랍니다. 각 차트별로 신호의 종류를 저장하는 변수가 S1, S2입니다. 2개다 1을 기록하면 선물 매수주문 하고 MP는 1 2개다 3을 기록하면 선물 매도주문 하고 MP는 -1 MP가 1인 상태에서 차트1이나 차트2에서 매수청산신호나 매도신호 발생하면 잔고상 선물 매수포지션 있는지 확인하고 선물 매도주문,MP는 0 MP가 -1인 상태에서 차트1이나 차트2에서 매도청산신호나 매수신호 발생하면 잔고상 선물 매도포지션 있는지 확인하고 선물 매수주문, MP는 0 var S1; var S2; var MP; function Main_OnStart() { S1 = 0; S2 = 0; MP = 0; } function Chart1_OnRiseSignal(Signal) { S1 = Signal.signalKind; if (S1 == 1 && S2 == 1) { Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(1), 0); MP = 1; } if (S1 == 3 && S2 == 3) { Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(1), 0); MP = -1; } if (MP == 1 &&(S1 == 2 || S1 == 3)) { MP = 0; Account1.SetBalanceItem(MarketData1.code, 0); if (Account1.Balance.position == 2) { Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(1), 0); } } if (MP == -1 && (S1 == 4 || S1 == 1)) { MP = 0; Account1.SetBalanceItem(MarketData1.code, 0); if (Account1.Balance.position == 1) { Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(1), 0); } } } function Chart2_OnRiseSignal(Signal) { S2 = Signal.signalKind; if (S2 == 1 && S1 == 1) { Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(1), 0); MP = 1; } if (S2 == 3 && S1 == 3) { Account1.OrderSell(MarketData1.code, 1, MarketData1.Ask(1), 0); MP = -1; } if (MP == 1 && (S2 == 2 || S2 == 3)) { MP = 0; Account1.SetBalanceItem(MarketData1.code, 0); if (Account1.Balance.position == 2) { Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(1), 0); } } if (MP == -1 && (S2 == 4 || S2 == 1)) { MP = 0; Account1.SetBalanceItem(MarketData1.code, 0); if (Account1.Balance.position == 1) { Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(1), 0); } } } 즐거운 하루되세요 > 극동해 님이 쓴 글입니다. > 제목 : 문의드립니다. > 예스스팟에서 다음과 같은 전략을 구현하려고 하는데요. 1. 진입(매수인 경우) 차트A 그리고 차트B에서 매수신호가 발생하면 선물 매도1호가 1개 매수진입한다. (챠트마다 매수신호가 발생하는 시기가 다르므로 한 챠트에서 매수신호가 발생하는 시 점에 다른 챠트의 신호상태를 체크해서 동일 방향이면 매수진입하는 방법) 2. 청산(매수청산인 경우) 챠트A 또는 챠트B에서 매수청산신호(익절) 또는 매도신호가 발생하면 선물 매수1호가 1개 청산한다. 매도는 이와 반대로 되면 될 것 같은데요. 수식 좀 부탁드립니다. 감사합니다.
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2013-07-24 13:36:24

안녕하세요 예스스탁입니다. 1. 스크립트 객체설정은 이전과 같습니다. 예스스팟은 실제 주문관련 내용이 많거 시뮬레이션이 되는 부분이 아니므로 저희쪽에서 수식을 완전하게 검증해 드리기는 어렵습니다. 주석을 같이 첨부해 드립니다. 참고하셔서 수정 보완해 사용하시기 바랍니다 2. 식상에 게시판 금칙어가 있어 영문 업데이터가 U*pdate와 같이 *가 추가되어 있습니다. 114번,117번줄에 *삭제하시고 사용하셔야 합니다. 3. 예스스팟은 예스스팟 Q&A로 글을 올려주시기 바랍니다. 이후에는 해당 게시판으로 자동으로 이동됩니다. 4 스팟수식 var S1; var S2; var MP; function Main_OnStart() { S1 = 0; S2 = 0; MP = 0; } //차트A에서 신호발생 function Chart1_OnRiseSignal(Signal) { S1 = Signal.signalKind; //차트B에서 매수신호 발생했고 차트A에서 매수신호 발생하면 if (S1 == 1 && S2 == 1) { //시장가로 2계약 매수주문 Account1.OrderBuy(MarketData1.code, 2, 0, 1); //MP는 1 MP = 1; } //차트B에서 매도신호 발생했고 차트A에서 매도신호 발생하면 if (S1 == 3 && S2 == 3) { //시장가로 2계약 매도주문 Account1.OrderSell(MarketData1.code, 2, 0, 1); //MP는 -1 MP = -1; } //MP가 1인 상태에서 차트A에서 매수청산신호나 매도신호 나오면 if (MP == 1 && (S1 == 2 || S1 == 3)) { //MP는 0 MP = 0; //계좌잔고 셋팅 Account1.SetBalanceItem(MarketData1.code, 0); //전고가 매수포지션이면 if (Account1.Balance.position == 2) { //매도주문 - 잔고수량과 2중에 작은 수량으로 시장가 청산 Account1.OrderSell(MarketData1.code, Math.max(Account1.Balance.count,2), 0, 1); } } //MP가 -1인 상태에서 차트A에서 매도청산신호나 매수신호 나오면 if (MP == -1 && (S2 == 4 || S2 == 1)) { //MP는 0 MP = 0; //계좌 잔고 셋팅 Account1.SetBalanceItem(MarketData1.code, 0); //잔고가 매도 포지션이면 if (Account1.Balance.position == 1) { //매수주문 - 잔고수량과 2중에 작은 수량으로 시장가 청산 Account1.OrderBuy(MarketData1.code, Math.min(Account1.Balance.count,2), 0, 1); } } } //차트B에서 신호발생 function Chart2_OnRiseSignal(Signal) { S2 = Signal.signalKind; //차트A에서 매수신호 발생했고 차트B에서 매수신호 발생하면 if (S2 == 1 && S1 == 1) { //시장가로 2계약 매수주문 Account1.OrderBuy(MarketData1.code, 2, 0, 1); //MP는 1 MP = 1; } //차트A에서 매도신호 발생했고 차트B에서 매도신호 발생하면 if (S2 == 3 && S1 == 3) { //시장가로 2계약 매도주문 Account1.OrderSell(MarketData1.code, 2, 0, 1); //MP는 -1 MP = -1; } //MP가 1인 상태에서 차트B에서 매수청산신호나 매도신호 나오면 if (MP == 1 && (S2 == 2 || S2 == 3)) { //MP는 0 MP = 0; //계좌잔고 셋팅 Account1.SetBalanceItem(MarketData1.code, 0); //전고가 매수포지션이면 if (Account1.Balance.position == 2) { //매도주문 - 잔고수량과 2중에 작은 수량으로 시장가 청산 Account1.OrderSell(MarketData1.code, Math.max(Account1.Balance.count,2), 0, 1); } } //MP가 -1인 상태에서 차트B에서 매도청산신호나 매수신호 나오면 if (MP == -1 && (S2 == 4 || S2 == 1)) { //MP는 0 MP = 0; //계좌 잔고 셋팅 Account1.SetBalanceItem(MarketData1.code, 0); //잔고가 매도 포지션이면 if (Account1.Balance.position == 1) { //매수주문 - 잔고수량과 2중에 작은 수량으로 시장가 청산 Account1.OrderBuy(MarketData1.code, Math.min(Account1.Balance.count,2), 0, 1); } } } //계좌 잔고에 변경 발생 function Main_OnU*pdateAccount(sAccntNum, sItemCode, lU*pdateID)//*제거 { //Account1 계좌에 MarketData1 종목이 추가되면 if (sAccntNum == Account1.number && sItemCode == MarketData1.code && lU*pdateID == 30001))//*제거 { //1번 타이머 셋팅 (1초간격으로 타이머 동작) Main.SetTimer(1, 1000); } } function Main_OnTimer(nEventID) { //계좌 잔고 셋팅 Account1.SetBalanceItem(MarketData1.code, 0); //계좌잔고가 매도포지션이면 if (Account1.Balance.position == 1) { //현재가가 평균단고대비 1.5포인트 작으면 if (Account1.Balance.current <= Account1.Balance.assessedAmount -1.5) { //1계약 시장가 매수주문 Account1.OrderBuy(MarketData1.code,1, 0, 1); } } //계좌잔고가 매수포지션이면 if (Account1.Balance.position == 1) { //현재가가 평균단가대비 1.5포인트 크면 if (Account1.Balance.current >= Account1.Balance.assessedAmount +1.5) { //1계약 시장가 매도주문 Account1.OrderSell(MarketData1.code,1, 0, 1); } } } 즐거운 하루되세요