공개 거래 확인 문제 - 페이지 6

 

나는 이것을 시도한 적이 없지만 유효하지 않다고 생각합니다. . .

 OrderType ()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
OrderMagicNumber ()==(Mnumber1||Mnumber1))     // The orders magic number is the same as the magic number used in this ea

나는 당신이 이것을 할 필요가 있다고 생각합니다. . .

(( OrderType ()==OP_BUYSTOP)|| ( OrderType ()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
(( OrderMagicNumber ()== Mnumber1) || ( OrderMagicNumber ()==Mnumber2))     // The orders magic number is the same as the magic number used in this ea

라고 생각하는 이유. . . 이것은 무엇에 해당합니까? (OP_BUYSTOP||OP_SELLSTOP) 변수가 bool 이면 작동할 수 있습니다. . . 그러나 나는 그것이 int 와 함께 작동 할 수 있다고 생각하지 않습니다.

한 가지 사소한 점은 OrderDelete 전에 OderSelect가 필요하지 않다는 것입니다. 일반적으로 int 티켓을 사용하지 않는 Order 함수 를 사용할 때만 OrderSelect가 필요합니다. 예: 주문 주석 ( ), 주문수수료 ( ) 등

 
좋아요, Raptor님 감사합니다. 방금 내 게시물의 코드를 업데이트했습니다. 바를 카운터로 사용 하는 것은 좋지 않다고 말씀하신 것이 생각나서 바 시간을 사용하도록 변경했습니다. 논리를 수정하고 작동하는지 확인합니다.
 

좋아, 나는 논리를 고쳤다. 그러나 여전히 주문을 삭제하지는 않습니다.


앞에서 언급했듯이 카운터를 바에서 때때로 변경했습니다.


 extern string   sComment4                = "Max Hours allowed before pending orders are deleted" ;
extern int      pendinglimit        = 4 ;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour ( TimeCurrent ());


   if ( TimeHour ( TimeCurrent ()) > (bartraded + pendinglimit) && Tradeopen()==true)       // Check to see if pending orders have expired
     {
         for ( int tnumber = OrdersTotal ()- 1 ; tnumber >= 0 ; tnumber--)                   //scan through open orders
        {
           if ( OrderSelect (tnumber, SELECT_BY_POS) &&   
             (( OrderType ()==OP_BUYSTOP)|| ( OrderType ()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             (( OrderMagicNumber ()== Mnumber1) || ( OrderMagicNumber ()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                 OrderDelete (tnumber);                                                 // Delete it
               }
        }
     }
 

dazamate :
좋아요, Raptor님 감사합니다. 방금 내 게시물의 코드를 업데이트했습니다. 바를 카운터로 사용하는 것은 좋지 않다고 말씀하신 것이 생각나서 바 시간을 사용하도록 변경했습니다. 논리를 수정하고 작동하는지 확인합니다.
" 막대 는 신뢰할 수 없습니다(차트의 최대 막대에 도달하면 변경되지 않고 코드가 중단됨). Volume[0]==1은 신뢰할 수 없으며 틱을 놓치면 코드가 중단됩니다. 항상 시간을 사용하십시오."

사실이지만 이 주석이 작성된 시점의 맥락을 살펴볼 필요가 있습니다. . . 는 신뢰할 수 없습니다. . .

 int Bars 

Number of bars in the current chart

하지만 시간 대신 막대 번호를 사용할 수 없다는 의미는 아닙니다. 예를 들어 당신의 코드 는 금요일 저녁과 일요일에 어떻게 대처할 것인가? pendinglimit 는 4시간 또는 4막대와 같습니까?

또한 거래가 22:00에 이루어지면 어떻게 됩니까? 22 + 4 = 26 ?

 if ( TimeHour ( TimeCurrent ()) > (bartraded + pendinglimit) && Tradeopen()==true)       // Check to see if pending orders have expired
 

알겠습니다. 시간 전략에 문제가 있습니다. 그러나 차트가 최대 막대 에 도달한 후 막대를 카운터로 사용하면 해당 막대에서도 실패합니다. 그렇죠?

다시 돌아가서 내가 무엇을 생각해낼 수 있는지 보겠습니다...

 

좋아, 이 접근법은 어때


 extern string   sComment4                = "Max Hours allowed before pending orders are deleted" ;
extern int      pendinglimit        = 4 ;
 
// * EVERYTIME A TRADE GETS TRIGGERED* 

bartraded = 0 ;


   if (Time0 == Time[ 0 ]) return ; Time0 = Time[ 0 ];           // make sure each bar is only scanned once
       {   
//-----------------------------------------------------------------------------------------------------------------------------------------------
//TRADE COUNTER
   

   bartraded++;   // Each time a new bar opens add 1 to the counter

//------------------------------------------------------------------------------------------------------------------------------------------------
// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 'pendinglimit'

   if (bartraded > pendinglimit && Tradeopen()==true)       // Check to see if pending orders have expired
     {
         for ( int tnumber = OrdersTotal ()- 1 ; tnumber >= 0 ; tnumber--)                   //scan through open orders
        {
           if ( OrderSelect (tnumber, SELECT_BY_POS) &&   
             (( OrderType ()==OP_BUYSTOP)|| ( OrderType ()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             (( OrderMagicNumber ()== Mnumber1) || ( OrderMagicNumber ()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                 OrderDelete (tnumber);                                                 // Delete it
               }
        }
     }
 
dazamate :

알겠습니다. 시간 전략에 문제가 있습니다. 그러나 차트가 최대 막대에 도달한 후 막대를 카운터로 사용하면 해당 막대에서도 실패합니다. 그렇죠?


아니요, 현재 H1 막대는 항상 막대 0 입니다. . 60분 후 현재 H1 막대는 막대 0이 됩니다. . 막대는 차트의 총 막대 수를 의미하는 막대 를 사용하거나 차트의 맨 왼쪽에 있는 막대를 보고 있는 경우에 문제가 됩니다.

에 대한 막대 번호 TimeHour ( TimeCurrent () 가 0이면 iBarShift를 사용하여 거래가 이루어진 시간의 막대 번호를 얻을 수 있습니다(저장하지 않고 계산해야 합니다! ! !) . 그런 다음 다음과 같이 하십시오. . .

 if ( iBarShift (symbol, TF, Time_order_Placed)+ 1 >  pendinglimit) && Tradeopen()==true)  
 

OK 세 번째 운이 좋았습니다. 거기에서 말하려는 내용을 파악하는 데 시간이 좀 걸렸습니다. 여기 내가 한 일이 있습니다. 하지만 주문은 여전히 삭제되지 않습니다 >:(


 static datetime tradeopened;


//Everytime a trade is opened I run
 tradeopened = TimeCurrent ();


 if (( iBarShift (hothand(), 60 ,tradeopened)>pendinglimit) && Tradeopen()==true)           // Check to see if pending orders have expired
     {
         for ( int tnumber = OrdersTotal ()- 1 ; tnumber >= 0 ; tnumber--)                   //scan through open orders
        {
           if ( OrderSelect (tnumber, SELECT_BY_POS) &&   
             (( OrderType ()==OP_BUYSTOP)|| ( OrderType ()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
             (( OrderMagicNumber ()== Mnumber1) || ( OrderMagicNumber ()==Mnumber3)))     // The orders magic number is the same as the magic number used in this ea
          
               {
                 OrderDelete (tnumber);                                                 // Delete it
               }
        }
     }
 
네, 댓글을 다시 읽어보니 제가 한 일은 잘못되었습니다.
tradeopened = TimeCurrent ()
시간 [0]을 사용해야 합니까?
 

이 시도 ;-)

 OrderDelete ( OrderTicket ( ) );                     // Delete it