캔들 오픈 확인 - 페이지 3

 
  1. 코드는 빌드 600 이전에 작성되었습니다. 2014년 2월 이후로 변수 이름에 점을 사용할 수 없습니다. 밑줄로 바꾸면 됩니다.
  2. 다음은 방향 독립 코드의 예입니다.
     double DIR, OOP, OCP, ISL;   int OP;
    
    if (     Bid > High[ 1 ]){
       DIR = + 1 ; OOP = Ask; OCP = Bid; OP = OP_BUY;
    }
    else if (Bid <  Low[ 1 ]){
       DIR = - 1 ; OOP = Bid; OCP = Ask; OP = OP_BUY;
    }
    else return ;
    
    ISL = OCP -DIR* pips_to_change( extISL_Pips );
    ... OrderSend (...);
    매도/매도를 시가 /종가 로 전환하고 다른 모든 것은 매수인 것처럼 씁니다. ISL은 OCP(OCP - ISL) 미만이고 -DIR*은 매도 기호를 변경합니다.
    비교 (A > B) 가 필요한 경우 (A - B) *DIR> 0 을 사용하여 판매 비교를 반대로 하십시오.
 
GumRai :

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

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

안녕하세요 검라이님

여기에 업데이트를 게시한 지 꽤 되었지만 코드 작업을 계속하다가 마침내 완료했습니다. 10시간 동안 작업할 때 고통스럽습니다. 그러나 두 가지 주요 문제가 있습니다. 1) 내가 무엇을 하든, 오류 코드가 생성됩니다: "Unknown ticket XYZ for OrderCloseFunction" 및 2) 다른 magicnumbers 등을 사용하여 파일(하나는 USDCAD, 다른 하나는 EURUSD라고 함)을 다른 이름으로 저장했지만 아직 여전히 한 번에 거래만 하고 쌍을 독립적으로 취급하지 않습니다. 실제로 "OrderCloseFunction에 대한 잘못된 티켓" 오류도 생성합니다.

나는 이것을 구글링했지만 소용이 없었다. 이것으로 올바른 방향으로 안내해 주시면 정말 감사하겠습니다. 내가 무엇을 잘못하고 있지?

 #property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

//part with the extern int stating the terms of the MA removed to reduce space.

int MagicNumber = 1234 ;
int MagicNumber2 = 2345 ;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   double Ticksize = MarketInfo( Symbol (), MODE_TICKSIZE);
   if (Ticksize == 0.00001 || Ticksize == 0.001 )
   Pips = Ticksize* 10 ;
   else Pips = Ticksize;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
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 );
       double PreviousPriceClose2=iClose( NULL , 0 , 2 );
       if ((iOpen( NULL , 0 , 1 )<PreviousSlow && 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" ,MagicNumber, 0 , clrLimeGreen );
        }
        
       else
       for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--) 
         {
         if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
       if (iClose( NULL , 0 , 0 )<PreviousSlow)
        {
          CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
         }
         }
       if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if ( OrdersTotal ()== 0 )
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
        }
       else
       for (i = OrdersTotal ()- 1 ; i >= 0 ; i--) 
         {
         if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) continue ;
           if (iClose( NULL , 0 , 1 )>PreviousSlow)
        {
          CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
              }
     }
     }
     return ( 0 );
     return ( 0 ); 
    }
//--------------

  

미리 감사드립니다!

 

거래를 입력하기 위한 조건으로 OrdersTotal()==0을 사용 하지 마십시오.

이는 거래가 수동으로 또는 다른 EA 또는 다른 차트 기호에 첨부된 동일한 EA에 의해 열린 경우 1개의 거래만 열릴 수 있음을 의미합니다.

글로벌 변수 BuyTicket이 있으며 -1로 초기화합니다.

int BuyTicket =- 1 ;

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

닫기 전에 주문을 반복하지 마십시오. 불필요합니다.

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
  }

이제 티켓 번호에 전역적으로 선언된 변수를 사용할 때 터미널이 어떤 이유로 종료되었다가 다시 시작되면 문제가 발생할 수 있습니다.

따라서 새로운 전역 범위 변수를 선언하십시오.

 bool Recovery= true ;

  
   if (Recovery)
     {
     //loop through open orders and check for magic number, symbol and type
     //if you find a buy order with the magic number and symbol
     BuyTicket=OrderTicket();
     //if you find a sell order with the magic number and symbol
     SellTicket=OrderTicket();
     Recovery= false ;
     }

급하게 작성해서 오타가 있을 수 있지만 이 정도면 충분합니다

 
GumRai :


이것에 대한 톤 감사합니다! 내가 거기에 루프를 넣은 이유는 그것이 매도를 마감할 때 어떤 이유로 매수를 유발하지 않을 것이라는 점을 알아차렸기 때문입니다.

계속해서 필요한 변경을 수행했지만... 여전히 뭔가 잘못된 것 같습니다. 이제 긴 거래가 필요하지 않으며 잘못된 티켓의 오류 코드 와 OrderClose 오류 4051이 생성됩니다. 여기서 여전히 잘못된 점에 대한 제안이 있습니까?

이상한 부분은 이전 코드와 현재 코드(판매 전용) 모두에서 거래가 합리적으로 괜찮았다는 것입니다(하나의 차트에서만 구현한 경우).

