커뮤니티

피라미딩 진입 수정 부탁드립니다.

프로필 이미지
몬스터
2020-10-17 16:16:46
2756
글번호 225340
답변완료
첫 진입이후 3% 하락시 추가 피라미딩 진입하는 식인데, 작동을 안하네요. 수정 부탁드립니다. var BL = [],req=0,step; var CT = []; function Main_OnStart() { //처음 시작시 step은 0 step = 0; //시작시점의 보유종목수 var num1 = Account1.GetTheNumberOfBalances(); //보유종목이 1개 이상이면 보유종목의 종목코드를 BL변수에 순차적으로 저장 if (num1 > 0) { step = 1; for(var i = 0 ; i < num1 ; i++) { Account1.SetBalance(i); BL[i] = Account1.Balance.code; } if (BL.length >= 1) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); // 최대진입횟수 var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } } else //보유종목이 없으면 바로 1분 타이머 시작 { step = 2; Main.MessageList("보유종목없음"); Main.SetTimer(1, 100000);//1번 타이머, 60초 } } function Main_OnRcvChartEx(ChartEx) { if (step == 1 && ChartEx.GetCode(1) == BL[req]) { step = 1; CT[req] = ChartEx; req = req+1; if (req < BL.length) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } else { step = 2; Main.SetTimer(1, 100000);//1번 타이머, 60초 Main.MessageList("보유종목차트생성완료"); } } if (step == 2 && ChartEx.GetCode(1) == BL[req]) { CT[req] = ChartEx; req = req+1; if (req < BL.length) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } else { Main.MessageList("종목검색후차트생성완료"); //차트생성 완료하면 타이머 다시 셋팅 Main.SetTimer(1, 100000);//1번 타이머, 60초 } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); Main.ReqPowerSearch("종목검색") } } function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목이 없으면 if (nCount == 0) { //타이머 다시 셋팅 Main.SetTimer(1, 100000);//1번 타이머, 60초 } //검색된 종목이 있으면 if (nCount >= 1) { //검색된 종목과 기존 만든 차트들의 종목코드를 비교해 //차트가 만들어 지지 않은 종목이면 BL변수에 종목코드 추가 var cnt = 0; for(var i = 0 ; i < aItemList.length ; i++) { var add = true; for(var z = 0 ; z < CT.length ; z++) { if (aItemList[i] == CT[z].GetCode(1)) { add = false; break; } } if (add == true) { cnt = cnt+1; BL.push(aItemList[i]); } } Main.MessageList("BL : ",req,BL); //차트 생성해야할 종목이 있으면 차트요청 if (cnt >= 1) { //차트 요청 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } else //없으면 타이머 다시 셋팅 { Main.SetTimer(1, 100000);//1번 타이머, 60초 } } } //생성된 차트들에서 신호가 발생하면 function Main_OnRiseSignal(ChartEx, Signal) { //매수신호 발생 if (Signal.signalKind == 1) { //잔고셋팅 Account1.SetBalance(Signal.code,0); //보유수량이 없으면 if (Account1.Balance.count == 0) { //EntryVol주 시장가 매수 Account1.OrderBuy(Signal.code, EntryVol,Signal.price,1); } } //매수청산신호 발생 if (Signal.signalKind == 2) { //잔고셋팅 Account1.SetBalance(Signal.code,0); //보유수량이 있으면 if (Account1.Balance.count > 0) { //전량 시장가 매도 Account1.OrderSell(Signal.code, Account1.Balance.count,Signal.price,1); } } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { //체결데이터 수신 업데이트 if (lUp*dateID == 20001) { //루프를 돌아 생성된 종목중 어떤 종목인지 파악 for (i = 0; i < Math.min(itemcnt,100); i++) { //어떤 배열방의 종목인지 찾았으면 if (sItemCode == BL[i]) { //해당 종목 잔고셋팅 Account1.SetBalance(BL[i].code, 0); //잔고 수량이 있을때만 if (Account1.Balance.count > 0) { //하락시 매수할 가격이하 3% 하락이면 추가매수 if (BL[i].current <= Signal.Price[i]*0.97) { Account1.OrderBuy(BL[i].code,EntryVol,Signal.Price[i]*0.97, 0); } } } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2020-11-20 16:57:48

안녕하세요 예스스탁입니다. 1 function Main_OnUp*dateMarket 위 이벤트는 종목객체가 있어야 동작하는 이벤트 입니다. 작성하신 수식에 종목객체가 생성된 내용이 없습니다. 2 매수신호 후에 3% 하락하면 추가진입을 하고자 하는 내용이시면 현재 ReqChartEx의 SymSet에는 피라미딩 설정을 지정한 부분이 없습니다. 단지 변수 TradeSet에만 피라미딩설정 내용만 저장이 되어 있습니다. var SymSet = new SystemInfo("Signal전략",YL_TYPE_NORMAL,null,TradeSet); 와 같이 TradeSet변수를 지정해 주셔야 합니다. 3 3% 하락시 추가매수하는 내용은 시스템 수식에 추가하시면 됩니다. 아마 시스템셋팅에 피라미딩 설정이 되어 있으므로 시스템 수식에 해당 내용이 있는 것 같습니다. 기존에 OnUp*dateMarket이벤트에서 처리하시려면 그 횟수나 진입가를 별도로 저정해야 하는 복잡한 부분이 있습니다. 해당 내용은 시스템수식에 추가해서 스팟은 차트에서 신호가 발생하면 주문만 나가게 구현하시는 편이 간단합니다. 4 수정한 식입니다. 이후에 추가로 종목객체가 필요한 경우가 있을 수 있어 차트와 동일종목으로 종목객체도 생성되게 내용을 추가했습니다. var BL = [],req; var CT = [],MK = []; function Main_OnStart() { //처음 시작시 step은 0 step = 0; //시작시점의 보유종목수 var num = Account1.GetTheNumberOfBalances(); //보유종목이 1개 이상이면 보유종목의 종목코드를 BL변수에 순차적으로 저장 if (num > 0) { BL = []; for(var i = 0 ; i < num ; i++) { Account1.SetBalance(i); BL.push(Account1.Balance.code); } Main.MessageList("BL : ",BL); if (BL.length >= 1) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); // 최대진입횟수 var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); Main.MessageList("차트객체요청 :",BL[req]); } } else //보유종목이 없으면 바로 1분 타이머 시작 { Main.MessageList("보유종목없음"); Main.SetTimer(1, 10000);//1번 타이머, 60초 } } function Main_OnRcvChartEx(ChartEx) { if (ChartEx.GetCode(1) == BL[req]) { Main.MessageList("차트객체생성 :",ChartEx.GetCode(1)); CT.push(ChartEx); Main.ReqMarketData(BL[req]); Main.MessageList("종목객체요청 :",BL[req]); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == BL[req]) { Main.MessageList("종목객체생성 :",MarketData.code); MK.push(MarketData); req = req+1; if (req < BL.length) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); Main.MessageList("차트객체요청 :",BL[req]); } else { Main.SetTimer(1, 10000);//1번 타이머, 60초 Main.MessageList("보유종목차트생성완료",CT.length,MK.length); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); Main.ReqPowerSearch("종목검색"); } } function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목이 없으면 if (nCount == 0) { //타이머 다시 셋팅 Main.SetTimer(1, 100000);//1번 타이머, 60초 } //검색된 종목이 있으면 if (nCount >= 1) { //검색된 종목과 기존 만든 차트들의 종목코드를 비교해 //차트가 만들어 지지 않은 종목이면 BL변수에 종목코드 추가 BL = []; for(var i = 0 ; i < aItemList.length ; i++) { var add = true; for(var z = 0 ; z < CT.length ; z++) { if (aItemList[i] == CT[z].GetCode(1)) { add = false; break; } } if (add == true) { BL.push(aItemList[i]); } } Main.MessageList("BL : ",BL); //차트 생성해야할 종목이 있으면 차트요청 if (BL.length >= 1) { req = 0; //차트 요청 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); } else //없으면 타이머 다시 셋팅 { Main.SetTimer(1, 100000);//1번 타이머, 60초 } } } //생성된 차트들에서 신호가 발생하면 function Main_OnRiseSignal(ChartEx, Signal) { //매수신호 발생 if (Signal.signalKind == 1) { //EntryVol주 시장가 매수 Account1.OrderBuy(Signal.code, EntryVol,Signal.price,1); } //매수청산신호 발생 if (Signal.signalKind == 2) { //잔고셋팅 Account1.SetBalance(Signal.code,0); //보유수량이 있으면 if (Account1.Balance.count > 0) { //전량 시장가 매도 Account1.OrderSell(Signal.code, Account1.Balance.count,Signal.price,1); } } } 즐거운 하루되세요 > 몬스터 님이 쓴 글입니다. > 제목 : 피라미딩 진입 수정 부탁드립니다. > 첫 진입이후 3% 하락시 추가 피라미딩 진입하는 식인데, 작동을 안하네요. 수정 부탁드립니다. var BL = [],req=0,step; var CT = []; function Main_OnStart() { //처음 시작시 step은 0 step = 0; //시작시점의 보유종목수 var num1 = Account1.GetTheNumberOfBalances(); //보유종목이 1개 이상이면 보유종목의 종목코드를 BL변수에 순차적으로 저장 if (num1 > 0) { step = 1; for(var i = 0 ; i < num1 ; i++) { Account1.SetBalance(i); BL[i] = Account1.Balance.code; } if (BL.length >= 1) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); // 최대진입횟수 var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } } else //보유종목이 없으면 바로 1분 타이머 시작 { step = 2; Main.MessageList("보유종목없음"); Main.SetTimer(1, 100000);//1번 타이머, 60초 } } function Main_OnRcvChartEx(ChartEx) { if (step == 1 && ChartEx.GetCode(1) == BL[req]) { step = 1; CT[req] = ChartEx; req = req+1; if (req < BL.length) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } else { step = 2; Main.SetTimer(1, 100000);//1번 타이머, 60초 Main.MessageList("보유종목차트생성완료"); } } if (step == 2 && ChartEx.GetCode(1) == BL[req]) { CT[req] = ChartEx; req = req+1; if (req < BL.length) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } else { Main.MessageList("종목검색후차트생성완료"); //차트생성 완료하면 타이머 다시 셋팅 Main.SetTimer(1, 100000);//1번 타이머, 60초 } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); Main.ReqPowerSearch("종목검색") } } function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목이 없으면 if (nCount == 0) { //타이머 다시 셋팅 Main.SetTimer(1, 100000);//1번 타이머, 60초 } //검색된 종목이 있으면 if (nCount >= 1) { //검색된 종목과 기존 만든 차트들의 종목코드를 비교해 //차트가 만들어 지지 않은 종목이면 BL변수에 종목코드 추가 var cnt = 0; for(var i = 0 ; i < aItemList.length ; i++) { var add = true; for(var z = 0 ; z < CT.length ; z++) { if (aItemList[i] == CT[z].GetCode(1)) { add = false; break; } } if (add == true) { cnt = cnt+1; BL.push(aItemList[i]); } } Main.MessageList("BL : ",req,BL); //차트 생성해야할 종목이 있으면 차트요청 if (cnt >= 1) { //차트 요청 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 2); var ChartSet = new ReqChartItem(BL[req],15,CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("Signal전략"); Main.ReqChartEx(ChartSet, SymSet); } else //없으면 타이머 다시 셋팅 { Main.SetTimer(1, 100000);//1번 타이머, 60초 } } } //생성된 차트들에서 신호가 발생하면 function Main_OnRiseSignal(ChartEx, Signal) { //매수신호 발생 if (Signal.signalKind == 1) { //잔고셋팅 Account1.SetBalance(Signal.code,0); //보유수량이 없으면 if (Account1.Balance.count == 0) { //EntryVol주 시장가 매수 Account1.OrderBuy(Signal.code, EntryVol,Signal.price,1); } } //매수청산신호 발생 if (Signal.signalKind == 2) { //잔고셋팅 Account1.SetBalance(Signal.code,0); //보유수량이 있으면 if (Account1.Balance.count > 0) { //전량 시장가 매도 Account1.OrderSell(Signal.code, Account1.Balance.count,Signal.price,1); } } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { //체결데이터 수신 업데이트 if (lUp*dateID == 20001) { //루프를 돌아 생성된 종목중 어떤 종목인지 파악 for (i = 0; i < Math.min(itemcnt,100); i++) { //어떤 배열방의 종목인지 찾았으면 if (sItemCode == BL[i]) { //해당 종목 잔고셋팅 Account1.SetBalance(BL[i].code, 0); //잔고 수량이 있을때만 if (Account1.Balance.count > 0) { //하락시 매수할 가격이하 3% 하락이면 추가매수 if (BL[i].current <= Signal.Price[i]*0.97) { Account1.OrderBuy(BL[i].code,EntryVol,Signal.Price[i]*0.97, 0); } } } } } }