커뮤니티

차트신호시 특정가격 옵션 현재가 매수

프로필 이미지
좌오비우오비
2024-11-15 09:53:22.0
543
글번호 225996
답변완료
답변 수식 고맙습니다. 아래수식은 특정시간대, 특정조건에서 주문이 나가는 수식입니다. 이 수식을 특정시간, 특정조건은 사용하지 않고 차트신호로 진입하고 차트신호로 청산하는 것으로 교체하고 싶습니다. //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { OrderBuy } } if (Signal.signalKind == 2) { OrderSell } 차트에서 진입신호 발생 후 실시간으로 0.05 체결이 발생한 행사가를 찾아 주문을 내고 익절하는 내용까지는 spot 수식 그대로 보존해 주십시오. 다만, 차트신호에 포함되는 내용인 재진입 건 내용과 142500 시간대 청산주문 내용은 삭제해 주십시요. 그리고 진입주문과 청산주문에 시장가 주문을 주석으로 병행하여 주시기 바랍니다. 시세가 빠르게 갈 때는 지정가로는 체결이 안되더군요. 항상 고맙습니다. *********************************************************************************** 안녕하세요 예스스탁입니다. 스팟수식은 가이드입니다. 아래 가이드 내용 참고하시기 바랍니다. 1 스크립트 객체설정 옵션객체 추가 --> 객체명 Option1, 월물선택 종목객체 추가 --> 객체명 MarketData1, 연결선물로 지정 계좌객체 추가 --> 객체명 Account1, 주문낼 계좌번호 지정 2 영문 업데이트가 게시판 금침어라 중간에 *이 삽입되어 있습니다. * 제거하시고 적용하셔야 합니다. 3 var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && ReqCom == true && Exit == false && lUp*dateID == 20001 )//*제거 { Main.MessageList(HHMMSS,Exit); for (var i = 0; i < MK.length; i++) { if (OD[i] == 0) { if (MK[i].current == BuyPrice) { OD[i] = 1; Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); } } else { if (MK[i].current == ExitPrice) { OD[i] = 0; Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(MK[i].code, 1,MK[i].current,0); } } } } } if (HHMMSS >= EndTime && Exit == false) { Main.MessageList(HHMMSS,Exit); Exit = true; //미체결주문수 var UF = Account1.GetTheNumberOfUnfills(); Main.MessageList(HHMMSS,"미체결수",UF); if (UF > 0) { //모든 옵션 미체결 취소 for (var i = 0; i < UF; i++) { Account1.SetUnfill(i) if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum); } } } //보유종목수 var BB = Account1.GetTheNumberOfBalances() Main.MessageList(HHMMSS,"보유종목수",BB); if (BB > 0) { //잔고의 모든 옵션매수청산 for (var i = 0; i < BB; i++) { Account1.SetBalance(i); if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수3호가로 잔고잔량 매수청산(매도주문) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0); Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code); } } } } } 즐거운 하루되세요
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2024-05-22 14:22:30.0

