커뮤니티

예스스팟 Q&A

답변완료

취소 접수 확인을 위한 프라퍼티는 어떤것일까요?

주문을 취소한 것도, 주문접수 함수가 반응하네요. Main_OnOrderResponse(OrderResponse)의 OrderResponse에서 원주문, 주문수정, 주문취소 각각을 구분하려면 어떤 프라퍼티를 이용해야 할까요? 그리고, STOP주문이나, 외부에서 한 주문의 경우를 구분할 수 있는지요? 있다면 어떻게 구분해야하는지 알려주시기 바랍니다.
프로필 이미지
푸른비행
2024-08-23
417
글번호 226086
답변완료

TypeError: Account1.OrderReplace is not a function

SI증권, NH선물에서 모의테스트 중인데 NH선물에서만 이런 오류가 뜹니다. TypeError: Account1.OrderReplace is not a function 원주문을 취소하려다가 원주문이 없어서 거부된 것으로 보이는데 어떻게 해야 하는지 가이드 부탁드립니다.
프로필 이미지
gap
2024-08-20
458
글번호 226085
답변완료

외가격 옵션 매수

1. 검토사항 (아래 수식) 진입조건(등가격의 합과 차)을 만족했을 때 등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다. 코딩내용이 맞는지 봐주셨으면 합니다. 2. 요청수식 검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다. 등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다. (판단은 등가격의 합과 차로, 액션은 외가격으로) 익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다. 포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다. **************************************************************************** var ID, num; var Entry, Code; var Xvol; var HasExited; // 청산 후 재진입을 방지하는 변수 function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격) Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격) Entry = 0; // 초기 Entry 값 설정 HasExited = false; // 초기 재진입 가능 상태 } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); if (nEventID == 1) { if (!HasExited) { // 재진입 방지 조건 추가 if (HHMMSS >= 84500) { var CallPrice = Option1.GetCurrent(0, 0); var PutPrice = Option1.GetCurrent(1, 0); var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5); var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5); var absCall = Math.abs(CallPrice); var absPut = Math.abs(PutPrice); var sum = absCall + absPut; var diff = Math.abs(absCall - absPut); // 진입 조건 if (Entry == 0 && sum <= 5.00 && diff <= 2.50) { if (absCall <= absPut) { Entry = CallPrice; Code = Option1.GetATMCallRecent(0); ID = Account1.OrderBuy(Code, 1, CallAsk, 0); Xvol = 1; } else { Entry = PutPrice; Code = Option1.GetATMPutRecent(0); ID = Account1.OrderBuy(Code, 1, PutAsk, 0); Xvol = 1; } } // 익절/손절 조건 if (Entry > 0 && Xvol > 0) { var currentPrice = Option1.GetCurrent(Code); if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) { closePosition(); // 청산 후 매수 재진입 방지 HasExited = true; // 청산 후 재진입 방지 Main.KillTimer(1); // 타이머 1 종료 } } } } } if (nEventID == 2) { // 15시 청산 조건 if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산 closePosition(); Main.KillTimer(2); // 타이머 2 종료 } } } function closePosition() { // 포지션 청산 if (Xvol > 0) { if (Code) { Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0); } } Entry = 0; // Entry 값 초기화 Code = null; // Code 초기화 Xvol = 0; // 수량 초기화 // HasExited = true; // 청산 후 재진입 방지 } function Main_OnOrderResponse(OrderResponse) { // 주문 응답 처리 if (OrderResponse.orderID == ID) { num = OrderResponse.orderNum; } }
프로필 이미지
좌오비우오비
2024-08-22
514
글번호 226084
답변완료

문의드립니다

