답변완료
주문체결 응답 이벤트
선물 시스템은 예스랭귀지로 만들고, 예스랭귀지 시스템 신호를 받아서 예스스팟에서 매매를 진행합니다.
매수 진행 중에 매도 신호가 발생하여 리버스가 된 경우 스팟에서 OrderResponse 이벤트가 다소 불안정한 것 같아 문의 드립니다.
리버스 발생시 시그널(Signal.signalKind)은 매수청산(2) -> 매도(3) 순서로 발생되겠지요. 실제 상황에서는 거의 동시에 이뤄질 것입니다.
이때, 매수청산 이후 발생한 매도에 대해 주문접수>주문응답>체결응답을 확인하려고 하는데요. 매수 청산이 잘 이뤄지고 매도 신규 진입도 잘 이뤄졌으나 신규 진입한 매도에 대한 주문 응답이 동작하지 않는 경우가 있습니다. 항상 그런 것은 아닌 것 같고 되다 안되다 그러네요... 참고로, 현재 테스트를 위해 모의서버를 사용 중이며, 3개 이상의 시스템 신호를 하나의 스팟에서 동시에 처리합니다.
혹시, 이 문제가 매수청산에 대한 주문응답과 신규매도 주문응답이 거의 동시에 들어오게 되면서 주문응답 이벤트가 뒤에 들어온 신규매도 주문응답 이벤트를 놓치거나 스킵하게 될 수도 있는 건지요?
스팟 코드는 아래와 같습니다.
0) 전역 변수:
var BuyOrderID = new Array(4);
var ShortOrderID = new Array(4);
var ExitOrderID = new Array(4);
var BuyOrderNumber = new Array(4);
var ShortOrderNumber = new Array(4);
var ExitOrderNumber = new Array(4);
1) 시스템 시그널:
function Chart1_OnRiseSignal(Signal)
{
MakeOrder(1, Signal.signalKind);
}
function Chart2_OnRiseSignal(Signal)
{
MakeOrder(2, Signal.signalKind);
}
function Chart3_OnRiseSignal(Signal)
{
MakeOrder(3, Signal.signalKind);
}
function MakeOrder(ChartNumber, ChartSignal)
{
if(ChartSignal == 1) {
BuyOrderID[ChartNumber] = Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(5), 0);
Start[ChartNumber] = 1;
}
if(ChartSignal == 2 && Start[ChartNumber] == 1) {
ExitOrderID[ChartNumber] = Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(5), 0);
}
if(ChartSignal == 3) {
ShortOrderID[ChartNumber] = Account1.OrderSell(MarketData1.code, 1, MarketData1.Bid(5), 0);
Start[ChartNumber] = 1;
}
if(ChartSignal == 4 && Start[ChartNumber == 1) {
ExitOrderID[ChartNumber] = Account1.OrderBuy(MarketData1.code, 1, MarketData1.Ask(5), 0);
}
}
2) 주문 응답
function Main_OnOrderResponse(OrderResponse)
{
for(var i=1; i<=3; i++)
{
if(OrderResponse.orderID == BuyOrderID[i]) {
BuyOrderNumber[i] = OrderResponse.orderNum;
}
if(OrderResponse.orderID == ShortOrderID[i]) {
ShortOrderNumber[i] = OrderResponse.orderNum;
}
if(OrderResponse.orderID == ExitOrderID[i]) {
ExitOrderNumber[i] = OrderResponse.orderNum;
}
}
}
3) 주문 체결 응답
function Main_OnNotifyFill(NotifyFill)
{
for(var i=1; i<=3; i++)
{
if(NotifyFill.orderNum == BuyOrderNum[i]) {
Main.MessageList("신규 매수 체결 응답");
}
if(NotifyFill.orderNum == ShortOrderNum[i]) {
Main.MessageList("신규 매도 체결 응답");
}
if(NotifyFill.orderNum == ExitOrderNum[i]) {
Main.MessageList("청산 주문 체결 응답");
}
}
}
2014-09-03
1123
글번호 223146
답변완료
스팟문의
스팟문의드립니다.
해외선물 골드 기준으로 현재 잔고금액의 30%에서 최대주문가능 계약수를 구하는 방법을 알고 싶습니다.
예로 10억의 자금이 있다고 할때 30%인 3억으로 최대가능 계약수를 구한뒤 매수신호가 발생하면 3억으로 10틱 차이로 주문을 쫘악 내고 싶습니다. 만약 3억으로 10계약 매수가능하다고 할때, 현재가가 1300.00 이라고 하면 1300.00에 한계약, 1299.0 1계약, 1298.0 1계약 ~ 1290.0 1계약으로 모두 10계약 매수주문을 냅니다.
여기서 A신호일때는 호가를 5틱 차이로 주문하고, B신호일때는 호가를 10틱차이로 주문을 합니다.
각각의 주문은 배열을 사용해서 주문번호를 기억합니다.
매수청산신호가 발생하면 미체결 진입은 모두 취소시키고, 마찬가지로 진입된 수량을 A신호명일때는 10틱차이로 매도호가에 깔고, B청산신호일때는 5틱차이로 매도호가에 깝니다.
이후 시간이 지나 만약 미체결 수량이 잔고에 있고 매도신호가 발생하면 시장가로 모두 매수청산합니다.
정전이나 예스스팟이 갑작스럽게 종료되는 것을 예방하기 위해 종료시 포지션 진입유무, 포지션, 수량, 진입신호명 등의 정보를 기억하고 있다가, 다시켰을때 이 데이타를 이용했으면 합니다.
요청사항이 많은데 도움주시면 너무 감사하겠습니다.
2014-08-28
1009
글번호 223137
답변완료
스팟전략문의
수고많으십니다.
예스트레이더 선물 신호를 이용하여 옵션매수전략을 개발하고 있는데요.
신규로 예스랭귀지에 Piramiding 전략을 추가하였고, 개념은 아래와 같습니다.
선물매수신호 -> 콜매수
선물매수신호 -> 콜매수 -> 선물매수청산신호 -> 콜매수청산
선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수
선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 -> 선물피라미딩매수분청산신호 -> 콜매수청산
선물매수신호 -> 콜매수 -> 선물피라미딩매수신호 -> 콜피라미딩매수 -> 선물매수청산신호 -> 콜매수청산
선물매도신호 -> 풋매수
선물매도신호 -> 풋매수 -> 선물매도청산신호 -> 풋매수청산
선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수
선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 -> 선물피라미딩매도분청산신호 -> 풋매수청산
선물매도신호 -> 풋매수 -> 선물피라미딩매도신호 -> 풋피라미딩매수 -> 선물매도청산신호 -> 풋매수청산
아래의 스팟수식을 위와같은 Piramiding 신호에 대응할 수 있도록 수정부탁드립니다.
//선물매수신호시 콜매수 신호 발생시키기
if (Signal.signalKind == 1)
{
BuySignalCode = CallOrderCode;
CallOrderPrice = Option.GetCurrentByCode(BuySignalCode);
BuyID = Account1.OrderBuy(BuySignalCode, Signal.count, Option.GetAskByCode(BuySignalCode, 5), 0);
Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",CallOrderPrice);
BuyFill = 0;
}
//선물매수신호후 청산신호가 나오면 청산실행
if (Signal.signalKind == 2)
{
CallOrderPrice = Option.GetCurrentByCode(BuySignalCode);
if (BuyFill == 1)
{
Account1.OrderSell(BuySignalCode, Signal.count, Option.GetBidByCode(BuySignalCode, 5), 0)
Main.MessageList("콜종목코드 : ",BuySignalCode," 콜현재가 : ",CallOrderPrice);
}
else
{
Account1.OrderCancel(BuyNum);
Main.MessageLog("매수주문취소");
}
}
//선물매도신호시 풋매수 신호 발생시키기
if (Signal.signalKind == 3)
{
BuySignalCode = PutOrderCode;
PutOrderPrice = Option.GetCurrentByCode(BuySignalCode);
Account1.OrderBuy(BuySignalCode, Signal.count, Option.GetAskByCode(BuySignalCode, 5), 0);
Main.MessageList("풋종목코드 : ",BuySignalCode," 풋현재가 : ",PutOrderPrice);
BuyFill = 0;
}
//선물매도신호후 청산신호가 나오면 청산실행
if (Signal.signalKind == 4)
{
PutOrderPrice = Option.GetCurrentByCode(BuySignalCode);
if (BuyFill == 1)
{
Account1.OrderSell(BuySignalCode, Signal.count, Option.GetBidByCode(BuySignalCode, 5), 0);
Main.MessageList("풋종목코드 : ",BuySignalCode," 풋현재가 : ",PutOrderPrice);
}
else
{
Account1.OrderCancel(BuyNum);
Main.MessageLog("매수주문취소");
}
}
//주문응답 이벤트
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BuyID)
{
BuyNum = OrderResponse.orderNum;
}
}
//체결통보 이벤트
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == BuyNum)
{
BuyFill = 1;
}
}
2014-08-19
1088
글번호 223133