안녕하세요 예스스탁입니다. 매수진입신호발생 이후 매수청산신호 발생전까지 최초 0.5체결이 발생하면 매수되게 작성해 드립니다. var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom,Sig,Sigi; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; Sig = 0; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //Buy if (Sig == 0 && Signal.signalKind == 1) { Sig = 1; } //exitlong if (Sig >= 1 && Signal.signalKind == 2) { Sig = 0; Account1.SetBalance(MK[Sigi].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0); //시장가 //Account1.OrderSell(MK[i].code, 1,0,1); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && ReqCom == true && Exit == false && lUp*dateID == 20001 )//*제거 { Main.MessageList(HHMMSS,Exit); for (var i = 0; i < MK.length; i++) { if (OD[i] == 0 && Sig == 1) { if (MK[i].current == BuyPrice) { OD[i] = 1; Sig = 1; Sigi = i; //지정가 Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); //시장가 //Account1.OrderBuy(MK[i].code, 1,0,1); } } else { if (MK[i].current == ExitPrice) { OD[i] = 0; Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[i].code, 1,MK[i].current,0); //시장가 //Account1.OrderSell(MK[i].code, 1,0,1); } } } } } if (HHMMSS >= EndTime && Exit == false) { Main.MessageList(HHMMSS,Exit); Exit = true; //미체결주문수 var UF = Account1.GetTheNumberOfUnfills(); Main.MessageList(HHMMSS,"미체결수",UF); if (UF > 0) { //모든 옵션 미체결 취소 for (var i = 0; i < UF; i++) { Account1.SetUnfill(i) if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum); } } } //보유종목수 var BB = Account1.GetTheNumberOfBalances() Main.MessageList(HHMMSS,"보유종목수",BB); if (BB > 0) { //잔고의 모든 옵션매수청산 for (var i = 0; i < BB; i++) { Account1.SetBalance(i); if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수3호가로 잔고잔량 매수청산(매도주문) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0); Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code); } } } } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 문의 > 답변 수식 고맙습니다. 아래수식은 특정시간대, 특정조건에서 주문이 나가는 수식입니다. 이 수식을 특정시간, 특정조건은 사용하지 않고 차트신호로 진입하고 차트신호로 청산하는 것으로 교체하고 싶습니다. //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { OrderBuy } } if (Signal.signalKind == 2) { OrderSell } 차트에서 진입신호 발생 후 실시간으로 0.05 체결이 발생한 행사가를 찾아 주문을 내고 익절하는 내용까지는 spot 수식 그대로 보존해 주십시오. 다만, 차트신호에 포함되는 내용인 재진입 건 내용과 142500 시간대 청산주문 내용은 삭제해 주십시요. 그리고 진입주문과 청산주문에 시장가 주문을 주석으로 병행하여 주시기 바랍니다. 시세가 빠르게 갈 때는 지정가로는 체결이 안되더군요. 항상 고맙습니다. *********************************************************************************** 안녕하세요 예스스탁입니다. 스팟수식은 가이드입니다. 아래 가이드 내용 참고하시기 바랍니다. 1 스크립트 객체설정 옵션객체 추가 --> 객체명 Option1, 월물선택 종목객체 추가 --> 객체명 MarketData1, 연결선물로 지정 계좌객체 추가 --> 객체명 Account1, 주문낼 계좌번호 지정 2 영문 업데이트가 게시판 금침어라 중간에 *이 삽입되어 있습니다. * 제거하시고 적용하셔야 합니다. 3 var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && ReqCom == true && Exit == false && lUp*dateID == 20001 )//*제거 { Main.MessageList(HHMMSS,Exit); for (var i = 0; i < MK.length; i++) { if (OD[i] == 0) { if (MK[i].current == BuyPrice) { OD[i] = 1; Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); } } else { if (MK[i].current == ExitPrice) { OD[i] = 0; Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(MK[i].code, 1,MK[i].current,0); } } } } } if (HHMMSS >= EndTime && Exit == false) { Main.MessageList(HHMMSS,Exit); Exit = true; //미체결주문수 var UF = Account1.GetTheNumberOfUnfills(); Main.MessageList(HHMMSS,"미체결수",UF); if (UF > 0) { //모든 옵션 미체결 취소 for (var i = 0; i < UF; i++) { Account1.SetUnfill(i) if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum); } } } //보유종목수 var BB = Account1.GetTheNumberOfBalances() Main.MessageList(HHMMSS,"보유종목수",BB); if (BB > 0) { //잔고의 모든 옵션매수청산 for (var i = 0; i < BB; i++) { Account1.SetBalance(i); if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수3호가로 잔고잔량 매수청산(매도주문) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0); Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code); } } } } } 즐거운 하루되세요
프로필 이미지

좌오비우오비

2024-05-23 10:49:45.0

