예스스탁
예스스탁 답변
2021-09-14 11:50:42.0
안녕하세요
예스스탁입니다.
신호객체에서 신호별로 아래와 같이 발생하게 됩니다.
매수진입신호이면 if (Signal.signalKind == 1)
매수청산신호이면 if (Signal.signalKind == 2)
매도진입신호이면 if (Signal.signalKind == 3)
매도청산신호이면 if (Signal.signalKind == 4)
현재 올리신 식에는 진입신호가 발생할때 청산신호에서 처리할 내용도 들어가 있습니다.
각 진입신호는 신호수량으로 진입하고 청산시에는 진입주문에 미체결이 있으면 취소하고 잔고수량만큼만 청산되는 기본구조로 수정해 드립니다.
var BID,Bnum,BIDx,Bnumx;
var SID,Snum,SIDx,Snumx;
function Main_OnStart()
{
Main.MessageLog("시작");
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
//매수신호 발생하면 신호수량으로 현재가 매수주문
if (Signal.signalKind == 1)
{
// 매수진입
BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.current, 1);
}
if (Signal.signalKind == 2)
{
//주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Bnum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Bnum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매수수량이 있으면 매도로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
SIDx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Bid(3), 1)
}
}
//매도신호 발생하면 신호수량으로 현재가 매도주문
if (Signal.signalKind == 3)
{
SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.current, 1);
}
if (Signal.signalKind == 4)
{
//Snum에 저장된 주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Snum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Snum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매도수량이 있으면 잔고만큼 매수로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
SIDx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Ask(3), 1)
}
}
}
//주문응답수신
function Main_OnOrderResponse(OrderResponse)
{
//BID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == BID)
{
//매수주문번호를 Bnum에 저장
Bnum = OrderResponse.orderNum;
}
//BIDx와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == BIDx)
{
//매수주문번호를 Bnum에 저장
Bnumx = OrderResponse.orderNum;
}
//SID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == SID)
{
//매도주문번호를 Snum에 저장
Snum = OrderResponse.orderNum;
}
//SID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == SIDx)
{
//매도주문번호를 Snum에 저장
Snumx = OrderResponse.orderNum;
}
}
즐거운 하루되세요
> 심심00 님이 쓴 글입니다.
> 제목 : 스팟 간단한 내용 검토요청
> 안녕하세요?
스팟수식 여쭤볼 곳이 없어서, 부득이 부탁드리고합니다.
아래 수식 목표는
단순 진입입니다. 차트에서 1계약 매수 / 매도 시그널 나오면 그대로 적용, 청산 신호 나오면 청산...
그런데 단순한 건데 이상하게 성능보고서와 다르게 청산이 되어도 잔고가 남아 있고... 오류가 있습니다.
검토요청드립니다.
청산시 잔고 없고, 신규 진입시 이전 물량 청산만 하면 됩니다.
다시 한 번 감사드립니다.
-----------------------------------------------------------------
//진입청산주문을 모두 스팟에서 내게 하셔야 합니다.
//차트에 시스템은 시험적용으로 적용하고
//신호가 발생하면 스팟에서 주문을 내고 추적해야 합니다.
//차트객체추가 --> 속성에서 객체명은 Chart1, 아이디 부여해 차트와 연결
//종목객체추가 --> 속성에서 객체명은 MarketData1, 차트와 동일종목으로 지정
//계좌객체추가 --> 속성에서 객체명은 Account1, 계좌번호 지정
// 시장가 주문으로 변경(1))
var BID,Bnum,BIDx,Bnumx;
var SID,Snum,SIDx,Snumx;
function Main_OnStart()
{
Main.MessageLog("시작");
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
//매수신호 발생하면 신호수량으로 현재가 매수주문
if (Signal.signalKind == 1)
{
T = 1;
//주문후 주문아이디
//주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Bnum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Bnum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매도수량이 있으면 매도수량만큼 매수로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
BIDx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count,MarketData1.current, 1);
}
// 매수진입
BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.current, 1);
}
if (Signal.signalKind == 2)
{
T = 0;
//주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Bnum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Bnum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매수수량이 있으면 매도로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
SIDx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Bid(3), 1)
}
//매도 신호 수량만큼 진입
SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count, MarketData1.Bid(3), 1)
}
//매도신호 발생하면 신호수량으로 현재가 매도주문
if (Signal.signalKind == 3)
{
T = -1;
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매수수량이 있으면 잔고만큼 매도로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
BIDx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count,MarketData1.current, 1);
}
}
if (Signal.signalKind == 4)
{
T = 0;
//Snum에 저장된 주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Snum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Snum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매도수량이 있으면 잔고만큼 매수로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
SIDx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Ask(3), 1)
}
}
}
//주문응답수신
function Main_OnOrderResponse(OrderResponse)
{
//BID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == BID)
{
//매수주문번호를 Bnum에 저장
Bnum = OrderResponse.orderNum;
}
//SID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == SID)
{
//매도주문번호를 Snum에 저장
Snum = OrderResponse.orderNum;
}
//BIDx와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == BIDx)
{
//매수주문번호를 Bnum에 저장
Bnumx = OrderResponse.orderNum;
}
//SID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == SIDx)
{
//매도주문번호를 Snum에 저장
Snumx = OrderResponse.orderNum;
}
}