코드에 대한 도움이 필요합니다 - 페이지 2

 
deVries :


나에게 그것은 여전히 당신이 코딩에 대해 아무것도 모르는 찾고 있습니다

코딩에 대해 알기 위해 아무 것도 하지 않습니다.

이것을 만들기 위해 어떤 시도를 했습니까 ??

당신이 그것을 만드는 당신의 시도를 보여 도움을 원한다면

아직 도움이 될 내용이 없습니다...

네. 그것은 나에게 완전히 새로운 것입니다. 참조할 수 있는 책이 있습니까?
 
diamstar :
네. 그것은 나에게 완전히 새로운 것입니다. 참조할 수 있는 책이 있습니까?

하나의 파일로 예약
다운로드 - 2Mb
 
deVries :

하나의 파일로 예약
다운로드 - 2Mb
고맙습니다. 아무리 나빠도 책을 다 끝내고 나서 글을 쓰겠습니다.
 
diamstar :
30분


다음은 시작하는 데 도움이 될 수 있는 사항입니다.

그리고 이미 중국어를 사용하지 않는 한 고대 중국에 대해 mql을 사용하십시오. 더 쉽고, 더 많은 도움을 받을 수 있으며, 아이디어가 있다면 mql이 많은 돈을 버는 데 도움이 될 것입니다. 재미도 있습니다.

그래서 여기 우리가 간다 :

 //+------------------------------------------------------------------+
//|                                               News_Trader_v1.mq4 |
//|                                            Copyright © 2013 _3DE |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013 _3DE"
#property link        "https://www.metaquotes.net"
extern string   Note1       = "Set parameters in Pips not points !" ;
extern string   Note2       = "Set day of the month for the news !" ;
extern string   Note3       = "Set to zero to trade every day    !" ;
extern string   Note4       = "Leave SetDistance to zero if trading news !" ;
extern int      TakeProfit  = 25 ; // Take profit pips
extern int      StopLoss    = 20 ; // Stop loss pips (manual trading)
extern int      SetDistance = 0 ; // Sistance for BuyStop and SellStop from price at news time
extern int      DayOfNews   = 0 ; // Day of the month of news
extern int      NewsHour    = 0 ; // Hour of news
extern int      NewsMin     = 0 ; // Minute of news
extern int      Expiration  = 5 ; // Expiration of pending orderes
extern int      BEPips      = 11 ; // Move to break even after BEPips
extern int      TrailingStop= 0 ; // What distance to keep trailing
extern int      Slip        = 5 ; // Slippage
extern int      MagicNumber= 2210 ; // Must be unique for every chart
extern double   Lots        = 0.1 ;
extern bool     WriteLog= false ; // Write a log file 
extern string   TradeLog    = "MI_Log" ;
input    string   EaComment   = "NewsTrader_EA" ;

double h,l,ho,lo,hso,lso,htp,ltp,sp,price;

