커뮤니티

수식 문의 드립니다.

프로필 이미지
dandy
2016-11-25 15:49:40
2280
글번호 224044
답변완료
안녕하세요 당일청산 선물신호 시스템 을 이용한, 아래 스팟수식으로 당일손실제한(1.0 PT) 전량 청산할경우, 당일 추가 선물신호가 발생해도 추가 진입이 안되도록 수정 요청 드립니다. (스팟수식으로 당일손실제한정산 될 경우, PT 청산 메시지 출력 요청 드림니다) 감사합니다. 스팟수식요류 if (Signal.signalKind == 3 sumPL > 당일손실제한) => ReferenceError 오류 => if (Signal.signalKind == 3, sumPL > -1.0) 수정 확인 점검 요청드림니다. 스크립트 객체설정 차트객체 추가 --> 속성에서 객체명은 Chart1, 아이디 연결 계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호 지정 종목객체 추가 --> 속성에서 객체명은 MarketData1, 주문낼 종목으로 지정 입력변수 추가 --> 속성에서 변수명은 당일손실제한, 초기값 음수로 지정, 데이터형 숫자 var sumPL; -1.0 //당일손실제한 1.0 PT 설정 var BuyID, BxID, SellID,SxID; var BuyNum, BxNum, SellNum,SxNum; var BuyAvg,SellAvg; var EntryStart,Dayloss,sumPL,T; function Main_OnStart() { sumPL = 0; T = 0; EntryStart = false; Dayloss = false; Main.SetTimer(1, 5000); } //차트에서 신호나오면 MarketData1 종목에 대해 주문 function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1 && Dayloss == false) { BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0); EntryStart = true; } //매수청산신호 발생 if (EntryStart == true && Signal.signalKind == 2) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(BuyNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BuyNum); } //잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수포지션 잔고 평단가 저장 BuyAvg = Account1.Balance.avgUnitCost; BxID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0); T = 1; } } //매도진입신호 발생 if (Signal.signalKind == 3 sumPL > 당일손실제한) <============= 수식요류메세지 { SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(3), 0); EntryStart = true; } //매도청산신호 발생 if (EntryStart == true && Signal.signalKind == 4) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(SellNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SellNum); } //잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //매도포지션 잔고 평단가 저장 SellAvg = Account1.Balance.avgUnitCost; SxID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0); T = -1; } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID) BuyNum = OrderResponse.orderNum; if (OrderResponse.orderID == BxID) BxNum = OrderResponse.orderNum; if (OrderResponse.orderID == SellID) SellNum = OrderResponse.orderNum; if (OrderResponse.orderID == SxID) SxNum = OrderResponse.orderNum; } function Main_OnNotifyFill(NotifyFill) { //매수청산신호의 체결이 수신되면 if (NotifyFill.orderNum == BxNum) { sumPL = sumPL +(NotifyFill.fillPrice-BuyAvg)*NotifyFill.fillCount; } //매도청산신호의 체결이 수신되면 if (NotifyFill.orderNum == SxNum) { sumPL = sumPL +(SellAvg-NotifyFill.fillPrice)*NotifyFill.fillCount; } } function Main_OnTimer(nEventID) { if (EntryStart == true && T == 1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { tempPL = sumPL+(Account1.Balance.current-Account1.Balance.avgUnitCost)*Account1.Balance.count; if (tempPL <= 당일손실제한) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0); Dayloss = true; } } } if (EntryStart == true && T == -1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { tempPL = sumPL+(Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count; if (tempPL <= 당일손실제한) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(3), 0); Dayloss = true; } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2016-12-08 16:45:11

