예스스탁
예스스탁 답변
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);
}
}