예스스탁
예스스탁 답변
2019-09-10 14:00:43
안녕하세요
예스스탁입니다.
스팟은 가이드 정도만 작성해 드립니다.
아래 내용 참고하셔서 이후 수정보완하시기 바랍니다.
스팟은 외부변수를 수식안에서 지정할수 없습니다.
스크립트 설정에서 설정하셔야 합니다.
스크립트 객체설정
종목객체추가 ---> 객체명 MarketData1, a종목으로 지정
종목객체추가 ---> 객체명 MarketData2, b종목으로 지정
종목객체추가 ---> 객체명 MarketData3, c종목으로 지정
종목객체추가 ---> 객체명 MarketData4, d종목으로 지정
계좌객체추가 --> 객체명 Account1, 주문계좌번호 지정
외부변수 추가 --> 변수명 bt, 초기값에 매수할 시간지정(8시30분이면 83000) , 데이터형 숫자
외부변수 추가 --> 변수명 t1, 초기값에 매수주문 취소할 시간지정(11시00분이면 110000) , 데이터형 숫자
외부변수 추가 --> 변수명 t2, 초기값에 매도 시작할 시간지정(13시00분이면 130000) , 데이터형 숫자
외부변수 추가 --> 변수명 t3, 초기값에 매도간격 지정(초간격으로 지정) , 데이터형 숫자
외부변수 추가 --> 변수명 n, 상승율값 지정, 데이터형 숫자
외부변수 추가 --> 변수명 p, 하락율값 지정, 데이터형 숫자
외부변수 추가 --> 변수명 m1, 수량지정, 데이터형 숫자
외부변수 추가 --> 변수명 m2, 수량지정, 데이터형 숫자
var HHMMSS, HHMMSS1;
//스팟 첫 실행시
function Main_OnStart()
{
//1번 타이머, 10초
Main.SetTimer(1, 10000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS1 = HHMMSS;
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//지정시간(bt) 매수
if (nEventID == 1 && HHMMSS >= bt && HHMMSS1 < bt)
{
var P1 = MarketData1.prevClose*(1+n/100);
var P2 = Math.floor(P1/MarketData1.GetTickSize(P1));
var P3 = P2*MarketData1.GetTickSize(P1);
Account1.OrderBuy(MarketData1.code, m1,P3,0);
var P1 = MarketData2.prevClose*(1+n/100);
var P2 = Math.floor(P1/MarketData2.GetTickSize(P1));
var P3 = P2*MarketData2.GetTickSize(P1);
Account1.OrderBuy(MarketData2.code, m1,P3,0);
var P1 = MarketData3.prevClose*(1+n/100);
var P2 = Math.floor(P1/MarketData3.GetTickSize(P1));
var P3 = P2*MarketData3.GetTickSize(P1);
Account1.OrderBuy(MarketData3.code, m1,P3,0);
var P1 = MarketData4.prevClose*(1+n/100);
var P2 = Math.floor(P1/MarketData4.GetTickSize(P1));
var P3 = P2*MarketData4.GetTickSize(P1);
Account1.OrderBuy(MarketData4.code, m1,P3,0);
}
if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS1 < t1)
{
if (MarketData1.open > 0 && MarketData1.current <= (MarketData1.prevClose*(1+n/100))*(1-P/100))
Account1.OrderBuy(MarketData1.code, m2,MarketData1.current,0);
if (MarketData2.open > 0 && MarketData2.current <= (MarketData2.prevClose*(1+n/100))*(1-P/100))
Account1.OrderBuy(MarketData2.code, m2,MarketData2.current,0);
if (MarketData3.open > 0 && MarketData3.current <= (MarketData3.prevClose*(1+n/100))*(1-P/100))
Account1.OrderBuy(MarketData3.code, m2,MarketData3.current,0);
if (MarketData4.open > 0 && MarketData4.current <= (MarketData4.prevClose*(1+n/100))*(1-P/100))
Account1.OrderBuy(MarketData4.code, m2,MarketData4.current,0);
}
//t1으로 지정한 시간에 매수 미체결 모두 취소
if (nEventID == 1 && HHMMSS >= t1 && HHMMSS1 < t1)
{
var num = Account1.GetTheNumberOfUnfills();
if (num >= 1)
{
for (var i = 0; i < num;i++ )
{
Account1.SetUnfill(i);
if (Account1.Unfill.orderKind == 2 &&
(Account1.Unfill.code == MarketData1.code ||
Account1.Unfill.code == MarketData2.code ||
Account1.Unfill.code == MarketData3.code ||
Account1.Unfill.code == MarketData4.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
}
}
//t1으로 지정한 시간에 매수 미체결 모두 취소
if (nEventID == 1 && HHMMSS >= t2 && HHMMSS1 < t2)
{
s = 1;
Account1.SetBalance(MarketData1.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData1.code,vv,0,10);
}
Account1.SetBalance(MarketData2.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData2.code,vv,0,10);
}
Account1.SetBalance(MarketData3.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData3.code,vv,0,10);
}
Account1.SetBalance(MarketData4.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData4.code,vv,0,10);
}
Main.SetTimer(2, t3*1000);
}
//t1으로 지정한 시간에 매수 미체결 모두 취소
if (nEventID == 2)
{
s = s+1;
if (s < k)
{
Account1.SetBalance(MarketData1.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData1.code,vv,0,10);
}
Account1.SetBalance(MarketData2.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData2.code,vv,0,10);
}
Account1.SetBalance(MarketData3.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData3.code,vv,0,10);
}
Account1.SetBalance(MarketData4.code, 0);
if (Account1.Balance.count > 0)
{
var vv = Math.floor(Account1.Balance.count/(k-s+1));
if (vv >= 1)
Account1.OrderSell(MarketData4.code,vv,0,10);
}
}
if (s < k)
{
//매도 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
if (num >= 1)
{
for (var i = 0; i < num;i++ )
{
Account1.SetUnfill(i);
if (Account1.Unfill.orderKind == 1 &&
(Account1.Unfill.code == MarketData1.code ||
Account1.Unfill.code == MarketData2.code ||
Account1.Unfill.code == MarketData3.code ||
Account1.Unfill.code == MarketData4.code))
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
}
Account1.SetBalance(MarketData1.code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(MarketData1.code,Account1.Balance.count,0,1);
}
Account1.SetBalance(MarketData2.code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(MarketData2.code,Account1.Balance.count,0,1);
}
Account1.SetBalance(MarketData3.code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(MarketData3.code,Account1.Balance.count,0,1);
}
Account1.SetBalance(MarketData4.code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(MarketData4.code,Account1.Balance.count,0,1);
}
Main.KillTimer(1);
Main.KillTimer(2);
}
}
}
}
즐거운 명절되시길 바랍니다.
> cs아빠 님이 쓴 글입니다.
> 제목 : 매도, 매도식 부탁드립니다.
> =======매수========
1. a,b,c,d종목의 전일종가대비 n%에 m1 수량만큼 매수주문한다.(장전 주문)
2. a,b,c,d종목 현재가가 전일종가의 n%(==매수가) 보다 p% 낮으면 m2 매수주문한다.
3. t1시에 미체결 매수 취소
(영어는 외부변수로 빠지게 해 주세요)
=======매도========
1. t2시부터 미체결 매도 취소
2. 보유종목 호출
3. s회차 매도 시행(최우선) : 매도량은 (호출시 보유량)/(k-s+1) (총 k회 분할매도)
***매도간격은 t3***
ex) 총10회 매도 예정일 때,
1회차 매도시
(호출된 보유량)/(10-1+1) = (보유량)/10
5회차 매도시
(호출된 보유량)/(10-5+1) = (보유량)/6
4. 마지막 회차에서는 (1번,2번) 진행후 잔량 모두 시장가 매도
==> 1-3번을 (k-1)회차 진행후 마지막회차 시장가 매도 진행(4번 항목)
(영어는 외부변수로 빠지게 해 주세요)
부탁드리겠습니다. 감사합니다.