예스스탁
예스스탁 답변
2013-09-24 15:23:55
안녕하세요
예스스탁입니다.
진입의 주문번호만 추적해서 식을 구현할수가 없습니다.
주문번호가 살아있을 경우는 미체결되었을 때 뿐입니다.
체결이 되면 소멸이 되므로 계속 주문번호로 추적해서 내용을 구현할수가 없습니다.
그러므로 수식에서 주문후에 과정이 어디까지 진행되는지 파악할수 있는
step과 같은 변수값이 필요하게 됩니다.
아래식은 BuyStep이 0일때만 매수신호 발생할 때 매수주문(1) 하고 -->
응답이 수신되면(2) --> 미체결객체를 셋팅하고 --> 주문가격 +-5틱을 벋어나면 취소주문(0) 합니다.
주문이 체결되면(3) --> 잔고객체를 셋팅하고--> 체결가격 -9틱이면 매도주문(0)
--> 체결가격 +50틱이면 매도주문(0)
--> 체결 후 최고가가 체결가격 +10이상 상승했고 최고가에서 -2틱 하락하면 매도주문(0)
()의 숫자는 매수주문의 진행상태입니다
buyStep이 0일때는 다시 매수주문이 발생해도 발생하지 않습니다.
var BuyID; //매수주문 아이디 저장
var BuyNum; //매수주문 주문번호 저장
var BuyStep; //매수주문의 진행상황을 판단하기 위한 변수로 사용
var BarSinceHigh; //매수주문 체결후에 최고가 저장위한 변수로 사용
function Main_OnStart()
{
BuyStep = 0;
}
function Chart1_OnRiseSignal(Signal)
{
//BuyStep이 0일때 매수신호 발생하면 주문
//BuyStep은 1
if (BuyStep == 0 && Signal.signalKind == 1)
{
BuyId = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1, MarketData1.current, 0);
BuyStep = 1;
BarSinceHigh = 0;
}
}
//주문응답 수신되면
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuyId)
{
if (OrderResponse.count > 0)
{
//주문번호저장하고
BuyNum = OrderResponse.orderNum;
//buyStep은 2
BuyStep = 2;
}
}
}
//체결응답
function Main_OnNotifyFill(NotifyFill)
{
//BuyBum주문 체결되면
if (NotifyFill.orderNum == BuyBum)
{
//BuyStep은 2
BuyStep = 3;
//체결가격 저장
BuyFillPrice = NotifyFill.fillPrice;
//초기값으로 체결가격을 지정
BarSinceHigh = BuyFillPrice;
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
//BuyStep이 2인상태이고 시세 변경이 있으면
if ( BuyStep == 2 && lUp*dateID == 20001)
{
//BuyNum 주문번호의 미체결 객체 셋팅
Account1.SetUnfillOrderNumber(BuyNum);
//현재가가 미체결객체의 주문가격 +5틱 이상이거나 -5틱이하이면 취소주문
//BuyStep은 0
if ((MarketData1.current >= Account1.Unfill.price + MarketData1.GetTickSize()*5) ||
(MarketData1.current <= Account1.Unfill.price - MarketData1.GetTickSize()*5))
{
Account1.OrderCancel(BuyNum);
BuyStep = 0;
}
}
//BuyStep이 3인상태이고 시세 변경이 있으면
if ( BuyStep == 3 && lUp*dateID == 20001)
{
//현재가가 잔고객체의 체결가격 -9틱이면 매도
//BuyStep은 0
if (MarketData1.current <= BuyFillPrice - MarketData1.GetTickSize()*9)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1, MarketData1.current, 0);
BuyStep = 0;
}
//현재가가 평균단가 +50틱이면 매도
//BuyStep은 0
if (MarketData1.current >= BuyFillPrice + MarketData1.GetTickSize()*50)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1, MarketData1.current, 0);
BuyStep = 0;
}
//체결이후 최고가 계산
if (MarketData1.current >= BarSinceHigh)
BarSinceHigh = MarketData1.current;
//체결이후 최고가가 체결가격 +10이상이고 최고가에서 2틱 하락하면 매도
if ( BarSinceHigh >= BuyFillPrice + MarketData1.GetTickSize()*10 &&
MarketData1.current <= BarSinceHigh - MarketData1.GetTickSize()*2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1, MarketData1.current, 0);
}
}
}
저희쪽에서도 주문이후의 과정을 따로 확인할 방법이 있지는 않습니다.
모두 주문을 내보면서 테스트를 하면서 작성해 봐야 하는 부분입니다.
그러므로 예스스팟 관련 문의의 경우 가이드만 제시되고 저희쪽에서 식의 확답을 드리기 어렵습니다.
예스스팟과 같은 API의 경우에는 사용자분이 테스트를 해가시면서 식을 완성해 가셔야 합니다.
즐거운 하루되세요
> 즐겁게 님이 쓴 글입니다.
> 제목 : 질문 올립니다.
> 안녕하세요.
항상 친절하신 답변 감사드립니다.
한 번 주문한 후, 그 것이 체결되어 청산되든, 아니면 조건이 안 맞아 체결 전에 취소하든,
이런 과정들을 아주 철저하게 주문번호를 연결고리로 하여 추적해 가며 관리하고 싶습니다.
그래서, 아래와 같은 스팟 식을 짜고 싶은데, 아직 잘 되질 않고 있어서 도움을 부탁드립니다.
////////// ////////// ////////// ////////// //////////
아래:
신호에 따라 매수진입 주문(예: 20 이평 80 이평 교차 전략)
주문번호: 88번. (변수로는 가령 BuyNum이라 가정)
1. 이 매수주문이 체결되면:
1.1. 초기손절: 진입가격에서 9틱 하락하면 손절. ((위 주문 번호를 이용해서 코딩))
1.2. 익절: 매수주문이 체결되면 50틱 위에서 익절하도록 익절 주문 냄. ((위 주문 번호를 이용해서 코딩))
1.3. 추적스탑: 그 전까지는(즉 익절 목표에 달성하기 전까지는), 10틱 이상 오르고 2틱 내리면 손절하는 추적스탑. ((위 주문 번호를 이용해서 코딩))
2. 미체결된 경우:
주문 취소: 매수진입 주문 후, 그 주문이 아직 체결되지 않은 상태에서, 시장의 가격이, 처음 매수주문한 가격으로부터, 5틱 오르거나 3틱 내리면 매수진입주문 취소. ((위 주문 번호를 이용해서 코딩))
////////// ////////// ////////// ////////// //////////
이상과 같은 것을, step과 같은 변수 등을 이용하지 않고, 최대한 주문 번호 자체를 이용해서, 즉 그 매수주문이 응답됐는지, 체결됐는지, 아직 안 됐으면 그 주문가격과 현재가격을 비교해서 현재가격이 너무 동떨어져 버렸으면 주문을 취소한다든지 하는 모든 과정을, 아주 철저하게 주문 번호 자체로 추적하며 관리할 수 있는 소스를 짜고자 하는데, 잘 안 되고 있습니다.
신호에 따라 매수주문 내고 하는 것은 별 문제없이 잘 되는데,
특히 잘 안 되는 부분은, 체결되고 난 후, 손절 익절 주문 등이 제가 짠 소스대로 잘 나가 주질 않고,
또 체결 전에 시장 가격이 많이 바뀌어서 주문을 취소해 버리고자 하는 부분도 제가 짠 소스에 의한 대로는 실행이 안 되고 있습니다.
그래서 아주 주문 번호 자체를 이용, 그 주문의 전 과정을 주문번호에 따라 밀착 추적해서 관리하는 방법을 배우고 싶습니다.
전문가님께서 도움을 제시해 주시면 대단히 감사하겠습니다.