안녕하세요 계좌잔고 에 있는데 중복매수되는걸 어떻게 해야하는지 문의드립니다 계좌에 잇다면 pass해야하는데 그걸 어떻게 넣어야 하는지 부탁드립니다 var 진입수량 = 2; var DH, DH1, DL, DL1; var BEID, BENM, SEID, SENM; var CC, C1; var T; function Main_OnStart() { Main.MessageList("Start"); T = 0; } function Main_OnU*dateMarket(sItemCode, lU*dateID) { if (lU*dateID == 20001) { C1 = CC; CC = MarketData1.current; Main.MessageList("Main_OnU*dateMarket", MarketData1.current); // 시초가 + 10틱 터치 if (T <= 0 && C1 > 0 && C1 < MarketData1.open + MarketData1.GetTickSize() * 10 && CC >= MarketData1.open + MarketData1.GetTickSize() * 10) { T = 1; BEID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 진입수량, MarketData1.current, 2); Main.MessageList("매수 진입 주문: " + MarketData1.current,+ MarkerDatal.open); } // 매수 후 손절, 익절, 미체결 셋팅 if (T == 1) { // 손절 셋팅 if (MarketData1.current <= MarketData1.open - MarketData1.GetTickSize() * 8) { 청산수량처리(BENM, 진입수량, "매수 포지션 손절"); T = 0; // 초기화 } // 익절 셋팅 else if (MarketData1.current >= MarketData1.open + MarketData1.GetTickSize() * 130) { 청산수량처리(BENM, 진입수량, "매수 포지션 익절"); T = 0; // 초기화 } } // 시초가 - 10틱 터치 if (T >= 0 && C1 > MarketData1.open - MarketData1.GetTickSize() * 10 && CC <= MarketData1.open - MarketData1.GetTickSize() * 10) { T = -1; SEID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 진입수량, MarketData1.current, 2); Main.MessageList("매도 진입 주문: " + MarketData1.current,+ MarkerDatal.open); } // 매도 후 손절, 익절, 미체결 셋팅 if (T == -1) { // 손절 셋팅 if (MarketData1.current >= MarketData1.open + MarketData1.GetTickSize() * 8) { 청산수량처리(SENM, 진입수량, "매도 포지션 손절"); T = 0; // 초기화 } // 익절 셋팅 else if (MarketData1.current <= MarketData1.open - MarketData1.GetTickSize() * 130) { 청산수량처리(SENM, 진입수량, "매도 포지션 익절"); T = 0; // 초기화 } } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BEID) { BENM = OrderResponse.orderNum; } if (OrderResponse.orderID == SEID) { SENM = OrderResponse.orderNum; } } function 청산수량처리(orderNum, 수량, message) { Account1.SetUnfillOrderNumber(orderNum); var 청산수량 = 수량 - Account1.Unfill.count; if (Account1.Unfill.count > 0) { Account1.OrderCancel(orderNum); } if (청산수량 > 0) { if (T == 1) { Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 청산수량, MarketData1.current, 2); Main.MessageList("매수 포지션 청산: " + MarketData1.current + " (" + message + ")"); } else if (T == -1) { Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 청산수량, MarketData1.current, 2); Main.MessageList("매도 포지션 청산: " + MarketData1.current + " (" + message + ")"); } } } 이렇게 되있는데 어떤땐 정상적으로 2계약체결되고 어떤땐 4계약이 체결됩니다
프로필 이미지
1000djr
2024-08-16
478
글번호 226083
답변완료

문의 드립니다

안녕하세요! https://www.yesstock.com/Board/View.asp?db=board100070&Ext=0&startpage=1&pageno=1&num=4480&ref=4471&Sort=&KeyField=Content&KeyWord=%B0%FC%BD%C9%C1%BE%B8%F1&SystemName= 윗글을 보고 궁금한점이 생겨서 문의 드립니다. 링크된 문의 내용을 간략히 말하자면 관심종목을 감시해서 조건이 맞을때 자동 매수매도가 되냐는 질문이였는데요, 저도 비슷한 맥락의 스팟을 만들고 싶은데 궁금한부분이 있어서요. 예시로 작성해주신 가이드문에선 5초 간격으로 관심종목의 시세와 계좌를 감시해 조건문이 실행된다고 해주셨는데요. 5초인 이유가 있나요? 혹시 그보다 더 잦은 빈도수로 감시가 불가능하거나 그렇게하면 문제가 생길 수 있나요? 저는 1초나 그 이하로 감시를 했으면 하는데 이부분이 기술적으로 불가능한가요? 관심종목의 종목수 자체는 그렇게 까지 많지 않을거라서요... 배우기 시작한지 얼마 안되서 여쭤봅니다 도와주셔서 감사합니다!
프로필 이미지
제천지박령
2024-08-15
446
글번호 226082
답변완료

주문 수량 오류 -1 문의드립니다.

안녕하세요. 수식작성을 했는데 매수할 때 자꾸 매수가 안되고 주문상태에 주문수량오류 (주문수량:-1) 이라고 뜹니다. 뭐가 잘못 작성 된 것 일까요? 저는 NH증권을 쓰고 매수금액을 주문가능금액의 85프로로 설정하였습니다. 차트에서 신호받아서 매수하진 않고, 검색기에 뜨는 종목을 매수합니다. 한번 봐주시길 바라겠습니다. 감사합니다. var 타이머간격 = 3; var 손절 = 0.95; var 익절 = 1.05; var OrderList = []; var MKList = []; var req; var 매수금; function Main_OnStart() { //1번 타이머, 3초 Main.SetTimer(1, 타이머간격*1000); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; //주문가능현금의 85% 매수금 = Account1.GetBalanceETCinfo(16)*0.85; //스팟 시작시 잔고평가금액 V1 = Account1.GetBalanceETCinfo(100); } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS < 151500) { // 종목검색 실행 //조건검색명입력 Main.ReqPowerSearch("전략2"); } if (nEventID == 1) { //계좌전체종목수 var num = Account1.GetTheNumberOfBalances(); //9시~15시 15분 사이 if (HHMMSS >= 90000 && HHMMSS < 151500) { //보유종목이 1개 이상 if (num >= 1) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 인덱스를1씩증가 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (Account1.Balance.count > 0 && (Account1.Balance.current >= Account1.Balance.avgUnitCost*익절 || Account1.Balance.current <= Account1.Balance.avgUnitCost*손절)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } //15시 15분이후이면 if (HHMMSS >= 151500) { //1번 타이머 종료 Main.KillTimer(1); //미체결 전체 취소 var Unum = Account1.GetTheNumberOfUnfills() for(var i = 0; i < Unum; i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); if (Account1.Balance.count > 0) //잔고에 수량이 0이상이면 { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); //시장가로매도 } } } } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvItemList(aItemList, nCount) //종목검색완료 { OrderList = []; if (nCount >= 1) //1종목 이상 검색되면 { Main.KillTimer(1); if (MKList.length == 0) //첫검색이면 { OrderList = aItemList; //해당 종목코드 모두 종목객체요청 리스트에 추가 } else //첫검색이 아니면 { for (var a = 0; a < nCount; a++) //기존종목객체요청리스트에 없는 종목만 선별 { var Add = true; for (var b = 0; b < BuyList.length; b++) { if (aItemList[a] == BuyList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); } } } } if (OrderList.length == 0) //종목객체 요청할 종목수가 없으면 종목검색을 위해 타이머 다시 동작 { Main.SetTimer(1, 타이머간격*1000); //1번타이머재동작 } else //종목객체 요청할 종목수가 1이상이면 { req = 0; //요청횟수는 초기값 0 Main.ReqMarketData(OrderList[req]); //요청시작 } } function Main_OnRcvMarketData(MarketData) //요청한 종목객체가 만들어지먼 { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); //MK배열변수에 순서대로 종목객체저장 // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); // 시장가 주문 Main.MessageList(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } req = req+1; //요청횟수 1증가 if (req < OrderList.length) //요청횟수가 요청할종목수 미만이면 { var aa = Main.ReqMarketData(OrderList[req]); //다음종목 요청 if (aa == -1) //종목객체 제한시간에 걸리면(15초에 60개) 15초 쉬고 다시 요청 { Main.SetTimer(2, 15000); } } else //모두 요청했으면 { Main.SetTimer(1, 타이머간격*1000); //종목검색을 위해 타이머 다시 동작 } } } function IsStockInAccount(stockCode) { // 계좌에 해당 종목이 있는지 확인하는 함수 var numberOfBalances = Account1.GetTheNumberOfBalances(); for (var i = 0; i < numberOfBalances; i++) { Account1.SetBalance(i); if (stockCode == Account1.Balance.code) { return true; // 계좌에 같은 종목이 있으면 true 반환 } } return false; // 계좌에 같은 종목이 없으면 false 반환 }
프로필 이미지
iinnn
2024-08-12
607
글번호 226077
답변완료

문의드립니다

안녕하세요 문의 드립니다 -.차트에 나타나는 매매신호에 따라 진입이 되는 경우 최초 신호(매수신호이든 매도신호이든) 에는 진입이 안되고 두번째 신호(매도청산 또는 매수청산) 이후 에만 진입이 되는 식 (즉 첫번째신호만 진입 안하는 경우의 수식) -.(예를들어) 8시50분에 선물매수신호가 완성되고---1번신호 9시15분에 선물매수청산 신호---2번신호 가 나오는 경우 1번신호에는 진입이 안되고 2번 신호에는 진입(매수청산 즉 매도) 되게 하는 수식 부탁드립니다
프로필 이미지
tktmsl
2024-08-19
523
글번호 226076

Trader 님에 의해서 삭제되었습니다.

프로필 이미지
Trader
2024-08-12
7
글번호 226075

하운드독 님에 의해서 삭제되었습니다.

프로필 이미지
하운드독
2024-08-08
6
글번호 226073
답변완료

MarketData1 옵션 매수 다운하이, 하이다운하이

MarketData1에 옵션종목 1개를 선정하여 진입하는 수식입니다. 요청수식 1. 시작 084500 우선순위 1 : 가격이 1.00 보다 작아지고 우선순위 2 : 가격이 1.01 보다 커지면 매수 1계약 지정가 상대5호가 익절 1.00, 손절 0.50 1번 진입하고 1번 청산하면 추가 진입금지 endofday 151500 주의점 : 계좌에는 다른 전략의 미결제들도 있으므로 그것들과 구별하여 청산함. 요청수식 2. 시작 084500 우선순위 1 : 가격이 1.50 보다 커지고 우선순위 2 : 가격이 1.00 보다 작아지고 우선순위 3 : 가격이 1.01 보다 커지면 매수 1계약 지정가 상대5호가 익절 1.00, 손절 0.50 1번 진입하고 1번 청산하면 추가 진입금지 endofday 151500 주의점 : 계좌에는 다른 전략의 미결제들도 있으므로 그것들과 구별하여 청산함. 수식 부탁드립니다.
프로필 이미지
좌오비우오비
2024-11-15
690
글번호 226072