예스스탁
예스스탁 답변
2017-07-11 16:08:11
안녕하세요
예스스탁입니다.
문의하신 내용은 3개의 차트객체를 이용해 스팟식을 작성하면 가능한 부분입니다.
다만 신호의 체크를 3개의 차트 신호중 어떤 차트를 기준으로 할것인지가 관건입니다.
올리신 내용과 같이 3개 차트에서 발생되는 신호에 대해
각각 주문을 집행하게 하면 의미가 없으므로
하나의 차트를 기준으로 나머지 2개의 차트는 신호상태(포지션상태)를 참고해서
주문낼 포지션과 수량을 산정해서 주문내게 작성해야 합니다.
주의하실 부분은 신호가 동시에 각 차트에서 발생했다고 해도
스팟에서는 순서를 두고 수신되고 계산하게 되므로
기준되는 차트보다 우선순위에 밀려난 차트는
새로 발생된 신호가 반영되지 않을수 있으므로
기준되는 차트에서 신호가 발생하고 N초뒤에 체크해서 주문집행하게 작성하시면 됩니다.
스팟 수식 답변은 단순 가이드입니다.
아래 수식내용과 주석내용 참고하셔서 수정보강해 식 완성하시기 바랍니다.
스크립트 객체 설정
차트객체 추가 --> 객체명 Chart1, 차트아이디 연결
차트객체 추가 --> 객체명 Chart2, 차트아이디 연결
차트객체 추가 --> 객체명 Chart3, 차트아이디 연결
계좌객체 추가 --> 계좌번호 지정
종목객체 추가 --> 객체명 MarketData1, 차트와 동일 종목으로 지정
아래는 수식입니다.
var V1,V2,V3;
function Chart1_OnRiseSignal(Signal)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//Chart1에서 신호발생시 마다,발생시간, 차트번호,신초객체 내용을 log.txt파일에 출력
Main.PrintOnFile("C:₩₩log.txt",HHMMSS,"Chart1",Signal);
Main.SetTimer(1, 2000);//2초 타이머
Main.MessageList("신호발생 : 타이머 동작", Signal.signalKind);
}
function Chart2_OnRiseSignal(Signal)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//Chart2에서 신호발생시 마다,발생시간, 차트번호,신호객체 내용을 log.txt파일에 출력
Main.PrintOnFile("C:₩₩log.txt",HHMMSS,"Chart2",Signal);
}
function Chart1_OnRiseSignal(Signal)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//Chart3에서 신호발생시 마다,발생시간, 차트번호, 신호객체 내용을 log.txt파일에 출력
Main.PrintOnFile("C:₩₩log.txt",HHMMSS,"Chart3",Signal);
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//타이머 종료
Main.KillTimer(1);
//Chart1 포지션 상태(매수면 수량이 양수로, 매도면 수량이 음수로)
var V1 = Chart1.GetOpenContracts();
//Chart2 포지션 상태(매수면 수량이 양수로, 매도면 수량이 음수로)
var V2 = Chart2.GetOpenContracts();
//Chart3 포지션 상태(매수면 수량이 양수로, 매도면 수량이 음수로)
var V3 = Chart3.GetOpenContracts();
//차트포지션 합산 수량
var sum = V1+V2+V3;
//실계좌 셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0);
//실계좌 잔고 수량
var num = Account1.Balance.count;
//실계좌 잔고 포지션
var pst = Account1.Balance.position;
//차트합산잔고가 0이상(차트합산 매수포지션)
if (sum > 0)
{
//실계좌 포지션 매수
if (pst == 2)
{
//차트와 실계좌 수량 차이
var diff = Math.abs(sum)-num;
//차트 수량이 많으면 부족 수량 추가매수
if (diff > 0)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Math.abs(diff), MarketData1.Ask(5), 0);
}
//차트 수량이 적으면 일부매도
if (diff < 0)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Math.abs(diff), MarketData1.Bid(5), 0);
}
}
//실계좌 포지션 매도
if (pst == 1)
{
//매도포지션 정리하고 차트수량만큼 매수포지션을 보유하기 위해 num+sum만큼 매수주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), num+Math.abs(sum), MarketData1.Ask(5), 0);
}
}
//차트합산잔고가 0미만(차트 합산 매도포지션)
if (sum < 0)
{
//실계좌 포지션 매도
if (pst == 1)
{
//차트와 실계좌 수량 차이
var diff = Math.abs(sum)-num;
//차트 수량이 많으면 부족 수량 추가매도
if (diff > 0)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Math.abs(diff), MarketData1.Bid(5), 0);
}
//차트 수량이 적으면 일부매수
if (diff < 0)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Math.abs(diff), MarketData1.Ask(5), 0);
}
}
//실계좌 포지션 매수
if (pst == 2)
{
//매수포지션 정리하고 차트수량만큼 매수포지션을 보유하기 위해 num+sum만큼 매도주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), num+Math.abs(sum), MarketData1.Ask(5), 0);
}
}
//차트합산 무포지션
if (sum == 0)
{
//계좌 잔고가 매도포지션이면 전량 청산
if (pst == 1)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), num, MarketData1.Ask(5), 0);
}
//계좌 잔고가 매수포지션이면 전량 청산
if (pst == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), num, MarketData1.Bid(5), 0);
}
}
}
}
즐거운 하루되세요
> 롱감마 님이 쓴 글입니다.
> 제목 : 전략 취합 방법 문의 드립니다.
> 안녕하세요?
예스스팟을 이용하여 예스랭귀지로 짜여진 전략을 취합하는 방법과 로그를 기록하는 방법에 대한 예제를 얻고 싶어서 이렇게 문의 드립니다.
이를 풀어서 다시 말씀드리면,
(1) 예스랭귀지로 작성된 다수의 전략을 예스스팟에서 취합하여 주문을 내는 방법에 관해 알고싶습니다. 예를 들어 어떤 시점에서 "전략1"에서 매수 시그널이 나오고 "전략2"와 "전략3"에서 매도 시그널이 나오는 경우 각각의 전략이 걸려있는 차트에서 매수 1개 / 매도 2개의 주문이 나가는 것이 아니라, 이를 취합하여 1개의 매도 주문만 나가게 하는 스크립트에 대한 예제가 있으시면 부탁드립니다.
(2) 또한 주문이 나온 전략명과 시그널을 (텍스트 또는 엑셀) 파일 형태의 로그를 남기는 방법에 대해서도 알고 싶습니다. 이 또한 가능하다면 도움 좀 부탁 드리겠습니다.
감사합니다. 즐거운 하루 되십시오.