안녕하세요 예스스탁입니다. if (Signal.signalKind == 3 && sumPL > 당일손실제한) 조건 사이에 &&가 빠져있습니다. 당일손실제한 청산이 발동하면 Dayloss가 true가 되므로 진입식에는 Dayloss == false라는 조건을 주시면 됩니다. 수식 답변은 가이드입니다. 해당 내용 숙지하시고 모의투자등으로 테스트 하시면서 사용자분이 수정보완하셔서 식 완성해 가셔야 합니다. var sumPL; -1.0 //당일손실제한 1.0 PT 설정 var BuyID, BxID, SellID,SxID; var BuyNum, BxNum, SellNum,SxNum; var BuyAvg,SellAvg; var EntryStart,Dayloss,sumPL,T; function Main_OnStart() { sumPL = 0; T = 0; EntryStart = false; Dayloss = false; Main.SetTimer(1, 5000); } //차트에서 신호나오면 MarketData1 종목에 대해 주문 function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1 && Dayloss == false) { BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0); EntryStart = true; } //매수청산신호 발생 if (EntryStart == true && Signal.signalKind == 2) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(BuyNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BuyNum); } //잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수포지션 잔고 평단가 저장 BuyAvg = Account1.Balance.avgUnitCost; BxID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0); T = 1; } } //매도진입신호 발생 if (Signal.signalKind == 3 && Dayloss == false) { SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(3), 0); EntryStart = true; } //매도청산신호 발생 if (EntryStart == true && Signal.signalKind == 4) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(SellNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SellNum); } //잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //매도포지션 잔고 평단가 저장 SellAvg = Account1.Balance.avgUnitCost; SxID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0); T = -1; } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID) BuyNum = OrderResponse.orderNum; if (OrderResponse.orderID == BxID) BxNum = OrderResponse.orderNum; if (OrderResponse.orderID == SellID) SellNum = OrderResponse.orderNum; if (OrderResponse.orderID == SxID) SxNum = OrderResponse.orderNum; } function Main_OnNotifyFill(NotifyFill) { //매수청산신호의 체결이 수신되면 if (NotifyFill.orderNum == BxNum) { sumPL = sumPL +(NotifyFill.fillPrice-BuyAvg)*NotifyFill.fillCount; } //매도청산신호의 체결이 수신되면 if (NotifyFill.orderNum == SxNum) { sumPL = sumPL +(SellAvg-NotifyFill.fillPrice)*NotifyFill.fillCount; } } function Main_OnTimer(nEventID) { if (EntryStart == true && T == 1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { tempPL = sumPL+(Account1.Balance.current-Account1.Balance.avgUnitCost)*Account1.Balance.count; if (tempPL <= 당일손실제한) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0); Dayloss = true; } } } if (EntryStart == true && T == -1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { tempPL = sumPL+(Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count; if (tempPL <= 당일손실제한) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(3), 0); Dayloss = true; } } } } 즐거운 하루되세요 > dandy 님이 쓴 글입니다. > 제목 : 수식 문의 드립니다. > 안녕하세요 당일청산 선물신호 시스템 을 이용한, 아래 스팟수식으로 당일손실제한(1.0 PT) 전량 청산할경우, 당일 추가 선물신호가 발생해도 추가 진입이 안되도록 수정 요청 드립니다. (스팟수식으로 당일손실제한정산 될 경우, PT 청산 메시지 출력 요청 드림니다) 감사합니다. 스팟수식요류 if (Signal.signalKind == 3 sumPL > 당일손실제한) => ReferenceError 오류 => if (Signal.signalKind == 3, sumPL > -1.0) 수정 확인 점검 요청드림니다. 스크립트 객체설정 차트객체 추가 --> 속성에서 객체명은 Chart1, 아이디 연결 계좌객체 추가 --> 속성에서 객체명은 Account1, 계좌번호 지정 종목객체 추가 --> 속성에서 객체명은 MarketData1, 주문낼 종목으로 지정 입력변수 추가 --> 속성에서 변수명은 당일손실제한, 초기값 음수로 지정, 데이터형 숫자 var sumPL; -1.0 //당일손실제한 1.0 PT 설정 var BuyID, BxID, SellID,SxID; var BuyNum, BxNum, SellNum,SxNum; var BuyAvg,SellAvg; var EntryStart,Dayloss,sumPL,T; function Main_OnStart() { sumPL = 0; T = 0; EntryStart = false; Dayloss = false; Main.SetTimer(1, 5000); } //차트에서 신호나오면 MarketData1 종목에 대해 주문 function Chart1_OnRiseSignal(Signal) { //매수진입신호 발생 if (Signal.signalKind == 1 && Dayloss == false) { BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0); EntryStart = true; } //매수청산신호 발생 if (EntryStart == true && Signal.signalKind == 2) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(BuyNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BuyNum); } //잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수포지션 잔고 평단가 저장 BuyAvg = Account1.Balance.avgUnitCost; BxID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0); T = 1; } } //매도진입신호 발생 if (Signal.signalKind == 3 sumPL > 당일손실제한) <============= 수식요류메세지 { SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Bid(3), 0); EntryStart = true; } //매도청산신호 발생 if (EntryStart == true && Signal.signalKind == 4) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(SellNum); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SellNum); } //잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //매도포지션 잔고 평단가 저장 SellAvg = Account1.Balance.avgUnitCost; SxID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.Ask(3), 0); T = -1; } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID) BuyNum = OrderResponse.orderNum; if (OrderResponse.orderID == BxID) BxNum = OrderResponse.orderNum; if (OrderResponse.orderID == SellID) SellNum = OrderResponse.orderNum; if (OrderResponse.orderID == SxID) SxNum = OrderResponse.orderNum; } function Main_OnNotifyFill(NotifyFill) { //매수청산신호의 체결이 수신되면 if (NotifyFill.orderNum == BxNum) { sumPL = sumPL +(NotifyFill.fillPrice-BuyAvg)*NotifyFill.fillCount; } //매도청산신호의 체결이 수신되면 if (NotifyFill.orderNum == SxNum) { sumPL = sumPL +(SellAvg-NotifyFill.fillPrice)*NotifyFill.fillCount; } } function Main_OnTimer(nEventID) { if (EntryStart == true && T == 1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { tempPL = sumPL+(Account1.Balance.current-Account1.Balance.avgUnitCost)*Account1.Balance.count; if (tempPL <= 당일손실제한) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData1.Bid(3), 0); Dayloss = true; } } } if (EntryStart == true && T == -1) { Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { tempPL = sumPL+(Account1.Balance.avgUnitCost-Account1.Balance.current)*Account1.Balance.count; if (tempPL <= 당일손실제한) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,MarketData1.Ask(3), 0); Dayloss = true; } } } }