예스스탁
예스스탁 답변
2023-05-30 13:21:52
안녕하세요
예스스탁입니다.
올려주신 내용을 정확히 이해하지 못했습니다.
현재 수식이 발생하면 주문이 시장가 주문입니다.
시장가는 시장에서 가장 빨리 체결될수 있는 가격에 주문을 하므로
이후 취소 후 미체결 등을 확인해서 재주문이 필요가 없습니다.
또한 체결응답에서 확인하시면
주문후 체결이 없으면 재주문이 불가합니다.
아래와 같이 가이드식 작성해 드립니다.
주문후 주문응답이 수신되면 주문번호를 저장하고
5초 후에 미체결이면 취소하고 다시 재주문입니다.
// 전역변수선언
var exit;
var PL //종합손익 확인위한 전역변수선언
var Position;
var Snum;
var Bnum;
var BuyFill;
var SellFill;
var ID1,ID2,Num1,Num2;
var Xcode1,Xpst1,Xvol1,XID1;
var Xcode2,Xpst2,Xvol2,XID2;
//스팟 시작
function Main_OnStart()
{
Main.SetTimer(1, 10000);
//SetTimer(nEventID,nElapse) nElapsesms 타이머 반복주기로 1000==1초
exit = false;
}
function Main_OnTimer(nEventID)
//타잉머의 ID, OnTimer이벤트 발생시 자동생성되는 다른 OnTimer이벤트와 구분하기 위한 ID를 생성하여 리턴
{
if (nEventID == 1)
{
if (exit == false)
{
//손익계산
//SetBalanceItem(sItemCode, nPosition)
//sItemCode :종목코드,단축코드 nPosition 0:구분없음 1:매도 2:매수
//MarketData1 종목 잔고셋팅
Account1.SetBalanceItem(Cd1.code, 0);
//잔고정보 변수에 저장
var vol1 = Account1.Balance.count; //수량
var pos1 = Account1.Balance.position; //포지션방향(매도1, 매수2)
var PL1 = Account1.Balance.profit; //손익
Main.MessageList("종목1",vol1,pos1,PL1);
//MarketData2 종목 잔고셋팅
Account1.SetBalanceItem(Ad2.code, 0);
//잔고정보 변수에 저장
var vol2 = Account1.Balance.count; //수량
var pos2 = Account1.Balance.position; //포지션방향(매도1, 매수2)
var PL2 = Account1.Balance.profit; //손익
Main.MessageList("종목2",vol2,pos2,PL2);
//합산손익이 1000불이상이면
PL = PL1 + PL2;
Main.MessageList("종합손익",PL);
//테스트 완료----------------------------------------------------------
if (PL >= 1000)
{
Exit = true;
//종목1이 매도포지션이면
if (pos1 == 1)
{
//전량 시장가로 매수주문(청산)
//ID1에 주문아이디 저장
ID1 = Account1.OrderBuy(Cd1.code,vo11, 0, 1);
//주문가격 0, 시장가 주문이므로(1)
}
//종목1이 매수포지션이면
if (pos1 == 2)
{
//전량 시장가로 매도주문(청산)
//ID1에 주문아이디 저장
ID1 = Account1.OrderSell(Ad2.code,vo11, 0, 1);
}
//종목2가 매도포지션이면
if (pos2 == 1)
{
//전량 시장가로 매수주문(청산)
//ID2에 주문아이디 저장
ID2 = Account1.OrderBuy(Ad2.code,vo12, 0, 1);
}
//종목2가 매수포지션이면
if (pos2 == 2)
{
//전량 시가로 매도주문(청산)
//ID2에 주문아이디 저장
ID2 = Account1.OrderSell((Ad2.code,vo12, 0, 1);
}
}
}
}
//2번 타이머
if (nEventID == 2)
{
Main.KillTimer(2);
//Num1주문번호 미체결 객체 셋팅
Account1.SetUnfillOrderNumber(Num1)
//미체결 수량이 있으면
if (Account1.Unfill.count > 0)
{
//종목코드 저장
Xcode1 = Account1.Unfill.code;
//주문구분 저장
Xpst1 = Account1.Unfill.orderKind;
//주문수량 저장
Xvol = Account1.Unfill.count;
//취소주문, 주문아이디 XID1 저장
XID1 = Account1.OrderCancel(Num1);
}
}
//3번 타이머
if (nEventID == 3)
{
Main.KillTimer(3);
//Num2주문번호 미체결 객체 셋팅
Account1.SetUnfillOrderNumber(Num2)
//미체결 수량이 있으면
if (Account1.Unfill.count > 0)
{
//종목코드 저장
Xcode2 = Account1.Unfill.code;
//주문구분 저장
Xpst2 = Account1.Unfill.orderKind;
//주문수량 저장
Xvo2 = Account1.Unfill.count;
//취소주문, 주문아이디 XID2 저장
XID2 = Account1.OrderCancel(Num2);
}
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//주문응답 아이디가 ID1과 같으면
if (OrderResponse.orderID == ID1)
{
//주문번호 저장
Num1 = OrderResponse.orderNum;
//2번 타이머 5초
Main.SetTimer(2, 5000)
}
//주문응답 아이디가 ID1과 같으면
if (OrderResponse.orderID == ID2)
{
//주문번호 저장
Num2 = OrderResponse.orderNum;
//3번 타이머 5초
Main.SetTimer(3, 5000)
}
//주문응답 아이디가 XID1과 같으면
//시장가로 재주문
if (OrderResponse.orderID == XID1)
{
if (Xpst1 == 1)
{
Account1.OrderSell(Xcod1, Xvol1, 0, 1);
}
if (Xpst1 == 2)
{
Account1.OrderBuy(Xcod1, Xvol1, 0, 1);
}
}
//주문응답 아이디가 XID1과 같으면
//시장가로 재주문
if (OrderResponse.orderID == XID2)
{
if (Xpst2 == 1)
{
Account1.OrderSell(Xcod2, Xvol2, 0, 1);
}
if (Xpst2 == 2)
{
Account2.OrderBuy(Xcod2, Xvol2, 0, 1);
}
}
}
즐거운 하루되세요
> 멋진감자 님이 쓴 글입니다.
> 제목 : 전화상담 및 친절한 수식감사합니다.
> 전화상담 및 친절한 수식감사합니다.
친절한 수식덕분에 예스트레이더에서 저를 어렵게하던 부분이
해결되었습니다.
전화상담으로 예스스팟을 알려주시고
자바스크립터도 공부하게 해주시고
덕분에 예스스팟메뉴얼 usb에 담아 프린트 링제본해서
3번 완독 하고 2번 예제 실습하니
이제 어느정도 이해가 되네요
// 전역변수선언
var exit;
var PL //종합손익 확인위한 전역변수선언
var Position;
var Snum;
var Bnum;
var BuyFill;
var SellFill;
//스팟 시작
function Main_OnStart()
{
Main.SetTimer(1, 10000);
//SetTimer(nEventID,nElapse) nElapsesms 타이머 반복주기로 1000==1초
exit = false;
}
function Main_OnTimer(nEventID)
//타잉머의 ID, OnTimer이벤트 발생시 자동생성되는 다른 OnTimer이벤트와 구분하기 위한 ID를 생성하여 리턴
{
if (nEventID == 1)
{
if (exit == false)
{
//손익계산
//SetBalanceItem(sItemCode, nPosition)
//sItemCode :종목코드,단축코드 nPosition 0:구분없음 1:매도 2:매수
//MarketData1 종목 잔고셋팅
Account1.SetBalanceItem(Cd1.code, 0);
//잔고정보 변수에 저장
var vol1 = Account1.Balance.count; //수량
var pos1 = Account1.Balance.position; //포지션방향(매도1, 매수2)
var PL1 = Account1.Balance.profit; //손익
Main.MessageList("종목1",vol1,pos1,PL1);
//MarketData2 종목 잔고셋팅
Account1.SetBalanceItem(Ad2.code, 0);
//잔고정보 변수에 저장
var vol2 = Account1.Balance.count; //수량
var pos2 = Account1.Balance.position; //포지션방향(매도1, 매수2)
var PL2 = Account1.Balance.profit; //손익
Main.MessageList("종목2",vol2,pos2,PL2);
//합산손익이 1000불이상이면
PL = PL1 + PL2;
Main.MessageList("종합손익",PL);
//테스트 완료----------------------------------------------------------
if (PL >= 1000)
{
Exit = true;
//종목1이 매도포지션이면
if (pos1 == 1)
{
//전량 시장가로 매수주문(청산)
Account1.OrderBuy(Cd1.code,vo11, 0, 1);
//주문가격 0, 시장가 주문이므로(1)
}
//종목1이 매수포지션이면
if (pos1 == 2)
{
//전량 시장가로 매도주문(청산)
Account1.OrderSell(Ad2.code,vo11, 0, 1);
}
//종목2가 매도포지션이면
if (pos2 == 1)
{
//전량 시장가로 매수주문(청산)
Account1.OrderBuy(Ad2.code,vo12, 0, 1);
}
//종목2가 매수포지션이면
if (pos2 == 2)
{
//전량 시가로 매도주문(청산)
Account1.OrderSell((Ad2.code,vo12, 0, 1);
}
}
}
}
//체결통보이벤트 발생 후 체결여부 확인하고 체결될떼까지 미체결주문 누적 없도록
기존주문취소하고 일정타임이후 재주문 -----------------------------------
function Main_OnNotifyFill(NotifyFill)
{
if (Position == 1 && NotifyFill == Bnum)
//매수신호발생시(Bnum) 주문번호와 주문시 저장된 주문번호(NotifyFill)가 같으면 주문체결
{
BuyFill = 1;
//주문체결되면 BuyFill 변수에 1을 저장
}
if (Position == -1 && NotifyFill == Snum)
{
SellFill = 1;
}
}
}
체결여부 확인하고 일정시간 이후 시장가로 재주문을 넣어야 하는데
일단 두종목 이 모두 미체결 또는 한종목만 체결 또는 모두 미체결 확인하고
동시에 일정시간 후 시장가로 재주문하는 것 코딩이
한종목이면 할 수 있을 것 같은데 두종목에 조건도 3가지니 논리상 감이 잘 안오네요
참고할 수 있는 수식 부탁드립니다.
바쁘신데 죄송하고 감사합니다.