커뮤니티

확인및 수식 부탁드립니다.

프로필 이미지
워싱턴
2019-05-29 19:36:09
3471
글번호 224879
답변완료
안녕하세요 예스스팟을 이용하여 아래의 예스랭귀지 수식을 사용하고자 합니다. * 아래의 기본적인 시스템수식을 예스스팟을 이용하여 실행하기 위해 아래부분을 추가한 스팟 수식을 부탁드립니다. (1) 거래는 1계약을 기준으로 실행한다. (2) 스팟 최초 실행후 미체결 상태가 있는경우, 미체결을 취소한다. (3) 스팟실행후 매수포지션(잔고)이 있는 상태에서, (+15틱 이상 수익상태인 경우 즉시 청산하고 아닌경우는) 신호 가 매수 청산 신호가 발생하면 청산하고, 매수신호 또는 매도청산 신호인 경우 실행하지 않으며, 매도 신호인 경우 진입된 매수포지션을 청산하고, 새로 매도 1계약 진입한다. (4) 3번에서 매도포지션 보유 경우도 같은 방식으로 처리한다. (5) 진입신호시, 같은 포지션이 존재하는 경우, 추가 진입하지 않는다.(1계약) (6) 신호발생후 미체결인 있는 경우, 30초후 1호가(유리호가) 정정주문하고, 2분후에도 미체결 상태이면 취소처리하고, 미체결에 대한 청산 또는 익절/손절 부분도 처리되지 않도록 설정한다. (7) 진입후 익절(20틱)/손절(20틱) 청산 한다. (8) 거래 시간을 18:00 ~ 23:00 까지로 제한 (9) 진입한 상태에서 손실 또는 수익이 증거금의 10% 이상 발생하는 경우 전량 청산 하고 당일 거래를 종료하도록 설정 항상 많은 도움에 감사드립니다. // -------------------------------------------------------- // 시스템 수식 : GC-2060 // -------------------------------------------------------- Input : shortPeriod(5), midPeriod(20), longPeriod(60); value1 = ma(C, shortPeriod); value2 = ma(C, midPeriod); value3 = ma(C, longPeriod); # 매수 If CrossUP(value1, value2) Then { Buy(); } # 매수청산 If CrossUP(value2, value3) Then { ExitLong(); } # 매도 If CrossDown(value1, value2) Then { Sell(); } # 매도청산 If CrossUP(value2, value3) Then { ExitShort(); } // -------------------------------------------------------- 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-06-04 17:52:55

