차트에서 신호발생시 스팟으로 주문을 내는 수식입니다.
1.
전략내용
차트에서 진입신호가 발생하면 현재가로 주문 후 30초 후에 미체결이 있으면 취소를 하고
청산신호가 발생하면 미체결된 수량을 제외하고 상대5호가로 주문을 집행하게 됩니다.
2.
스크립트 객체화면 설정
차트객체 : 객체명 Chart1 → 속성에서 차트와 동일 아이디 지정
계좌객체 : 객체명 Account1 → 속성에서 계좌번호 선택
3.
스팟수식
var OC, MK, pst;
var BID, SID, BNUM, SNUM;
var 취소주문시간 = 30;//30초
function Main_OnStart()
{
Main.MessageList("Start");
//차트종목 종목코드
OC = Main.GetOrderCode(Chart1.GetCode(1));
//종목객체 요청
Main.ReqMarketData(OC);
pst = 0;
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OC)
{
MK = MarketData;
}
}
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
//신호수량 저장
BV = Signal.count;
//매수주문 집행(신호수량, 현재가 지정가)
BID = Account1.OrderBuy(OC, BV, MK.current,2);
//포지션은 1
pst = 1;
//1번 300초 타이머 셋팅
Main.SetTimer(1, 취소주문시간*1000);
Main.MessageList("매수진입신호:",BV);
}
//스팟에서 매수진입 이후에 매수청산 신호 발생
if (pst == 1 && Signal.signalKind == 2)
{
//1번 타이머 종료
Main.KillTimer(1);
//진입매수주문 미체결 객체 셋팅
Account1.SetUnfillOrderNumber(BNUM);
//미체결이 있으면
if ( Account1.Unfill.count > 0 )
{
//진입수량에서 미체결수량 차감
BV = BV-Account1.Unfill.count;
//미체결 주문 취소
Account1.OrderCancel(BNUM);
}
Main.MessageList("매수청산:",BV);
//매수진입수량에서 미체결수량 차감후 0이 아니면(진입전량 체결이나 일부체결)
if (BV > 0)
{
//청산을 위해 매도주문 집행(수량은 BV, 매수5호가 지정가)
Account1.OrderSell(OC, BV, MK.Bid(5), 2);
}
}
//매도진입신호 발생
if (Signal.signalKind == 3)
{
//신호수량 저장
SV = Signal.count;
//매도주문 집행(신호수량, 현재가 지정가)
SID = Account1.OrderSell(OC, SV,MK.current,2);
//포지션은 -1
pst = -1;
//3번 300초 타이머 셋팅
Main.SetTimer(3, 취소주문시간*1000);
Main.MessageList("매도진입신호:",SV);
}
//스팟에서 매도진입 이후에 매도청산 신호 발생
if (pst == -1 && Signal.signalKind == 4)
{
//3번 타이머 종료
Main.KillTimer(3);
//진입매도주문 미체결 객체 셋팅
Account1.SetUnfillOrderNumber(SNUM);
//미체결이 있으면
if ( Account1.Unfill.count > 0 )
{
//진입수량에서 미체결수량 차감
SV = SV-Account1.Unfill.count;
//미체결 주문 취소
Account1.OrderCancel(SNUM);
}
Main.MessageList("매도청산:",SV);
//매도진입수량에서 미체결수량 차감후 0이 아니면(진입전량 체결이나 일부체결)
if (SV > 0)
{
//청산을 위해 매수주문 집행(수량은 SV, 매도5호가 지정가)
Account1.OrderBuy(OC, SV, MK.Ask(5), 2);
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//매수진입주문에 대한 응답이 오면
if (OrderResponse.orderID == BID)
{
//주문번호 저장
BNUM = OrderResponse.orderNum;
}
//매도진입주문에 대한 응답이 오면
if (OrderResponse.orderID == SID)
{
//주문번호 저장
SNUM = OrderResponse.orderNum;
}
}
//타이머 실행
function Main_OnTimer(nEventID)
{
//1번타이머
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(1);
//매수진입주문에 대해 미체결 셋팅
Account1.SetUnfillOrderNumber(BNUM);
//미체결이 있으면
if (Account1.Unfill.count > 0)
{
//매수진입수량에서 미체결수량 차감
BV = BV-Account1.Unfill.count;
Main.MessageList("매수진입취소:",BV);
//미체결주문 취소
Account1.OrderCancel(BNUM);
}
}
//3번타이머
if (nEventID == 3)
{
//타이머 종료
Main.KillTimer(3);
//매도진입주문에 대해 미체결 셋팅
Account1.SetUnfillOrderNumber(SNUM);
//미체결이 있으면
if (Account1.Unfill.count > 0)
{
//매수진입수량에서 미체결수량 차감
SV = SV-Account1.Unfill.count;
Main.MessageList("매도진입취소:",SV);
//미체결주문 취소
Account1.OrderCancel(SNUM);
}
}
}
JavaScript
복사