캔들 오픈 확인

 

안녕하세요 여러분,

저는 mql4로 코딩하는 것이 처음이고 실제로 첫 번째 EA를 작동시키려고 노력했습니다. 다음에 대해 도움을 주시면 감사하겠습니다. 말하자면 기본적인 교차점이지만 이동 평균이 교차하는 대신 이동 평균을 교차하는 가격일 뿐입니다.

다음과 같은 경우 캔들 시가 에서 발동되는 주문이 필요합니다.

지금까지 기본 영역에 다음 코드가 있습니다.


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

정수 시작()

{

//---

더블 PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);

이중 CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,0);

더블 PreviousFast = iMA(NULL,0,FastMa,FastMaShift,FastMaMethod,FastMaAppliedTo,1);

이중 CurrentFast = iMA(NULL,0,FastMa,FastMaShift,FastMaMethod,FastMaAppliedTo,0);

이중 PreviousPriceClose= iClose(NULL, 0, 1);

이중 CurrentCandleOpen= iOpen(NULL,0,0);

//----------------------메인 계산은 여기에서 시작됩니다.


if(PreviousPriceClose<PreviousSlow && (CurrentCandleOpen>(CurrentSlow)))

if(주문 총계() == 0)

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "메인 엔트리 EA", 0,0,clrLimeGreen);

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

리턴(0);

리턴(0);

}

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

내가 무엇을 하든, 나는 일을 할 수 없는 것 같고, 내가 여기서 뭔가를 하고 있다고 생각하지 않습니다. 다시 한 번 도움을 주시면 감사하겠습니다!

 
    

   double CurrentSlow = iMA ( NULL , 0 ,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo, 0 );   

이 값은 양초가 현재 상태인 동안 변경됩니다.

 double CurrentCandleOpen= iOpen( NULL , 0 , 0 );

이것은 아니다

BuyTicket = OrderSend ( Symbol (),OP_BUY, LotSize, CurrentCandleOpen , Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );

CurrentCandleOpen은 많은 틱에 대해 유효한 진입 가격이 아닐 것입니다.

이 논리를 사용해야 하는 경우 새 막대가 열릴 때 한 번만 계산하십시오.

OrderSend가 실패하면 반환 값을 확인하십시오 .

 
GumRai :

이 값은 양초가 현재 상태인 동안 변경됩니다.

이것은 아니다

CurrentCandleOpen은 많은 틱에 대해 유효한 진입 가격이 아닐 것입니다.

이 논리를 사용해야 하는 경우 새 막대가 열릴 때 한 번만 계산하십시오.

OrderSend가 실패하면 반환 값을 확인하십시오.


빠른 응답에 감사합니다! 내가 올바르게 이해했는지 보자.

  1. CurrentSlow는 아직 형성 중이기 때문에 실제로 작동하지 않습니다. 알겠습니다. 이전 캔들에 대해 형성된 이동 평균 값을 사용할 수 있습니다. 그것은 문제가 될 수 없습니다.
  2. CurrentCandleOpen은 움직이는 값이 아니기 때문에...그렇다면 코드의 일부가 정확하다고 가정하고 있습니까?
  3. CandleOpen에 충분히 가깝도록 이 작업을 수행하려면 어떻게 해야 합니까? -- 새 막대가 열릴 때 한 번만 계산하도록 언급했습니다. 좀 더 확장해 주시겠습니까? 나는 그것을 하는 방법을 잘 모른다
다시 한번 GumRai에게 감사드립니다.

 
   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       //Code to process the signal
     }

   
중괄호 안의 코드는 새 막대의 첫 번째 눈금에서만 실행됩니다.
 
GumRai :
중괄호 안의 코드는 새 막대의 첫 번째 눈금에서만 실행됩니다.

코드 감사합니다! 앞서 논의한 대로 다음을 업데이트했습니다.

  1. MA의 현재 슬로우를 이전 슬로우로 변경했습니다.
  2. Ask로 CurrentCandleOpen을 제거 했습니다. Ask 대신 CurrentCandleOpen을 사용할 때마다 거래가 필요하지 않았습니다. 그러나 그것을 Ask로 교체하면 작동했지만 물론 Ask가 MA를 넘을 때마다 거래되고 Candle이 열려있을 때는 거래되지 않습니다.

하지만 이후에 다음과 같이 코드에 넣으면 다시는 거래를 하지 않습니다. 내가 이것을 올바르게 삽입 했습니까?

int start()
  {
//---
    
  double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);     //1 at the end signifies that we want it on candle close

  double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);     //1 at the end signifies that we want it on candle close
   
  double PreviousPriceClose= iClose(NULL, 0, 1);
  double CurrentPriceClose= iOpen(NULL, 0, 0);
  
//----------------------Main calculation starts here

 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
   if(PreviousPriceClose<PreviousSlow && Ask>PreviousSlow)
      if(OrdersTotal () == 0)
         BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,Ask, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
   }
//--------------
   return(0);
   return(0);
  }
 

새 바코드 외부에 iMA 호출을 하는 이유는 무엇입니까? 즉, 필요하지 않을 때 마다 틱 이 호출됩니다. 비효율적입니다.

   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow = iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo, 1 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   // You can just use Close[1]
       if (PreviousPriceClose<PreviousSlow && Bid >PreviousSlow)
         if ( OrdersTotal ()== 0 )
            {
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
             if (BuyTicket==- 1 )
               {
               //Error checking code
               }
     }

Ask를 사용하여 MT4 차트의 값을 비교하지 마십시오. 입찰가를 기반으로 합니다.