안녕하세요 예스스탁입니다. 아래 가이드수식과 주석내용 참고하셔서 수정보완해 사용하시기 바랍니다. 스팟은 차트의 신호가 발생하면 감지해서 주문만 집행하면 되므로 (7),(8)은 시스템수식에 추가해 드립니다. 1 스팟 스크립트 객체설정 계좌객체 추가 --> 속성에서 객체명 Account1, 주문계좌지정 차트객체 추가 --> 속성에서 객체명 Chart1, 차트아이디 지정해 차트와 연결 종목객체 추가 --> 속성에서 객체명 Marketdata1, 차트와 같은 종목으로 지정 var vol = 1;//주문수량 var OC,trade; var BEID,BXID,SEID,SXID; var BENUM,BXNUM,SENUM,SXNUM; //스팟시작 function Main_OnStart() { //종목코드(주문코드) OC = Main.GetOrderCode(MarketData1.code); //미체결 갯수 var num = Account1.GetTheNumberOfUnfills(); //미체결이 1개 이상이면 if (num >= 1) { //MarketData1과 같은 종목의 미체결이면 모두 취소 for (var i = 0; i < num; i++ ) { Account1.SetUnfillIndex(i); if (Account1.Unfill.code == OC && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } } //잔고셋팅 Account1.SetBalanceItem(OC,0); //잔고가 있고 if (Account1.Balance.count > 0) { //매수포지션이고 현재가가 평단가보다 15틱 위이면 전량 청산 if (Account1.Balance.position == 2 && MarketData1.current >= Account1.Balance.avgUnitCost + MarketData1.GetTickSize(dPrice)*15) { Account1.OrderSell(OC,Account1.Balance.count,0,1); } //매도포지션이고 현재가가 평단가보다 15틱 아래이면 전량 청산 if (Account1.Balance.position == 1 && MarketData1.current <= Account1.Balance.avgUnitCost - MarketData1.GetTickSize(dPrice)*15) { Account1.OrderBuy(OC,Account1.Balance.count,0,1); } } //999번 타이머 셋팅(5초), 증거금 및 당일 청산손익 체크용도 Main.SetTimer(999, 5000); trade = true; } //차트에서 신호발생 function Chart1_OnRiseSignal(Signal) { Account1.SetBalanceItem(OC,0); var pst = 0; if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { pst = -1; } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { pst = 1; } //매수진입신호 발생 if (pst == 0 && Signal.signalKind == 1 && trade == true) { BEID = Account1.OrderBuy(OC,vol,MarketData1.current, 2); Main.SetTimer(1, 30000);//1번 타이머 셋팅 30초 T1 = 0; //T1은 0, 1번타이머 동작횟수 체크용 } //매수포지션 청산신호 발생 if (pst == 1 && Signal.signalKind == 2 && trade == true) { //진입주문 미체결셋팅 Account1.SetUnfill(BENUM); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BENUM); } //잔고 보유 수량만큼만 청산 if (Account1.Balance.count > 0) { BXID = Account1.OrderSell(OC,Account1.Balance.count,MarketData1.Bid(3), 2); } pst = 0; } //매도진입신호발생 if (pst == 0 && Signal.signalKind == 3 && trade == true) { SEID = Account1.OrderSell(OC,vol,MarketData1.current, 2); Main.SetTimer(3, 30000);//3번 타이머 셋팅 30초 T3 = 0; //T3은 0, 3번타이머 동작횟수 체크용 } //매도포지션 청산신호 발생 if (pst == -1 && Signal.signalKind == 4 && trade == true) { Account1.SetUnfill(SENUM); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SENUM); } //잔고 보유 수량만큼만 청산 if (Account1.Balance.count > 0) { SXID = Account1.OrderSell(OC,vol,MarketData1.Ask(3), 2); } pst = 0; } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BEID) { BENUM = OrderResponse.orderNum; } if (OrderResponse.orderID == BXID) { BXNUM = OrderResponse.orderNum; } if (OrderResponse.orderID == SEID) { SENUM = OrderResponse.orderNum; } if (OrderResponse.orderID == SXID) { SXNUM = OrderResponse.orderNum; } } function Main_OnTimer(nEventID) { if (nEventID == 1) { T1 = T1+1; //첫번째 타이머동작(30초후) if (T1 == 1) { //매수진입주문번호로 미체결 셋팅 Account1.SetUnfillOrderNumber(BENUM); //미체결이 있으면 매수1호가로 정정 if (Account1.Unfill.count > 0) { var RP = MarketData1.Bid(1); //기존주문가격과 정정가격이 동일가격이면 에러가 발생하므로 //기존주문가격과 매수1호가가 다른가격이면 정정 if (Account1.Unfill.price != RP) { BEID = Account1.OrderReplacePrice(BENUM, RP); } } } //네번째 타이머동작(120초후) if (T1 == 1) { //매수진입주문번호로 미체결 셋팅 Account1.SetUnfillOrderNumber(BENUM); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(BENUM) } } } //3번 타이머 동작 if (nEventID == 3) { T3 = T3+1; //첫번째 동작(30초후) if (T1 == 1) { //매도진입주문번호로 미체결 셋팅 Account1.SetUnfillOrderNumber(SENUM); //미체결이 있으면 매도1호가로 정정 if (Account1.Unfill.count > 0) { var RP = MarketData1.Ask(1); //기존주문가격과 정정가격이 동일가격이면 에러가 발생하므로 //기존주문가격과 매도1호가가 다른가격이면 정정 if (Account1.Unfill.price != RP) { SEID = Account1.OrderReplacePrice(SENUM, RP); } } } //네번째 동작(120초후) if (T1 == 1) { //매도진입주문번호로 미체결 셋팅 Account1.SetUnfillOrderNumber(SENUM); //미체결이 있으면 취소 if (Account1.Unfill.count > 0) { Account1.OrderCancel(SENUM) } } } ///999번 타이머 동작 if (nEventID == 999) { //당일선물청산손익이 위탁증거금의 10% 이상 수익이나 손실이면 if (Account1.GetBalanceETCinfo(2) >= Account1.GetBalanceETCinfo(11)*0.10 || Account1.GetBalanceETCinfo(2) <= -Account1.GetBalanceETCinfo(11)*0.10) { //trade변수는 false trade = false; //잔고 셋팅 Account1.SetBalanceItem(OC,0); //매도포지션 잔고가 있으면 전량청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(OC, Account1.Balance.count, 0,1); } //매수포지션 잔고가 있으면 전량청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(OC, Account1.Balance.count, 0,1); } } } } 2 시스템식 input : 시작시간(180000),종료시간(230000),익절틱수(20),손절틱수(20); Input : shortPeriod(5), midPeriod(20), longPeriod(60); var : Tcond(false); if (sdate != sdate[1] and stime >= 시작시간) or (sdate == sdate[1] and stime >= 시작시간 and stime[1] < 시작시간) Then Tcond = true; if (sdate != sdate[1] and stime >= 종료시간) or (sdate == sdate[1] and stime >= 종료시간 and stime[1] < 종료시간) Then Tcond = false; value1 = ma(C, shortPeriod); value2 = ma(C, midPeriod); value3 = ma(C, longPeriod); if Tcond == true then { # 매수 If CrossUP(value1, value2) Then { Buy(); } # 매수청산 If CrossUP(value2, value3) Then { ExitLong(); } # 매도 If CrossDown(value1, value2) Then { Sell(); } # 매도청산 If CrossUP(value2, value3) Then { ExitShort(); } if MarketPosition == 1 then { ExitLong("bp",AtLimit,EntryPrice+PriceScale*익절틱수); ExitLong("bl",AtStop,EntryPrice-PriceScale*손절틱수); } if MarketPosition == -1 then { ExitShort("sp",AtLimit,EntryPrice-PriceScale*익절틱수); ExitShort("sl",AtStop,EntryPrice+PriceScale*손절틱수); } } 즐거운 하루되세요 > 워싱턴 님이 쓴 글입니다. > 제목 : 확인및 수식 부탁드립니다. > 안녕하세요 예스스팟을 이용하여 아래의 예스랭귀지 수식을 사용하고자 합니다. * 아래의 기본적인 시스템수식을 예스스팟을 이용하여 실행하기 위해 아래부분을 추가한 스팟 수식을 부탁드립니다. (1) 거래는 1계약을 기준으로 실행한다. (2) 스팟 최초 실행후 미체결 상태가 있는경우, 미체결을 취소한다. (3) 스팟실행후 매수포지션(잔고)이 있는 상태에서, (+15틱 이상 수익상태인 경우 즉시 청산하고 아닌경우는) 신호 가 매수 청산 신호가 발생하면 청산하고, 매수신호 또는 매도청산 신호인 경우 실행하지 않으며, 매도 신호인 경우 진입된 매수포지션을 청산하고, 새로 매도 1계약 진입한다. (4) 3번에서 매도포지션 보유 경우도 같은 방식으로 처리한다. (5) 진입신호시, 같은 포지션이 존재하는 경우, 추가 진입하지 않는다.(1계약) (6) 신호발생후 미체결인 있는 경우, 30초후 1호가(유리호가) 정정주문하고, 2분후에도 미체결 상태이면 취소처리하고, 미체결에 대한 청산 또는 익절/손절 부분도 처리되지 않도록 설정한다. (7) 진입후 익절(20틱)/손절(20틱) 청산 한다. (8) 거래 시간을 18:00 ~ 23:00 까지로 제한 (9) 진입한 상태에서 손실 또는 수익이 증거금의 10% 이상 발생하는 경우 전량 청산 하고 당일 거래를 종료하도록 설정 항상 많은 도움에 감사드립니다. // -------------------------------------------------------- // 시스템 수식 : GC-2060 // -------------------------------------------------------- Input : shortPeriod(5), midPeriod(20), longPeriod(60); value1 = ma(C, shortPeriod); value2 = ma(C, midPeriod); value3 = ma(C, longPeriod); # 매수 If CrossUP(value1, value2) Then { Buy(); } # 매수청산 If CrossUP(value2, value3) Then { ExitLong(); } # 매도 If CrossDown(value1, value2) Then { Sell(); } # 매도청산 If CrossUP(value2, value3) Then { ExitShort(); } // -------------------------------------------------------- 감사합니다.