예스스탁
예스스탁 답변
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;
}
}
}
}