string filename;
int pointMultiply= 10 ;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   if ( Digits == 3 || Digits == 5 )
     {
      pointMultiply  *= 10 ;
      TakeProfit     *= 10 ;
      StopLoss       *= 10 ;
      BEPips         *= 10 ;
      TrailingStop   *= 10 ;
      SetDistance    *= 10 ;
     }
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int i;
   int OrdersCondition,minofday,minofnews;

   filename= Symbol ()+TradeLog+ "-" + Month ()+ "-" + Day ()+ ".txt" ;

   if (BEPips> 0 ) DoBE(BEPips);

   if (TrailingStop> 0 ) DoTrail();

   OrdersCondition=CheckOrdersCondition();
   if ( Day ()==DayOfNews || DayOfNews== 0 )
     {
      minofday= Hour ()* 60 + Minute ();
      minofnews=NewsHour* 60 +NewsMin;

       if ((minofday==minofnews- 2 ) || (minofday==minofnews- 1 ))
        {
         h= iHigh ( NULL , PERIOD_M1 , 0 );
         l= iLow ( NULL , PERIOD_M1 , 0 );
         for (i= 1 ;i<= 3 ;i++) if ( iHigh ( NULL , PERIOD_M1 ,i)>h) h= iHigh ( NULL , PERIOD_M1 ,i);
         for (i= 1 ;i<= 3 ;i++) if ( iLow ( NULL , PERIOD_M1 ,i)<l) l= iLow ( NULL , PERIOD_M1 ,i);
         sp= Ask - Bid ;
         ho=h+sp+(pointMultiply)* Point ;
         lo=l-(pointMultiply)* Point ;
         hso=h+sp;
         lso=l;
         htp=ho+TakeProfit* Point -sp;
         ltp=lo-TakeProfit* Point +sp;
         //---
         ho= NormalizeDouble (ho, Digits );
         lo= NormalizeDouble (lo, Digits );
         hso= NormalizeDouble (hso, Digits );
         lso= NormalizeDouble (lso, Digits );
         htp= NormalizeDouble (htp, Digits );
         ltp= NormalizeDouble (ltp, Digits );
         if (SetDistance!= 0 )
           {
            price=( Ask + Bid )/ 2 ;
            h=price+SetDistance* Point ;
            l=price-SetDistance* Point ;
            ho= NormalizeDouble (h+sp, Digits );
            lo= NormalizeDouble (l-sp, Digits );
            hso= NormalizeDouble (ho-StopLoss* Point , Digits );
            htp= NormalizeDouble (ho+TakeProfit* Point , Digits );
            lso= NormalizeDouble (lo+StopLoss* Point , Digits );
            ltp= NormalizeDouble (lo-TakeProfit* Point , Digits );
           }
         if (OrdersCondition== 0 )
           {
             if (WriteLog)Write( "Opening BuyStop & SellStop, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
            OpenBuyStop();
            OpenSellStop();
           }

         if (OrdersCondition== 10 )
           {
             if (WriteLog)Write( "Opening SellStop, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
            OpenSellStop();
           }

         if (OrdersCondition== 1 )
           {
             if (WriteLog)Write( "Opening BuyStop , OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
            OpenBuyStop();
           }
        }
     }
   if ((minofday>=minofnews) && (minofday<=minofnews+Expiration- 1 ))
     {

       if (OrdersCondition== 1001 )
        {
         if (WriteLog)Write( "Deleting SellStop Because of BuyStop Hit, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
         DeleteSellStop();
        }

       if (OrdersCondition== 110 )
        {
         if (WriteLog)Write( "Deleting BuyStop Because of SellStop Hit, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
         DeleteBuyStop();
        }
     }

   if (minofday>=minofnews+Expiration)
     {
       if (OrdersCondition== 11 )
        {
         if (WriteLog)Write( "Deleting BuyStop and SellStop Because 5 min expired, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
         DeleteBuyStop();
         DeleteSellStop();
        }

       if ((OrdersCondition== 10 ) || (OrdersCondition== 110 ))
        {
         if (WriteLog)Write( "Deleting BuyStop Because 5 min expired, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
         DeleteBuyStop();
        }

       if ((OrdersCondition== 1 ) || (OrdersCondition== 1001 ))
        {
         if (WriteLog)Write( "Deleting SellStop Because 5 min expired, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday);
         DeleteSellStop();
        }
     }

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| int CheckOrdersCondition()                                       |
//+------------------------------------------------------------------+

int CheckOrdersCondition()
  {
   int result= 0 ;
   for ( int i= 0 ;i< OrdersTotal ();i++)
     {
       OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
       if (( OrderType ()== OP_BUY ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber))
        {
         result+= 1000 ;
        }
       if (( OrderType ()== OP_SELL ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber))
        {
         result+= 100 ;
        }
       if (( OrderType ()== OP_BUYSTOP ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber))
        {
         result+= 10 ;
        }
       if (( OrderType ()== OP_SELLSTOP ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber))
        {
         result+= 1 ;
        }

     }
   return (result); // 0 means we have no trades
  }
// OrdersCondition Result Pattern
//    1    1    1    1
//    b    s    bs   ss
//  
//+------------------------------------------------------------------+
//|void OpenBuyStop()                                                |
//+------------------------------------------------------------------+

void OpenBuyStop()
  {
   int ticket,tries;
   tries= 0 ;
   if (! GlobalVariableCheck ( "InTrade" ))
     {
       while (tries< 3 )
        {
         GlobalVariableSet ( "InTrade" , TimeCurrent ());   // set lock indicator
         ticket= OrderSend ( Symbol (), OP_BUYSTOP ,Lots,ho,Slip,hso,htp,EaComment,MagicNumber, 0 ,Red);
         if (WriteLog)Write( "in function OpenBuyStop OrderSend Executed , ticket =" +ticket);
         GlobalVariableDel ( "InTrade" );   // clear lock indicator
         if (ticket<= 0 )
           {
            tries++;
           }
         else tries= 3 ;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenSellStop()
  {
   int ticket,tries;
   tries= 0 ;
   if (! GlobalVariableCheck ( "InTrade" ))
     {
       while (tries< 3 )
        {
         GlobalVariableSet ( "InTrade" , CurTime ());   // set lock indicator
         ticket= OrderSend ( Symbol (), OP_SELLSTOP ,Lots,lo,Slip,lso,ltp,EaComment,MagicNumber, 0 ,Red);
         if (WriteLog)Write( "in function OpenSellStop OrderSend Executed , ticket =" +ticket);
         GlobalVariableDel ( "InTrade" );   // clear lock indicator
         if (ticket<= 0 )
           {
            tries++;
           }
         else tries= 3 ;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DoBE( int byPips)
  {
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
       if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber)) // only look if mygrid and symbol...
        {
         if ( OrderType ()== OP_BUY ) if ( Bid - OrderOpenPrice ()>byPips* Point ) if ( OrderStopLoss ()< OrderOpenPrice ())
           {
             if (WriteLog)Write( "Movine StopLoss of Buy Order to BE+1" );
             OrderModify ( OrderTicket (), OrderOpenPrice (), OrderOpenPrice ()+ Point , OrderTakeProfit (),Red);
           }
         if ( OrderType ()== OP_SELL ) if ( OrderOpenPrice ()- Ask >byPips* Point ) if ( OrderStopLoss ()> OrderOpenPrice ())
           {
             if (WriteLog)Write( "Movine StopLoss of Buy Order to BE+1" );
             OrderModify ( OrderTicket (), OrderOpenPrice (), OrderOpenPrice ()- Point , OrderTakeProfit (),Red);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DoTrail()
  {
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
       if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber)) // only look if mygrid and symbol...
        {

         if ( OrderType ()== OP_BUY )
           {
             if ( Bid - OrderOpenPrice ()> Point *TrailingStop)
              {
               if ( OrderStopLoss ()< Bid - Point *TrailingStop)
                 {
                   OrderModify ( OrderTicket (), OrderOpenPrice (), Bid - Point *TrailingStop, OrderTakeProfit (), 0 ,Green);
                   return ;
                 }
              }
           }

         if ( OrderType ()== OP_SELL )
           {
             if (( OrderOpenPrice ()- Ask )>( Point *TrailingStop))
              {
               if (( OrderStopLoss ()>( Ask + Point *TrailingStop)) || ( OrderStopLoss ()== 0 ))
                 {
                   OrderModify ( OrderTicket (), OrderOpenPrice (), Ask + Point *TrailingStop, OrderTakeProfit (), 0 ,Red);
                   return ;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DeleteBuyStop()
  {
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
       if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber) && ( OrderType ()== OP_BUYSTOP ))
        {
         OrderDelete ( OrderTicket ());
         if (WriteLog)Write( "in function DeleteBuyStopOrderDelete Executed" );
        }

     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DeleteSellStop()
  {
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
       if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber) && ( OrderType ()== OP_SELLSTOP ))
        {
         OrderDelete ( OrderTicket ());
         if (WriteLog)Write( "in function DeleteSellStopOrderDelete Executed" );
        }

     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Write( string str)
  {
   int handle;

   handle= FileOpen (filename, FILE_READ | FILE_WRITE | FILE_CSV , "/t" );
   FileSeek (handle, 0 , SEEK_END );
   FileWrite(handle,str+ " Time " + TimeToStr ( CurTime (), TIME_DATE | TIME_SECONDS ));
   FileClose (handle);
  }
//+------------------------------------------------------------------+


뉴스 거래 및 수동 입력에 적합하도록 몇 가지 코드를 추가했습니다. 그것은 아마도 당신의 목적에 맞을 것입니다.

이 EA는 원래 뉴스를 거래하기 위한 것이므로 해당 월의 뉴스 날짜, 시간 및 분을 입력하고 핍으로 이익 을 얻습니다. 만료 시간(분) - 이동이 발생하지 않은 경우 보류 중인 주문을 마감하는 뉴스 후 몇 분 , BEPips - 1개의 주문이 트리거되어 손익분기점으로 이동하는 데 낭비되는 경우 이익이 몇 핍인지. 후행 정지 = 0이면 후행이 없습니다. 후행을 설정하는 경우 이익인 경우 가격에서 멀어지도록 핍 수를 설정합니다.

수동 거래의 경우 DayOfNews를 0으로 두어 EA가 매일 지정된 시간과 분에 거래하도록 하거나 매일 거래할 때 날짜를 수동으로 설정할 수 있습니다.

또한 원하는 핍(포인트가 아님)의 양으로 StopLoss를 설정해야 합니다.

SteDistance를 지정된 시간의 가격에서 대기 중인 주문을 원하는 거리로 설정합니다(당신이 말한 30핍).

채워지지 않은 경우 EA에서 주문을 삭제하기 전에 주문이 활성화되기를 원하는 시간(분)으로 만료(분)를 설정합니다.

어쨌든, 코드를 살펴보고 질문이 있으면 여기에 게시하거나 저에게 메일을 보내주십시오.

 
diamstar :
고맙습니다. 아무리 나빠도 책을 다 끝내고 나서 글을 쓰겠습니다.


그 정신이야 :)

노력하면 도와줄 사람을 찾을 수 있습니다

 
diamstar :
고맙습니다. 아무리 나빠도 책을 다 끝내고 나서 글을 쓰겠습니다.


diamstar, 올바른 도움을 받으면 배우는 것이 즐겁습니다. 그것에 속지 말고 처음에 고대 중국처럼 보이면 가치가 없다고 생각하지 마십시오.

또한 정말로 돕고 싶지 않은 사람들 때문에 낙담하지 마십시오. 사용할 수 있는 도움이 많이 있습니다. 찾기만 하면 됩니다.

그녀는 배우고 싶다면 다음과 같은 조언을 제공합니다.

1. 기꺼이 공유하려는 사람들(지식, 리소스, 코드 등)과 연락을 유지합니다. 당신은 그들이 필요합니다

2. 문서를 읽고 무엇을 읽어야 하는지 잘 이해할 수 있도록 질문하십시오. 모든 것을 외울 필요는 없으며 사용 가능한 항목과 찾을 수 있는 위치만 알면 됩니다.

3. 모든 코드를 스스로 작성하려고 과도하게 자신을 죽이지 마십시오. 바퀴를 재발명하는 것과 같습니다.

4. 다운로드할 수 있는 무료 EA를 손에 넣고 코드를 살펴보십시오. 그것이 어떻게 구성되어 있는지 이해하고, 각 기능이 무엇을 하는지 이해하고, 그 기능을 연구하십시오.

5. 코드에서 작동하고 좋아하는 기능을 사용합니다. 텍스트 편집기에서 코드를 복사하거나 MetaEditor에서 스크립트로 복사 하여 미래를 위해 의미 있는 이름으로 저장할 수 있습니다. 필요할 때 찾을 수 있습니다.

도움이 되기를 바랍니다.

행운을 빕니다

 
thrdel :


다음은 시작하는 데 도움이 될 수 있는 사항입니다.

그리고 이미 중국어를 사용하지 않는 한 고대 중국에 대해 mql을 사용하십시오. 더 쉽고, 더 많은 도움을 받을 수 있으며, 아이디어가 있다면 mql이 많은 돈을 버는 데 도움이 될 것입니다. 재미도 있습니다.

그래서 여기 우리가 간다 :


뉴스 거래 및 수동 입력에 적합하도록 몇 가지 코드를 추가했습니다. 그것은 아마도 당신의 목적에 맞을 것입니다.

이 EA는 원래 뉴스를 거래하기 위한 것이므로 해당 월의 뉴스 날짜, 시간 및 분을 입력하고 핍으로 이익을 얻습니다. 만료 시간(분) - 이동이 발생하지 않은 경우 보류 중인 주문을 마감하는 뉴스 후 몇 분 , BEPips - 1개의 주문이 트리거되어 손익분기점으로 이동하는 데 낭비되는 경우 이익이 몇 핍인지. 후행 정지 = 0이면 후행이 없습니다. 후행을 설정하는 경우 이익인 경우 가격에서 멀어지도록 핍 수를 설정합니다.

수동 거래의 경우 DayOfNews를 0으로 두어 EA가 매일 지정된 시간과 분에 거래하도록 하거나 매일 거래할 때 날짜를 수동으로 설정할 수 있습니다.

또한 원하는 핍(포인트가 아님)의 양으로 StopLoss를 설정해야 합니다.

SteDistance를 지정된 시간의 가격에서 대기 중인 주문을 원하는 거리로 설정합니다(당신이 말한 30핍).

채워지지 않은 경우 EA가 주문을 삭제하기 전에 주문이 활성화되기를 원하는 시간(분)으로 만료(분)를 설정합니다.

어쨌든, 코드를 살펴보고 질문이 있으면 여기에 게시하거나 저에게 메일을 보내주십시오.


OP는 초보자 프로그래머라고 생각합니다. 그/그녀가 당신의 코드를 이해할 수 있을지 의심스럽습니다.

처음 배우기 시작했을 때 코드를 이해할 수 있었습니까?

 
GumRai :


OP는 초보자 프로그래머라고 생각합니다. 그/그녀가 당신의 코드를 이해할 수 있을지 의심스럽습니다.

처음 배우기 시작했을 때 코드를 이해할 수 있었습니까?

정말 감사합니다. 나는 코드를 시도하고 여전히 책을 읽으면서 모든 부분을 이해할 수 있습니다. 문제가 발생하면 업데이트하겠습니다. 감사해요
 
GumRai :


OP는 초보자 프로그래머라고 생각합니다. 그/그녀가 당신의 코드를 이해할 수 있을지 의심스럽습니다.

처음 배우기 시작했을 때 코드를 이해할 수 있었습니까?


GumRay, 코드가 있고 mql에 대한 문서를 사용할 수 있으며 코드에 몇 가지 설명이 있으며 우리가 도와드리겠습니다. 내가 말했듯이 " 궁금한 사항이 있으면 여기에 게시하거나 저에게 메일을 보내주십시오."

그렇다고 해서 내가 모든 답을 가지고 있다는 의미는 아닙니다. 단지 diamstar가 기꺼이 배울 의향이 있다면 기꺼이 도울 의향이 있다는 것입니다.

"그/그녀가 당신의 코드를 이해할 수 있을지 의심스럽습니다." 지금 아니면 완전히. 또한 코드가 그/그녀가 찾고 있는 것과 100% 일치하지 않을 수도 있지만(사용 가능한 정보가 주어지면 최선을 다했습니다) 좋은 시작입니다.

실제 사례로 배우면 얼마나 쉬운지 알고 계시죠?

EA에는 초보자를 위한 정보가 너무 많고 이에 대해 많은 질문이 있을 수 있다는 것을 알고 있습니다. 하지만 그것이 우리가 여기 있는 이유입니다, 그렇죠?

물론 제가 처음 배울 때는 그 모든 것을 이해할 수 없었습니다(저는 여전히 배우고 있습니다). 적어도 처음에는 전부는 아니지만 diamstar 는 도움을 요청할 수 있는 적절한 포럼을 찾았고 배우기로 결심한 것 같습니다.

그/그녀가 최선을 다하기를 바라며 할 수만 있다면 돕도록 합시다.

 
thrdel :


GumRay, 코드가 있고 mql에 대한 문서를 사용할 수 있으며 코드에 몇 가지 설명이 있으며 우리가 도와드리겠습니다. 내가 말했듯이 " 궁금한 사항이 있으면 여기에 게시하거나 저에게 메일을 보내주십시오."

그렇다고 해서 내가 모든 답을 가지고 있다는 의미는 아닙니다. 단지 diamstar가 기꺼이 배울 의향이 있다면 기꺼이 도울 의향이 있다는 것입니다.

"그/그녀가 당신의 코드를 이해할 수 있을지 의심스럽습니다." 지금 아니면 완전히. 또한 코드가 그/그녀가 찾고 있는 것과 100% 일치하지 않을 수도 있지만(사용 가능한 정보가 주어지면 최선을 다했습니다) 좋은 시작입니다.

실제 사례로 배우면 얼마나 쉬운지 알고 계시죠?

EA에는 초보자를 위한 정보가 너무 많고 이에 대해 많은 질문이 있을 수 있다는 것을 알고 있습니다. 하지만 그것이 우리가 여기 있는 이유입니다, 그렇죠?

물론 제가 처음 배울 때는 그 모든 것을 이해할 수 없었습니다(저는 여전히 배우고 있습니다). 적어도 처음에는 전부는 아니지만 diamstar는 도움을 요청할 수 있는 적절한 포럼을 찾았고 배우기로 결심한 것 같습니다.

그/그녀가 최선을 다하기를 바라며 할 수만 있다면 돕도록 합시다.

모든 지원에 진심으로 감사드립니다. d 코드가 아무리 복잡하더라도 몇 달 동안 생각해내지 못했을 수도 있는 큰 도움이 되며 읽고 있는 책을 통해 d를 비교적 쉽게 이해할 수 있습니다. U 읽기 n 이해 b4 의미 있는 것을 쓰는 법을 배웁니다.