커뮤니티

문의

프로필 이미지
좌오비우오비
2024-01-06 06:53:16.0
495
글번호 225907
답변완료
아래 수식으로 콜매도 진입한 후 차트에서 신호를 이용하여 청산하는 수식 요청드립니다. 1. 종목을 하나로 정해서 진입하는 경우는 청산할 때 진입한 종목과 청산할 종목간의 매칭에 어려움이 없습니다. 하지만 아래 수식처럼 진입시 가격의 범위로 종목을 정하면 청산할 때 매칭하는 수식이 쉽지 않습니다. 2. 하나의 계좌에 다른 진입건들의 미결제와 혼재되어 있는 상황에서 아래 수식으로 진입한 미결제만 정확히 청산하고 싶습니다. 3. 아래 수식의 진입은 콜매도 3개 입니다. 차트에서 청산신호가 발생하는 조건에서 청산은 2개만 하고 1개를 남기고 싶습니다. 위 3가지 사항을 만족하는 수식을 요청드립니다. 항상 고맙습니다. **************************************************************************************** var UNum; var LNum; var CallCode; var CallPrice; var CC; var CallOrderCode; var CallExit; function Main_OnStart() { CallExit = false; Main.SetTimer(1, 5000); } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //1.0이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option1.uppersATM; //ATM아래 행사가 갯수 LNum = Option1.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 CallPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 1.0이하이면 if (Option1.GetCurrent(0, i) < 1.0) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option1.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option1.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//1.0보다 크면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 CC = -1; CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum] } } Main.MessageList("--------------------------------------------"); Main.MessageList("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); //콜옵션종목 매도 if (CallExit == false) { //지정가 Account1.OrderSell(CallOrderCode, 3, Option1.GetBidByCode(CallOrderCode, 5), 0); //시장가 //Account1.OrderSell(CallOrderCode, 3, 0, 1); } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2024-01-11 18:41:23.0

> 좌오비우오비 님이 쓴 글입니다. > 제목 : 문의 > 아래 수식으로 콜매도 진입한 후 차트에서 신호를 이용하여 청산하는 수식 요청드립니다. 1. 종목을 하나로 정해서 진입하는 경우는 청산할 때 진입한 종목과 청산할 종목간의 매칭에 어려움이 없습니다. 하지만 아래 수식처럼 진입시 가격의 범위로 종목을 정하면 청산할 때 매칭하는 수식이 쉽지 않습니다. 2. 하나의 계좌에 다른 진입건들의 미결제와 혼재되어 있는 상황에서 아래 수식으로 진입한 미결제만 정확히 청산하고 싶습니다. 3. 아래 수식의 진입은 콜매도 3개 입니다. 차트에서 청산신호가 발생하는 조건에서 청산은 2개만 하고 1개를 남기고 싶습니다. 위 3가지 사항을 만족하는 수식을 요청드립니다. 항상 고맙습니다. **************************************************************************************** var UNum; var LNum; var CallCode; var CallPrice; var CC; var CallOrderCode; var CallExit; function Main_OnStart() { CallExit = false; Main.SetTimer(1, 5000); } //차트에서 신호가 발생하면 function Chart1_OnRiseSignal(Signal) { //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //1.0이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option1.uppersATM; //ATM아래 행사가 갯수 LNum = Option1.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 CallPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 1.0이하이면 if (Option1.GetCurrent(0, i) < 1.0) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option1.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option1.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//1.0보다 크면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -1; } } //배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고 //CallCode의 동일 방번호의 값을 CallOrderCode에 저장 CC = -1; CallOrderCode = -1; for (var iii = -LNum; iii <= UNum; iii++) { if (CallPrice[iii+LNum] > CC) { CC = CallPrice[iii+LNum]; CallOrderCode = CallCode[iii+LNum] } } Main.MessageList("--------------------------------------------"); Main.MessageList("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); //콜옵션종목 매도 if (CallExit == false) { //지정가 Account1.OrderSell(CallOrderCode, 3, Option1.GetBidByCode(CallOrderCode, 5), 0); //시장가 //Account1.OrderSell(CallOrderCode, 3, 0, 1); } } }