캔들 오픈 확인 - 페이지 4

 
GumRai :

주문이 없을 때 주문을 마감하기 위해 확인하는 것과 같은 작은 변화.

코드에 따르면 매도가 매수 마감 즉시 열릴 이유가 없습니다.

매수를 종료하는 조건은 매도를 여는 조건과 동일하지 않습니다.

양초가 열린 상태에서만 확인하기 때문에 Close[0]은 양초에 대해 수신된 첫 번째 틱의 입찰가 값임을 기억하십시오.

안녕하세요 검라이님

내 코드에 대해 좀 더 도와줄 수 있는지/의향이 있는지 궁금합니다. 어떤 코드를 살펴봐야 하는지 말씀해 주시면 먼저 직접 코딩한 다음 질문이 있으면 다시 답변해 드리겠습니다.

내가 원하는 것은 일단 거래가 이루어지면 예를 들어 50핍(지금 하고 있는 것)에서 손절매 를 하는 것입니다. 그러나 가격이 거래 방향으로 60핍 이동하면 SL이 손익분기점으로 이동하고 더 나아가 거래에서 70핍 떨어진 후행 스탑이 됩니다.

이 작업을 수행하는 방법은 무엇입니까? 항상 그렇듯이 도움을 주시면 감사하겠습니다.

 

손익분기점의 경우 항상 SL을 손익분기점 + 1점 이상으로 이동합니다. 그래야 나중에 검사할 때 두 배를 비교할 때 발생할 수 있는 문제를 피할 수 있습니다.

2가지 조건만 체크한 경우입니다(구매의 경우)

OrderOpenPrice()>OrderStopLoss()

그리고

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

그런 다음 SL이 공개 가격 +1 포인트 또는 고정하기로 결정할 수 있는 금액이 되도록 주문을 수정하십시오.

판매의 경우 반대 조건이지만 SL이 처음에 0인지 설명하도록 코딩해야 합니다.

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()== 0 
 
GumRai :

손익분기점의 경우 항상 SL을 손익분기점 + 1점 이상으로 이동합니다. 그래야 나중에 검사할 때 두 배를 비교할 때 발생할 수 있는 문제를 피할 수 있습니다.

2가지 조건만 체크한 경우입니다(구매의 경우)

그리고

그런 다음 SL이 공개 가격 +1 포인트 또는 고정하기로 결정할 수 있는 금액이 되도록 주문을 수정하십시오.

판매의 경우 반대 조건이지만 SL이 처음에 0인지 설명하도록 코딩해야 합니다.

정말 감사합니다. 사실, 내가 할 일은 거래에 대한 중개 비용을 (대략) 충당할 만큼 충분한 포인트를 추가하는 것입니다.

두 번째 줄에.. 왜 Orderclose price-OrderOpenPrice를 사용합니까? 나는 그 코드를 잘 이해하지 못했다. Bid-OrderOpenPrice를 사용하면 가격이 얼마나 이동했는지 추적할 수 있기 때문에 사용해야 하지 않습니까?

나는 아래에서 내가 하는 일에 가깝습니까?:

 if (BuyTicket==- 1 )
        {
         if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips), 0 , "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
           }
           if (OrderOpenPrice()>OrderStopLoss())
               if (Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket, NULL ,Bid-( 50 * Point ), NULL , NULL , clrNONE );
        }

위의 커미션을 extern으로 선언했습니다. 그리고 대신 Bid를 사용했습니다.

편집하다:

그래서 (아래에서 찾은 것을 기반으로) 위에 게시한 코드가 올바르지 않다고 생각합니까? MQL4 책/도움말에서 다음을 찾았습니다... 그냥 후행 정지인 것 같습니다. 반면에 내가 필요한 것은 먼저 손익분기점 정지 후 후행 정지입니다. 이것을 어떻게 수정합니까?

 int TrailingStop = 50 ;
               //--- modifies Stop Loss price for buy order 
             if (TrailingStop> 0 )
               {
               OrderSelect (BuyTicket,SELECT_BY_TICKET);
                 if (Bid-OrderOpenPrice()> Point *TrailingStop)
                {
                 if (OrderStopLoss()<Bid- Point *TrailingStop)
                  {
                   bool res =OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (Bid- Point *TrailingStop, Digits ),OrderTakeProfit(), 0 , clrNONE );
                   if (!res)
                         Print ( "Error in OrderModify. Error code=" , GetLastError ());
                     else
                         Print ( "Order modified successfully." );
                    }
                 }
                 }
 
 if ( BuyTicket ==- 1 )
        {
         if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
             BuyTicket = OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips), 0 , "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
           }
           if (OrderOpenPrice()>OrderStopLoss())
               if (Bid-OrderOpenPrice>=( BuyTicket +(Commission*LotSize)))
                  OrderModify(BuyTicket, NULL ,Bid-( 50 * Point ), NULL , NULL , clrNONE );
        }

전체 코드 블록은 BuyTicket==-1에 대한 조건부입니다.

주문이 열리면 BuyTicket = -1이 아니므로 거래가 열려 있는 동안 BE로 이동하기 위한 검사 가 수행되지 않습니다.

 if (Bid-OrderOpenPrice>=( BuyTicket +(Commission*LotSize)))

티켓 번호와 가격이 무슨 상관이 있나요?

OrderOpenPrice()를 사용하기 전에 주문을 선택 해야 합니다 .

OrderClosePrice()는 매수, 매도를 요청하는 주문이 선택된 시점의 Bid입니다.(주문이 아직 열려 있는 동안)

 
SharkWaters :