이렇게 힘들 줄 몰랐어요 하하! 아주 간단하고 간단한 일이라고 생각했을 때 제가 착각한 것 같습니다. 양초가 MA 위로 교차하여 열릴 때 매수하고, 양초가 교차하여 MA 아래로 떨어질 때 닫고 매도하십시오.


 if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if (BuyTicket==- 1 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
        }
        
       else
       if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))
      {
       if (OrderCloseTime()== 0 )
      {
       if (Close[ 0 ]<PreviousSlow)
        {
           bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
           if (CloseTicket)
            BuyTicket=- 1 ;
            }
         }
         else
            BuyTicket= - 1 ;
            }
            
       if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if (SellTicket==- 1 )
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
        }
       else
       if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))
       {
         if (Close[ 0 ]>PreviousSlow)
        {
         bool   CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
                     }
         }
         else
            SellTicket= - 1 ;
            }
            
     return ( 0 );
     return ( 0 ); 
    }
 

죄송합니다만, 당신이 무엇을 하려는지 정말 모르겠습니다

 if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))

주문을 선택하지 않습니다. 코드도 컴파일됩니까?

       if (OrderCloseTime()== 0 )
      {
       if (Close[ 0 ]<PreviousSlow)
        {
           bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage, clrPink );
           if (CloseTicket)
            BuyTicket=- 1 ;
            }
         }
         else
            BuyTicket= - 1 ;

여기서 else는 if( OrderCloseTime()== 0)이 false 인 경우 적용됩니다.

       if ( OrderSelect (SELECT_BY_POS,MODE_TRADES))
       {
         if (Close[ 0 ]>PreviousSlow)
        {
         bool   CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
                     }
         }
         else
            SellTicket= - 1 ;

여기에서는 OrderSelect가 실패하는 경우 적용됩니다.

 
GumRai :

죄송합니다만, 당신이 무엇을 하려는지 정말 모르겠습니다

주문을 선택하지 않습니다. 코드도 컴파일됩니까?

여기서 else는 if( OrderCloseTime()== 0)이 false 인 경우 적용됩니다.

여기에서는 OrderSelect가 실패하는 경우 적용됩니다.

죄송합니다. 전적으로 제 잘못입니다. 귀하의 제안을 올바르게 읽지 않았거나 적용하지 않았습니다. 지적해주셔서 감사합니다. 여기에서 올바르게 수행했습니다. 보고서에 오류가 전혀 생성되지 않았습니다. 유일한 것은 이제 여러 매도 및 매수 주문 을 입력하고 있어 적시에 거래를 마감하지 못하게 한다는 것입니다.

편집: 정확히 말하면, 가격이 MA의 반대편을 교차할 때가 아니라 SL과 TP에서만 종료됩니다. 이것이 bool과 관련이 있습니까?

 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]
       if ((iOpen( NULL , 0 , 1 )<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if (BuyTicket==- 1 )
            BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips), "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
        }
       else
       if ( OrderSelect (BuyTicket,MODE_TRADES))
      {
         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
               }
            
       if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if (SellTicket==- 1 )
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
        }
       else
       if ( OrderSelect (SellTicket,MODE_TRADES))
       {
         if (Close[ 0 ]>PreviousSlow)
        {
         bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
                     }
         }
         else 
            SellTicket= - 1 ; //Order has closed so reset variable
            }
     return ( 0 );
     return ( 0 ); 
    }
 
if ( OrderSelect (BuyTicket,MODE_TRADES))
이것은 거래를 선택하는 것이 아닙니다. 내가 당신에게 준 예를 따르고 올바르게 수행하십시오.
 
GumRai :
이것은 거래를 선택하는 것이 아닙니다. 내가 당신에게 준 예를 따르고 올바르게 수행하십시오.

기분이...정말 바보 같아. ㅋㅋㅋ. 찾아주셔서 감사합니다!!

1) 두 가지가 남았습니다...이제 OrderClose 4108의 오류 코드 가 생성됩니다. 코드를 다시 게시할까요? 말씀하신 수정사항은 위와 같습니다. 그래도 규칙에 따라 들어오고 나갑니다.

2) 그리고 사진과 같이 롱포지션을 청산하자마자 바로 숏 포지션이 되지는 않습니다. 녹색 아래쪽 화살표는 짧아야 하는 위치를 보여줍니다. 매수를 했고 노란색 MA 아래에서 마감되면 손실로 마감했습니다. 여기, 그것은 짧았어야 했다. 어떻게 이것을 반복할 수 있습니까?

GumRai님, 감사합니다. 나는 솔직히 당신의 도움이 없었다면 이렇게 가까운 곳에 도달하지 못했을 것입니다.

여기서 짧았어야 했다

 
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]
       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),Ask+(TakeProfit*Pips), "Main Entry EA" ,MagicNumber, 0 , clrLimeGreen );
           }
        }
       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
        }

       if (SellTicket==- 1 )
        {
         if ((iOpen( NULL , 0 , 1 )>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
           {
            SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips), "Main Entry EA" ,MagicNumber2, 0 , clrLimeGreen );
           }
        }
       else
       if ( OrderSelect (SellTicket,SELECT_BY_TICKET))
        {
         if (OrderCloseTime()== 0 )
           {
             if (Close[ 0 ]>PreviousSlow)
              {
               bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage, clrPink );
               if (CloseSellTicket)
                  SellTicket=- 1 ;
              }
           }
         else
            SellTicket=- 1 ; //Order has closed so reset variable
        }
     }
   return ( 0 );
  }

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

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

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

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

 
GumRai :

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

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

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

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

거룩한! 훌륭해! 다시 한번 GumRai에게 감사드립니다. 당신은 최고예요.

지금은 테스트를 전달할 수 없지만 시장이 열리면 데모에 다른 마법이 있는 한 다른 쌍과 함께 사용할 수 있어야 한다고 생각합니다.