다시 한번 검토해 주시면 감사하겠습니다.
항상 노고에 머리숙여 감사드립니다.1.글번호 229848수식어 사용해 보니 다음날 분할매수가 되지 않터라구요그래서 챗-지피티을 이용해서 작성해 보았습니다.이게 맞는지 점검해 주시면 감사하겠습니다.위 조건이 힘드시면 2번 해당하는 수식어 부탁 드립니다.2.당일 분할매수 조건 말고, 보유종목들중에 마이너스 조건에 맞게 다음날 부터 분할매수 할수 있게끔 부탁드립니다.var timer5 = 2; var 매수금 = 500000; var OrderList = [];var MKList = [];var B = [], P = [], S = []; var SC = 1, req = 0;function Main_OnStart(){// 이전 상태 복원if (Main.GetUserValue("XB") != ""){B = JSON.parse(Main.GetUserValue("XB"));P = JSON.parse(Main.GetUserValue("XP"));S = JSON.parse(Main.GetUserValue("XS"));}OrderList = [];if (S.length > 0){OrderList = S;SC = 0;req = 0;Main.ReqMarketData(OrderList[req]);}else{SC = 1;Main.SetTimer(1, timer5 * 1000);Main.SetTimer(3, 1000);}}function Main_OnTimer(nEventID){var d = new Date();var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds();if (nEventID == 1 && HHMMSS > 090300 && HHMMSS < 151500){Main.ReqPowerSearch("test");}if (nEventID == 3 && MKList.length > 0){for (var i = 0; i < MKList.length; i++){Account1.SetBalance(MKList[i].code, 0);if (Account1.Balance.count <= 0) continue;var avg = Account1.Balance.avgUnitCost;var cur = MKList[i].current;if ((B[i] == 1 && cur <= avg * 0.97) ||(B[i] == 2 && cur <= avg * 0.95) ||(B[i] == 3 && cur <= avg * 0.92)){Account1.OrderBuy(MKList[i].code,Math.floor(매수금 / MKList[i].Ask(5)),MKList[i].Ask(5),0);B[i]++;Main.MessageList(MKList[i].code, "분할매수", B[i] - 1, "차");continue;}if (B[i] >= 4 && cur <= avg * 0.85){B[i] = -1;Account1.OrderSell(MKList[i].code,Account1.Balance.count,MKList[i].Bid(5),0);Main.MessageList(MKList[i].code, "분할완료 후 손절 -15%");continue;}if (cur >= avg * 1.11){B[i] = -1;Account1.OrderSell(MKList[i].code,Account1.Balance.count,MKList[i].Bid(5),0);Main.MessageList(MKList[i].code, "익절");continue;}}}}function Main_OnRcvItemList(altemList, nCount){Main.KillTimer(1);OrderList = [];for (var i = 0; i < nCount; i++){if (!IsStockInAccount(altemList[i]) && S.indexOf(altemList[i]) == -1){OrderList.push(altemList[i]);}}if (OrderList.length > 0){req = 0;Main.ReqMarketData(OrderList[req]);}else{Main.SetTimer(1, timer5 * 1000);}}/* ======================= MarketData 수신======================= */function Main_OnRcvMarketData(MarketData){for (var i = 0; i < MKList.length; i++){if (MKList[i].code == MarketData.code){MKList[i] = MarketData;return;}}MKList.push(MarketData);if (!IsStockInAccount(MarketData.code)){Account1.OrderBuy(MarketData.code,Math.floor(매수금 / MarketData.Ask(5)),MarketData.Ask(5),0);B.push(1);P.push(MarketData.current);S.push(MarketData.code);Main.MessageList(MarketData.code, "신규매수");}}function IsStockInAccount(stockCode){var cnt = Account1.GetTheNumberOfBalances();for (var i = 0; i < cnt; i++){Account1.SetBalance(i);if (Account1.Balance.code == stockCode)return true;}return false;}/* ======================= 스팟 종료======================= */function Main_OnClose(){for (var i = B.length - 1; i >= 0; i--){if (B[i] == -1){B.splice(i, 1);P.splice(i, 1);S.splice(i, 1);}}Main.SetUserValue("XB", JSON.stringify(B));Main.SetUserValue("XP", JSON.stringify(P));Main.SetUserValue("XS", JSON.stringify(S));}
수식변경 부탁드립니다
var timer5 = 5; //5초var 매수금 = 10000;var 손절 = 0.05;var 익절 = 1.05;var OrderList = [];var MKList = [];var req;function Main_OnStart(){ //1번 타이머, 5초 Main.SetTimer(1, timer5*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 < 151500) { //종목검색 수행 Main.ReqPowerSearch("v-갭상에이격종합(1분)") } if (nEventID == 1) { //계좌보유종수 var num = Account1.GetTheNumberOfBalances(); //9시~15시 15분 사이 if (HHMMSS >= 90000 && HHMMSS < 150000) { //보유종목이 1개 이상 if (num >= 1) { //계좌평가금액이 스팟시작시 평가금액대비 5% 이상이면 전종목 전량매도 if (Account1.GetBalanceETCinfo(100) >= V1*1.06) { //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%수익이거나 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 >= 150100) { //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, timer5*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); // Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); // Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),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, timer5*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 반환}* 위 수식에 이익보존 3% 수식 추가 부탁드립니다.
차트시그널로 진입시 두번째 이상의 거래를 할 수 있는 수식
아래 수식은 차트 신호로 진입하고 청산하는 수식입니다.차트가 1회 진입, 1회 청산할 때는 문제가 없는데...최근 차트신호를 2회 이상의 진입과 청산으로 바꾼 후 사용해보니2회차부터는 진입하지 않습니다.차트신호에 따라 두번째 이상의 거래를 할 수 있게 수정해 주십시요.차트 진입명칭은 아래처럼 사용합니다. 1회차 진입명 "b1" 2회차부터 진입명 "b2"1회차 b1 진입, 2회차 이상은 b2 가 반복해서 진입합니다. ex) 5회 거래면 진입명이 b1,b2,b2,b2,b2 입니다.청산은 진입명과 연계되어 청산하고 있습니다.항상 고맙습니다.************************************************************************************************************************************************var UNum; var LNum;var CallCode; var CallPrice;var CC;var CallOrderCode;var CallExit;function Main_OnStart(){ CallExit = false; Main.SetTimer(1, 5000);}//차트에서 신호가 발생하면function Chart1_OnRiseSignal(Signal){ //해당 신호가 매수신호이면 if (Signal.signalKind == 1) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호 발생"); //0.12 이하 중 가장 큰 가격을 가지는 종목을 찾음 //ATM위 행사가 갯수 UNum = Option1.uppersATM; //ATM아래 행사가 갯수 LNum = Option1.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 CallPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로 //for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함 for (var i = -LNum; i <= UNum; i++) { //값이 0.12 이하이면 if (Option1.GetCurrent(0, i) <= 0.12) { //해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장 CallPrice[i+LNum] = Option1.GetCurrent(0, i); //해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장 CallCode[i+LNum] = Option1.GetATMCallRecent(i); //주의 //배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터 //저장하도록 작성해야 함 } else//0.12 보다 크면 { //배열변수 CallPrice의 방번호 i+LNum에 -1 저장 CallPrice[i+LNum] = -1; //배열변수 CallCode의 방번호 i+LNum에 -1 저장 CallCode[i+LNum] = -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] } } Main.MessageList("--------------------------------------------"); Main.MessageList("콜종목코드:",CallOrderCode,"/콜현재가 :",CC); //콜옵션종목 매수 if (CallExit == false) { //지정가 Account1.OrderBuy(CallOrderCode, 1, Option1.GetAskByCode(CallOrderCode, 5), 0); //시장가 //Account1.OrderBuy(CallOrderCode, 1, 0, 1); } }//해당 신호가 청산신호면if (Signal.signalKind == 2){Account1.OrderSell(CallOrderCode, 1, Option1.GetBidByCode(CallOrderCode, 5), 0);}}
답변완료
키움신호검색 예스검색식
CC=CCi(20);M=Macd(12,26);Ms=eavg(M,9);S=SuperTrend(60,2);R=RSI(14);bs_C=Barssince(CC<-100);bs_M=Barssince(M<0 && CrossUp(M,Ms));bs_S=Barssince(CrossUp(C,S));bs_R=Barssince(R<30);조건=bs_C=최소 && bs_C <=봉C &&bs_M=최소 && bs_M <=봉M &&bs_S=최소 && bs_S <=봉S &&bs_R=최소 && bs_R <=봉R;조건 && !조건(1)----------------------------------------------지표변수 봉c 10, 봉m 10, 봉s 10, 봉r 10 , 최소 5