답변 고맙습니다. 그런데 답변수식에서 1. 차트신호발생시 매수에 대한 내용은 언급은 주석으로 되어있으나 buy실행문이 없고... if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && 이 내용속에 buy 실행이 존재하는데요. 위 조건은 삭제될 내용이었는데요. 차트신호발생에 따른 진입하는 거니까요. 다시 요청내용을 정리하면 다음과 같습니다. 종목객체생성완료 후 차트매수신호 이후에 0.05 실시간 체결된 행사가에 buy 주문 실행 차트매도신호가 나오면 포지션 청산 - 다른 전략으로 진입한 옵션 포지션이 놔두고, 지금 전략으로 진입한 것만 청산해야 함 - spot수식으로 0.5 익절 실행 > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 문의 > 안녕하세요 예스스탁입니다. 매수진입신호발생 이후 매수청산신호 발생전까지 최초 0.5체결이 발생하면 매수되게 작성해 드립니다. var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom,Sig,Sigi; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; Sig = 0; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //Buy if (Sig == 0 && Signal.signalKind == 1) { Sig = 1; } //exitlong if (Sig >= 1 && Signal.signalKind == 2) { Sig = 0; Account1.SetBalance(MK[Sigi].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0); //시장가 //Account1.OrderSell(MK[i].code, 1,0,1); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && ReqCom == true && Exit == false && lUp*dateID == 20001 )//*제거 { Main.MessageList(HHMMSS,Exit); for (var i = 0; i < MK.length; i++) { if (OD[i] == 0 && Sig == 1) { if (MK[i].current == BuyPrice) { OD[i] = 1; Sig = 1; Sigi = i; //지정가 Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); //시장가 //Account1.OrderBuy(MK[i].code, 1,0,1); } } else { if (MK[i].current == ExitPrice) { OD[i] = 0; Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[i].code, 1,MK[i].current,0); //시장가 //Account1.OrderSell(MK[i].code, 1,0,1); } } } } } if (HHMMSS >= EndTime && Exit == false) { Main.MessageList(HHMMSS,Exit); Exit = true; //미체결주문수 var UF = Account1.GetTheNumberOfUnfills(); Main.MessageList(HHMMSS,"미체결수",UF); if (UF > 0) { //모든 옵션 미체결 취소 for (var i = 0; i < UF; i++) { Account1.SetUnfill(i) if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum); } } } //보유종목수 var BB = Account1.GetTheNumberOfBalances() Main.MessageList(HHMMSS,"보유종목수",BB); if (BB > 0) { //잔고의 모든 옵션매수청산 for (var i = 0; i < BB; i++) { Account1.SetBalance(i); if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수3호가로 잔고잔량 매수청산(매도주문) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0); Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code); } } } } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 문의 > 답변 수식 고맙습니다. 아래수식은 특정시간대, 특정조건에서 주문이 나가는 수식입니다. 이 수식을 특정시간, 특정조건은 사용하지 않고 차트신호로 진입하고 차트신호로 청산하는 것으로 교체하고 싶습니다. //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { OrderBuy } } if (Signal.signalKind == 2) { OrderSell } 차트에서 진입신호 발생 후 실시간으로 0.05 체결이 발생한 행사가를 찾아 주문을 내고 익절하는 내용까지는 spot 수식 그대로 보존해 주십시오. 다만, 차트신호에 포함되는 내용인 재진입 건 내용과 142500 시간대 청산주문 내용은 삭제해 주십시요. 그리고 진입주문과 청산주문에 시장가 주문을 주석으로 병행하여 주시기 바랍니다. 시세가 빠르게 갈 때는 지정가로는 체결이 안되더군요. 항상 고맙습니다. *********************************************************************************** 안녕하세요 예스스탁입니다. 스팟수식은 가이드입니다. 아래 가이드 내용 참고하시기 바랍니다. 1 스크립트 객체설정 옵션객체 추가 --> 객체명 Option1, 월물선택 종목객체 추가 --> 객체명 MarketData1, 연결선물로 지정 계좌객체 추가 --> 객체명 Account1, 주문낼 계좌번호 지정 2 영문 업데이트가 게시판 금침어라 중간에 *이 삽입되어 있습니다. * 제거하시고 적용하셔야 합니다. 3 var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && ReqCom == true && Exit == false && lUp*dateID == 20001 )//*제거 { Main.MessageList(HHMMSS,Exit); for (var i = 0; i < MK.length; i++) { if (OD[i] == 0) { if (MK[i].current == BuyPrice) { OD[i] = 1; Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); } } else { if (MK[i].current == ExitPrice) { OD[i] = 0; Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(MK[i].code, 1,MK[i].current,0); } } } } } if (HHMMSS >= EndTime && Exit == false) { Main.MessageList(HHMMSS,Exit); Exit = true; //미체결주문수 var UF = Account1.GetTheNumberOfUnfills(); Main.MessageList(HHMMSS,"미체결수",UF); if (UF > 0) { //모든 옵션 미체결 취소 for (var i = 0; i < UF; i++) { Account1.SetUnfill(i) if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum); } } } //보유종목수 var BB = Account1.GetTheNumberOfBalances() Main.MessageList(HHMMSS,"보유종목수",BB); if (BB > 0) { //잔고의 모든 옵션매수청산 for (var i = 0; i < BB; i++) { Account1.SetBalance(i); if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수3호가로 잔고잔량 매수청산(매도주문) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0); Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code); } } } } } 즐거운 하루되세요
프로필 이미지

