커뮤니티

예스스팟 Q&A

답변완료

여기 게시판은 답을 안해주시나요 궁금합니다....

여기 게시판은 답을 안해주시나요 궁금합니다....
프로필 이미지
wkri
995
글번호 225854
답변완료

예스스팟으로 파워종목 검색

예스스팟으로 파워종목 검색하여 자동매매 작동시 매매종목을 갯수를 제한할수있나요 또한 종목당 매수금액을 정할수 있는 명령어가있는지요
프로필 이미지
wkri
969
글번호 225853

올드송 님에 의해서 삭제되었습니다.

프로필 이미지
올드송
36
글번호 225852

관리자에 의해 수식작성 QnA로 이동되었습니다

if CrossUp(C,Bu[13])then 이런 조건이 있다면 ,,,13일전 볼밴상단을 종가가 상향돌파하면 이렇게 해석하나요? 처음 보는것 같아서요 아시는분 아무나 답좀주세요 ㅋ
프로필 이미지
트라이
38
글번호 225851
0
답변완료

문의합니다.

항상 빠른 대응 감사합니다. function Main_OnStart() { Main.ReqPowerSearch("#TEST"); } 위 처럼 사용자 검색식을 읽어온후 1) 매매는 9시 ~ 3시20분까지 거래 가능하며 2) 5분(15분/30분) 마다 검색식을 읽어와서 3) 첫매수 100만원 4) 분할매수 5회(-2%(첫매수금액의 0.2%) , -4%(첫매수금액의 0.2%), -6%(첫매수금액의 0.2%), -8%(첫매수금액의 0.2%), -10%(첫매수금액의 0.2%)) 5) 분할매도 4회(+2%, +4%, +6%, +8%)를 진행하며 분할매도시 1차매도후 -1.4% 밀리는경우 전체익절 분할매도시 1차,2차매도후 -1.4% 밀리는경우 전체익절 분할매도시 1차,2차,3차매도후 -1.4% 밀리는경우 전체익절 6) 수익보전은 최대 +15%상승후 -5% 밀리는 경우 전체 익절 7) StopLoss : -15%입니다. 가능하면 꼭..~~부탁드립니다.
프로필 이미지
배움이
782
글번호 225850
답변완료

한달이 넘었는데 답을 안해주네요.

