클로징 포지션. 지표에 따르면. - 페이지 5

 
komposter :
제거 :

결과는 여전히 동일합니다! 마지막 옵션을 사용하면 마지막 열린 위치만 닫힙니다.!

이제 OrderClose 후 반환을 제거하고 결과를 관찰합니다.)

 //----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal () - 1 ; v >= 0 ; v -- )                  {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic )     { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( RVI_1 >= Up_lim &&  RVI_0 < Up_lim )     {
         OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if (( RVI_1_ <= Low_lim ) && ( RVI_0_ > Low_lim ))    {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
지시에 따라 제거했습니다. 그리고 기적이 일어났습니다. 모든 열린 위치는 표시기의 신호에 닫히기 시작했습니다! 그런데 왜 그럴까요?
 
rid :
퇴비통 :
제거 :

결과는 여전히 동일합니다! 마지막 옵션을 사용하면 마지막 열린 위치만 닫힙니다.!

이제 OrderClose 후 반환을 제거하고 결과를 관찰합니다.)

 //----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal () - 1 ; v >= 0 ; v -- )                  {       
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))               {           
        if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic )     { 
//-----------------------------------------------------                  
if ( OrderType () == OP_BUY ) { 
      if ( RVI_1 >= Up_lim &&  RVI_0 < Up_lim )     {
         OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if ( OrderType () == OP_SELL ) { 
      if (( RVI_1_ <= Low_lim ) && ( RVI_0_ > Low_lim ))    {
               OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
지시에 따라 제거했습니다. 그리고 기적이 일어났습니다. 모든 열린 위치는 표시기의 신호에 닫히기 시작했습니다! 그런데 왜 그럴까요?
반품으로 인해 처리 루프가 중단되었습니다.
 
이해했다. 응답해주신 모든 분들께 감사드립니다!
 
KimIV :

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

 //+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
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 ) ;
    }
  }
}
보시다시피, 매우 구체적인 작업을 수행하는 함수가 작성되었습니다. 그런 다음 이러한 기능은 위치 작업에 원하는 전술을 구현하는 방식으로 결합됩니다.
Igor, 간단히 말해서 귀하의 기능에 대해 좀 더 자세히 설명해 주십시오. 깊이 파고들고 싶지만 미약한 지식으로 인해 처음부터 생각을 잃습니다.
 
rid писал (а):
Igor, 간단히 말해서 귀하의 기능에 대해 좀 더 자세히 설명해 주십시오. 더 파고들고 싶지만 미약한 지식으로 인해 처음부터 생각을 잃습니다.

일하는 Expert Advisor의 사례입니다. 기능의 목적:

  1. GetTradeSignal() 함수는 ms[] 배열을 거래 신호로 채웁니다. 물론 각 Expert Advisor는 GetTradeSignal() 함수를 자체적으로 채우고 있습니다.
  2. ExistPositions() 함수는 위치 존재 플래그를 반환합니다.
  3. ClosePositions() 함수는 ms[] 배열에 해당 신호가 있는 경우 하나 이상의 위치를 닫습니다. 닫기 전에 if(ExistPositions("", -1, Magic) 조건)에 의해 위치가 있는지 확인합니다.
  4. OpenPosition() 함수는 ms[] 배열에 해당 신호가 있는 경우 현재 가격에서 한 위치를 엽니다. 포지션은 포지션이 없을 때만 열 수 있습니다.

전술:

  1. 포지션이 있고 청산 신호가 있으면 포지션 을 청산하십시오.
  2. 포지션이 없고 오픈 신호가 있으면 포지션을 오픈합니다.

얼마나 간단한지 보시겠습니까? :-)

 
네 감사합니다. 나는 그것을 알아 내려고 노력할 것입니다.
 

안녕하세요! 메리 크리스마스!

여기에 또 다른 문제가 있습니다. 이론을 통해 살펴보았다. 일부이지만 아직 탈출구를 찾지 못했습니다. 여러 가지 이유로, 스톱(손절매 및 이익실현)이 아니라 EA에서 미결 포지션을 청산해야 합니다. 만들어진. 벌었다! 하지만...

