커뮤니티

수식 작성 부탁드립니다.

프로필 이미지
워싱턴
2019-06-19 15:59:27
3222
글번호 224896
답변완료
안녕하세요 많은 도움에 항상 감사드립니다. 아래 예시의 스팟 수식을 부탁드립니다. 1. 아래의 스팟 샘플은 매수 포지션 일때, 익절과 손절 설정입니다. 아래의 조건문에 추가하거나 아니면 새롭게 트레일링 조건을 하나 더 추가하고 싶습니다. ( 예시 : 수익 최고치가 진입가의 + 25틱 이되면 트레일링 발동하여 (최고치에서) -5틱 아래로 내려오면 전량 청산. 예로는 +25틱에서 -5틱 이상 떨어지지 않으면 계속 증가하여 최종 +50틱에서 전량 청산한다.) // ---------------------------------------------------------- //잔고가 매수포지션이고 매수잔고 수량이 있을떄 if (Account1.Balance.position == 2 ) { //현재가가 잔고평단가 대비 지정틱수(+50틱) 이상이면 익절청산 (시장가) if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*50) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); } } // ---------------------------------------------------------- 2. 스팟에서 매매시간 설정이 가능하다면, 스팟에서 아래와 같이 설정하고 싶습니다. (1) 거래시간 #1 : 당일 오전 10시 ~ 저녁 9시 #2 : 당일 저녁 11시 ~ 저녁 12시 #3 : 다음날 오전 00시 ~ 오전 4시 ( 오전 10시~ 다음날 오전4시 (당일 저녁 9시~11시 제외) ) 3. 손절 익절 초기 설정은 손절(25틱)/익절(25틱) 입니다. (1) 진입후에 30분이 지나도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 30분이 지나도 청산이 되지 않으면 현재가에 청산한다. (2) 진입후에 20봉이 경과해도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 또 20봉이 경과해도 청산이 되지 않으면 현재가에 청산한다. 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-07-08 16:02:55

