답변완료
수식에 오류가 없는지 점검부탁드립니다
아래 식은
선물 10개 진입 주문후
1. 일부만 체결되고 나머지 미체결된 후 청산신호발생한 경우 미체결분량은 취소하고 체결된 것만 청산주문함
2. 청산주문 중 일부만 체결되고 나머지 미체결시 미체결부분은 30초 경과시 우선 2호가 주문함
을 작성한 것입니다.
1) 스팟이 처음이라 이것저것 예제보고 붙여넣기해서 작성해보았는데요... 잘 작성된 것인지 점검부탁드립니다.^^
2) 그리고, 청산주문 중 일부만 체결되고 나머지 미체결시 미체결부분은 30초 경과시 시장가주문하려면 어떻게 작성해야하는지 좀 알려주세요....
3) 그리고, 예를 들어, 10계약 매수진입 후 매도신호 발생시 20개 매도 주문(10개는 청산, 10개는 신규 매도)이 들어갔을때 그 중 15개만 매도 체결된 경우 스팟에서는 우선 10개는 signalkind == 2로 잡고 나머지 5개만 signalkind == 3으로 잡히는거 맞나요?
var EntryVol = 10; //진입수량
var BEid,BEnum,SEid,SEnum,BEidx,SEidx,BEnumx,SEnumx;
function Main_OnStart()
{
Main.MessageList("스팟시작");
}
function Chart1_OnRiseSignal(Signal)
{
//Buy신호 발생하면 10개약 매수1호가로 매수
if (T == 0 && Signal.signalKind == 1)
{
T = 1;
BEid = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Bid(1),0);
}
//Exitlong신호 발생하면
if (T == 1 && Signal.signalKind == 2)
{
T = 0;
//매수진입의 주문번호로 미체결 객체 셋팅
Account1.SetUnfill(BEnum);
//미체결이 있으면 취소
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(BEnum)
}
//잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
//보유한 매수포지션이 있으면 매도1호가로 전량 매도(청산)
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
BEidx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(1),0);
}
}
//Sell신호 발생하면 10개약 매도1호가로 매도
if (T == 0 && Signal.signalKind == 3)
{
T = -1;
SEid = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),EntryVol, MarketData1.Ask(1),0);
}
if (T == -1 && Signal.signalKind == 4)
{
T = 0;
//매도진입의 주문번호로 미체결 객체 셋팅
Account1.SetUnfill(SEnum);
//미체결이 있으면 취소
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SEnum)
}
//잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
//보유한 매도포지션이 있으면 매수1호가로 전량 매수(청산)
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
SEidx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(1),0);
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BEid)
{
BEnum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == SEid)
{
SEnum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == BEidx)
{
BEnumx = OrderResponse.orderNum;
Main.SetTimer(1,30000);
}
if (OrderResponse.orderID == SEidx)
{
SEnumx = OrderResponse.orderNum;
Main.SetTimer(2,30000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Account1.SetUnfill(BEnumx);
//매수포지션 청산주문후 미체결이 있으면 잔고셋팅
if (Account1.Unfill.count > 0)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
}
// 30초 경과시 매수2호가 정정주문
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderReplacePrice(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Bid(2),0);
Main.KillTimer(1);
}
}
if (nEventID == 2)
{
Account1.SetUnfill(SEnumx);
//매도포지션 청산주문후 미체결이 있으면 잔고셋팅
if (Account1.Unfill.count > 0)
{
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
}
// 30초 경과시 매도2호가 정정주문
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderReplacePrice(Main.GetOrderCode(MarketData1.code),Account1.Balance.count, MarketData1.Ask(2),0);
Main.KillTimer(2);
}
}
}
2019-02-20
3097
글번호 224737
답변완료
질문있습니다
수고에 감사드립니다.
현재 저는 유진예스트레이더를 이용하여 지정가 매매를 하고 있습니다.
그런데, 지정가로 매매하다보니 미체결이 종종 발생하여 어려움이 있습니다.
이 미체결을 조금이나마 줄일수 있을까 해서 질문드립니다.
제가 사용하는 주문유형이 Atlimit, AtStop, Onclose 가 섞여 있는데,
예스트레이더는 Atlimit든 AtStop든 그 가격에 주가가 도달해야 비로소 주문이 발생하는데,
AtStop과 Onclose은 미리 주문발생이 어렵다 하더라도
혹시 예스스팟을 이용하면 Atlimit는 미리 주문발생이 가능하지 않을까 해서요.
Atlimit의 경우에는 예스트레이더에서 "[3030]시스템모니터"의 "예비신호"를 클릭해보면
"신호가격"이 나타나는데, 제가 원하는 것은...
예스스팟을 이용하여 이 Atlimit의 예비신호가격에 미리 주문을 발생시키고
한 봉이 경과할때까지 Atlimit 주문이 실행되지 않고 다음봉에서 Atlimit 예비신호가격이 바뀌면 그 가격으로 주문이 정정되도록 하고 싶습니다.
그리고, 예비신호가 Atlimit가 아니거나 다른유형의 주문(Atstop 또는 Onclose 주문)을 포함하여 다른 주문이 이뤄졌는데, 미체결주문이 남아있다면 미체결주문은 취소되기를 원합니다.
가능할까요?
가능하다면 방법을 알려주시면 고맙겠습니다.
제가 예스스팟에 대해서는 아는 것이 없는데 도움을 부탁드립니다.
2019-02-12
2967
글번호 224731
답변완료
종목선정 문의
안녕하세요 한결같은 답변이 매우 큰 도움이 되고 있습니다.
아래 수식은 옵션 2.7에 가까운 콜, 풋 옵션종목을 찾는 수식입니다.
이것을 콜풋 내가 5단계, 등가, 외가5단계 범위안에서 델타값이 0.4에 가장 가까운 콜,풋
옵션종목을 찾는 수식으로 변경해주시면 대단히 감사하겠습니다.
// 아래는 수식임
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번 타이머 동작
if (nEventID == 1)
{
//ATM위 행사가 갯수
var UNum = Option.uppersATM;
//ATM아래 행사가 갯수
var LNum = Option.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
var CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
var CallPrice = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언
var PutCode = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언
var PutPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션중 2.7에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.7);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//풋종목 찾기
//풋옵션중 2.7에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.7);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (CC < 99999999 && PP < 99999999)
{
Start = 1;
SC = CallOrderCode;
SP = PutOrderCode;
}
}
}
// 답변 미리 감사드립니다.
2019-02-17
3003
글번호 224727