커뮤니티

차트신호시 콜옵션 풋옵션 동시매수 청산추가 0.01 도달시

프로필 이미지
좌오비우오비
2024-11-15 09:33:08.0
1320
글번호 225749
답변완료
아래 수식은 장종료 시점에 청산시간 조건으로만 exit 합니다. 콜매수 포지션 가격이 0.01 되면 콜포지션 청산 풋매수 포지션 가격이 0.01 되면 풋포지션 청산 위 조건을 추가해 주십시요. 만기일에 매수가격이 없는 경우가 발생하므로 그전에 청산하려고 합니다. 항상 고맙습니다. ****************************************************************************** 안녕하세요 예스스타입니다. 1 Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 1); 주문함수의 마지막 옵션은 지정가나 시장가등을 지정하는 옵션입니다. 0이면 지정가, 1이면 시장가입니다. 시장가이면 가격을 지정할 필요가 없어 주문가격은 0으로 지정하시면 됩니다. Account1.OrderBuy(CallOrderCode, 1, 0, 1); 만약 지정가로 주문한다면 아래와 같이 마지막옵션이 0으로 지정하시면 됩니다. Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0); 아래식에는 지정가로 작성해 드립니다. 시장가도 주석처리로 추가해 드립니다. 2 var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; var CallExit,PutExit; function Main_OnStart() { CallExit = false; PutExit = 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); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = 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; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 1.0이하이면 if (Option1.GetCurrent(1, ii) <= 1.0 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetCurrent(1, ii); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option1.GetATMPutRecent(ii); } else //1.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -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] } } //배열변수 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("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //콜옵션종목 매수 if (CallExit == false) { //지정가 Account1.OrderBuy(CallOrderCode, 1, Option1.GetAskByCode(CallOrderCode, 2), 0); //시장가 //Account1.OrderBuy(CallOrderCode, 1, 0, 1); } //콜옵션종목 매수 if (PutExit == false) { //지정가 Account1.OrderBuy(PutOrderCode, 1, Option1.GetAskByCode(PutOrderCode, 2), 0); //시장가 //Account1.OrderBuy(PutOrderCode, 1, 0, 1); } } } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && CallExit == false && HHMMSS >= 143530) { CallExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } if (nEventID == 1 && PutExit == false && HHMMSS >= 151530) { PutExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } }
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2022-12-27 17:42:06.0

안녕하세요 예스스탁입니다. var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; var CallExit,PutExit; function Main_OnStart() { CallExit = false; PutExit = 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); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = 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; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 1.0이하이면 if (Option1.GetCurrent(1, ii) <= 1.0 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetCurrent(1, ii); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option1.GetATMPutRecent(ii); } else //1.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -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] } } //배열변수 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("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //콜옵션종목 매수 if (CallExit == false) { //지정가 Account1.OrderBuy(CallOrderCode, 1, Option1.GetAskByCode(CallOrderCode, 2), 0); //시장가 //Account1.OrderBuy(CallOrderCode, 1, 0, 1); } //콜옵션종목 매수 if (PutExit == false) { //지정가 Account1.OrderBuy(PutOrderCode, 1, Option1.GetAskByCode(PutOrderCode, 2), 0); //시장가 //Account1.OrderBuy(PutOrderCode, 1, 0, 1); } } } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && CallExit == false && HHMMSS >= 143530) { CallExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } if (nEventID == 1 && PutExit == false && HHMMSS >= 151530) { PutExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } if (nEventID == 1 && (CallExit == false || PutExit == false)) { var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i); var unum = Account1.GetTheNumberOfUnfills(); if (unum > 0) { var ExitO = true; for (var z = 0; z < unum; z++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == Account1.Balance.code && Account1.Unfill.orderKind == 1) { ExitO = false; } } } if (ExitO == true && Account1.Balance.position == 2 && Account1.Balance.current == 0.01) { //지정가(0.01) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0.01, 0); } } } } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : 문의 > 아래 수식은 장종료 시점에 청산시간 조건으로만 exit 합니다. 콜매수 포지션 가격이 0.01 되면 콜포지션 청산 풋매수 포지션 가격이 0.01 되면 풋포지션 청산 위 조건을 추가해 주십시요. 만기일에 매수가격이 없는 경우가 발생하므로 그전에 청산하려고 합니다. 항상 고맙습니다. ****************************************************************************** 안녕하세요 예스스타입니다. 1 Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 1); 주문함수의 마지막 옵션은 지정가나 시장가등을 지정하는 옵션입니다. 0이면 지정가, 1이면 시장가입니다. 시장가이면 가격을 지정할 필요가 없어 주문가격은 0으로 지정하시면 됩니다. Account1.OrderBuy(CallOrderCode, 1, 0, 1); 만약 지정가로 주문한다면 아래와 같이 마지막옵션이 0으로 지정하시면 됩니다. Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 2), 0); 아래식에는 지정가로 작성해 드립니다. 시장가도 주석처리로 추가해 드립니다. 2 var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; var CallExit,PutExit; function Main_OnStart() { CallExit = false; PutExit = 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); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = 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; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 1.0이하이면 if (Option1.GetCurrent(1, ii) <= 1.0 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetCurrent(1, ii); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option1.GetATMPutRecent(ii); } else //1.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -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] } } //배열변수 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("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //콜옵션종목 매수 if (CallExit == false) { //지정가 Account1.OrderBuy(CallOrderCode, 1, Option1.GetAskByCode(CallOrderCode, 2), 0); //시장가 //Account1.OrderBuy(CallOrderCode, 1, 0, 1); } //콜옵션종목 매수 if (PutExit == false) { //지정가 Account1.OrderBuy(PutOrderCode, 1, Option1.GetAskByCode(PutOrderCode, 2), 0); //시장가 //Account1.OrderBuy(PutOrderCode, 1, 0, 1); } } } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && CallExit == false && HHMMSS >= 143530) { CallExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } if (nEventID == 1 && PutExit == false && HHMMSS >= 151530) { PutExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } }
프로필 이미지