안녕하세요 예스스탁입니다. 1 잔고에는 진입이후의 최고가나 최저가에 대한 정보가 없습니다. 진입이후의 최고가는 자체 계산을 해야 하는데 올려주신 내용에서는 진입시점을 알수 없습니다. 진입이 차트에서 매수신호 발생한것으로 간주해 작성해 드립니다. 해당식 응용해서 식 완성하시기 바랍니다. 요점은 스팟수식에서 매수진입 할때 변수에 초기값을 할당하고 이후 시세를 받아 최고가를 찾는 내용입니다. var buy = false; var HH = 0; function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { Account1.OrderBuy(Signal.code, 10,0,1); //초기값 HH = Signal.price; //매수신호 발생하면 true Buy = true; } //매수청산신호 발생하면 if (Signal.signalKind == 1) { //false buy = false; } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { //매수신호 발생이후 최고가 계산 if (buy == true && sItemCode == Chart1.GetCode(1) && MarketData1.current > hh && lUp*dateID == 20001) { hh = MarketData1.current; } Account1.SetBalance(MarketData1.code,0); if (Account1.Balance.position == 2 ) { //현재가가 잔고평단가 대비 지정틱수(+50틱) 이상이면 익절청산 (시장가) if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*50) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); } if (HH >= Account1.Balance.avgUnitCost+MarketData1.GetTickSize(MarketData1.current)*25 && MarketData1.current <= HH-MarketData1.GetTickSize(MarketData1.current)*5) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); } } } 2 function 매매가 발생하는 이벤트 { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //오전10시~오후21시 또는 오후 23시이후 또는 오전 04시 이전 if ((HHMMSS >= 100000 && HHMMSS < 210000) || (HHMMSS >= 230000) || (HHMMSS < 040000) ) { 매매로직 } } 3 3-1 var buy = false,timecount; function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { Account1.OrderBuy(Signal.code, 10,0,1); //true Buy = true; Main.SetTimer(1, 1800000);//30분 18000초, 1000이 1초 timecount = 0; Main.SetTimer(2, 3000);//3초, 1000이 1초 } //매수청산신호 발생하면 if (Signal.signalKind == 1) { //false buy = false; Main.KillTimer(1); Main.KillTimer(2); } } function Main_OnTimer(nEventID) { if (nEventID == 1) { timecount = timecount+1; } if (nEventID == 2) { Account1.SetBalance(MarketData1.code,0); if (timecount == 0) { if (Account1.Balance.position == 2 && timecount == 0 ) { //현재가가 잔고평단가 대비 +25 if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*25) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); buy = false; Main.KillTimer(1); Main.KillTimer(2); } if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*25) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); buy = false; Main.KillTimer(1); Main.KillTimer(2); } } } if (timecount == 1) { if (Account1.Balance.position == 2 && timecount == 0 ) { //현재가가 잔고평단가 대비 +25 if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*20) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); buy = false; Main.KillTimer(1); Main.KillTimer(2); } if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*10) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); buy = false; Main.KillTimer(1); Main.KillTimer(2); } } } if (timecount == 3) { Main.KillTimer(1); Main.KillTimer(2); Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); buy = false; } } } 3-2 var buy = false,barcount; function Chart1_OnRiseSignal(Signal) { if (Signal.signalKind == 1) { Account1.OrderBuy(Signal.code, 10,0,1); //true Buy = true; barcount = 0; Main.SetTimer(1, 3000); } //매수청산신호 발생하면 if (Signal.signalKind == 1) { //false buy = false; } } function Chart1_OnBarAppended(nData) { if (nData == 1 && Buy == true) { barcount = barcount+1; } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Account1.SetBalance(MarketData1.code,0); if (barcount < 20) { if (Account1.Balance.position == 2 && timecount == 0 ) { //현재가가 잔고평단가 대비 +25 if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*25) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); Main.KillTimer(1); buy = false; } if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*25) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); Main.KillTimer(1); buy = false; } } } if (barcount >= 20 && barcount < 40) { if (Account1.Balance.position == 2 && timecount == 0 ) { //현재가가 잔고평단가 대비 +25 if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize(MarketData1.current)*20) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); Main.KillTimer(1); buy = false; } if (MarketData1.current >= (Account1.Balance.avgUnitCost - MarketData1.GetTickSize(MarketData1.current)*10) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); Main.KillTimer(1); buy = false; } } } if (barcount == 40) { Main.KillTimer(1); buy = false; Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); } } } 즐거운 하루되세요 > 워싱턴 님이 쓴 글입니다. > 제목 : 수식 작성 부탁드립니다. > 안녕하세요 많은 도움에 항상 감사드립니다. 아래 예시의 스팟 수식을 부탁드립니다. 1. 아래의 스팟 샘플은 매수 포지션 일때, 익절과 손절 설정입니다. 아래의 조건문에 추가하거나 아니면 새롭게 트레일링 조건을 하나 더 추가하고 싶습니다. ( 예시 : 수익 최고치가 진입가의 + 25틱 이되면 트레일링 발동하여 (최고치에서) -5틱 아래로 내려오면 전량 청산. 예로는 +25틱에서 -5틱 이상 떨어지지 않으면 계속 증가하여 최종 +50틱에서 전량 청산한다.) // ---------------------------------------------------------- //잔고가 매수포지션이고 매수잔고 수량이 있을떄 if (Account1.Balance.position == 2 ) { //현재가가 잔고평단가 대비 지정틱수(+50틱) 이상이면 익절청산 (시장가) if (MarketData1.current >= (Account1.Balance.avgUnitCost + MarketData1.GetTickSize()*50) ) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0, 1); } } // ---------------------------------------------------------- 2. 스팟에서 매매시간 설정이 가능하다면, 스팟에서 아래와 같이 설정하고 싶습니다. (1) 거래시간 #1 : 당일 오전 10시 ~ 저녁 9시 #2 : 당일 저녁 11시 ~ 저녁 12시 #3 : 다음날 오전 00시 ~ 오전 4시 ( 오전 10시~ 다음날 오전4시 (당일 저녁 9시~11시 제외) ) 3. 손절 익절 초기 설정은 손절(25틱)/익절(25틱) 입니다. (1) 진입후에 30분이 지나도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 30분이 지나도 청산이 되지 않으면 현재가에 청산한다. (2) 진입후에 20봉이 경과해도 청산이 되지 않는 경우, 손절/익절을 각 각 10틱으로 변경하고, 그 이후에 또 20봉이 경과해도 청산이 되지 않으면 현재가에 청산한다. 감사합니다.