커뮤니티

수식 요청드립니다.

프로필 이미지
zenirvan
2017-12-03 12:08:50
2671
글번호 224268
답변완료
안녕하세요. 다음과 같은 전략을 실행시키기 위해 예스스팟 파일을 작성해 보았습니다. 이상은 없는지 한 번 검토해 주시면 감사드리겠습니다. [전략 내용] 1. 해외 선물 데이트레이딩 전략으로 뉴욕 시각 기준으로 18시부터 진입을 하고 다음날 16시 40분에 모든 포지션을 청산함 2. 일 목표 수익액은 50만원이고, 일 최대 손실액도 50만원 임. 위 수익액 또는 손실액에 도달하면 모든 매매를 종료함 3. Chart1에서 신호가 발생하면 최초로 진입을 하되, 일단 최초 진입을 한 이후부터는 Chart2의 신호에 따라서 계속 스위칭을 하게 됨 1) Chart1에서 매수 신호가 발생하면, MarketData1 종목을 1개 매수하고, 동시에 MarketData2 종목도 1개 매수함 1-1) 이후 Chart1에서 발생하는 신호는 무시되며, Chart2의 스위칭 신호에 따라서 스위칭을 반복하게 됨 1-2) 이후 Chart2에서 매수 신호가 발생하면, 이미 매수 진입을 했으므로 추가 진입은 없음 1-3) 이후 Chart3에서 매도 신호가 발생하면, 진입된 매수 포지션을 모두 청산하고, MarketData1 종목을 1개 매도하고, 동시에 MarketData2 종목도 1개 매도함 1-4) 일 목표 수익/손실액을 달성할 때까지, 1-2) 및 1-3) 과정을 반복함 2) Chart1에서 매도 신호가 발생하면, MarketData1 종목을 1개 매수하고, 동시에 MarketData2 종목도 1개 매수함 2-1) 이후 Chart1에서 발생하는 신호는 무시되며, Chart2의 스위칭 신호에 따라서 스위칭을 반복하게 됨 2-2) 이후 Chart2에서 매도 신호가 발생하면, 이미 매도 진입을 했으므로 추가 진입은 없음 2-3) 이후 Chart3에서 매수 신호가 발생하면, 진입된 매도 포지션을 모두 청산하고, MarketData1 종목을 1개 매수하고, 동시에 MarketData2 종목도 1개 매수함 2-4) 일 목표 수익/손실액을 달성할 때까지, 2-2) 및 2-3) 과정을 반복함 [HTS 환경] - 현대선물 [예스스팟 코드] var N=0; var IsChart1on=0; var X; var i1; function Main_OnStart() { Main.MessageList("스팟 시작"); //i1에 예수금/예탁총액 저장 i1 = Account1.GetBalanceETCinfo(4); X = 0; Main.SetTimer(1, 1000); //5초 타이머 셋팅 Main.MessageList("예수금", Account1.GetBalanceETCinfo(4)); } function Chart1_OnRiseSignal(Signal) { if (IsChart1on == 0 && Signal.signalKind == 1) // 매수 신호 발생시 { Main.MessageList("최초 진입신호!!! Chart1 매수 신호 발생"); Account1.Orderbuy(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Orderbuy(Main.GetOrderCode(MarketData2.code), 1, 0, 1); IsChart1on = 1; // IsChart1on의 값을 1로 변경하여 더 이상 Chart1에서 발생하는 신호에는 진입하지 않도록 함 N = 1; } if (IsChart1on == 0 && Signal.signalKind == 3)// 매도 신호 발생시 { Main.MessageList("최초 진입신호!!! Chart1 매도 신호 발생"); Account1.Ordersell(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Ordersell(Main.GetOrderCode(MarketData2.code), 1, 0, 1); IsChart1on = 1; // IsChart1on의 값을 1로 변경하여 더 이상 Chart1에서 발생하는 신호에는 진입하지 않도록 함 N = -1; } } // 일단 Chart1에서 진입 신호가 발생한 이후에는 Chart2에서 발생하는 스위칭 신호에 따라서만 스위칭 함 function Chart2_OnRiseSignal(Signal) { if (N == 1 && Signal.signalKind == 2) // 매수청산 신호 발생시 { Main.MessageList("Chart2 매수청산 신호 발생"); Account1.Ordersell(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Ordersell(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = 0; } if (N == 0 && Signal.signalKind == 1) // 매수 신호 발생시 // Chart1에 의해서 매수신호가 발생해서 이미 진입된 상태에서 Chart2에서 또 매수 신호가 나오더라도 추가 진입을 // 시키지 않기 위해 N이 1이면 추가 진입하지 않음 { Main.MessageList("Chart2 매수 신호 발생"); Account1.Orderbuy(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Orderbuy(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = 1; } if (N == -1 && Signal.signalKind == 4) // 매도청산 신호 발생시 { Main.MessageList("Chart2 매도청산 신호 발생"); Account1.Orderbuy(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Orderbuy(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = 0; } if (N == 0 && Signal.signalKind == 3) // 매도 신호 발생 // Chart1에 의해서 매도신호가 발생해서 이미 진입된 상태에서 Chart2에서 또 매도 신호가 나오더라도 추가 진입을 // 시키지 않기 위해 N이 -1이면 추가 진입하지 않음 { Main.MessageList("Chart2 매도 신호 발생"); Account1.Ordersell(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Ordersell(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = -1; } } // 일(daily) 수익 목표 및 손실 한도액(각 50만원)에 도달할 경우 당일 매매는 중지함 // 뉴욕 현지 시각 기준으로 16시 40분에 모든 포지션 청산함 function Main_OnTimer(nEventID) { //현재 예수금이 스팟 시작시값보다 50만원 이상 감소하면 진입 금지 if (nEventID == 1 && Account1.GetBalanceETCinfo(4) <= i1-500000) { //미체결주문 전체 취소 var num1 = Account1.GetTheNumberOfUnfills(); for(i = 0; i < num1; i++) { Account1.SetUnfillIndex(i) Account1.OrderCancel(Account1.Unfill.orderNum); } //잔고 전체 종목 청산 var num2 = Account1.GetTheNumberOfBalances(); for(i = 0; i < num2; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } X = 1; Main.MessageList("당일 손실 한도액 초과! 진입 금지!"); } //현재 예수금이 스팟 시작시값보다 50만원 이상 증가하면 진입 금지 if (nEventID == 1 && Account1.GetBalanceETCinfo(4) >= i1+500000) { //미체결주문 전체 취소 var num1 = Account1.GetTheNumberOfUnfills(); for(i = 0; i < num1; i++) { Account1.SetUnfillIndex(i) Account1.OrderCancel(Account1.Unfill.orderNum); } //잔고 전체 종목 청산 var num2 = Account1.GetTheNumberOfBalances(); for(i = 0; i < num2; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } X = 1; Main.MessageList("당일 수익 달성! 진입 금지!"); } //뉴욕 현지 시각 기준 16시 40분 모두 청산 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS <= 170000 && HHMMSS >= 164000) //16시 40분에 계좌 잔고 모두 시장가로 청산주문 { Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); for(var i = 0; i < num; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } Main.MessageList("장마감 청산"); IsChart1on = 0; //IsChart1on의 값을 0으로 변경하고 18시 뉴욕 장 시작 이후 chart1의 진입 신호를 기다림 } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2017-12-22 16:15:12

안녕하세요 예스스탁입니다. 예스스팟은 대략적인 가이드만 해드리게 됩니다. 수식이 실시간에서만 동작을 하고 모두 주문처리와 관계된 부분들이라 저희가 세부적인 동작까지는 시간관계상 확인해 드리지 못합니다. 작성 흐름이 맞는지 정도만 판단해 드릴수 있습니다. 올려주신 내용과 수식만으로는 내용판단이 정확히 되지 않아 가이드를 해드리기 어렵습니다. 아래 내용 참고하셔서 수식 수정하셔서 자세한 전략 내용과 함께 다시 올려주시기 바랍니다. 1 해외선물(현대선물)에서 예탁금총액은 Account1.GetBalanceETCinfo(0) 예탁자산평가액은 Account1.GetBalanceETCinfo(14) 입니다. 현재 수식에 Account1.GetBalanceETCinfo(4)는 국내선물기준이신것 같습니다. 증권사/선물사별로 모두 항목마다 인덱스 번호가 다릅니다. https://www.yesstock.com/Product/pd_hyundaiyestrader.asp 위 링크에 가셔서 해외선물용 예스스팟 도움말 다운받으셔서 함수의 매개변수 확인하시기 바랍니다. 2 수식에 대소문자가 잘못된 부분이 있습니다. Account1.Orderbuy --> Account1.OrderBuy Account1.Ordersel --> Account1.OrderSell 자바스크립트는 대수문자를 엄격히 구분합니다. 지정된 함수/변수의 이름과 다르게 사용된 부분이 없는지 확인하시기 바랍니다. 3 //뉴욕 현지 시각 기준 16시 40분 모두 청산 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); 자바스크립트의 날짜시간객체는 컴퓨터의 시간입니다. 뉴욕현지시간으로 16시 40분에 해당되는 우리나라 시간으로 지정하셔야 할것 같습니다. 4 올려주신 내용에는 Chart3조건이 있는데 작성하신 수식에는 Chart3객체가 없습니다. 즐거운 하루되세요 > zenirvan 님이 쓴 글입니다. > 제목 : 수식 요청드립니다. > 안녕하세요. 다음과 같은 전략을 실행시키기 위해 예스스팟 파일을 작성해 보았습니다. 이상은 없는지 한 번 검토해 주시면 감사드리겠습니다. [전략 내용] 1. 해외 선물 데이트레이딩 전략으로 뉴욕 시각 기준으로 18시부터 진입을 하고 다음날 16시 40분에 모든 포지션을 청산함 2. 일 목표 수익액은 50만원이고, 일 최대 손실액도 50만원 임. 위 수익액 또는 손실액에 도달하면 모든 매매를 종료함 3. Chart1에서 신호가 발생하면 최초로 진입을 하되, 일단 최초 진입을 한 이후부터는 Chart2의 신호에 따라서 계속 스위칭을 하게 됨 1) Chart1에서 매수 신호가 발생하면, MarketData1 종목을 1개 매수하고, 동시에 MarketData2 종목도 1개 매수함 1-1) 이후 Chart1에서 발생하는 신호는 무시되며, Chart2의 스위칭 신호에 따라서 스위칭을 반복하게 됨 1-2) 이후 Chart2에서 매수 신호가 발생하면, 이미 매수 진입을 했으므로 추가 진입은 없음 1-3) 이후 Chart3에서 매도 신호가 발생하면, 진입된 매수 포지션을 모두 청산하고, MarketData1 종목을 1개 매도하고, 동시에 MarketData2 종목도 1개 매도함 1-4) 일 목표 수익/손실액을 달성할 때까지, 1-2) 및 1-3) 과정을 반복함 2) Chart1에서 매도 신호가 발생하면, MarketData1 종목을 1개 매수하고, 동시에 MarketData2 종목도 1개 매수함 2-1) 이후 Chart1에서 발생하는 신호는 무시되며, Chart2의 스위칭 신호에 따라서 스위칭을 반복하게 됨 2-2) 이후 Chart2에서 매도 신호가 발생하면, 이미 매도 진입을 했으므로 추가 진입은 없음 2-3) 이후 Chart3에서 매수 신호가 발생하면, 진입된 매도 포지션을 모두 청산하고, MarketData1 종목을 1개 매수하고, 동시에 MarketData2 종목도 1개 매수함 2-4) 일 목표 수익/손실액을 달성할 때까지, 2-2) 및 2-3) 과정을 반복함 [HTS 환경] - 현대선물 [예스스팟 코드] var N=0; var IsChart1on=0; var X; var i1; function Main_OnStart() { Main.MessageList("스팟 시작"); //i1에 예수금/예탁총액 저장 i1 = Account1.GetBalanceETCinfo(4); X = 0; Main.SetTimer(1, 1000); //5초 타이머 셋팅 Main.MessageList("예수금", Account1.GetBalanceETCinfo(4)); } function Chart1_OnRiseSignal(Signal) { if (IsChart1on == 0 && Signal.signalKind == 1) // 매수 신호 발생시 { Main.MessageList("최초 진입신호!!! Chart1 매수 신호 발생"); Account1.Orderbuy(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Orderbuy(Main.GetOrderCode(MarketData2.code), 1, 0, 1); IsChart1on = 1; // IsChart1on의 값을 1로 변경하여 더 이상 Chart1에서 발생하는 신호에는 진입하지 않도록 함 N = 1; } if (IsChart1on == 0 && Signal.signalKind == 3)// 매도 신호 발생시 { Main.MessageList("최초 진입신호!!! Chart1 매도 신호 발생"); Account1.Ordersell(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Ordersell(Main.GetOrderCode(MarketData2.code), 1, 0, 1); IsChart1on = 1; // IsChart1on의 값을 1로 변경하여 더 이상 Chart1에서 발생하는 신호에는 진입하지 않도록 함 N = -1; } } // 일단 Chart1에서 진입 신호가 발생한 이후에는 Chart2에서 발생하는 스위칭 신호에 따라서만 스위칭 함 function Chart2_OnRiseSignal(Signal) { if (N == 1 && Signal.signalKind == 2) // 매수청산 신호 발생시 { Main.MessageList("Chart2 매수청산 신호 발생"); Account1.Ordersell(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Ordersell(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = 0; } if (N == 0 && Signal.signalKind == 1) // 매수 신호 발생시 // Chart1에 의해서 매수신호가 발생해서 이미 진입된 상태에서 Chart2에서 또 매수 신호가 나오더라도 추가 진입을 // 시키지 않기 위해 N이 1이면 추가 진입하지 않음 { Main.MessageList("Chart2 매수 신호 발생"); Account1.Orderbuy(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Orderbuy(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = 1; } if (N == -1 && Signal.signalKind == 4) // 매도청산 신호 발생시 { Main.MessageList("Chart2 매도청산 신호 발생"); Account1.Orderbuy(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Orderbuy(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = 0; } if (N == 0 && Signal.signalKind == 3) // 매도 신호 발생 // Chart1에 의해서 매도신호가 발생해서 이미 진입된 상태에서 Chart2에서 또 매도 신호가 나오더라도 추가 진입을 // 시키지 않기 위해 N이 -1이면 추가 진입하지 않음 { Main.MessageList("Chart2 매도 신호 발생"); Account1.Ordersell(Main.GetOrderCode(MarketData1.code), 1, 0, 1); Account1.Ordersell(Main.GetOrderCode(MarketData2.code), 1, 0, 1); N = -1; } } // 일(daily) 수익 목표 및 손실 한도액(각 50만원)에 도달할 경우 당일 매매는 중지함 // 뉴욕 현지 시각 기준으로 16시 40분에 모든 포지션 청산함 function Main_OnTimer(nEventID) { //현재 예수금이 스팟 시작시값보다 50만원 이상 감소하면 진입 금지 if (nEventID == 1 && Account1.GetBalanceETCinfo(4) <= i1-500000) { //미체결주문 전체 취소 var num1 = Account1.GetTheNumberOfUnfills(); for(i = 0; i < num1; i++) { Account1.SetUnfillIndex(i) Account1.OrderCancel(Account1.Unfill.orderNum); } //잔고 전체 종목 청산 var num2 = Account1.GetTheNumberOfBalances(); for(i = 0; i < num2; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } X = 1; Main.MessageList("당일 손실 한도액 초과! 진입 금지!"); } //현재 예수금이 스팟 시작시값보다 50만원 이상 증가하면 진입 금지 if (nEventID == 1 && Account1.GetBalanceETCinfo(4) >= i1+500000) { //미체결주문 전체 취소 var num1 = Account1.GetTheNumberOfUnfills(); for(i = 0; i < num1; i++) { Account1.SetUnfillIndex(i) Account1.OrderCancel(Account1.Unfill.orderNum); } //잔고 전체 종목 청산 var num2 = Account1.GetTheNumberOfBalances(); for(i = 0; i < num2; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); } X = 1; Main.MessageList("당일 수익 달성! 진입 금지!"); } //뉴욕 현지 시각 기준 16시 40분 모두 청산 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS <= 170000 && HHMMSS >= 164000) //16시 40분에 계좌 잔고 모두 시장가로 청산주문 { Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); for(var i = 0; i < num; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.position == 1) Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1); if (Account1.Balance.position == 2) Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } Main.MessageList("장마감 청산"); IsChart1on = 0; //IsChart1on의 값을 0으로 변경하고 18시 뉴욕 장 시작 이후 chart1의 진입 신호를 기다림 } }