Search
📝

예제3. 수식안에서 차트객체 생성

1.
전략내용
전략내용은 예제2와 같습니다. 스크립트 객체화면에서 차트객체를 설정하는 부분을 수식안에서 생성해서 사용하게 만든 예제입니다.
2.
스크립트 객체화면 설정
스크립트 객체화면 설정은 예제2과 같습니다. 수식안에서 차트객체를 생성하므로 예제2에서 C1로 지정한 차트개체 지정만 제외합니다.
3.
종목객체 생성 함수
차트객체를 생성하는 함수는 메인객체의 ReqChartEx함수입니다. 매개변수는 총 4개(기본차트셋팅, 시스템셋팅, 지표셋팅, 참조데이타셋팅)를 지정합니다. 4개의 매개변수는 모두 셋팅정보로 단일값이 아니고 여러가지 값을 지정해야 하는 부분으로 배열변수에 값을 순차적으로 넣어서 지정해야 합니다. 각 셋팅값을 지정하는 객체가 제공되므로 해당 객체들에 값을 지정해서 최종사용합니다.
기본차트셋팅 new ReqChartItem(exchange, market, code, cycle, period, count, countKind, modifyPrice, dailyGap)
시스템셋팅
new SystemInfo(name, kind, inputVar, tradeInfo, stopInfo)
지표 셋팅
new IndicatorInfo(name, kind, inputVar)
참조데이타 셋팅(차트 셋팅객체와 동일)
new ReqChartItem(exchange, market, code, cycle, period, count, countKind, modifyPrice, dailyGap)
ReqChrtExa함수가 동작해서 차트객체 생성이 완료되면
이벤트가 발생되며 해당 이벤트가 발생시에 차트객체를 변수에 저장해서 사용하면 되며 차트객체는 생성이 완료되면 해당 차트는 자동으로 실시간 업데이트를 하게 됩니다.
수식안에서 생성된 차트에서 발생하는 신호는 Main객체의 신호발생 이벤트로 수신됩니다.
4.
생성할 차트의 거래소코드, 시장구분, 종목코드
차트객체나 종목객체를 수식에서 생성하기 위해서는 [거래소코드], [시장구분], [종목코드]가 필요합니다. 예제2에서는 종목객체만 수식안에서 생성하므로 차트객체에서 받아 올수 있었지만 차트도 수식 안에서 생성하기 위해서는 거래소코드, 시장구분, 종목코드를 사용자분이 직접 지정하므로 해당종목의 거래소코드, 시장구분, 종목코드를 미리 숙지하셔야 합니다.
필요한 종목의 거래소코드, 시장구분, 종목코드는 스크립트 객체화면에서 종목객체 추가한 후에 종목선택 후 확인할 수 있습니다.
업비트의 거래소코드는 “006”이므로  원화시장은 “KRW”, 비트코인의 종목코드는 “BTC”로 지정하시면 됩니다.
5.
스팟수식
var exchangeCode = "006"; var marketCode = "KRW"; var symbolCode = "BTC" var BID,BNum,C1,MK; function Main_OnStart() { //"Start"메세지 출력 Main.MessageList("Start"); //기본차트셋팅정보(거래소코드,시장구분,종목코드,주기,주기구분,조회건수,조회건수구분,수정주가,갭보정) ChartSet = new ReqChartItem(exchangeCode, marketCode, symbolCode, 5, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false); //시스템 설정 //SystemInfo객체에 시스템명, 파일종류,외부변수지정,트레이딩정보설정,강제청산설정을 지정할 수 있지만 //예제에서는 간단히 이름만 지정해서 시스템을 적용합니다. //일반적으로 스팟에서 사용할 시스템은 수식안이나 시스템식 속성에서 미리 피리미딩이나 강제청산을 지정해 놓으시면 스팟에서는 이름만 지정해 적용하면 되므로 //스팟수식이 간단해 집니다. SystemSet = new SystemInfo("Aroon"); //지정한 기본차트셋팅정보와 시스템정보르 차트객체 생성 요청 Main.ReqChartEx(ChartSet,SystemSet); } //요청산 차트객체 생성완료 function Main_OnRcvChartEx(ChartEx) { //차트객체를 C1에 저장 C1 = ChartEx; //종목개체 요청 Main.ReqMarketData(exchangeCode, marketCode, symbolCode); } //요청한 종목객체 수신완료 function Main_OnRcvMarketData(MarketData) { //종목객체를 MK에 저장 //종목객체는 만들어지면 자동으로 업데이트가 됨 MK = MarketData; } //차트에서 신호 발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호가 발생한 차트객체가 C1차트객체일때를 지정한 내용입니다. // 수식에서 여러개의 차트를 생성해서 사용할 경우 신호가 발생한 차트를 구분할 필요가 있습니다. //수식에서 하나의 차트만 생성해 사용한 다면 불필요한 내용입니다. if (ChartEx.GetCode(1).exchange == C1.GetCode(1).exchange && ChartEx.GetCode(1).market == C1.GetCode(1).market && ChartEx.GetCode(1).code == C1.GetCode(1).code) { //Buy신호가 발생 if (Signal.signalKind == 1) { //현재가로 백만원 매수주문(주문아이디를 BID변수에 저장) //주문함수는 동작하면 고유의 주문아이디가 발생합니다. 주문아이디를 저장해서 주문응답시에 주문번호를 저장할 때 사용합니다. BID = ACC.OrderBuy(MK.market, MK.code, 1000000/MK.current, MK.current, 0,0); //1번 타이머 셋팅(300초, 1000이 1초) Main.SetTimer(1, 3000000); } //ExitLong신호 발생 if (Signal.signalKind == 2) { //매수주문 주문번호로 미체결객체 셋팅 ACC.SetUnfill(BNum); //미체결 수량이 있으면 주문 취소 if (ACC.Unfill.count > 0) { ACC.OrderCancel(BNum); } //잔고 셋팅 ACC.SetBalance(MK.code, 0); //계좌잔고에 해당종목 보유수량이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //전량 현재가로 청산 ACC.OrderSell(MK.market, MK.code, Account1.Balance.count,MK.current, 0) } } } } //주문응답 function Main_OnOrderResponse(OrderResponse) { //수신받은 주문응답이 매수주문시 지정한 아이디와 같으면(매수주문에 대한 주문응답이면) if (OrderResponse.orderID == BID) { //Bnum에 주문번호 저장 BNum = OrderResponse.orderNum; } } //타이머 동작 function Main_OnTimer(nEventID) { //1번 타이머 동작 if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); //매수주문 주문번호로 미체결객체 셋팅 ACC.SetUnfill(BNum); //미체결 수량이 있으면 주문 취소 if (ACC.Unfill.count > 0) { ACC.OrderCancel(BNum); } } }
JavaScript
복사