예스스탁
예스스탁 답변
2015-09-18 16:28:24
안녕하세요
예스스탁입니다.
예스스팟의 수식답변은 식작성의 가이드입니다.
아래 내용 참고하셔서 수정 보완해 사용하시기 바랍니다.
차트에서 신호가 발생해 주문한것을 인지하려면
스팟에서 차트에서 신호발생시 주문하게 해야 합니다.
차트의 종목이 고정이므로 따로 수식에서 종목객체 생성이 필요없고
스크립트 객체화면에서 종목객체로 지정하시면 됩니다.
아래식은
각 차트에서 신호가 발생하면 현재가로 주문을 하고 타이머를 세팅하고
주문 후 5초후에 정정주문을 합니다.
차트신호 --> 주문/타이머 셋팅 --> 주문응답시 주문번호 저장 --> 5초후 타이머 동작 -->
저장한 주문번호의 미체결 객체를 셋팅해서 미체결 수량이 남아 있으면 정정
정정은 매수주문은 매도2 호가, 매도주문은 매수2호가로 정정합니다.
스크립트 객체설정
차트객체 추가 --> 객체명 Chart1, 차트와 아이디 연결
차트객체 추가 --> 객체명 Chart2, 차트와 아이디 연결
차트객체 추가 --> 객체명 Chart3, 차트와 아이디 연결
종목객체 추가 --> 객체명 MarketData1, Chart1과 같은 종목을 설정
종목객체 추가 --> 객체명 MarketData2, Chart2과 같은 종목을 설정
종목객체 추가 --> 객체명 MarketData3, Chart3과 같은 종목을 설정
계과객체 추가 --> 객체명 Account1
var BuyID1,BxID1,SellID1,SxID1,BNum1,BxNum1,SNum1,SxNum1;
var BuyID2,BxID2,SellID2,SxID2,BNum2,BxNum2,SNum2,SxNum2;
var BuyID3,BxID3,SellID3,SxID3,BNum3,BxNum3,SNum3,SxNum3;
//차트1에서 신호발생하면 현재가로 주문하고 각각 타이머 셋팅
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
BuyID1 = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current), 0);
Main.SetTimer(11, 5000);
}
if (Signal.signalKind == 2)
{
BxID1 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0);
Main.SetTimer(12, 5000);
}
if (Signal.signalKind == 3)
{
SellID1 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0);
Main.SetTimer(13, 5000);
}
if (Signal.signalKind == 4)
{
SxID1 = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, MarketData1.current, 0);
Main.SetTimer(14, 5000);
}
}
//차트2에서 신호발생하면 현재가로 주문
function Chart2_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
BuyID2 = Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), 1, MarketData2.current, 0);
Main.SetTimer(21, 5000);
}
if (Signal.signalKind == 2)
{
BxID2 = Account1.OrderSell(Main.GetOrderCode(MarketData2.code), 1, MarketData2.current, 0);
Main.SetTimer(22, 5000);
}
if (Signal.signalKind == 3)
{
SellID2 = Account1.OrderSell(Main.GetOrderCode(MarketData2.code), 1, MarketData2.current, 0);
Main.SetTimer(23, 5000);
}
if (Signal.signalKind == 4)
{
SxID2 = Account1.OrderSell(Main.GetOrderCode(MarketData2.code), 1, MarketData2.current, 0);
Main.SetTimer(24, 5000);
}
}
//차트3에서 신호발생하면 현재가로 주문
function Chart3_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
BuyID3 = Account1.OrderBuy(Main.GetOrderCode(MarketData3.code), 1, MarketData3.current, 0);
Main.SetTimer(31, 5000);
}
if (Signal.signalKind == 2)
{
BxID3 = Account1.OrderSell(Main.GetOrderCode(MarketData3.code), 1, MarketData3.current, 0);
Main.SetTimer(32, 5000);
}
if (Signal.signalKind == 3)
{
SellID3 = Account1.OrderSell(Main.GetOrderCode(MarketData3.code), 1, MarketData3.current, 0);
Main.SetTimer(33, 5000);
}
if (Signal.signalKind == 4)
{
SxID3 = Account1.OrderSell(Main.GetOrderCode(MarketData3.code), 1, MarketData3.current, 0);
Main.SetTimer(34, 5000);
}
}
//주문응답 발생하면 주문번호 저장
function Main_OnOrderResponse(OrderResponse)
{
//차트1 주문별 주문번호 저장
if (OrderResponse.orderID == BuyID1)
BNum1 = OrderResponse.orderID;
if (OrderResponse.orderID == BxID1)
BxNum1 = OrderResponse.orderID;
if (OrderResponse.orderID == SellID1)
SNum1 = OrderResponse.orderID;
if (OrderResponse.orderID == SxID1)
SxNum1 = OrderResponse.orderID;
//차트2 주문별 주문번호 저장
if (OrderResponse.orderID == BuyID2)
BNum2 = OrderResponse.orderID;
if (OrderResponse.orderID == BxID2)
BxNum2 = OrderResponse.orderID;
if (OrderResponse.orderID == SellID2)
SNum2 = OrderResponse.orderID;
if (OrderResponse.orderID == SxID2)
SxNum2 = OrderResponse.orderID;
//차트3 주문별 주문번호 저장
if (OrderResponse.orderID == BuyID3)
BNum3 = OrderResponse.orderID;
if (OrderResponse.orderID == BxID3)
BxNum3 = OrderResponse.orderID;
if (OrderResponse.orderID == SellID3)
SNum3 = OrderResponse.orderID;
if (OrderResponse.orderID == SxID3)
SxNum3 = OrderResponse.orderID;
}
function Main_OnTimer(nEventID)
{
//차트1 주문 후 타이버 동작
if (nEventID == 11)
{
Main.KillTimer(11);
Account1.SetUnfill(BNum1);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(BNum1, MarketData1.Ask(2));
}
}
if (nEventID == 12)
{
Main.KillTimer(12);
Account1.SetUnfill(BxNum1);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(BxNum1, MarketData1.Bid(2));
}
}
if (nEventID == 13)
{
Main.KillTimer(13);
Account1.SetUnfill(SNum1);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(SNum1, MarketData1.Bid(2));
}
}
if (nEventID == 14)
{
Main.KillTimer(14);
Account1.SetUnfill(SxNum1);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(Sxum1, MarketData1.Ask(2));
}
}
//차트2 주문 후 타이머 동작
if (nEventID == 21)
{
Main.KillTimer(21);
Account1.SetUnfill(BNum2);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(BNum2, MarketData2.Ask(2));
}
}
if (nEventID == 22)
{
Main.KillTimer(22);
Account1.SetUnfill(BxNum2);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(BxNum2, MarketData2.Bid(2));
}
}
if (nEventID == 23)
{
Main.KillTimer(23);
Account1.SetUnfill(SNum2);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(SNum2, MarketData2.Bid(2));
}
}
if (nEventID == 24)
{
Main.KillTimer(24);
Account1.SetUnfill(SxNum2);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(Sxum2, MarketData2.Ask(2));
}
}
if (nEventID == 31)
{
Main.KillTimer(31);
Account1.SetUnfill(BNum3);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(BNum3, MarketData3.Ask(2));
}
}
if (nEventID == 32)
{
Main.KillTimer(32);
Account1.SetUnfill(BxNum3);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(BxNum3, MarketData3.Bid(2));
}
}
if (nEventID == 33)
{
Main.KillTimer(33);
Account1.SetUnfill(SNum3);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(SNum3, MarketData3.Bid(2));
}
}
if (nEventID == 34)
{
Main.KillTimer(34);
Account1.SetUnfill(SxNum3);
if (Account1.Unfill.count > 0)
{
Account1.OrderReplacePrice(Sxum3, MarketData3.Ask(2));
}
}
}
즐거운 하루되세요
> adino30 님이 쓴 글입니다.
> 제목 : 미체결정정 복수개의 차트 적용방법 문의
> 안녕하세요 매번도움 감사드립니다.
아래와 같은 미체결발생시 주문정정 하는 코드를 검색하였습니다
아래코드를 3개의차트에 적용하는 코드 부탁 드립니다.
(각 차트에서 매수매도 신호발생시 각 차트종목의 주문 미체결에 따른 정정주문)
-------------------------아래-----------------------
var Onum;
var OCode;
var OKind;
//주문응답 수신
function Main_OnOrderResponse(OrderResponse)
{
//주문번호 저장
ONum = OrderResponse.orderNum;
OCode = OrderResponse.code;
OKind = OrderResponse.orderKind;
//타이머 실행
Main.SetTimer(1, 5000);//5초 타이머
}
//타이머 동작
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//타이머 중지
Main.KillTimer(1);
//Onum주문번호 미체결 셋팅
Account1.SetUnfillOrderNumber(ONum);
//미체결로 남아 있으면
if (Account1.Unfill.count > 0)
{
//종목객체 요청
Main.ReqMarketData(OCode,0,0);
}
}
}
//종목객체 수신
function Main_OnRcvMarketData(MarketData)
{
var Object = MarketData;
//수신받은 종목객체가 Onum과 같으면
if (MarketData.code == ONum)
{
Account1.SetUnfillOrderNumber(ONum);
//수량이 남아 있고 매도주문이면 매수2호가로 정정
if (Account1.Unfill.count > 0 && Account1.Unfill.position == 1)
{
Account1.OrderReplacePrice(ONum, MarketData.Bid(2));
}
//수량이 남아 있고 매수주문이면 매도2호가로 정정
if (Account1.Unfill.count > 0 && Account1.Unfill.position == 2)
{
Account1.OrderReplacePrice(ONum, MarketData.Ask(2));
}
//사용이 끝났으므로 수신받은 종목객체는 삭제
Main.RemoveMarketData(Object);
}
}