클로징 포지션. 지표에 따르면.

 

좋은 저녁이에요! 문제가 있었습니다.

포지션을 닫아야 합니다. 지표에 따르면. 게다가. 포지션은 손절매 또는 이익실현도 가능해야 합니다. (지시등 신호가 너무 늦은 경우 - 자주 발생합니다) 나는 포지션을 엽니다:

 if                    ( ... ... ...  )         
   {
  ticket = OrderSend ( Symbol () , 0 , Lot , Ask , Slippage , Bid - SL * Point , Ask + TP * Point ,
                                               NULL , MAGIC , 0 , CLR_NONE ) ;

앞으로 미결 포지션을 마감하기 위해 다음을 제공합니다.

 for ( int v = 0 ; v < OrdersTotal () ; v ++ )                          {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))             {           
        if ( OrderSymbol () == Symbol ()) && OrderMagicNumber () == MAGIC )   { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY )                   { 
      if ( Stochast_1 > 75 &&  Stochast_0 < 75 )     {
                   OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; 
                 return ( 0 ) ; // выходим
                }       
               }   
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { ... .... ....

그러나 포지션은 여전히 손절매 또는 이익실현에 의해서만 마감됩니다. (매우 드문 경우 - 단 하나의 예외!)

차트의 표시기 는 거의 모든 열린 위치가 표시기의 신호에 따라 정확히 마감되어야 함을 보여줍니다. 제발. 어디에서 오류가 발생할 수 있는지 알려주실 수 있습니까...?

 

나는 일반적으로 다음과 같이 구현합니다.

 //+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions () {
  double sl = 0 , tp = 0 ;
  int    ms [ 2 ] ;
 
  ArrayInitialize ( ms , 0 ) ;
  GetTradeSignal ( ms ) ;
  if ( ExistPositions ( "" , - 1 , Magic )) {
    if ( ms [ 1 ] > 0 ) ClosePositions ( "" , OP_BUY , Magic ) ;
    if ( ms [ 1 ] < 0 ) ClosePositions ( "" , OP_SELL , Magic ) ;
  } else {
    if ( ms [ 0 ] > 0 ) {
      if ( StopLoss > 0 ) sl = Ask - StopLoss * Point ; else sl = 0 ;
      if ( TakeProfit > 0 ) tp = Ask + TakeProfit * Point ; else tp = 0 ;
      OpenPosition ( OP_BUY , sl , tp , Magic ) ;
    }
    if ( ms [ 0 ] < 0 ) {
      if ( StopLoss > 0 ) sl = Bid + StopLoss * Point ; else sl = 0 ;
      if ( TakeProfit > 0 ) tp = Bid - TakeProfit * Point ; else tp = 0 ;
      OpenPosition ( OP_SELL , sl , tp , Magic ) ;
    }
  }
}
보시다시피, 매우 구체적인 작업을 수행하는 함수가 작성되었습니다. 그런 다음 이러한 기능은 위치 작업에 원하는 전술을 구현하는 방식으로 결합됩니다.
 
아마도 Stochast_1, Stochast_0에 있는 무언가일 것입니다. 다른 모든 것은 괜찮습니다.
 
KIM IV님, 감사합니다. 나는 그것을 알아 내려고 노력할 것입니다.
 
Integer :
아마도 Stochast_1, Stochast_0에 있는 무언가일 것입니다. 다른 모든 것은 괜찮습니다.


아니오..... 스토캐스틱으로 모든 것이 정상입니다. ( 시가 로 작업)

 double Stochast_0 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 ) ;
double Stochast_1 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
 
Bai는 입찰로 마감합니다. 이 경우 최근 호가 스트림에 스프레드에 의해 지정된 호가와 다른 호가 우연히 포함된 경우에만 마감이 트리거됩니다. 그러한 견적이 (노령으로 인해) 아직 브로커가 고려한 견적 목록을 떠나도록 관리되지 않은 경우, 청산 주문이 실행될 기회가 있습니다.
 

내가 당신을 올바르게 이해 했습니까? 바이 포지션을 닫아야 합니다.

OrderClose (OrderTicket(),OrderLots(),Bid,3,Green);

그리고 매도 포지션은 닫혀야 합니다:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); ?
 
rid :

내가 당신을 올바르게 이해 했습니까?

일반적으로 맞습니다.

 
정확히! 질문의 문제
 

그럼에도 불구하고 그들은 스토캐스틱에 따라 포지션을 청산하고 싶지 않습니다! 모든 작업을 수행했습니다! 외부 매개변수에 스위치를 삽입했습니다. 코드 끝에서 - 포지션을 닫기 위한 별도의 블록! 폐쇄는 녹색 삼각형으로 제공되었습니다.

전술은 간단합니다. 빠른 MA는 위아래 편차가 있는 느린 MA에 의해 형성된 채널의 경계를 가로지릅니다. 코드는 간단합니다. 어드바이저 다운로드 중 - 아래.

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
 //********* Закрытие позиций ****************************************
if ( AutoClose ) {  
//----переменные для закрытия позиций ----
double Stochast_0 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 ) ;
double Stochast_1 = iStochastic ( NULL , 0 , Stochastic_period , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
//----------------------------------------------------------------------
  for ( int v = 0 ; v < OrdersTotal () ; v ++ )                             {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == MagicNum )   { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( Stochast_1 > 75 && Stochast_0 < 75 )     {
           OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим
                }       
     }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if ( Stochast_1 < 25 && Stochast_0 > 25 )    {
                 OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                 return ( 0 ) ; // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

할 수 있다. 누가 볼 것인가? 그리고 무슨일인지 말해줘...

아마도 주문을 열 때 큰 것과 묻는 것이 부정확하게 배치되었을 것입니다. 항상 이것과 혼동:

티켓 = OrderSend (Symbol(),... ....
파일:
 
코드를 보지 않았습니다.
하지만 한 가지는 확실히 고칠 것입니다. "if(Stochast_1>75 && Stochast_0<75)" 대신 "if(Stochast_1>75 && Stochast_0 <= 75)"를 수행합니다.