그래서 (아래에서 찾은 것을 기반으로) 위에 게시한 코드가 올바르지 않다고 생각합니까? MQL4 책/도움말에서 다음을 찾았습니다... 그냥 후행 정지인 것 같습니다. 반면에 내가 필요한 것은 먼저 손익분기점 정지 후 후행 정지입니다. 이것을 어떻게 수정합니까?

   int BreakEvenPoints= 50 ;
   double BE_Decimal=BreakEvenPoints* Point ;
//--- modifies Stop Loss price for buy order 
   if (BreakEvenPoints> 0 )
  {
   OrderSelect (BuyTicket,SELECT_BY_TICKET);
   if (Bid-OrderOpenPrice()>BE_Decimal)
     {
       if (OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+ Point , Digits ),
                              OrderTakeProfit(), 0 , clrNONE );
         if (!res)
             Print ( "Error in OrderModify to BE. Error code=" , GetLastError ());
         else
             Print ( "Order modified to BE successfully." );
        }
     }
  }
이 시도
 
GumRai :
이 시도

포인트 주셔서 감사합니다! 필요한 사항을 변경했습니다. 컴파일할 때 "'OrderSelect'의 반환 값을 확인해야 한다는 경고가 표시됩니다. 이것은 이상하게도 하나의 구매만 트리거되고 나머지는 다시 4108 오류 코드 로 변환됩니다. 판매는 정상적으로 작동합니다(나는 ' t는 그것을 변경했습니다).

여기에 구매 코드의 전체 섹션이 있습니다. 내가 뭔가를 잘못하고 있는 경우를 대비해서입니다. 하지만 중간에 이 코드만 추가했기 때문에 그 부분은 없어야 합니다. 나머지는 완벽하게 잘 작동하는 이전과 같았습니다. 내가 여기서 무엇을 잘못 알고 있습니까?

 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 (BuyTicket==- 1 )
        {
         if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips), 0 , "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints= 50 ;
         double BE_Decimal=BreakEvenPoints* Point ;
         
         if (BreakEvenPoints> 0 )
              {
               OrderSelect (BuyTicket,SELECT_BY_TICKET);
               if (Bid-OrderOpenPrice()>BE_Decimal)
                 {
                   if (OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+ Point , Digits ),OrderTakeProfit(), 0 , clrNONE );
                     if (!res)
                         Print ( "Error in OrderModify to BE. Error code=" , GetLastError ());
                     else
                         Print ( "Order modified to BE successfully." );
                    }
                 }
              }
       else
       if ( OrderSelect (BuyTicket,SELECT_BY_TICKET))
        {
         if (OrderCloseTime()== 0 )
           {
             if (Close[ 0 ]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
               if (CloseTicket)
                  BuyTicket=- 1 ;
              }
           }
         else
            BuyTicket=- 1 ; //Order has closed so reset variable
        }
        

업데이트:

좀 더 구글링해서 아래와 같이 수정했습니다.

 int BreakEvenPoints= 50 ;
         double BE_Decimal=BreakEvenPoints* Point ;
         
         if (BreakEvenPoints> 0 )
              {
               if ( OrderSelect (BuyTicket,SELECT_BY_TICKET))
               {
               if (Bid-OrderOpenPrice()>BE_Decimal)
                 {
                   if (OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+ 10 * Point , Digits ),OrderTakeProfit(), 0 , clrNONE );
                     if (!res)
                         Print ( "Error in OrderModify to BE. Error code=" , GetLastError ());
                     else
                         Print ( "Order modified to BE successfully." );
                    }
                   }   
                 }
              }


이렇게 하면 컴파일을 클릭할 때 생성되는 오류가 제거됩니다. 그러나 여전히 저널에 OrderModify 오류 4108이 생성됩니다.

 

모든 코드는 if 조건에 포함됩니다.

  if (bar_time!=Time[ 0 ])  

따라서 새 막대당 한 번만 실행됩니다.

 

BuyTicket == -1일 때 티켓 번호가 -1인 주문을 선택하려고 하고 물론 존재하지 않습니다.

주문을 선택하기 전에 BuyTicket>0인지 확인하십시오 .

 
GumRai :

모든 코드는 if 조건에 포함됩니다.

따라서 새 막대당 한 번만 실행됩니다.


지적해 주셔서 감사합니다.

따라서 이를 위해 다음과 같이 시작 직후 상단에 추가 브래킷을 만들었습니다.

 int start() 
{
{

그런 다음 하나의 대괄호(전체 if (bar_time!=Time[ 0 ]) 섹션을 종료한 다음 끝에 코드를 배치한 다음 return(0); 그리고 시작()을 닫는 끝 대괄호를 닫습니다.

코드나 백테스트 저널에 오류는 없지만 단 한 번의 매수 거래만 있으면 됩니다. 그것도 가격이 오픈에서 더 이상 오르지 않았지만 오픈에서 바로 닫혀서 50핍 이동은 고사하고 .

이것은 귀하가 언급한 BuyTicket == -1과 관련이 있을 수 있다고 생각하십시오. 하지만 솔직히 어떻게 바꿔야 할지 모르겠습니다. 환상적으로 작동하는 초기 코드에 대한 귀하의 권장 사항을 기반으로 -1 항목을 넣었습니다. 그러나 주문을 선택하기 전에 BuyTicket>0을 어떻게 확인합니까?

 
SharkWaters :

그러나 주문을 선택하기 전에 BuyTicket>0을 어떻게 확인합니까?

죄송하지만 이렇게 질문해야 한다면 지식 수준에 비해 너무 복잡한 코드를 작성하려고 하는 것입니다.

나는 당신을 위해 한 번에 약간의 코드를 작성할 수 없습니다.