글을 자꾸 수정해서 날자가 이렇지.. 원본글은 등록한지가 한달이 훌쩍 넘었습니다. 관리 안하려면 게시판 없애는게 좋겠습니다. 딱히 물어볼곳도 없고, 별로 대단한 이유라고는 생각되지 않지만 프로그램은 안되고.. 답답하니까 .. 오늘은 답을 달아줬을까 하면서 매일 와서 확인하고 있는데 그냥 희망고문이네요 이게 뭡니까;; 아니면 인원부족으로 한달에 한번만 답을 준다고 명시를 하시던가요;; 신규종목 추가시 판매가 원할히 안되요. 제가 이해한 바로는 Main_OnUp*dateAccount 에서 신규종목 추가를 감지하면 Main.ReqMarketData(sItemCode, 0, 0); 여기서 시장 테이터를 요청하고, 시장 데이터가 요청되면 Main_OnRcvMarketData 함수가 실행되면서 필요값을 초기화 한다로 이해 했습니다. 아무리 봐도 코드는 정상적인데 신규 종목이 추가되면 판매가 되지 않습니다. 코드를 재시작 시키면 정상 판매되구요. 코드를 계속 숫정중이라.. 확실하지는 않은데 Main_OnUp*dateAccount 의 ReqMarketData 부분을 가리키면서 이미 같은 종목이 있다고 할때도 있고,(같은 종목은 없습니다. 하나의 종목을 사고 팔면서 신규종목 테스트를 하는데 같은 종목이 있다고도 하네요. ... 계좌 삭제 감지 메세지 및 코드가 잘 나와서 3002번에서 마켓데이터도 잘 지워 주고 있습니다), 주시들 객체에 코드가 있는게 확인되도, 판매조건에 판매가 안되기도 합니다. 예트로 종목을 구매하고 / 삭제한겁니다. 스팟으로는 안해봤습니다. 예트로 종목 추가 / 삭제시 스팟에서 코드까지 나오는거 보면 안되는건 아닌것 같은데.. 안됩니다; 추가질문 ReqMarketData로 마켓데이터로 주식이름을 읽어 오는데 다른방법으로 주식이름을 얻어올수 있는게 있나요? 셋발란스에서 주식이름이 읽어지면 굳이 ReqMarketData를 안써도 될꺼 같아서 질문합니다. function 주식(code, name) { this.code = code; this.name = typeof name !== 'undefined' ? name : ""; // ES5 방식 this.data = null; // this.현재가 = 0; //현재가 this.매입평균가 = 0; this.최고가 = 0; // high this.수량 = 0; this.구매시간 = 0; this.경과시간 = 0; this.losscut1 = false; // 1.5% 내려갈 때 부분 매도 this.esc1 = false; // 1% 이익 시 부분 매도 플래그 this.esc3 = false; // 3% 이익시 부분매도 플래그 this.esc5 = false; // 5%이익시 부분매도 플래그 this.esc7 = false; //7%이익시 부분매도 플래그 this.esc9 = false; //9%이익시 부분매도 플래그 this.esc12 = false; // 12%이익시 부분매도 플래그 this.soldAllFlag = false; // 전체 매도 플래그 주식.prototype.loadFromUserValue = function() { var keys = Object.keys(propertyMapping); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var storedValue = Main.GetUserValue(key + this.code); if (storedValue) { this[key] = JSON.parse(storedValue); } else { this[key] = propertyMapping[key]; } } }; 주식.prototype.saveToUserValue = function() { var keys = Object.keys(this); for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key in propertyMapping) { var value = JSON.stringify(this[key]); Main.SetUserValue(key + this.code, value, 1); } } }; 주식.prototype.deleteFromUserValue = function() { var keys = Object.keys(this); for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key in propertyMapping) { Main.SetUserValue(key + this.code, "", 0); this[key] = propertyMapping[key]; // 객체 프로퍼티를 초기값으로 재설정 } } }; } var propertyMapping = { "code": "", "name": "", "현재가": 0, "매입평균가": 0, "최고가": 0, "수량": 0, "구매시간": 0, "경과시간": 0, "losscut1": false, "esc1": false, "esc3": false, "esc5": false, "esc7": false, "esc9": false, "esc12": false, "soldAllFlag": false }; // 나머지 부분은 주요 로직을 유지하면서 Stock 클래스를 사용하도록 수정합니다. var 주식들 = {}; // (주식들) 주식 코드를 키로 사용하는 객체 var t = 0; // 구성 완료 여부 var 보유주식수 = 0; // TSN var 순번 = 0; // Sno var allreset = 0; //1이면 모든값을 초기화 한다. var isNewStock = {}; // 신규 종목 확인을 위한 객체 / 문제해결될때까지만 사용 var orderQueue = []; function Main_OnStart() { for (var stockCode in 주식들) { // if (주식들.hasOwnProperty(stockCode)) { 주식들[stockCode].loadToUserValue(); // } } // propertyMapping에서 속성 목록을 가져와서 각 속성별로 주식들의 정보를 수집하여 출력 var keys = Object.keys(propertyMapping); for (var i = 0; i < keys.length; i++) { var property = keys[i]; // 해당 속성의 모든 주식 정보를 배열로 수집 var values = []; for (var stockCode in 주식들) { if (주식들.hasOwnProperty(stockCode)) { values.push(주식들[stockCode][property]); } } // 수집한 주식 정보를 출력 (디버그용) Main.MessageList(property + " = " + values.join(', ')); } } function reload() { //여기서 종목객체 요청 t = 1; var 순번 = 0; 보유주식수 = Account1.GetTheNumberOfBalances(); Main.MessageList(getCurrentTime() + "보유종목수", 보유주식수); for (var i = 0; i < 보유주식수; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0) { Main.ReqMarketData(Account1.Balance.code, 0, 0); if (!주식들.hasOwnProperty(Account1.Balance.code)) { var stock = new 주식(Account1.Balance.code); 주식들[Account1.Balance.code] = stock; } } } } function Main_OnRcvMarketData(MarketData) { //여기서 셋발란스 아이템 t = 1; if (주식들[MarketData.code]) { // 주식들 객체에서 해당 주식 코드에 대한 정보가 있는지 확인 var stock = 주식들[MarketData.code]; Account1.SetBalanceItem(stock.code, 0); stock.loadFromUserValue(); // 유저밸브에서 저장된 값 불러오기 // 현재가와,이름,코드,수량,매입평균가.. 등등 업데이트 stock.현재가 = MarketData.current; stock.data = MarketData; stock.name = MarketData.name; stock.code = MarketData.code; stock.수량 = Account1.Balance.count; stock.매입평균가 = Account1.Balance.avgUnitCost stock.soldAllFlag = false; //현재 데이터의 최고가와 현재가를 비교해서 더 큰 값을 최고가로 설정 if (stock.현재가 > stock.최고가) { stock.최고가 = stock.현재가; } // 신규 종목 정보 출력 if (isNewStock[stock.code]) { var message = "신규 종목 추가됨: " + " 코드: " + stock.code + " 이름: " + stock.name + " 현재가: " + stock.현재가 + " 수량: " + stock.수량 + " 매입평균가: " + stock.매입평균가; Main.MessageList(message); delete isNewStock[stock.code]; // 신규 플래그 해제 } Main.MessageList((순번+1), "번째", "종목객체생성완료 : ", stock.data.name); 순번 = 순번 + 1; if (순번 >= 보유주식수) { t = 2; } } } function Main_OnU*pdateAccount(sAccntNum, sItemCode, lU*pdateID) { //종목이 추가되면 종목객체 요청 t = 1; if (sAccntNum == Account1.number) { if (lU*pdateID == 30001) { Main.RemoveMarketData(sItemCode); // 임시로 넣어봤다. Main.ReqMarketData(sItemCode,0,0); // 수정된 부분 Main.MessageList("계좌 추가 감지 " + sItemCode); var stock = 주식들[MarketData.code]; isNewStock[sItemCode] = true; // 신규 종목 플래그 설정 // 주식들 객체에 신규 종목 추가 주식들[sItemCode] = new 주식(sItemCode); // 주식 클래스 생성자를 이용해 새로운 주식 객체 생성 } if (lU*pdateID == 30002) { if (주식들[sItemCode]) { Main.MessageList("계좌 삭제 감지 " + sItemCode); // 주식 객체에서 데이터 삭제 var stock = 주식들[sItemCode]; stock.deleteFromUserValue(); 순번 = 순번 - 1; // 주식들 객체에서 삭제 delete 주식들[sItemCode]; Main.RemoveMarketData(sItemCode); Main.MessageList("마켓데이터 삭제 3002 "+sItemCode); t = 2; } } } } function Main_OnU*pdateMarket(sItemCode, lU*pdateID) { //여기서 셋바란스 아이템 설정 if (주식들[sItemCode] && lU*pdateID == 20001) { // 주식들 객체에서 해당 주식 코드에 대한 정보가 있는지 확인 var stock = 주식들[sItemCode]; Account1.SetBalanceItem(sItemCode, 0); stock.수량 = Account1.Balance.count; stock.현재가 = Account1.Balance.current; stock.매입평균가 = Account1.Balance.avgUnitCost // 최고가 업데이트 if (!stock.최고가 || stock.현재가 > stock.최고가) { stock.최고가 = stock.현재가; } var profitRate = (stock.현재가 - stock.매입평균가) / stock.매입평균가 * 100; var maxProfitRate = ((stock.최고가 - stock.매입평균가) / stock.매입평균가 * 100).toFixed(1); // 1.5% 이익 시 부분 매도 if (profitRate >= 1.5 && !stock.esc1) { stock.esc1 = true; partialSell(sItemCode, 0.2); // 20% 매도 } // 3% 이익 시 부분 매도 if (profitRate >= 3 && !stock.esc3) { stock.esc3 = true; partialSell(sItemCode, 0.2); // 20% 매도 } // 5% 이익 시 부분 매도 if (profitRate >= 5 && !stock.esc5) { stock.esc5 = true; partialSell(sItemCode, 0.2); // 20% 매도 } // 7% 이익 시 부분 매도 if (profitRate >= 7 && !stock.esc7) { stock.esc7 = true; partialSell(sItemCode, 0.2); // 20% 매도 } // 9% 이익 시 부분 매도 if (profitRate >= 9 && !stock.esc9) { stock.esc9 = true; partialSell(sItemCode, 0.2); // 20% 매도 } // 12% 이익 시 부분 매도 if (profitRate >= 12 && !stock.esc12) { stock.esc12 = true; partialSell(sItemCode, 0.2); // 20% 매도 } // 1.5% 손실 시 부분 매도 if (profitRate <= -1.5 && !stock.losscut1) { stock.losscut1 = true; partialSell(sItemCode, 0.2); // 30% 매도 } // 2.5% 손실 시 모든 주식 매도 if (profitRate <= -2.5 && !stock.soldAllFlag) { stock.soldAllFlag = true; partialSell(sItemCode, 1); // 100% 매도 } // 3% 올랐다가 1% 되면 모든 주식 매도 if (profitRate <= -1 && stock.esc3&& !stock.soldAllFlag) { stock.soldAllFlag = true; partialSell(sItemCode, 1); // 100% 매도 } // 5% 올랐다가 2% 되면 모든 주식 매도 if (profitRate <= 2 && stock.esc5&& !stock.soldAllFlag) { stock.soldAllFlag = true; partialSell(sItemCode, 1); // 100% 매도 } // 7% 올랐다가 3% 되면 모든 주식 매도 if (profitRate <= 3 && stock.esc7&& !stock.soldAllFlag) { stock.soldAllFlag = true; partialSell(sItemCode, 1); // 100% 매도 } // 9% 올랐다가 4% 되면 모든 주식 매도 if (profitRate <= 4 && stock.esc9&& !stock.soldAllFlag) { stock.soldAllFlag = true; partialSell(sItemCode, 1); // 100% 매도 } // 12% 올랐다가 6% 되면 모든 주식 매도 if (profitRate <= 6 && stock.esc12&& !stock.soldAllFlag) { stock.soldAllFlag = true; partialSell(sItemCode, 1); // 100% 매도 } if (stock.esc12 && maxProfitRate >= 10 && !stock.soldAllFlag) { // tr청산 12%올랐다가 최고가 대비 10% 내릴때 stock.soldAllFlag = true; partialSell(sItemCode, 1); // 100% 매도 } } } function Main_OnTimer(nEventID) { var now = new Date(); var currentHour = now.getHours(); var currentMinutes = now.getMinutes(); if (nEventID === 5 ) { printAndSaveAllStockDetails(); } if (nEventID === 7 ) { // 판매 로직은 오전 9시(9)부터 오후 3시 19분(15시 19분)까지만 실행 if ((currentHour >= 9 && currentHour < 15) || (currentHour == 15 && currentMinutes <= 19)) { exe*cuteOrder(); } else { Main.MessageList("판매 로직은 오전 9시부터 오후 3시 19분까지만 작동합니다. 현재 시간: " + now.toLocaleTimeString()); } } // 기타 타이머 로직은 여기에 추가... } function addOrderToQueue(stockCode, quantity, price, isMarketOrder) { if (!주식들[stockCode].주문진행중) { // 주문 진행 중이 아닌 경우에만 주문 추가 주식들[stockCode].주문진행중 = true; // 주문 진행 중 플래그 설정 orderQueue.push({ code: stockCode, quantity: quantity, price: price, isMarketOrder: isMarketOrder }); } } function partialSell(stockCode, percentage) { var stock = 주식들[stockCode]; var quantityToSell; if (percentage === 1) { // 전체 매도의 경우 quantityToSell = stock.수량; cancelUnfilledOrders(stock.code); // 미체결 주문 취소 } else { quantityToSell = Math.floor(stock.수량 * percentage); if (stock.수량 - quantityToSell < 5) { quantityToSell = stock.수량; // 전체 수량을 판매 } } var profitRate = ((stock.현재가 - stock.매입평균가) / stock.매입평균가 * 100).toFixed(1); // 소수 첫째자리까지 var roundedUpPrice = roundUpPrice(stock.현재가); var maxProfitRate = ((stock.최고가 - stock.매입평균가) / stock.매입평균가 * 100).toFixed(1); // 최고가에 대한 손익율 var isMarketOrder = percentage === 1; addOrderToQueue(stock.code, quantityToSell, roundedUpPrice, isMarketOrder); } function addOrderToQueue(stockCode, quantity, price, isMarketOrder) { if (!주식들[stockCode].주문진행중) { 주식들[stockCode].주문진행중 = true; var stock = 주식들[stockCode]; var profitRate = ((stock.현재가 - stock.매입평균가) / stock.매입평균가 * 100).toFixed(1); var maxProfitRate = ((stock.최고가 - stock.매입평균가) / stock.매입평균가 * 100).toFixed(1); orderQueue.push({ code: stockCode, quantity: quantity, price: price, isMarketOrder: isMarketOrder, name: stock.name, profitRate: profitRate, maxProfitRate: maxProfitRate }); } } function exe*cuteOrder() { if (orderQueue.length > 0) { var order = orderQueue.shift(); if (order.isMarketOrder) { Account1.OrderSell(order.code, order.quantity, 0, 1); } else { Account1.OrderSell(order.code, order.quantity, order.price, 0); } Main.MessageList( '종목코드: ' + order.code + ', 종목이름: ' + order.name + ', 손익율: ' + order.profitRate + '%' + ', 매도수량: ' + order.quantity + ', 최고가: ' + order.maxProfitRate + '%' ); 주식들[order.code].주문진행중 = false; if (주식들[order.code].수량 === 0) { Main.RemoveMarketData(order.code); Main.MessageList("마켓데이터 삭제 판매로직 " + order.code); } } } function roundUpPrice(price) { if (price < 1000) { return Math.round(price); } else if (price < 5000) { return Math.round(price / 5) * 5; } else if (price < 10000) { return Math.round(price / 10) * 10; } else if (price < 50000) { return Math.round(price / 50) * 50; } else if (price < 100000) { return Math.round(price / 100) * 100; } else if (price < 500000) { return Math.round(price / 100) * 100; } else { return Math.round(price / 100) * 100; } } function printAndSaveAllStockDetails() { // 먼저 모든 주식의 상세 정보를 저장 for (var stockCode in 주식들) { if (주식들.hasOwnProperty(stockCode)) { 주식들[stockCode].saveToUserValue(); } } // propertyMapping에서 속성 목록을 가져와서 각 속성별로 주식들의 정보를 수집하여 출력 var keys = Object.keys(propertyMapping); for (var i = 0; i < keys.length; i++) { var property = keys[i]; // 해당 속성의 모든 주식 정보를 배열로 수집 var values = []; for (var stockCode in 주식들) { if (주식들.hasOwnProperty(stockCode)) { values.push(주식들[stockCode][property]); } } // 수집한 주식 정보를 출력 (디버그용) // Main.MessageList(property + " = " + values.join(', ')); } } // 현재 시간을 시:분:초 형식으로 반환 function getCurrentTime() { var now = new Date(); var hours = now.getHours(); var minutes = now.getMinutes(); var seconds = now.getSeconds(); return padZero(hours) + ":" + padZero(minutes) + ":" + padZero(seconds); } // 숫자를 두 자릿수로 맞춰줌 function padZero(num) { return num < 10 ? "0" + num : num; } function resetAllStocks() { 보유주식수 = Account1.GetTheNumberOfBalances(); // 보유 주식 수만큼 순회합니다. for (var i = 0; i < 보유주식수; i++) { Account1.SetBalanceIndex(i); var stockCode = Account1.Balance.code; if (!주식들.hasOwnProperty(stockCode)) { 주식들[stockCode] = new 주식(stockCode); } // 해당 주식 정보를 초기값으로 설정합니다. var currentStock = 주식들[stockCode]; for (var key in currentStock) { if (currentStock.hasOwnProperty(key) && propertyMapping.hasOwnProperty(key)) { currentStock[key] = propertyMapping[key]; } } // 초기화된 주식 정보를 사용자 값에 저장합니다. currentStock.saveToUserValue(); } Main.MessageList(getCurrentTime() + " 모든 주식 정보를 초기화하였습니다."); } // 미체결 주문 취소 함수 function cancelUnfilledOrders(stockCode) { var numUnfilled = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < numUnfilled; i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.code === stockCode) { Account1.OrderCancel(Account1.Unfill.orderNum); } } }
프로필 이미지
올드송
885
글번호 225846
답변완료

미완성신호에서 매수매도

사용자의 편의를 위한 도움에 항상 감사드립니다. 아래와 같이 작성해서 실행하니 사진과 같이 종목이 선정되는데 signal is not defined 에러 발생으로실제 매매가 이루어지지 않고 있습니다. 수정 부탁드립니다. 미완성신호로 매수매도를 하고 싶습니다. 매수매도 둘다 미완성이 안된다면 매수는 종목검색이 되면 바로 매수 하고 매도는 미완성 신호로 하고 싶습니다. 1.차트와 확장차트의 다른점을 모르겠고 코딩이 어떻게 달라지나요? 2. 스크립트객체 설정 차트객체추가에서 아래와 같이 코딩할 경우 차트명과 차트id는 어떻게해야하나요? 3.아래코드에서 미완성신호에서 매수와 매도가 이루어졌어면 합니다. 추가 부탁드립니다. 4. -풍성하고 행복한 추석이 되시길 바랍니다. *건의사항 예스스팟의 경우 동일한 질문이 많고 일부의 질문자의 경우 답을 얻고 삭제를 하는군요. 일정양식을 작성하여 지워지지 않게 고정해 둔다면 답변하시는분이나 질문자가 서로 편할듯 합니다. var 검색주기 = 10; var 최대종목수 = 3; var 매수금액=30000; var ItemList = [];//검색 후 생성할 종목의 리스트를 저장하기 위한 배열변수 var CT = []; var MK = []; var ID = []; var Num = []; var Timer = []; var HHMMSS,req; var BuyEntry,BuyVol; function Main_OnStart() { CTcnt = 0; Main.SetTimer(999, 8000); Main.MessageList("start"); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 2분간격으로 종목검색 확장차트가가 50개 이하일때 반복적으로 검색 if (nEventID == 999 && HHMMSS >= 090100 && CT.length < 최대종목수) { Main.KillTimer(999); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("@@기본조건"); } if (nEventID < 최대종목수) { Timer[nEventID] = Timer[nEventID]+1; //1차 정정 if (Timer[nEventID] == 1) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //타이머와 같은 미체결종목을 찾아 if (Account1.Unfill.code == CT[nEventID].GetCode && Account1.Unfill.count > 0) { //주문가격과 현재가가 다르면(같으면 정정불가) if (Account1.Unfill.price != MK[nEventID].current) { //현재가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].current); } } } } if (Timer[nEventID] == 2) { //타이머가 2번 동작했으므로 타이머는 종료 Main.KillTimer(Timer[nEventID]); //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //타이머와 같은 미체결종목을 찾아 if (Account1.Unfill.code == CT[nEventID].GetCode && Account1.Unfill.count > 0) { //매수주문이고 주문가격과 매도1호가가 다르면(같으면 정정불가) if (Account1.Unfill.orderKind == 2 && Account1.Unfill.price != MK[nEventID].Ask(1)) { //매도1호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].Ask(5)); } //매도주문이고 주문가격과 매수1호가가 다르면(같으면 정정불가) if (Account1.Unfill.orderKind == 1 && Account1.Unfill.price != MK[nEventID].Bid(1)) { //매수1호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].Bid(5)); } } } } } } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("종목검색 완료 nCount : ",nCount); if (nCount > 0) { ItemList = []; //첫검색일때 if (CT.length == 0) { ItemList = aItemList; } else //두번? 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계) { for (var i = 0; i < nCount; i++ ) { var add = true; for (var x = 0; x < CT.length; x++ ) { if (aItemList[i] == CT[x].GetCode(1)) { add = false; } } if (add == true) { ItemList.push(aItemList[i]); } } } Main.MessageList("종목검색 완료 ItemList :",ItemList.length); //집계된 종목이 1개 이상이면 순차적으로 차트객체 요청 if (ItemList.length > 0 && CT.length < 최대종목수) { req = 0; var StopSet = new SystemStopInfo(new StopLoss(3, CALCMETHOD_PERCENT, 0xFFDA93), // new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), new StopProfitTarget(20, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", YL_TYPE_NORMAL, null, null, StopSet); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 최대종목수) { Main.SetTimer(999, 검색주기*1000);//5초 } } } } function Main_OnRcvChartEx(ChartEx) { if (ItemList[req] == ChartEx.GetCode(1)) { CT[CTcnt] = ChartEx; Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1)); Main.ReqMarketData(ItemList[req]); Main.MessageList(CTcnt,"종목객체요청 : ",ItemList[req]); } } function Main_OnRcvMarketData(MarketData) { if (ItemList[req] == MarketData.code) { Main.MessageList(CTcnt,"종목객체생성 : ",MarketData.code); MK[CTcnt] = MarketData; CTcnt = CTcnt +1; req = req + 1; if (req < ItemList.length && CT.length < 최대종목수) { var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93), // new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); // new StopTiming(STOP_INSTANT,0xFFDA93)) ; var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", YL_TYPE_NORMAL, null, null, StopSet); //var idset = new Array(new IndicatorInfo("2.이동평균(계절)"),new IndicatorInfo("단순이동평균3")); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); for (var i = 0; i < CT.length; i++) { Main.MessageList(CT[i].GetCode(1),MK[i].code); } //만들어진 차트가 50개 이하이면 if (CT.length < 최대종목수) { Main.SetTimer(999, 검색주기*1000);//120초 } } } } /* //완성 신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //신호발생한 차트객체의 배열번호 찾음 var ii; if (CT.length > 0) {전략 for (var i = 0; i < CT.length; i++) { if(CT[i].GetCode(1) == ChartEx.GetCode(1)) { ii = i; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell if (Signal.signalKind == 1 && Account1.Balance.count == 0) { // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { // Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,MK[ii].current,1); Main.MessageLog("매도주문 : ",Main.GetOrderCode(Signal.code),Account1.Balance.count,MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } } } */ // 미 신호발생 function Main_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //신호발생한 차트객체의 배열번호 찾음 var ii; if (CT.length > 0) { for (var i = 0; i < CT.length; i++) { if(CT[i].GetCode(1) == ChartEx.GetCode(1)) { ii = i; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell if (Sig[ii] == 0 && IncompleteSignal.signalKind == 1 && Account1.Balance.count == 0) { //sig 배열값은 1로 변경 Sig[ii] = 1; HH[ii] = 0; Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*5,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*2,0); Main.MessageLog("매도주문 : ",Main.GetOrderCode(Signal.code),Account1.Balance.count,MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } }
프로필 이미지
hyon707
934
글번호 225845
답변완료

수식질문 드립니다 도와주세요~~~

파워 종목 검색으로 제일 처음 검색되는 1종목만 매수하고 싶습니다. 매도는 손익률 3.5%에 매도하고 싶습니다. 위 1종목이 검색되면 정지시키고 싶어요 아래까지는 만들어봤는데 수량을 1000개로 되어있어서 현금부족으로 매수가 되질않네요 매수를 예수금 현금최대로 하고십습니다. var ItemList; var Count; var ReqCount; var 수량= 1000; var X1 = false function Main_OnStart() { Main.SetTimer(1, 3000); } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.MessageLog("스팟시작"); Main.MessageLog("종목검색시작"); Main.ReqPowerSearch("aaa") } } function Main_OnRcvItemList(aItemList, nCount) { if (nCount >= 1) { for (var i = 0; i < nCount; i++) { Account1.SetBalance(aItemList[i],0); if (Account1.Balance.count == 0) { Account1.OrderBuy(aItemList[i], 수량,0,1); } if (Account1.Balance.count >= 1) Main.KillTimer(1); if (X1 == false && Account1.Balance.count > 0 && Account1.Balance.current >= Account1.Balance.avgUnitCost*1.035) { X1 = true; Account1.OrderSell(Account1.Balance.code,Math.floor(Account1.Balance.current),MarketData.Bid(3),0); } } } } 이까지는 확실하게 알겠는데 여기서 어떤걸 손대야 할까요?
프로필 이미지
철판때기
788
글번호 225844

