+ Market Overview 주요지수현황
질문&자유게시판

 

간단한 Ea개발중인데, 막히는 부분 질문 올립니다.

간단한 이평선 매매로직 코드에서 추적손절매를 추가하려고 하는데, 시스템트레이딩에서 구동시키면 추적손절매 시작하고 얼마지나지 않아, 무한루프에 걸린 것처럼 렉이 걸리면서 돌아가질않네요. 코드에서 어느부분이 문제인걸까요ㅠㅠ..


파일도 같이 첨부합니다.


extern int MagicNo = 1234; //외부변수 값 설정

extern double Lots = 1.0; //랏사이즈 설정

extern int ShortMA = 50; //단기이동평균선 기간

extern int LongMA = 200; //장기이동평균선 기간

extern double TakeProfit = 50; //이익실현 핍

extern double StopLoss = 50; //손절매 핍


extern double TrailingStop = 20; //추적손절 시작(수익)핍 

extern double TStopLoss = 30; //추적손절매 핍


//extern double TTakeProfit = 100; 

//+------------------------------------------------------------------+


int start()

 {

 double SMACur,SMAPre,LMACur,LMAPre; //double 타입의 변수 선언

 int i,ticket,total;

 bool ticketM;

 

 SMACur=iMA(NULL,0,ShortMA,0,MODE_SMA,PRICE_OPEN,0); //현재봉의 단기이동평균선 값 

 SMAPre=iMA(NULL,0,ShortMA,0,MODE_SMA,PRICE_OPEN,1); //직전봉의 단기이동평균선 값

 LMACur=iMA(NULL,0,LongMA,0,MODE_SMA,PRICE_OPEN,0); //현재봉의 장기이동평균선 값

 LMAPre=iMA(NULL,0,LongMA,0,MODE_SMA,PRICE_OPEN,1); //직전봉의 장기이동평균선 값

 

 //SMACur,SMAPre,LMACur,LMAPre 변수안에 이동평균선 값을 넣어줌

 

 //--------------------------------------------------------------------

 total=OrdersTotal(); //변수 total에 현재 오픈포지션의 개수를 입력

 if(total<1) //현재 오픈포지션의 개수가 1보다 작다면, 즉 현재 오픈 포지션이 없다면

  {

   if(SMACur > LMACur && SMAPre < LMAPre)

   //현재봉의 단기이평선이 현재봉의 장기이평선보다 위에 있고, 직전봉의 단기이평선이 직전봉의 장기이평선보다 아래에 있을 때

   //즉, 이동평균선 골드크로스 발생시

   {

   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"MA",MagicNo,0,Blue);

   //매수포지션 오픈

   return(0);

   }

 

   if(SMACur < LMACur && SMAPre > LMAPre) //이평선 데드드크로스 발생시

   {

   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"MA",MagicNo,0,Red);

   return(0);

   }

 return(0);

 }

 

 //-------------------------------------------------------------------------------

 //아래구문에서 해당 오더에 대한 손절/익절값을 넣어 줌

 

 for(i=0;i<OrdersTotal();i++)//현재 오픈되어 있는 전체 오더를 대상으로 for구문을 돌림

  {

   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)== true)

   //OrderSelect함수로 개별 오더를 잡아줌

   {

    if(OrderMagicNumber()==MagicNo && OrderSymbol()==Symbol())

     {

      if(OrderType() == OP_BUY)

       {

        if(OrderStopLoss()==0 && OrderTakeProfit() == 0)

         //해당 오더의 손절과 익절값이 0이라면

         {

          ticketM=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-StopLoss*Point*10,Bid+TakeProfit*Point*10,0,Blue);

          //새로운 속성으로 해당 오더를 변경함

          return(0);

         }

         

        if (Bid - OrderOpenPrice() > TrailingStop*Point*10)

         {

            if (OrderStopLoss() < Bid - TrailingStop*Point*10)

            {

               ticketM = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TStopLoss*Point*10, OrderTakeProfit(), Red);

               

               return(0);

            }

         }

       }

       

       if(OrderType() == OP_SELL)

       {

        if(OrderStopLoss()==0 && OrderTakeProfit() == 0)

         //해당 오더의 손절과 익절값이 0이라면

         {

          ticketM=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+StopLoss*Point*10,Ask-TakeProfit*Point*10,0,Blue);

          //새로운 속성으로 해당 오더를 변경함

          return(0);

         }

         

        if (OrderOpenPrice() - Ask > TrailingStop*Point*10)

         {

            if (OrderStopLoss() > Ask + TrailingStop*Point*10)

            {

               ticketM = OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TStopLoss*Point*10, OrderTakeProfit(), Red);           

               

               return(0);

            }

         }

       }

      }

     }

   }

  

  

  

 

    return(0);

 }









