예스스탁
예스스탁 답변
2014-02-17 18:25:47
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
스팟수식은 정교하게 검토해서 올려드리진 않습니다.
가이드이므로 주석참고하셔서 수정 보완해 사용하시기 바랍니다.
스팟 수식안에 게시판 금칙어가 있습니다.
영문 업데이트가 Up*date로 중간에 *표시가 들어가 있으므로
제거하고 적용하셔야 합니다.
스크립트객체화면에서 계좌객체가 설정되어 있어야 합니다.
계좌객체명은 Account1입니다.
var RcvCount;
var List = new Array(100);
var ListCnt;
var Period1 = 5;
var Period2 = 20;
var Percent = 6;
//종목객체를 저장할 배열변수
var SymBol = new Array(100);
//현재 체결시세를 저장할 변수
var C1 = new Array(100);
//직전 체결시세를 저장할 변수
var C2 = new Array(100);
//주문여부를 저장할 배열변수
var Buy = new Array(100);
//매수주문금액
var BuyMoney = 1000000;
function Main_OnStart()
{
//스팟실행시 지정한 이름의 관심종목을 호출
//관심종목의 종목수
ListCnt = Main.GetItemCountOfInterest("JTurn")
Main.MessageList("전체종목수",ListCnt);
//차례대로 배열변수 List에 저장( 최대 100종목)
for(var i = 0; i < ListCnt; i++)
{
List[i] = Main.GetItemCodeInInterest("JTurn", i);
Main.MessageList("관심그룹 종목",List[i]);
}
Main.ReqMarketData(List[0],50,0);
Start = false
RcvCount = 0;
}
//요청한 종목객체가 생성되면
function Main_OnRcvMarketData(MarketData)
{
//생성 종목수 카운트
RcvCount = RcvCount+1;
//배열변수 SymBol의 RcvCount방에 현재 수신된 종목객체 저장
SymBol[RcvCount] = MarketData;
Main.MessageList(RcvCount,"번째 종목생성",MarketData.code);
//다음 순번 종목객체 요청
if (RcvCount < ListCnt)
{
Main.SetTimer(1, 1000);
}
//종목객체가 모두 생성되면(종목검색으로 나온 종목수와 생성횟수가 같을때)
if (RcvCount == ListCnt)
{
Main.KillTimer(1);
Start = true;
Main.MessageList("종목생성완료",Start);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.ReqMarketData(List[RcvCount],50,0);
}
}
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)
{
C2[i] = C1[i];
C1[i] = SymBol[i].current;
//5이평 20이평 계산
sum1 = 0;
sum2 = 0;
for (var ii = 1; ii < Period2; ii++)
{
sum2 = sum2 + SymBol[i].GetPrevClose(ii);
if (i < Period1)
sum1 = sum1 + SymBol[i].GetPrevClose(ii);
}
//5이평
var mav5 = (sum1 + SymBol[i].current)/Period1;
//20이평
var mav20 = (sum2 + SymBol[i].current)/Period2;
//Envelope 하단
var BBdn = mav20*(1-Percent/100);
//매수주문
//
if (Buy[i] != true && SymBol[i].current <= BBdn && C2[i] > BBdn && C2[i] > 0 )
{
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보다 크고(잔고수량있음)
if (Account1.Balance.count > 0)
{
//현재가가 5일이평이상이면 매도주문
if (SymBol[i].current >= mav5 && C2[i] < ma5)
{
//매수5호가로 잔고의 전량 매도주문
Account1.OrderBuy(SymBol[i].code,Account1.Balance.count,SymBol[i].Bid(5),0);
}
//20일이평 이하이면 매도주문
if (SymBol[i].current <= mav20 && C2[i] > ma20)
{
//매수5호가로 잔고의 전량 매도주문
Account1.OrderBuy(SymBol[i].code,Account1.Balance.count,SymBol[i].Bid(5),0);
}
//평균단가 대비 5% 이하이면
if (SymBol[i].current <= Account1.Balance.assessedAmount*0.95)
{
//매수5호가로 잔고의 전량 매도주문
Account1.OrderBuy(SymBol[i].code,Account1.Balance.count,SymBol[i].Bid(5),0);
}
}
}
}
}
}
}
즐거운 하루되세요
> 무영세 님이 쓴 글입니다.
> 제목 : 수식 문의드립니다.
> 관심종목그룹에서
엔벨로프 (10, 6) 을 설정하여
하단선 이탈 시 매수
5일선 골드크로스 시 매도
20일선 하향시 손절 또는 매수 후 5% 하락 시 손절 하는 수식 부탁드립니다.