예스스탁
예스스탁 답변
2013-12-20 16:53:13
안녕하세요
예스스탁입니다.
스팟수식 안에서 종목검색을 만드시긴 어렵고
종목검색은 예스랭귀지에서 종목검색식으로 작성하신 후에
파워종목검색화면에서 해당 검색식을 이용해 사용자검색조건으로 저장하고
스팟에서 사용자검색조건을 실행하도록 해서 사용하셔야 합니다.
1. 종목검색식(예스랭귀지)
우선 아래의 내용으로 종목검색식을 만드신 후에
첨부된 그림과 같이 파워종목검색화면에서
사용자검색조검으로 지정하시면 됩니다.
input : N(1);#1일전
var : 하한가(0), DnLimit(0);
var : dn1(0), dn2(0), dn3(0), dn4(0), dn5(0),dn6(0),dn7(0);
var : 상한가(0), UpLimit(0);
var : up1(0), up2(0), up3(0), up4(0), up5(0),up6(0),Up7(0);
if date >= 19981207 then {
if date < 20050328 && CodeCategory() == 2 then
DnLimit = (BP * 0.12);
Else
DnLimit = (BP * 0.15);
if CodeCategory() == 2 then {
if date >= 20030721 then {
dn1 = int(DnLimit/100)*100;
dn2 = int(DnLimit/100)*100;
dn3 = int(DnLimit/100)*100;
dn4 = int(DnLimit/50)*50;
dn5 = int(DnLimit/10)*10;
dn6 = int(DnLimit/5)*5;
dn7 = int(DnLimit/1)*1;
}
else {
dn1 = int(DnLimit/1000)*1000;
dn2 = int(DnLimit/500)*500;
dn3 = int(DnLimit/100)*100;
dn4 = int(DnLimit/50)*50;
dn5 = int(DnLimit/10)*10;
dn6 = int(DnLimit/10)*10;
dn7 = int(DnLimit/1)*1;
}
}
Else {
dn1 = int(DnLimit/1000)*1000;
dn2 = int(DnLimit/500)*500;
dn3 = int(DnLimit/100)*100;
dn4 = int(DnLimit/50)*50;
dn5 = int(DnLimit/10)*10;
dn6 = int(DnLimit/5)*5;
dn7 = int(DnLimit/1)*1;
}
if CodeCategory() == 1 or CodeCategory() == 2 then {
if sdate < 20101004 Then{
If BP >= 500000 Then
하한가 = BP-dn1;
Else If BP >= 100000 Then
하한가 = BP-dn2;
Else If BP >= 50000 Then
하한가 = BP-dn3;
Else If BP >= 10000 Then
하한가 = BP-dn4;
Else If BP >= 5000 Then
하한가 = BP-dn5;
Else If BP >= 1000 Then
하한가 = BP-dn6;
Else
하한가 = BP-dn6;
}
else{
If BP >= 500000 Then
하한가 = BP-dn1;
Else If BP >= 100000 Then
하한가 = BP-dn2;
Else If BP >= 50000 Then
하한가 = BP-dn3;
Else If BP >= 10000 Then
하한가 = BP-dn4;
Else If BP >= 5000 Then
하한가 = BP-dn5;
Else If BP >= 1000 Then
하한가 = BP-dn6;
Else
하한가 = BP-dn7;
}
}
else if CodeCategory() == 8 or CodeCategory() == 9 then {
하한가 = BP-dn6;
}
}
if date >= 19981207 then {
if date < 20050328 && CodeCategory() == 2 then
UpLimit = (BP[0] * 1.12);
Else
UpLimit = (BP[0] * 1.15);
if CodeCategory() == 2 then {
if date >= 20030721 then {
up1 = int(UpLimit/100+0.00001)*100;
up2 = int(UpLimit/100+0.00001)*100;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/10+0.00001)*10;
up7 = int(UpLimit/1+0.00001)*1;
}
}
Else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
up7 = int(UpLimit/1+0.00001)*1;
}
if CodeCategory() == 1 || CodeCategory() == 2 then {
if sdate < 20101004 Then{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up6);
}
Else{
If BP >= 500000 Then
상한가 = up1;
Else If BP >= 100000 Then
상한가 = iff(up2>=500000, up1, up2);
Else If BP >= 50000 Then
상한가 = iff(up3>=100000, up2, up3);
Else If BP >= 10000 Then
상한가 = iff(up4>=50000, up3, up4);
Else If BP >= 5000 Then
상한가 = iff(up5>=10000, up4, up5);
Else If BP >= 1000 Then
상한가 = iff(up5>=5000, up5, up6);
Else
상한가 = iff(up6>=1000, up6, up7);
}
}
else if CodeCategory() == 8 || CodeCategory() == 9 then { // ETF
상한가 = up6;
}
}
if C[N] >= 상한가[N] and V[N] >= 1000000 and M[N] >= 50000000 Then
find(1);
2.
아래는 스팟 수식입니다.
주석 참고하시기 바랍니다.
스팟 수식안에 게시판 금칙어가 있습니다.
영문 업데이트가 Up*date로 중간에 *표시가 들어가 있으므로
제거하고 적용하셔야 합니다.
var RcvCount;
var List;
var ListCnt;
//종목객체를 저장할 배열변수
var SymBol = new Array(100);
//주문여부를 저장할 배열변수
var Buy = new Array(100);
//매수주문금액
var BuyMoney = 1000000;
function Main_OnStart()
{
//스팟실행시 사용자 조건감색 중 Search1 실행
Main.ReqPowerSearch("Search1")
//초기값(종목객체 생성완료을 알기위해 사용할 변수)
Start = false
RcvCount = 0;
}
//종목검색이 완료되면
function Main_OnRcvItemList(aItemList, nCount)
{
//검색된 종목코드를 모두 저장
List = aItemList;
//검색된 종목수 저장
ListCnt = nCount;
//검색된 종목수와 종목코드들을 디버깅창에 출력
Main.MessageList("종목검색완료 - 전체종목수",ListCnt,"종목코드",List);
//검색된 종목에 대해 첫번째 종목부터 종목객체 요청
Main.ReqMarketData(List[0],10,0);
}
//요청한 종목객체가 생성되면
function Main_OnRcvMarketData(MarketData)
{
//생성 종목수 카운트
RcvCount = RcvCount+1;
Main.MessageList(RcvCount,"번째 종목생성");
//배열변수 SymBol의 RcvCount방에 현재 수신된 종목객체 저장
SymBol[RcvCount] = MarketData;
//다음 순번 종목객체 요청
if (RcvCount < ListCnt)
{
Main.ReqMarketData(List[RcvCount],10,0);
}
//종목객체가 모두 생성되면(종목검색으로 나온 종목수와 생성횟수가 같을때)
if (RcvCount == ListCnt)
{
Main.MessageList("종목생성완료");
Start = true;
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) //*제거
{
//시세 업데이트가 있으면
if (lUp*dateID == 20001 && Start == true) //* 제거
{
//여러 종목객체 중에 현재 업데이트 종목이 어떤 종목인지 확인
for (var i = 1; i <= RcvCount; i++)
{
//for문으로 현재 업데이트된 종목과 같은 종목을 찾음
if (SymBol[i].code == sItemCode)
{
//매수주문
//당일고가와 전일고가 중 큰값대비 -3%에 매수
if (Buy[i] != true && SymBol[i].current <= Math.max(SymBol[i].high,SymBol[i].GetPrevHigh(1))*0.97 )
{
var Vol = 0;
if (SymBol[i].tradeUnit == 1)
Vol = Math.floor(BuyMoney/SymBol[i].current );
else
Vol = Math.floor((BuyMoney/SymBol[i].current )/SymBol[i].tradeUnit)*10;
// SymBol[i].code 종목 매도5호가로 매수주문(수량인 Vol)
Account1.OrderBuy(SymBol[i].code,Vol ,SymBol[i].Ask(5),0);
//Buy배열변수의 동일배열번호에 매수주문을 했음을 알수 있게 true를 저장
Buy[i] = true;
}
//////////////////////////////////////////////////////////////////////////////
//매도주문
//매수주문을 한 종목이면
if (Buy[i] == true)
{
//해당 종목 잔고객체 셋팅
Account1.SetBalanceItem(SymBol[i].code)
//잔고수량이 0보다 크고(잔고수량있음) 현재가가 평균단가 +3% 이상이면 매도주문
if (Account1.Balance.count > 0 && SymBol[i].current >= Account1.Balance.avgUnitCost*1.03)
{
//매수5호가로 잔고의 전량 매도주문
Account1.OrderBuy(SymBol[i].code,Account1.Balance.count ,SymBol[i].Bid(5),0);
}
}
}
}
}
}
3
위식은 전일상한가 종목만 해당됩니다.
종목검색에서 1일전과 2일전을 모두 검색하고 종목을 리턴받으면
해당 종목이 1일전인지 2일전 상한가였는지 알수 없으므로
따로 종목검색식 만드시고 스팟도 별도로 식하나 더 만드시면 됩니다.
스팟의 수식은 가이드라인 정도로 참고용입니다.
주문과 관련된 부분은 저희쪽에서 테스트를 해드리지 못하므로
참고하셔서 수정보완해 사용하셔야 합니다.
즐거운 하루되세요
> 무영세 님이 쓴 글입니다.
> 제목 : 문의드립니다
> 안녕하세요
지난달에 교육받고 이제 막 시스템트레이딩에 공부 중에 있는 무영세라고 합니다.
예스스팟을 이용하여 주식용 트레이딩 프로그램을 공부 겸 해서
작성하고 싶은데 적당한 예제 샘플을 찾지 못하겠네요
-------------------------------------------------------------------------------
대상종목 : 전일 상한가, 전전일 상한가
제외종목 : 관리종목, 우선주
조건 : 상한가 당일 거래량 1,000,000 주 이상 또는 거래대금 50억 이상
위의 조건에 적합한 종목을 찾아서
전일이 상한가이면서 현재봉기준(15분봉상) 으로 금일고가 > 전일고가 이면
금일 고가대비 -3% 에서 매수
아니면
전일 고가대비 -3% 에서 매수
전전일이 상한가이면서 현재봉기준(15분봉상) 으로 금일고가 > 전일고가 이면
금일 고가대비 -5% 에서 매수
아니면
전일 고가대비 -5% 에서 매수
- 매도는 해당되는 매수가 대비 3%에서 매도
- 계좌총액대비 한 종목당 10%의 비중 또는 백만원 균등
-------------------------------------------------------------------------------
위와 같은 전략으로 매매하는 프로그램을
예스스팟을 이용하여 작성하고 싶습니다.
혹시 비슷한 샘플의 프로그램이 있으면 보내주시면 감사하겠습니다.