커뮤니티

문의드립니다.

프로필 이미지
종호
2017-11-07 12:25:31
2698
글번호 224234
답변완료
안녕하세요. 1번 질문: 해외선물의 경우 장개시 시간이 08시0분에 시작해서 그다음날 07시0분에 장마감됩니다. 제가 데이트레이딩으로 거래하고 싶습니다. 매수 또는 매도가 08:00 부터 거래를 시작해서 익일 04:00 넘어서 거래가 모두 청산이 되면 새로운 매수,또는 매도가 일어나지 않도록 하고 싶습니다. 2번질문 아래 수식에서 어떤 방식으로 수식을 짜야 할까요? 또 모든 거래가 익일 06:00 까지 잔존하고 있다면 익일 06:00에 잔존하는 모든거래를 청산하고 싶습니다. 2번 질문: 아래 매도 수식을 ( 무포지션시 기준가 형성후 그 기준가를 하방으로 돌파시 1계약씩 매도하는 수식) 실행을 시키면 var SSPrice; //스팟시작 function Main_OnStart() { //MarketData1종목 잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //내부파일에 SSPrice에 적어놓은 값을 가져와 다시 변수에 저장 var bb = Main.GetUserValue("SSPrice"); if (bb == "" || Account1.Balance.count == 0) SSPrice = 0; else SSPrice = bb; } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { if (lUp*dateID == 20001) { //무포지션이고 SSPrice가 0이면 기준값 지정 if (Account1.Balance.count == 0 && SSPrice == 0) { SSPrice = MarketData1.current; Main.SetUserValue("SSPrice",SSPrice); } //SSPrice가 0보다 크고 현재가가 SSPrice-3틱 이하이면 1계약 시장가 매도 if (SSPrice > 0 && MarketData1.current <= SSPrice - MarketData1.GetTickSize()*3) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1,0,1); SSPrice = SSPrice - MarketData1.GetTickSize()*3; Main.SetUserValue("SSPrice",SSPrice); } } } //계좌잔고에서 MarketData1이 완전청산되면 SSPrice 변수 0으로 셋팅 function Main_OnU*pdateAccount(sAccntNum, sItemCode, lUp*dateID) { if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) { SSPrice = 0; Main.SetUserValue("SSPrice",SSPrice); } } 가장 중요한 질문A : 거래가 이루어질 때 거의 동시에 2계약이나 심지어 수십계약이 동시 체결이 될 때가 있습니다..1 계약씩만 매도가 되도록 수식을 보완해 주시면 감사드리겠습니다. 그런데 최초 진입시 SSPrice-3틱 이하이면 1계약 시장가 매도 에서 -1틱 ,-2틱 간격으로 놓으면 진입이 일어나는데 3틱부터는 (큰 수의 4틱 5틱으로) 큰간격을 벌려 놓으면 진입이 아예 안되고 있습니다. 1틱으로 놓으면 동시진입이 6개 ,7개씩 동시진입이 나옵니다. 그리고 잔고 청산후에 다시 재진입시 진입이 되다가 안되다가등 진입이 중구 난방입니다.있던 잔고가 청산후에 재진입이 항상 일어나도록 수식을 수정 요청드립니다. 질문 B : 위에서 진입시 1개씩도 진입되지만 경우에 따라서는 거의 동시에 몇개씩 여러개가 동시진입이 되고 있습니다. 어떤 데이타 기준에 의해서 거래가 이루어지는 것인지도 알고 싶습니다.틱의 최소단위 데이타로 거래가 이루어지는 것인지요? 또 2분봉이나 30초봉, 20틱봉의 특정 분,초, 틱봉 데이타로 이 수식을 적용하는 방법을 가르쳐 주시면 감사드리겠습니다. 질문C : 또 if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) 에서 lUp*dateID == 30002 의 의미는 어떤 의미인지도 알고 싶습니다. 3번질문 이전 청산 손익에 따른 기준값 변경을 하고 싶습니다. 위의 2번식에서 2번식이 실행되어 잔고가 있게되고 그 잔고가 청산이 되어 다시 무포지션이 될 때 이전 청산이 손실이면 2번식의 //무포지션이고 SSPrice가 0이면 기준값 지정 if (Account1.Balance.count == 0 && SSPrice == 0) { SSPrice = MarketData1.current; 에서 기준값 SSPrice 을 SSPrice = MarketData1.current; 그대로 하고요. 이전 청산이 수익이면 기준값 SSPrice 을 SSPrice = MarketData1.current + MarketData1.GetTickSize()*5; 처럼 변경하고 싶습니다. 수식을 요청드립니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2017-11-21 17:37:23