메타4사용자포럼(MT4사용자포럼)

Comments

M 관리자 2019.08.30 15:22
프로그래머시군요..  저는 프로그래머가 아니라서 정확한 답변은 어렵네요..^^;
포럼에도 트레이더 뿐만 아니라 프로그래머로 활동하는 분들도 계시니.  곧 좋은 답변 주실껄로 기대합니다..^^
1 투꿈무 2019.08.30 17:43
메타4 사용자포럼, 관리자님 존재만으로도 감사할 따름입니다.! 관리자님 말씀처럼 금방 좋은 답변 얻었습니다!! 사랑합니다.
4 가을이다 2019.08.30 15:49
눈대중으로 봐서는, 특별한 것은 없어보이는데요..
실제로 돌렸을때 원하지 않는 증상이나, 문제가 있어보이면  디버깅을 해보시면 됩니다.

디버깅은 문제가 되는지 하나씩 찍어보아, 문제를 해결하는 과정인데요..

이부분이 잘 되면, 앞으로 좀 더 복잡한 EA도 문제없이 만드실 수 있으리라 생각이 듭니다.

--

먼저, 트레일링 스탑이 걸릴만한 차트를 검색하셔서, (예: EURSUD  5분, 몇월 몇일 몇분..) 

EA 첫상단에 날짜체크 하셔서, 해당 시간에 바로 EA가 동작되도록 세팅하시고

  //예: 2시 15분부터 로직 체크
  if ((Hour() >= 2) && (Min() >= 15))
  {
  }


OrderSend 또는 OrderModify 등등.. 의심이 가는 부분에 Print 함수로 로그를 찍습니다.

  //예
  Print("■ 로그 : " + OrderOpenPrice);


그러면, EA구동시 로그로 해당되는 값을 순서대로 확인할 수 있기 때문에.. 왜 어디서 문제가 있는지
확인이 가능합니다.

한번 원인을 잘 찾아보시길 바랍니다 ^^
M 관리자 2019.08.30 15:58
명쾌한 답변이군요.. 역시!! ^^ 
1 투꿈무 2019.08.30 17:47
프린트함수를 통해 로그확인하는 방법을 몰랐네요..!

답변주신대로 로그를 확인해보니 제가 원하는 조건(, 현재가격이 추적손절매시작가격보다 크고, 손절가격이 추적손절매가격보다 낮을때,)이 아님에도 손절가가 바뀌는 것을 보고 해당 조건을 자세히보니

  if (Bid - OrderOpenPrice() > TrailingStop*Point*10)

        {

            if (OrderStopLoss() < Bid - TrailingStop*Point*10) //  Bid - TrailingStop*Point*10가 아닌  Bid - TStopLoss*Point*10 로 바꿨어야 했습니다.

            {

              ticketM = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TStopLoss*Point*10, OrderTakeProfit(), Red);

             

              return(0);

            }

간단한 코딩인데도 막혀서 우울했었는데, 가을님 덕분에 날아갈 것 같네요..!
네이버 까페에서 뵌 적 있었는데 여기서도 활동하시나 봅니다! 다시한번 진심으로 감사드립니다
17 도협도성도신 2019.08.30 15:56
뭔가 대단히 있어보이는 질문에 대단히 스마트하고 있어보이는 답변까지 ㄷㄷ
포럼이 굉장히 발전하고 있는거 같아서 기분이 좋네용 ㅎ
전 무슨말인지 못알아들으니 가만있겠습니다 ㅋㅋ
M 관리자 2019.08.30 15:59
프로그래밍 관련해서라 그래요..  저도 잘 몰라요 ㅎㅎ  저는 트레이딩만 해온지라..
도협님이 암호화폐 얘기하면 또 그게 신기할 겁니다 ^^
1 투꿈무 2019.08.30 17:49
기본적인 코딩이라서, 대단하기까진 한참 멀었네요 ㅠㅠ
포럼이 발전할 수 있도록 활동 많이 하겠습니다~ 물론 질문을 많이 올리겠지만요..ㅎㅎ
17 도협도성도신 2019.08.30 18:16
그런 질문들이 포럼을 발전시키는거져 ㅎ
저는 그럴 능력이 안되니 투꿈무님이 제 몫까지 활동을 좀 ~ ㅋ;;
1 투꿈무 2019.08.30 23:43
포럼과 같이 함께 발전할 수 있도록 유익한 질문 올리겠습니다!!

 

MetaTrader 커뮤니티
+ 주요시장현황