철판때기 님에 의해서 삭제되었습니다.

프로필 이미지
철판때기
0
글번호 225843
답변완료

질문드립니다.

다음 수식 문의드립니다. 항상 좋은 답변 감사드립니다. 1. 1분봉 차트(차트1)에서 봉이 완성될때마다 차트2(60분봉)에서의 X지표값을 기억한다. GetIndicatorData함수 활용 (ex: X1, X2, X3...., 메세지 함수로 X지표값 표시) 2. 차트1에서 봉이 완성되는 시점마다 직전봉(-1봉)과 직전전봉(-2봉)의 X지표값이 직전봉이 크다면 -> con=1 직전전봉(-2봉)과 직전전전봉(-3봉)의 X지표값이 직전전봉이 크다면 -> con=2 3. 차트2(60봉)에서 가격이 변동(1틱 상승 또는 하락)될때마다(만약 1틱이 너무 짧다면 5틱의 가격변동) 차트2의 Y지표값을 기억한다. (시계열순서대로 Y1, Y2,, 메시지 함수로 현재 최종 Y지표값 표시) 4. 차트2(60봉)에서 당일 고가인 경우 차트2의 Z지표값을 기억한다.(Z high 1) 또한 당일 저가인 경우 차트2의 Z지표값을 기억한다. (Z Low 1, 메시지 함수 표시) 당일 고가나 저가가 갱신되는 경우 기존의 지표값을 삭제하지 않고 Z지표값을 새롭게 기억한다.(Z high 2 표시) 감사합니다.
프로필 이미지
지나리
902
글번호 225842