예스스탁
예스스탁 답변
2023-03-16 17:22:25.0
안녕하세요
예스스탁입니다.
1
스팟수식 답변은 식작성의 가이드입니다.
아래 내용 참고하시기 수정보완해 사용하시기 바랍니다.
익절손절은 틱수로 작성해 드립니다.
2
주문을 위해서는 각종목의 종목객체가 필요합니다.
스팟시작시 보유종목에 대해 모두 종목객체를 생성하고
이후 신규로 편입된 종목은 잔고에 편입시 종목객체를 만들게 됩니다.
n초 간격으로 감시를 해서
현재가가 평단가대비 +- 익절틱/손절틱에 도달하면 청산주문을 집행하게 됩니다.
3
영문 업데이트가 게시판 금칙어입니다.
중간에 *이 삽입되어 있으므로 삭제하셔야 합니다.
스크립트객체화면
계좌객체추가 --> 속성에서 객체명은 Account1, 계좌번호 지정
var 익절틱수 = 40;
var 손절틱수 = 40;
var List = [], MK = [],Process = [];
var req;
var step,AddMK;
function Main_OnStart()
{
step = 0;
//스팟 시작시 보유종목이 있으면
//보유종목에 대해 종목객체 생성
var num = Account1.GetTheNumberOfBalances();
if (num > 0)
{
step = 1;
for (i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
List.push(Account1.Balance.code);
}
Main.MessageList("보유종목:", List);
if (List.length > 0)
{
req = 0;
Main.ReqMarketData(List[req]);
Main.MessageList("종목객체요청:", List[req]);
}
}
else
{
//스팟 시작시 보유종목이 없으면
//다음 단계로 넘어가 새로운 종목이 편입되길 기다림
Main.MessageList("보유종목 없음");
step = 2;
}
Main.SetTimer(1, 5000);//5초 타이머
}
function Main_OnRcvMarketData(MarketData)
{
if (step == 1)
{
MK[req] = MarketData;
Process[req] = 0;
Main.MessageList(MK[req].code, MK[req].current);
req = req+1;
if (req < List.length)
{
Main.ReqMarketData(List[req]);
Main.MessageList("종목객체요청:", List[req]);
}
else
{
//스팟 시작시 보유종목에 대해 종목객체 생성이 모우 완료되면
//다음단계로 넘어감
Main.MessageList("end");
step = 2;
}
}
if (AddMK == true)
{
Main.MessageList("AddMK:",MarketData.code, MarketData.current);
MK.push(MarketData);
Process.push(0);
AddMK = false;
}
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)//*제거
{
//신규 종목이 편입되면
if (sAccntNum == Account1.number && lUp*dateID == 30001) //*제거
{
Main.MessageList("신규종목 잔고편입",sItemCode);
//신규 편입종목이 기존 생성한 종목객체가 없으면
var add = true;
if (MK.length > 0)
{
for (i = 0; i < MK.length; i++)
{
if (MK[i].code == sItemCode)
{
add = false;
}
}
}
//새로요청
if (add == true)
{
AddMK = true;
Main.ReqMarketData(sItemCode);
}
}
//종목이 전량 체결되어 잔고에서 삭제되면
if (sAccntNum == Account1.number && lUp*dateID == 30003)//*제거
{
//종목객체 중 같은 이름을 찾아서
for (i = 0; i < MK.length; i++)
{
if (MK[i].code == sItemCode)
{
//해다 종목의 Process는 0
Process[i] = 0;
}
}
}
}
//지정한 타이머 간격으로
function Main_OnTimer(nEventID)
{
var num = Account1.GetTheNumberOfBalances();
//보유종목이 있고 생성한 종목객체가 있을때
if (nEventID == 1 && MK.length > 0 && num > 0 )
{
//전체종목 익절 손절 도달을 체크
for (var i = 0; i < MK.length; i++)
{
Account1.SetBalanceItem(MK[i].code,0);
if (MK[i].code == Account1.Balance.code && Account1.Balance.count > 0 && Process[i] == 0)
{
//평단가
var AP = Account1.Balance.avgUnitCost;
//1틱값
var SC = MK[i].tickSize;
//매도포지션이면
if (Account1.Balance.position == 1)
{
Main.MessageList(MK[i].code,"|매도포지션 : 현재가",MK[i].current,"|평단가:",AP,"|익절가:",AP-SC*익절틱수,"|손절가:",AP+SC*손절틱수);
//익절도달 전량 매도3호가로 청산(매수주문)
if (MK[i].current <= Account1.Balance.avgUnitCost - MK[i].tickSize*익절틱수)
{
Main.MessageList(MK[i].code,"|매도포지션 : 손절도달");
Process[i] = 1;
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, MK[i].Ask(3), 2);
}
//손절도달 전량 매도3호가로 청산(매수주문)
if (MK[i].current >= Account1.Balance.avgUnitCost + MK[i].tickSize*손절틱수)
{
Main.MessageList(MK[i].code,"|매도포지션 : 익절도달");
Process[i] = 1;
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, MK[i].Ask(3), 2);
}
}
//매수포지션이면
if (Account1.Balance.position == 2)
{
Main.MessageList(MK[i].code,"|매수포지션 : 현재가",MK[i].current,"|평단가:",AP,"|익절가:",AP+SC*익절틱수,"|손절가:",AP-SC*손절틱수);
//익절도달 전량 매수3호가로 청산(매도주문)
if (MK[i].current >= Account1.Balance.avgUnitCost + MK[i].tickSize*익절틱수)
{
Main.MessageList(MK[i].code,"|매수포지션 : 익절도달");
Process[i] = 1;
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, MK[i].Bid(3), 2);
}
//손절도달 전량 매수3호가로 청산(매도주문)
if (MK[i].current <= Account1.Balance.avgUnitCost - MK[i].tickSize*손절틱수)
{
Main.MessageList(MK[i].code,"|매수포지션 : 손절도달");
Process[i] = 1;
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, MK[i].Bid(3), 2);
}
}
}
}
}
}
즐거운 하루되세요
> 정거장 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 한국투자 증권에서 나스닥, 항생위주로 거래합니다.
해당 종목에서 수동으로 진입한 후
평가손익이 100만원(달러기준 1000) 이상일 경우 손익 /손절 하거나
평균체결가 대비 40틱 이상일 경우 손익 / 손절하는 수식 부탁드립니다.