커뮤니티

차트신호시 풋편매수 트레일링 스탑 추가

프로필 이미지
좌오비우오비
2024-11-15 09:47:52.0
631
글번호 225926
답변완료

첨부 이미지

1) 체결오류 메세지 건(별첨파일 참조) 모의투자로 한달 동안 체결에 이상이 없었는데 금일 2024년 1월 19일 090200 주문가격이 하한가 미만이란 메세지를 받았습니다. 주문 건들은 모두 등가격이고 주문형식은 지정가 5를 사용하고 있습니다. 다시 한 번 주문을 내보았는데 102800 주문 건은 정상 체결되었습니다. 모의투자라서 발생할 수 있는 오류인가요? 2) 아래수식에 트레일링스탑 내용을 추가하고 싶습니다. 진입가격이 등가격까지 상승했을 때 고점에서 0.5 하락시 청산 위 조건에서 청산되지 않고 내가격 1까지 상승했을 때 고점에서 1.25 하락시 청산 항상 고맙습니다. ************************************************************************************ var UNum; var LNum; var PutCode; var PutPrice; var PP; var PutOrderCode; var PutExit; function Main_OnStart() { PutExit = false; Main.SetTimer(1, 5000); } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매도신호이면 if (Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //0.5 이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option1.uppersATM; //ATM아래 행사가 갯수 LNum = Option1.lowersATM; //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = new Array(UNum+LNum+1); //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 0.5 이하이면 if (Option1.GetCurrent(1, ii) <= 0.5 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetCurrent(1, ii); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option1.GetATMPutRecent(ii); } else //0.5 보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -1; } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 PP = -1; PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } Main.MessageList("--------------------------------------------"); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //풋옵션종목 매수 if (PutExit == false) { //지정가 Account1.OrderBuy(PutOrderCode, 1, Option1.GetAskByCode(PutOrderCode, 5), 0); //시장가 //Account1.OrderSell(PutOrderCode, 1, 0, 1); } } if (Signal.signalKind == 4) { Account1.OrderSell(PutOrderCode, 1, Option1.GetBidByCode(PutOrderCode, 5), 0); } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2024-02-20 12:48:54.0

안녕하세요 예스스탁입니다. 1 특정 매수호가나 매도호가를 주문시 지정한 호가가 없으면 값이 0이 리턴됩니다. 지정한 호가가 없으면 그 아래 호가로 주문이 집행되게 수정해 드립니다. 2 2번 내용은 정확히 이해하지 못했습니다. 진입가격이 등가격이나 1내가격까지 상승이 어떤 의미인지 모르겠습니다. 진입종목이 ATM종목이 되면 최고가에서 0.5하락시 청산, 진입종목이 +1내가격이 되면 최고가에서 1.25하락하면 청산으로 작성해 드립니다. 3 var UNum; var LNum; var PutCode; var PutPrice; var PP; var PutOrderCode; var PutExit; var BID, Bnum,Fill; function Main_OnStart() { PutExit = false; Main.SetTimer(1, 5000); } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매도신호이면 if (Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //0.5 이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option1.uppersATM; //ATM아래 행사가 갯수 LNum = Option1.lowersATM; //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = new Array(UNum+LNum+1); //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 0.5 이하이면 if (Option1.GetCurrent(1, ii) <= 0.5 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetCurrent(1, ii); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option1.GetATMPutRecent(ii); } else //0.5 보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -1; } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 PP = -1; PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } Main.MessageList("--------------------------------------------"); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //풋옵션종목 매수 if (PutExit == false) { //1~5매도호가 중는 가장 높은 가격 var OP = 0; for (var i = 5; i >= 1; i--) { if (OP == 0 && Option1.GetAskByCode(PutOrderCode, i) > 0) { OP = Option1.GetAskByCode(PutOrderCode, i) } } //1~5 매도호가가 모두 없으면 현재가 if (OP == 0) { OP = Option1.GetCurrent(PutOrderCode); } //지정가 BID = Account1.OrderBuy(PutOrderCode, 1, OP, 0); Fill = false; //시장가 //Account1.OrderSell(PutOrderCode, 1, 0, 1); } } if (Signal.signalKind == 4) { Main.KillTimer(3); //1~5매수호가 중는 가장 낮은 가격 var OP = 0; for (var i = 5; i >= 1; i--) { if (OP == 0 && Option1.GetBidByCode(PutOrderCode, i) > 0) { OP = Option1.GetBidByCode(PutOrderCode, i) } } //1~5 매수호가가 모두 없으면 현재가 if (OP == 0) { OP = Option1.GetCurrent(PutOrderCode); } Account1.OrderSell(PutOrderCode, 1, OP, 0); } } //타이머 function Main_OnTimer(nEventID) { //3번타이머 if (nEventID == 3) { //PutOrderCode코드 종목 잔고 셋팅 Account1.SetBalance(PutOrderCode, 0); //매수포지션 수량이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //PutOrderCode가 ATM이면 if (Option1.GetATMPutRecent(0) == PutOrderCode) { //PutOrderCode종목 당일최고가에서 0.5하락하면 청산 if (Option1.GetCurrent(PutOrderCode) <= Option1.GetHigh(PutOrderCode)-0.5) { //1~5매수호가 중는 가장 낮은 가격 var OP = 0; for (var i = 5; i >= 1; i--) { if (OP == 0 && Option1.GetBidByCode(PutOrderCode, i) > 0) { OP = Option1.GetBidByCode(PutOrderCode, i) } } //1~5 매수호가가 모두 없으면 현재가 if (OP == 0) { OP = Option1.GetCurrent(PutOrderCode); } Account1.OrderSell(PutOrderCode, 1, OP, 0); Main.KillTimer(3); } } //PutOrderCode종목이 1내가격이면 if (Option1.GetATMPutRecent(-1) == PutOrderCode) { //PutOrderCode종목 당일최고가에서 1.25하락하면 청산 if (Option1.GetCurrent(PutOrderCode) <= Option1.GetHigh(PutOrderCode)-1.25) { //1~5매수호가 중는 가장 낮은 가격 var OP = 0; for (var i = 5; i >= 1; i--) { if (OP == 0 && Option1.GetBidByCode(PutOrderCode, i) > 0) { OP = Option1.GetBidByCode(PutOrderCode, i) } } //1~5 매수호가가 모두 없으면 현재가 if (OP == 0) { OP = Option1.GetCurrent(PutOrderCode); } Account1.OrderSell(PutOrderCode, 1, OP, 0); Main.KillTimer(3); } } } } } //진입주문 주문번호 function Main_OnOrderResponse(OrderResponse) { if (BID == OrderResponse.orderID) { Bnum = OrderResponse.orderNum; } } //진입주문 체결발생 function Main_OnNotifyFill(NotifyFill) { if (Fill == false && NotifyFill.orderNum == Bnum) { Fill = true; //3번 타이머 동작 Main.SetTimer(3, 1000); } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 문의 > 1) 체결오류 메세지 건(별첨파일 참조) 모의투자로 한달 동안 체결에 이상이 없었는데 금일 2024년 1월 19일 090200 주문가격이 하한가 미만이란 메세지를 받았습니다. 주문 건들은 모두 등가격이고 주문형식은 지정가 5를 사용하고 있습니다. 다시 한 번 주문을 내보았는데 102800 주문 건은 정상 체결되었습니다. 모의투자라서 발생할 수 있는 오류인가요? 2) 아래수식에 트레일링스탑 내용을 추가하고 싶습니다. 진입가격이 등가격까지 상승했을 때 고점에서 0.5 하락시 청산 위 조건에서 청산되지 않고 내가격 1까지 상승했을 때 고점에서 1.25 하락시 청산 항상 고맙습니다. ************************************************************************************ var UNum; var LNum; var PutCode; var PutPrice; var PP; var PutOrderCode; var PutExit; function Main_OnStart() { PutExit = false; Main.SetTimer(1, 5000); } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매도신호이면 if (Signal.signalKind == 3) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //0.5 이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option1.uppersATM; //ATM아래 행사가 갯수 LNum = Option1.lowersATM; //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = new Array(UNum+LNum+1); //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 0.5 이하이면 if (Option1.GetCurrent(1, ii) <= 0.5 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetCurrent(1, ii); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option1.GetATMPutRecent(ii); } else //0.5 보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -1; } } //배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고 //PutCode의 동일 방번호의 값을 PutOrderCode에 저장 PP = -1; PutOrderCode = -1; for (var iiii = -UNum; iiii <= LNum; iiii++) { if (PutPrice[iiii+UNum] > PP) { PP = PutPrice[iiii+UNum]; PutOrderCode = PutCode[iiii+UNum]; } } Main.MessageList("--------------------------------------------"); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //풋옵션종목 매수 if (PutExit == false) { //지정가 Account1.OrderBuy(PutOrderCode, 1, Option1.GetAskByCode(PutOrderCode, 5), 0); //시장가 //Account1.OrderSell(PutOrderCode, 1, 0, 1); } } if (Signal.signalKind == 4) { Account1.OrderSell(PutOrderCode, 1, Option1.GetBidByCode(PutOrderCode, 5), 0); } }