OrderSend가 실패하면 오류를 확인하십시오.

이전 막대의 마지막 눈금이 MA 아래에 있을 때 새 막대의 첫 번째 눈금이 MA 위에 있는 경우는 많지 않을 수 있습니다.

 

GumRai님 정말 감사합니다. 나는 진심으로   도움을 주셔서 감사합니다.

귀하의 코드는 매력처럼 작동합니다. 나는 여전히 여기에서 로프를 배우려고 노력하고 있으며 iMA가 따로따로 자체적으로 장착되는 것을 보았습니다. 대신 당신의 방법을 따를 것입니다.

***자신의 머리를 때리다***

코드를 다시 작업하겠습니다. 마지막 줄은 내가 원했던 것과 실제로 코딩한 것의 결함을 지적했습니다.

내가 실제로해야 할 일은 다음과 같습니다.

  • 1단계 캔들은 MA 아래에서 마감되고,
  • 2단계: 양초가 MA 위로 교차하고 닫힙니다.
  • 3단계: 새 캔들 오픈 시 거래를 입력합니다.

마지막 질문이고 제가 알 것 같아요...

위의 1단계인 iMA의 경우 SlowMaShift는 2가 맞습니까? 2마디 뒤에 있기 때문에? iClose 는 해당 비교에 대한 iClose(NULL,0,2)가 맞습니까?

 

아이디어가 있으신 것 같습니다.

코드를 수정하고 게시하면 나 또는 다른 사람이 댓글을 달 것입니다.

 
GumRai :

아이디어가 있으신 것 같습니다.

코드를 수정하고 게시하면 나 또는 다른 사람이 댓글을 달 것입니다.

발휘할 수 있었습니다! 감사합니다.
지금은 똑같이 하고 있지만 반대 규칙을 사용하여 짧은 시간을 가집니다. 독립적으로 잘 작동하지만 OrderCloseBy 기능을 사용하여 long이 열려 있고 short가 트리거되면 주로 주문 티켓 을 찾는 방법에 대한 단서가 없기 때문에 long을 닫는 방법을 모르겠습니다... 다음을 수행하여 OrderCloseBy를 우회하려고 시도했습니다.

 int start()
  {
//---
 static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow = iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo, 1 );
       double PreviousSlow2 = iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if (PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
         if ( OrdersTotal ()== 0 )
            {
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if ( OrdersTotal ()== 1 )
         {
            OrderClose(BuyTicket,LotSize,Ask,Slippage, clrPink ) && OrderSend ( Symbol (), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
                  }
         if ( OrdersTotal ()== 0 )
         {
             OrderSend ( Symbol (), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
            }
     }
//--------------
   return ( 0 );
   return ( 0 );
  }
   return ( 0 );
  }
 
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if ( OrdersTotal ()== 1 )

조건 블록 안에 있으므로 만족할 수 없습니다.

         if ( OrdersTotal ()== 0 )

   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 1 );
       double PreviousSlow2= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if (PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if ( OrdersTotal ()== 0 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
        }
       else
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
        {
         if ( OrdersTotal ()== 1 )
           {
            OrderClose(BuyTicket,LotSize,Ask,Slippage, clrPink );
             OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
           }
         else
         if ( OrdersTotal ()== 0 )
           {
             OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Sell EA" , 0 , 0 , clrAliceBlue );
           }
        }
     }

위의 내용이 당신이 의도 한 것과 더 비슷하다고 생각합니다.

오류 반환 코드를 확인 해야 합니다.

 
GumRai :

위의 내용이 당신이 의도 한 것과 더 비슷하다고 생각합니다.

오류 반환 코드를 확인해야 합니다.

코드에 감사드립니다... 불행히도 실제로 작동하지 않았습니다. 이제 두 번 이상 short에 들어가게 되었기 때문입니다. 여기에 제가 대신 시도한 것이 있습니다. 저는 별도로 설명하겠습니다. 긴 진입과 퇴장, 그리고 나서 짧은 진입과 퇴장에 대해 반대를 만들 것입니다. 그것은 나를 위해 더 관리하기 쉽고 약간 더 쉽게 조정할 수 있습니다. 긴 입구와 출구 부분을 먼저 내리기 위해 노력하고 있습니다. 그러나 어떻게든, 이것은 양초가 공매도의 이동 평균 아래에서 마감될 때 거래를 마감하는 것이 아닙니다. 내가 뭘 잘못하고 있는지 알아? 그것은 오류를 제공합니다: 'OrderClose'의 반환 값을 확인해야 합니다. 나는 아침 내내 해결책을 구글링했지만 작동하지 않는 것 같다.

   static datetime bar_time= 0 ;
   if (bar_time!=Time[ 0 ])
     {
      bar_time=Time[ 0 ];
       double PreviousSlow= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 1 );
       double PreviousSlow2= iMA ( NULL , 0 ,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo, 2 );
       double PreviousPriceClose=iClose( NULL , 0 , 1 );   //You can just use Close[1]
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if (PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if ( OrdersTotal ()== 0 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" , 0 , 0 , clrLimeGreen );
        }
       else
       if (PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow && Bid<PreviousSlow)
        {
          OrderClose(BuyTicket,LotSize,Ask,Slippage, clrPink );
          
        }
     

업데이트: 오류 코드 를 제거했지만 닫기 티켓이 여전히 작동하지 않는 것 같습니다. 내가 원하는 것은 양초가 MA 아래로 교차하고 닫히면 매수를 마감하는 것입니다.