예스스탁 예스스탁 답변

2024-05-23 11:25:49.0

안녕하세요 예스스탁입니다. var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom,Sig,Sigi; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; Sig = -1; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //Buy if (Sig == 0 && Signal.signalKind == 1) { Sig = 1; Sigi = -1; } //exitlong // Sig가 1이상일때 if (Sig >= 1 && Signal.signalKind == 2) { //Sig는 0 Sig = 0; //Sig가 2일대만 if (Sig == 2) { //잔고체크해서 //해당 종목 매수포지션 전량 청산 Account1.SetBalance(MK[Sigi].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0); //시장가 //Account1.OrderSell(MK[Sigi].code, 1,0,1); } } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (ReqCom == true && lUp*dateID == 20001 )//*제거 { //차트에서 매수신호 발생한 후 if (Sig == 1) { //전체 종목 중 for (var i = 0; i < MK.length; i++) { //체결가 0.05인 종목이 발생하면 if (OD[i] == 0 && MK[i].current == BuyPrice) { //Sig는 2 Sig = 2; // 신호발생한 종목객체 번호 Sigi = i; //지정가 Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); //시장가 //Account1.OrderBuy(MK[i].code, 1,0,1); } } } //Sig값이 2이고 Sigi번호의 종목객체가 익절가가 발생하면 if (Sig == 2 && MK[Sigi].current == ExitPrice) { //Sig는 0 Sig = 0; //잔고체크해서 Account1.SetBalance(MK[Sigi].code,0); //해당종목 매수포지션 전량 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0); //시장가 //Account1.OrderSell(MK[Sigi].code, 1,0,1); } } } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : Re : Re : 문의 > 답변 고맙습니다. 그런데 답변수식에서 1. 차트신호발생시 매수에 대한 내용은 언급은 주석으로 되어있으나 buy실행문이 없고... if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && 이 내용속에 buy 실행이 존재하는데요. 위 조건은 삭제될 내용이었는데요. 차트신호발생에 따른 진입하는 거니까요. 다시 요청내용을 정리하면 다음과 같습니다. 종목객체생성완료 후 차트매수신호 이후에 0.05 실시간 체결된 행사가에 buy 주문 실행 차트매도신호가 나오면 포지션 청산 - 다른 전략으로 진입한 옵션 포지션이 놔두고, 지금 전략으로 진입한 것만 청산해야 함 - spot수식으로 0.5 익절 실행 > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 문의 > 안녕하세요 예스스탁입니다. 매수진입신호발생 이후 매수청산신호 발생전까지 최초 0.5체결이 발생하면 매수되게 작성해 드립니다. var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom,Sig,Sigi; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; Sig = 0; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //Buy if (Sig == 0 && Signal.signalKind == 1) { Sig = 1; } //exitlong if (Sig >= 1 && Signal.signalKind == 2) { Sig = 0; Account1.SetBalance(MK[Sigi].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0); //시장가 //Account1.OrderSell(MK[i].code, 1,0,1); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && ReqCom == true && Exit == false && lUp*dateID == 20001 )//*제거 { Main.MessageList(HHMMSS,Exit); for (var i = 0; i < MK.length; i++) { if (OD[i] == 0 && Sig == 1) { if (MK[i].current == BuyPrice) { OD[i] = 1; Sig = 1; Sigi = i; //지정가 Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); //시장가 //Account1.OrderBuy(MK[i].code, 1,0,1); } } else { if (MK[i].current == ExitPrice) { OD[i] = 0; Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //지정가 Account1.OrderSell(MK[i].code, 1,MK[i].current,0); //시장가 //Account1.OrderSell(MK[i].code, 1,0,1); } } } } } if (HHMMSS >= EndTime && Exit == false) { Main.MessageList(HHMMSS,Exit); Exit = true; //미체결주문수 var UF = Account1.GetTheNumberOfUnfills(); Main.MessageList(HHMMSS,"미체결수",UF); if (UF > 0) { //모든 옵션 미체결 취소 for (var i = 0; i < UF; i++) { Account1.SetUnfill(i) if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum); } } } //보유종목수 var BB = Account1.GetTheNumberOfBalances() Main.MessageList(HHMMSS,"보유종목수",BB); if (BB > 0) { //잔고의 모든 옵션매수청산 for (var i = 0; i < BB; i++) { Account1.SetBalance(i); if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수3호가로 잔고잔량 매수청산(매도주문) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0); Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code); } } } } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 문의 > 답변 수식 고맙습니다. 아래수식은 특정시간대, 특정조건에서 주문이 나가는 수식입니다. 이 수식을 특정시간, 특정조건은 사용하지 않고 차트신호로 진입하고 차트신호로 청산하는 것으로 교체하고 싶습니다. //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { OrderBuy } } if (Signal.signalKind == 2) { OrderSell } 차트에서 진입신호 발생 후 실시간으로 0.05 체결이 발생한 행사가를 찾아 주문을 내고 익절하는 내용까지는 spot 수식 그대로 보존해 주십시오. 다만, 차트신호에 포함되는 내용인 재진입 건 내용과 142500 시간대 청산주문 내용은 삭제해 주십시요. 그리고 진입주문과 청산주문에 시장가 주문을 주석으로 병행하여 주시기 바랍니다. 시세가 빠르게 갈 때는 지정가로는 체결이 안되더군요. 항상 고맙습니다. *********************************************************************************** 안녕하세요 예스스탁입니다. 스팟수식은 가이드입니다. 아래 가이드 내용 참고하시기 바랍니다. 1 스크립트 객체설정 옵션객체 추가 --> 객체명 Option1, 월물선택 종목객체 추가 --> 객체명 MarketData1, 연결선물로 지정 계좌객체 추가 --> 객체명 Account1, 주문낼 계좌번호 지정 2 영문 업데이트가 게시판 금침어라 중간에 *이 삽입되어 있습니다. * 제거하시고 적용하셔야 합니다. 3 var BuyPrice = 0.05, ExitPrice = 0.5; var StartTime = 103000, EndTime = 142500; var List = [],MK = [],OD = []; var req, Exit, ReqCom; function Main_OnStart() { List = []; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { List.push(Option1.GetATMCallRecent(i)); } Main.MessageList("콜옵션종목수:",List.length); req = 0; if (List.length > 0) { Main.MessageList("종목객체요청:",req,List.length); Main.ReqMarketData(List[req]); } Exit = false; ReqCom = false; } function Main_OnRcvMarketData(MarketData) { if (List[req] == MarketData.code) { Main.MessageList("종목객체생성:",req,MarketData.code); MK.push(MarketData); OD.push(0); req = req+1; if (req < List.length) { Main.MessageList("종목객체요청:",req,List[req]); var S = Main.ReqMarketData(List[req]); if (S == -1) { Main.SetTimer(1, 15000); Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:"); } } else { Main.MessageList("종목객체생성완료"); ReqCom = true; } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체 재요청:",req,List[req]); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (HHMMSS >= StartTime && HHMMSS < EndTime && MarketData1.current <= MarketData1.open - 2.5 && ReqCom == true && Exit == false && lUp*dateID == 20001 )//*제거 { Main.MessageList(HHMMSS,Exit); for (var i = 0; i < MK.length; i++) { if (OD[i] == 0) { if (MK[i].current == BuyPrice) { OD[i] = 1; Account1.OrderBuy(MK[i].code, 1,MK[i].current,0); } } else { if (MK[i].current == ExitPrice) { OD[i] = 0; Account1.SetBalance(MK[i].code,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(MK[i].code, 1,MK[i].current,0); } } } } } if (HHMMSS >= EndTime && Exit == false) { Main.MessageList(HHMMSS,Exit); Exit = true; //미체결주문수 var UF = Account1.GetTheNumberOfUnfills(); Main.MessageList(HHMMSS,"미체결수",UF); if (UF > 0) { //모든 옵션 미체결 취소 for (var i = 0; i < UF; i++) { Account1.SetUnfill(i) if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum); } } } //보유종목수 var BB = Account1.GetTheNumberOfBalances() Main.MessageList(HHMMSS,"보유종목수",BB); if (BB > 0) { //잔고의 모든 옵션매수청산 for (var i = 0; i < BB; i++) { Account1.SetBalance(i); if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수3호가로 잔고잔량 매수청산(매도주문) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0); Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code); } } } } } 즐거운 하루되세요