커뮤니티

수식변경 부탁드립니다

프로필 이미지
만경
2026-01-29 12:54:03
118
글번호 230188
답변완료

var timer5 = 5; //5초

var 매수금 = 10000;

var 손절  = 0.95;

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% 수식 추가 부탁드립니다.

추신; var 손절  = 0.95;인데 잘못 오타 나와서 수정했습니다. 죄송합니다.

답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-02-09 14:40:46

안녕하세요 예스스탁입니다. 이익보존 3%이면 최소수익도 지정하셔야 합니다. 최소수익 달성 후 하락해서 수익이 3%이면 청산되게 작성해 드립니다. 당일 매수한 종목만 매수후 최고가 인지가 가능합니다. 기존 잔고 종목은 가능하지 않습니다. var timer5 = 5;//5초 var 매수금 = 10000; var 손절 = 0.95; var 익절 = 1.05; var 최소수익 = 1.04, 이익보존 = 1.03; var OrderList = []; var MKList = []; var req; function Main_OnStart() { //1번 타이머, 5초 Main.SetTimer(1, timer5*1000); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; //스팟 시작시 잔고평가금액 V1 = Account1.GetBalanceETCinfo(100); Main.SetTimer(99, 1000); } 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); //99번 타이머 종료 Main.KillTimer(99); //계좌리스트의 순서대로 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); //99번 타이머 종료 Main.KillTimer(99); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } if (nEventID == 2) { Main.KillTimer(2); Main.ReqMarketData(OrderList[req]); } if (nEventID == 99 && MKList.length > 0 && HHMMSS < 150000) { for (var i = 0; i < MKList.length; i++) { if (MKList[i].current > HH[i]) { HH[i] = MKList[i].current; } //잔고를 셋팅 Account1.SetBalance(MKList[i].code); if (HH[i] >= Account1.Balance.avgUnitCost*최소수익 && MKList[i].current <= Account1.Balance.avgUnitCost*이익보존) { if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } } 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); HH.push(MarketData.current); // 계좌에 같은 종목이 있는지 확인 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 반환 } 즐거운 하루되세요