좌오비우오비

2022-12-29 12:48:36.0

답변 수식은 call,put 이 동일하게 0.01 일 때 청산하는 수식입니다. call 0.01 일 때와 put 0.02 일 때 각각 분리되어 청산이 진행되도록 하는 수식 부탁 드립니다. 처음부터 이렇게 요청 드렸어야 했는데 번거롭게 해서 죄송합니다. ********************************************************************************** if (nEventID == 1 && (CallExit == false || PutExit == false)) { var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i); var unum = Account1.GetTheNumberOfUnfills(); if (unum > 0) { var ExitO = true; for (var z = 0; z < unum; z++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == Account1.Balance.code && Account1.Unfill.orderKind == 1) { ExitO = false; } } } if (ExitO == true && Account1.Balance.position == 2 && Account1.Balance.current == 0.01) { //지정가(0.01) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0.01, 0); } } } } }
프로필 이미지

예스스탁 예스스탁 답변

2022-12-29 15:45:01.0

안녕하세요 예스스탁입니다. var UNum; var LNum; var CallCode; var CallPrice; var PutCode; var PutPrice; var CC; var PP; var CallOrderCode; var PutOrderCode; var CallExit,PutExit; function Main_OnStart() { CallExit = false; PutExit = 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); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 PutPrice = 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; } } //풋종목 찾기 //풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로 //for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함 for (var ii = -UNum; ii <= LNum; ii++) { //ii단계 풋종목이 1.0이하이면 if (Option1.GetCurrent(1, ii) <= 1.0 ) { //해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장 PutPrice[ii+UNum] = Option1.GetCurrent(1, ii); //해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장 PutCode[ii+UNum] = Option1.GetATMPutRecent(ii); } else //1.0보다 크면 { //배열변수 PutPrice의 방번호 ii+LNum에 -1 저장 PutPrice[ii+UNum] = -1; //배열변수 PutCode의 방번호 ii+LNum에 -1 저장 PutCode[ii+UNum] = -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] } } //배열변수 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("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); Main.MessageList("풋종목코드:",PutOrderCode,"/풋현재가 :",PP); //콜옵션종목 매수 if (CallExit == false) { //지정가 Account1.OrderBuy(CallOrderCode, 1, Option1.GetAskByCode(CallOrderCode, 2), 0); //시장가 //Account1.OrderBuy(CallOrderCode, 1, 0, 1); } //콜옵션종목 매수 if (PutExit == false) { //지정가 Account1.OrderBuy(PutOrderCode, 1, Option1.GetAskByCode(PutOrderCode, 2), 0); //시장가 //Account1.OrderBuy(PutOrderCode, 1, 0, 1); } } } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && CallExit == false && HHMMSS >= 143530) { CallExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } if (nEventID == 1 && PutExit == false && HHMMSS >= 151530) { PutExit = true; var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Main.MessageList(Account1.Balance.code,Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code))); Account1.SetBalance(i); if (Account1.Balance.position == 2 && Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(매수2호가) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetBidByCode(Account1.Balance.code, 2), 0); //시장가 //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1); } } } } if (nEventID == 1 && (CallExit == false || PutExit == false)) { var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i); var unum = Account1.GetTheNumberOfUnfills(); if (unum > 0) { var ExitO = true; for (var z = 0; z < unum; z++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == Account1.Balance.code && Account1.Unfill.orderKind == 1) { ExitO = false; } } } if (ExitO == true && Account1.Balance.position == 2) { //콜 if (Account1.Balance.current == 0.01 && Option1.GetCodeByExercisePrice(0, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(0.01) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0.01, 0); } //풋 if (Account1.Balance.current == 0.02 && Option1.GetCodeByExercisePrice(1, Option1.GetExercisePrice(Account1.Balance.code)) == Account1.Balance.code) { //지정가(0.01) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0.02, 0); } } } } } } 즐거운 하루되세요 > 좌오비우오비 님이 쓴 글입니다. > 제목 : Re : Re : 문의 > 답변 수식은 call,put 이 동일하게 0.01 일 때 청산하는 수식입니다. call 0.01 일 때와 put 0.02 일 때 각각 분리되어 청산이 진행되도록 하는 수식 부탁 드립니다. 처음부터 이렇게 요청 드렸어야 했는데 번거롭게 해서 죄송합니다. ********************************************************************************** if (nEventID == 1 && (CallExit == false || PutExit == false)) { var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i); var unum = Account1.GetTheNumberOfUnfills(); if (unum > 0) { var ExitO = true; for (var z = 0; z < unum; z++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == Account1.Balance.code && Account1.Unfill.orderKind == 1) { ExitO = false; } } } if (ExitO == true && Account1.Balance.position == 2 && Account1.Balance.current == 0.01) { //지정가(0.01) Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0.01, 0); } } } } }