예스스탁
예스스탁 답변
2018-07-10 16:14:59
안녕하세요
예스스탁입니다.
1
예스스팟은 예약주문 형태가 가능하지 않습니다.
그러므로 손절은 미리 주문 내는 형태는 가능하지 않습니다.
매수 후 평단가-AA%로 지정가 주문을 내면
주문가격이 낮아 지정가로 주문내면 바로 매도처리됩니다.
목표수익과 같은 경우에는 매도호가 쪽으로 매도주문을 내는 부분이므로 가능합니다.
아래식은 가이드이므로 별도로 테스트된 내용이 아닙니다.
참고하셔서 수정보완해 사용하시기 바랍니다.
var req,BID,Bnum,step;
var OBJ,SList = [],BXList = [];
var AA = 10;//익절 %
function Main_OnStart()
{
Main.SetTimer(1, 5000);
step = 0;
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS1 = HHMMSS;
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//8시
if (step == 0 && nEventID == 1 && HHMMSS >= 80000 && HHMMSS1 < 80000)
{
step = 1;
//보유 종목수
var num = Account1.GetTheNumberOfBalances();
BXLIST = [];
if (num >= 1)
{
//보유종목 종목코드를 배열변수 BXList에 저장
for (var i = 0; i < num; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.count > 0)
{
BXList.push(Account1.Balance.code);
}
}
//저장된 종목을 순서대로 종목객체 생성시작
if (BXList.length >= 1)
{
req = 0;
Main.MessageList(HHMMSS,step," | 매도처리시작 : ",EXLIST.length);
Main.ReqMarketData(BXList[req],0,0);
}
}
//보유종목 없으면 step은 2
if (num == 0)
{
step = 2;
}
}
//종목객체 생성 제한에 걸리면 지정한 시간(초) 이후에 다시 요청
if (step == 1 && nEventID == 2)
{
Main.KillTimer(2);
S = Main.ReqMarketData(BXList[req],0,0);
}
//15시 25분
if (nEventID == 1 && step == 2 && HHMMSS >= 152500)
{
//step은 3으로
step = 3;
//타이머는 더이상 불필요하므로 종료
Main.KillTimer(1);
//종목검색 요청
Main.ReqPowerSearch("사용자검색조건명");
}
//종목객체 생성 제한에 걸리면 지정한 시간(초) 이후에 다시 요청
if (step == 2 && nEventID == 2)
{
Main.KillTimer(2);
S = Main.ReqMarketData(List[req],0,0);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
//종목검색 완료
if (step == 3 && nCount > 0)
{
//step은 4로
step = 4;
//SList에 종목리스트 저장
SList = aItemList;
//1개 종목이상이면 요청시작
if (SList.length > 0)
{
req = 0;
Main.ReqMarketData(SList[req],0,0);
}
}
}
function Main_OnRcvMarketData(MarketData)
{
OBJ = MarketData;
//매도종목에 대해 종목객체가 생성되면
if (step == 1 && OBJ.code == BXList[req])
{
//잔고 셋팅
Account1.SetBalance(BXList[req], 0);
//수량이 잇으면
if (Account1.Balance.count > 0)
{
//평단가 +AA% 가격 계산
var XP = Account1.Balance.avgUnitCost*(1+AA/100);
var XT = OBJ.GetTickSize(XP);
var PP = Math.floor(XP/XT)*XT;
//잔고수량 전량 지정가로 매도주문
Account1.OrderSell(BXList[req],Account1.Balance.count,PP,0);
//종목객체는 삭제
Main.RemoveMarketData(OBJ);
//카운트 1 증가
req = req+1;
//매도종목에 대해 모두 요청하지 않았으면
if (req < BXList.length)
{
//다음종목 종목객체 요청
S = Main.ReqMarketData(BXList[req],0,0);
//종목객체 요청에 제한 시간에 걸리면)
if (S == -1)
{
//20초 타이머 동작(타이머 아이디 2번)
Main.SetTimer(2, 20000);
}
}
//모두 주무냈으면 step은 2로
if (req == BXList.length)
{
Main.MessageList("매도주문완료");
step = 2;
}
}
}
//매수종목의 종목객체가 수신되면
if (step == 4 && OBJ.code == SList[req])
{
//백만원치 시장가로 주문(수량산정시 가격이 필요하므로 백만원을 매도1호가를 나누어 산정 )
BID = Account1.OrderBuy(OBJ.code, Math.floor(1000000/OBJ.Ask(1)),0,1);
}
}
//주문응답
function Main_OnOrderResponse(OrderResponse)
{
//주문응답 수신되면
if (OrderResponse.orderID == BID)
{
//주문번호 저장
Bnum = OrderResponse.orderNum;
}
}
//체결응답
function Main_OnNotifyFill(NotifyFill)
{
//매수주문에 대한 체결응답을 받고
if (NotifyFill.orderNum == Bnum)
{
//주문번호로 미체결이 셋팅
Account1.SetUnfill(Bnum);
//해당 주문번호로 미체결이 없으면(전량체결)
if (Account1.Unfill.count == 0)
{
//잔고셋팅
Account1.SetBalance(SList[req], 0);
//잔고수량이 있으면
if (Account1.Balance.count > 0)
{
//목표수익가격 계산
var XP = Account1.Balance.avgUnitCost*(1+AA/100);
var XT = OBJ.GetTickSize(XP);
var PP = Math.floor(XP/XT)*XT;
//매도주문
Account1.OrderSell(List[req],Account1.Balance.count,PP,0);
//종목객체는 삭제
Main.RemoveMarketData(OBJ);
//카운트 1증가
req = req+1;
//매수할 다음종목의 종목객체 요청
if (req < SList.length)
{
S = Main.ReqMarketData(List[req],0,0);
if (S == -1)
{
Main.SetTimer(2, 20000);
}
}
//모두 요청되엇으면 주문종료
if (req == SList.length)
{
step = 4;
Main.MessageList("주문완료");
}
}
}
}
}
2
매도가능수량으로 제공되는 값은 없습니다.
각 잔고 셋팅하시면 보유수량만 리턴됩니다.
즐거운 하루되세요
> 여세우 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 수고하십니다.
(1) 파워종목검색에서 검색이 되면,
검색된 종목 모두 100만원씩 3시25분에 시장가 매수하고,
매수가 되면 바로 지정가 AA% 익절 매도주문을 내고, 당일 매도가 되지 않으면
다음날 장시작 전 8시에 지정가 AA% 익절, BB% 손절 주문을 넣는 식 부탁드립니다.
(2)주식 현물 계좌잔고에서 매도"가능수량"을 확인할 수 있는 방법 부탁드립니다.