커뮤니티

예스스팟 Q&A

답변완료

문의드립니다

안녕하세요 이제 더위가 한풀꺾이는듯합니다. 이럴때 감기가 잘 온다고 합니다. 건강관리 잘하시고요 다름이 아니라 진입시 시가기준으로 진입을 하는데 봉캔들의 액션을 참고로 하고싶어서요 이런것도 가능한지 여쭤보고싶습니다 시가를 기준으로 1분봉이 시가위인경우 1분봉완성봉의 저가가 시가위면 다음봉시가에 진입을 한다라는조건을 진입에 주고싶은데 가능한지 매도도 마찬가지로 시가 아래에 1분봉완성봉고가가 있을때만 다음봉시가에 진입 이런식으로 하고싶습니다
프로필 이미지
1000djr
2024-08-28
526
글번호 226103
답변완료

하루에 한 종목만 거래할수 있게 자바 부탁해요

하루에 한 종목만 거래할수 있게 자바 수정부탁해요 건강하세요 var timer120 = 120; // 2분 var 매수금 = 19000000; var 손절 = 0.89; var 익절 = 1.05; var OrderList = []; var MKList = []; var req; function Main_OnStart() { //1번 타이머, 2분 Main.SetTimer(1, timer120*1000); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; //스팟 시작시 잔고평가금액 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 < 113000) { //종목검색 수행 Main.ReqPowerSearch("단타테스트2") } if (nEventID == 1) { //계좌보유종수 var num = Account1.GetTheNumberOfBalances(); //9시~11시 15분 사이 if (HHMMSS >= 090000 && HHMMSS < 113000) { //보유종목이 1개 이상 if (num >= 1) { //계좌평가금액이 스팟시작시 평가금액대비 5% 이상이면 전종목 전량매도 if (Account1.GetBalanceETCinfo(100) >= V1*1.05) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } else //아니면 개별종목 5%익절, -5%손절 체크 { //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 5%수익이거나 -11% 손실이면 시장가 매도 if (Account1.Balance.count > 0 && (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.05 || Account1.Balance.current <= Account1.Balance.avgUnitCost*0.89)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } } //14시 15분이후이면 모든 종목 전량 수익에 상관없이 매도 if (HHMMSS >= 141500) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvItemList(aItemList, nCount) { Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList; } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); } } } } if (OrderList.length == 0) { Main.SetTimer(1, timer120*1000); } else { req = 0; Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 //Account1.OrderBuy(MarketData.code,1,0,1); 밑에 한번에 17000000 시장가에 매수 Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); //Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(4)),MarketData.Ask(1),0); //지정가로 주문하고자 하시면 주문함수 내용을 위와 같이 변경하시면 됩니다. Main.MessageList(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } req = req+1; if (req < OrderList.length) { var aa = Main.ReqMarketData(OrderList[req]); if (aa == -1) { Main.SetTimer(2, 15000); } } else { Main.SetTimer(1, timer120*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 반환 }
프로필 이미지
뽀스뽀스
2024-08-26
534
글번호 226098
답변완료

크립토,nft 프로그램

nft 거래소에는 주식 봉그림(차트)와 같은 방식의 봉그림이 없어서 nft 봉그림과 암호화폐 현물 선물 연관 시스템 트레이딩 프로그램 제작 계획?
프로필 이미지
aw
2024-08-24
507
글번호 226096
답변완료

MarketData에 시가총액 추가 요청

종목객체에 종목의 기본정보가 추가되면 좋겠습니다. 주가따라 바뀌어서 문제라면 유통주식수 같은 것 정도라도... 기술적 분석이어도 수급이 시총대비 어떤지는 유용한 정보인데...ㅠㅠ 가능할까요?
프로필 이미지
푸른비행
2024-08-23
472
글번호 226095
답변완료

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

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

TypeError: Account1.OrderReplace is not a function

SI증권, NH선물에서 모의테스트 중인데 NH선물에서만 이런 오류가 뜹니다. TypeError: Account1.OrderReplace is not a function 원주문을 취소하려다가 원주문이 없어서 거부된 것으로 보이는데 어떻게 해야 하는지 가이드 부탁드립니다.
프로필 이미지
gap
2024-08-20
505
글번호 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
571
글번호 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
538
글번호 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
499
글번호 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
680
글번호 226077