커뮤니티

매도 문의 드립니다.

프로필 이미지
wise3007
2026-03-23 22:27:07
14
글번호 231209

안녕하세요. 예스스팟을 이용하여 현재 자동매매를 진행하고 있습니다.

손절은 스탑로스로 진행중이고, 보유종목 당일 청산은 설정해 놓은 시간에

청산이 되도록 수식에 반영이 되어있는 상태입니다.

그런데 장중 실시간 지표조건 매도를 진행하고 싶어서 알아보다가

커뮤니티 글에서 매수를 할 때 처럼 매도도 조건검색식을 만들어서

검색을 병행하는 방식으로 진행을 하면 지표조건 매도 처럼 자동 매도가

가능하다는 내용을 확인하였습니다.

제가 만들어 보려고 여러번 시도를 해봤지만 도저히 구현이 되지 않아서

정말 많은 고민끝에 이렇게 부탁의 글을 드리게 되었습니다.

현재 사용하는 수식인데 바쁘시겠지만 이 수식에 제가 예스랭귀지로 만들어 놓은 매도 조건검색식도

자동 매수 처럼 검색해서 자동 매도가 가능하도록 수식을 만들어서 추가를 해주시면 정말 감사드리겠습니다.

(만약, 어떤 조건이 필요하다면 5분봉 차트상 현재 1일 이동평균이(현재주가가)

10일 이동평균을 하향 이탈하면 매도. 라는 조건을 넣고 싶습니다.

지금의 매도 조건 내용은 제가 매도조건검색식을 준비해둔 상태입니다.)

그리고 제가 조건검색기반 자동 매수와 자동 매도를 진행할 때 참고 및 주의 사항에

대해서도 많은 조언을 해주신다면 감사하겠습니다.


var timer5 = 1; // 타이머 주기: 1초

var 매수금 = 100000; // 매수금액 설정

var OrderList = []; // 매수 후보 종목 리스트

var MKList = [];    // 오늘 매수한 종목 관리 리스트

var req;            // 종목 요청 인덱스


function Main_OnStart()

{

   // 1번 타이머를 2초 간격으로 실행

   Main.SetTimer(1, timer5*1000);

   // 오늘 매수한 종목 관리 배열 초기화

   MKList = [];

}


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();


   // 09:04 ~ 09:40 사이 매수 조건 실행

   if (nEventID == 1 && HHMMSS >= 090400 && HHMMSS < 094000)

   {

      // 종목검색 수행

      Main.ReqPowerSearch("나의 자동 매수")      

   }


   // *** 추가된 부분: 09:49:10 이후 자동 매도 조건 ***

   if (nEventID == 1 && HHMMSS >= 094910)

   {

      var num = Account1.GetTheNumberOfBalances();

      if (num > 0)

      {

         // 모든 보유 종목 전량 매도

         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);


               // 지정가 매도 (모의투자에서는 정상적으로 동작, 현재가 기준으로 전량 매도)

               //Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Account1.Balance.current, 0);


               Main.MessageList(Account1.Balance.code + " 전량 매도합니다."); // 매도 메시지 출력

            }

         }

      }

      // 매도 후 타이머 종료

      Main.KillTimer(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); // 시장가 1주 매수 (모의투자에서는 지원되지 않음)

         Account1.OrderBuy(MarketData.code, 1, MarketData.Ask(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 반환

}


답변 0