로트 계산 라이브러리(B-lot)를 Expert Advisor에 삽입하려고 했을 때 Expert Advisor가 설명할 수 없는 작업을 시작했다는 것이 밝혀졌습니다! MM이 없으면 균형 곡선(최적화 후)이 약간의 하락으로 자신 있게 올라가고 MM을 켠 후에는 급격한 감소가 나타납니다! 뿐만 아니라! 코드에서 B 로트 라이브러리를 제거하고 단순히 로트 크기를 0.1에서 0.2로 늘리더라도 다시 급격한 드레인이 발생합니다. 초기 보증금이 몇 배로 증가하더라도. 시간 .... 즉. 그것은 도서관에 있지 않고 예금의 크기에 있지 않습니다. 인출액은 처음에는 부족합니다 ... . 나는 다음과 같이 시장에 진입한다.

 //---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if ( Long )    {  //выключатель вкл   
if ( ! ExpertOrder ( MagicLong ))     { //если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "  " , MagicLong , 0 , Blue ) ; 
    if ( ticket < 0 ){ Print ( " Ошибка открытия ордера BUY # " , GetLastError ()) ; return ( 0 ) ; }
              }
              }
여기에서는 모든 것이 명확하고 이해할 수 있습니다. 다음으로 OrderClose (... .. 함수를 사용하여 다음과 같이 위치를 닫습니다.
 for ( int v = 0 ; v < OrdersTotal () ; v ++ )               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if ( OrderSelect ( v , SELECT_BY_POS , MODE_TRADES ))  {           
        if ( OrderSymbol () == Symbol () )                   { 
//-----------------------------------------------------             
if ( ExpertOrder ( MagicLong ))  {
  if ( OrderProfit () > tp )   { OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Green ) ; return ( 0 ) ; }
  if ( OrderProfit () <= - sl ) { OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ; return ( 0 ) ; }
                               }
}}}
초기 로트 = 0.1이면 시공이 잘 됩니다! 로트 크기를 변경(증가)하려고 하거나 MM 라이브러리를 포함하려고 하면 작업이 중단됩니다! 이유를 알 수 없습니까? OrderLots() 대신 "Lots"로 대체했지만 아무 것도 변경되지 않았습니다. ... 제발, 말해 주세요.?
 
rid :
초기 로트 = 0.1이면 시공이 잘 됩니다! 로트 크기를 변경(증가)하려고 하거나 MM 라이브러리를 포함하려고 하면 작업이 중단됩니다! 이유를 알 수 없습니까? OrderLots () 대신 "Lots"를 방금 대체했지만 아무 것도 변경되지 않았습니다. ... 제발, 말해 주세요.?
전문가 의 행동의 차이를 살펴볼 필요가 있다.
이전과 같은 시간에 주문을 열거나 닫습니까?
 

아니요. 로트가 0.1에서 0.2로 증가함에 따라 거래가 더 자주, 2배 이상 발생하기 시작합니다! 동일한 외부 매개변수로... 이상합니다. 그러나 게으르지 마십시오! 다음과 같이 했습니다.

OrderClose 함수에 의한 포지션 청산을 제거하고 ticket=OrderSend(... ... ...) 함수에서 손절매와 이익실현에 의한 정상적인 청산을 위해 제공되었습니다. 이 경우 MM 블록이 제대로 작동했습니다! 기능에 대한 모든 것을 볼 수 있습니다.

 if ( OrderProfit () > tp )    { OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Green ) ;  }
로트를 늘릴 때 그에 따라 "tp" 값을 변경해야 합니까?
 
손가락으로 하늘을 가리켜 볼까요? ;)

오류는 코드에 있습니다. 어디 - 몰라, 왜냐하면. 코드도 아닙니다. 우리는 다음 지점에서 투시자를 호출합니다;)