안녕하세요 예스스탁입니다. 스팟 수식에 대한 답변은 단순 가이드 입니다. 이용에 참고하시기 바랍니다. 1. 주문이 발생하는 이벤트의 if문에 시간조건을 추가하시면 되며 6시 지정시간 청산은 타이머 동작시 시간체크해서 지정시간에 1회 청산하게 하시면 됩니다. 식 구조를 참고하시기 바랍니다. var d,HHMMSS,HHMMSS1; function Main_OnStart() { Main.SetTimer(1, 1000);//5초 간격으로 타이머 작동 } 주문발생이벤트 { d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //지정시간내에만 주 if (HHMMSS >= 80000 || HHMMSS < 040000) { Account1.OrderBuy(sItemCode, nCount, dPrice, nPriceKind) } if (HHMMSS >= 80000 || HHMMSS < 040000) { Account1.OrderSell(sItemCode, nCount, dPrice, nPriceKind) } } function Main_OnTimer(nEventID) { d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //6시 청산 if (HHMMSS >= 060000 && HHMMSS1 < 060000) { Main.KillTimer(1); Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); if (Account1.Balance.position == 1 && Account1.Balance.count > 0) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2 && Account1.Balance.count > 0) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } 2 현재 수식이 단순히 3틱단위로 변화하면 매도주문을 내는 식입니다. 해당 부분은 틱변화해도 정확히 동작하고 있습니다. 주문후 바로 체결되지 않으면 체결은 나중에 동시에 될수도 혹은 미체결로 남을수도 있습니다. 해당 부분은 수식에서 따로 컨트롤이 되지 않습니다. 주문후 체결이 되면 다음주문이 나가게 하고자 하시면 아래와 같이 작성하시면 됩니다. var SSPrice,Order,SID,Snum; //스팟시작 function Main_OnStart() { //MarketData1종목 잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //내부파일에 SSPrice에 적어놓은 값을 가져와 다시 변수에 저장 var bb = Main.GetUserValue("SSPrice"); if (bb == "" || Account1.Balance.count == 0) SSPrice = 0; else SSPrice = bb; Order = true; } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { if (lUp*dateID == 20001) { //무포지션이고 SSPrice가 0이면 기준값 지정 if (Account1.Balance.count == 0 && SSPrice == 0) { SSPrice = MarketData1.current; Main.MessageList("0",SSPrice); Main.SetUserValue("SSPrice",SSPrice); } //SSPrice가 0보다 크고 현재가가 SSPrice-3틱 이하이면 1계약 시장가 매도 if (Order == true && SSPrice > 0 && MarketData1.current <= SSPrice - MarketData1.GetTickSize()*3) { Oder = false; SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1,0,1); SSPrice = SSPrice - MarketData1.GetTickSize()*3; Main.SetUserValue("SSPrice",SSPrice); } Main.MessageList("3",MarketData1.current,SSPrice); } } //계좌잔고에서 MarketData1이 완전청산되면 SSPrice 변수 0으로 셋팅 function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) { SSPrice = 0; Main.SetUserValue("SSPrice",SSPrice); } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse == SID) { Snum = OrderResponse.orderNum; } } function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.orderNum == Snum) { Account1.SetUnfillOrderNumber(Snum) if (Account1.Unfill.count == 0) { Order = true; } } } 질문B 시세변동이벤트는 스팟에서 사용하는 종목의 시세변화가 있으면 동작하게 됩니다. 스팟에 MarketData1 하나의 종목객체만 있으면 해당 종목의 시세가 수신될때마다 동작하게 됩니다. 아래는 10초 간격으로 현재가 확인해 신호발생하는 내용입니다. 차트의 10초봉 종가만 사용하는 것과 같습니다. var SSPrice,Order,SID,Snum; //스팟시작 function Main_OnStart() { //MarketData1종목 잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //내부파일에 SSPrice에 적어놓은 값을 가져와 다시 변수에 저장 var bb = Main.GetUserValue("SSPrice"); if (bb == "" || Account1.Balance.count == 0) SSPrice = 0; else SSPrice = bb; Order = true; Main.SetTimer(1, 10000)//10초, 1000이 1초 } function Main_OnTimer(nEventID) { Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //무포지션이고 SSPrice가 0이면 기준값 지정 if (Account1.Balance.count == 0 && SSPrice == 0) { SSPrice = MarketData1.current; Main.MessageList("0",SSPrice); Main.SetUserValue("SSPrice",SSPrice); } //SSPrice가 0보다 크고 현재가가 SSPrice-3틱 이하이면 1계약 시장가 매도 if (Order == true && SSPrice > 0 && MarketData1.current <= SSPrice - MarketData1.GetTickSize()*3) { Oder = false; SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1,0,1); SSPrice = SSPrice - MarketData1.GetTickSize()*3; Main.SetUserValue("SSPrice",SSPrice); } } //계좌잔고에서 MarketData1이 완전청산되면 SSPrice 변수 0으로 셋팅 function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) { SSPrice = 0; Main.SetUserValue("SSPrice",SSPrice); } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse == SID) { Snum = OrderResponse.orderNum; } } function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.orderNum == Snum) { Account1.SetUnfillOrderNumber(Snum) if (Account1.Unfill.count == 0) { Order = true; } } } 틱봉 주기는 불가능하며 시간주기이면 타이머 이벤트를 이용하셔야 합니다. 만약 질문C 종목삭제입니다. 잔고에 있던 종목이 전량청산된것을 알려줍니다. 스팟 도움말에 해당 이벤트에 각 매개변수 도움말 내용이 있습니다. 3 실제 잔고에서 종목이 청산되어 빠지면 스팟에서는 이전거래의 손익을 알수가 없어 추적이 불가능합니다. 스팟의 잔고는 현재시점의 값만 항상 리턴해 주게 됩니다. 해당 부분은 따로 처리방법을 작성해 드리기 어렵습니다. 사용자분이 스팟수식내에 청산전략이 있으면 해당 청산전략으로 주문을 할때 혹은 주문후 체결이 될때 체결가와 현재가를 저장하거나 혹은 손익을 계산해서 변수에 저장해서 손익파악하게 처리하셔야 합니다. 청산 내용을 알수 없어 처리를 해드릴수가 없습니다. 즐거운 하루되세요 > 종호 님이 쓴 글입니다. > 제목 : 문의드립니다. > 안녕하세요. 1번 질문: 해외선물의 경우 장개시 시간이 08시0분에 시작해서 그다음날 07시0분에 장마감됩니다. 제가 데이트레이딩으로 거래하고 싶습니다. 매수 또는 매도가 08:00 부터 거래를 시작해서 익일 04:00 넘어서 거래가 모두 청산이 되면 새로운 매수,또는 매도가 일어나지 않도록 하고 싶습니다. 2번질문 아래 수식에서 어떤 방식으로 수식을 짜야 할까요? 또 모든 거래가 익일 06:00 까지 잔존하고 있다면 익일 06:00에 잔존하는 모든거래를 청산하고 싶습니다. 2번 질문: 아래 매도 수식을 ( 무포지션시 기준가 형성후 그 기준가를 하방으로 돌파시 1계약씩 매도하는 수식) 실행을 시키면 var SSPrice; //스팟시작 function Main_OnStart() { //MarketData1종목 잔고셋팅 Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0); //내부파일에 SSPrice에 적어놓은 값을 가져와 다시 변수에 저장 var bb = Main.GetUserValue("SSPrice"); if (bb == "" || Account1.Balance.count == 0) SSPrice = 0; else SSPrice = bb; } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { if (lUp*dateID == 20001) { //무포지션이고 SSPrice가 0이면 기준값 지정 if (Account1.Balance.count == 0 && SSPrice == 0) { SSPrice = MarketData1.current; Main.SetUserValue("SSPrice",SSPrice); } //SSPrice가 0보다 크고 현재가가 SSPrice-3틱 이하이면 1계약 시장가 매도 if (SSPrice > 0 && MarketData1.current <= SSPrice - MarketData1.GetTickSize()*3) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1,0,1); SSPrice = SSPrice - MarketData1.GetTickSize()*3; Main.SetUserValue("SSPrice",SSPrice); } } } //계좌잔고에서 MarketData1이 완전청산되면 SSPrice 변수 0으로 셋팅 function Main_OnU*pdateAccount(sAccntNum, sItemCode, lUp*dateID) { if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) { SSPrice = 0; Main.SetUserValue("SSPrice",SSPrice); } } 가장 중요한 질문A : 거래가 이루어질 때 거의 동시에 2계약이나 심지어 수십계약이 동시 체결이 될 때가 있습니다..1 계약씩만 매도가 되도록 수식을 보완해 주시면 감사드리겠습니다. 그런데 최초 진입시 SSPrice-3틱 이하이면 1계약 시장가 매도 에서 -1틱 ,-2틱 간격으로 놓으면 진입이 일어나는데 3틱부터는 (큰 수의 4틱 5틱으로) 큰간격을 벌려 놓으면 진입이 아예 안되고 있습니다. 1틱으로 놓으면 동시진입이 6개 ,7개씩 동시진입이 나옵니다. 그리고 잔고 청산후에 다시 재진입시 진입이 되다가 안되다가등 진입이 중구 난방입니다.있던 잔고가 청산후에 재진입이 항상 일어나도록 수식을 수정 요청드립니다. 질문 B : 위에서 진입시 1개씩도 진입되지만 경우에 따라서는 거의 동시에 몇개씩 여러개가 동시진입이 되고 있습니다. 어떤 데이타 기준에 의해서 거래가 이루어지는 것인지도 알고 싶습니다.틱의 최소단위 데이타로 거래가 이루어지는 것인지요? 또 2분봉이나 30초봉, 20틱봉의 특정 분,초, 틱봉 데이타로 이 수식을 적용하는 방법을 가르쳐 주시면 감사드리겠습니다. 질문C : 또 if (sItemCode == Main.GetOrderCode(MarketData1.code) && lUp*dateID == 30002) 에서 lUp*dateID == 30002 의 의미는 어떤 의미인지도 알고 싶습니다. 3번질문 이전 청산 손익에 따른 기준값 변경을 하고 싶습니다. 위의 2번식에서 2번식이 실행되어 잔고가 있게되고 그 잔고가 청산이 되어 다시 무포지션이 될 때 이전 청산이 손실이면 2번식의 //무포지션이고 SSPrice가 0이면 기준값 지정 if (Account1.Balance.count == 0 && SSPrice == 0) { SSPrice = MarketData1.current; 에서 기준값 SSPrice 을 SSPrice = MarketData1.current; 그대로 하고요. 이전 청산이 수익이면 기준값 SSPrice 을 SSPrice = MarketData1.current + MarketData1.GetTickSize()*5; 처럼 변경하고 싶습니다. 수식을 요청드립니다.