MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 434

 
WinProject :

그래픽 개체를 제거하는 방법을 알려주세요. 변수 값으로 이름이 지어진 수직선이 있습니다.

문자열 이름=="테스트1"; 문자열 Vertline="line_"+이름; ObjectCreate(0,VertLine,OBJ_VLINE,0,시간,시나); 이름이 test1인 세로줄만 제거하는 방법은 무엇입니까?


아마도 이 기능은 당신에게 유용할 것입니다:

차트 하위 창에서 이름 접두사로 지정된 유형의 모든 개체를 삭제합니다.

int ObjectsDeleteAll (
    long chart_id , // 차트 ID
    const string prefix , // 객체 이름 접두사
    정수      sub_window=EMPTY , // 창 인덱스
    int object_type=EMPTY // 삭제할 객체 유형
);

 
Vladislav Andruschenko :


아마도 이 기능이 당신에게 유용할 것입니다:

차트 하위 창에서 이름 접두사로 지정된 유형의 모든 개체를 삭제합니다.

int ObjectsDeleteAll (
    long chart_id , // 차트 ID
    const string prefix , // 객체 이름 접두사
    정수      sub_window=EMPTY , // 창 인덱스
    int object_type=EMPTY // 삭제할 객체 유형
);


감사합니다. 이 함수는 개체 이름의 첫 번째 부분 문자열을 접두사로 이해하지만 개체 이름의 두 번째 부분 문자열을 삭제하는 방법은 무엇입니까? 이 목적을 위해 개체 이름에 StringSubstr 및 StringFind를 사용할 수 있는 방법이 있습니까?

 
WinProject :

고마워, 내가 이해하는 한, 이 함수는 개체 이름의 첫 번째 부분 문자열을 접두사로 이해하지만 개체 이름에서 두 번째 부분 문자열을 삭제하는 방법은 무엇입니까? 이 목적을 위해 개체 이름에 StringSubstr 및 StringFind를 사용할 수 있는 방법이 있습니까?


기다리다,

다음 코드를 제공했습니다.

 string Vertline= "линия_" +name; 


귀하의 접두사는 어디에 있습니까?

모두가 그것을 한다.

그래서 접두사로 개체를 삭제하는 기능을 제공했습니다.


 "линия_"

접미사로 줄을 삭제해야 하는 경우 모든 개체의 일반적인 열거로 StringFind를 사용할 수 있습니다.

예를 들어:

 void ObjectsDelete()
  {
string NameEA= "суффикс" ;
   for ( int i= ObjectsTotal ();i>= 0 ;i--)
     {
       if ( StringFind ( ObjectName (i),NameEA)!=- 1 ) ObjectDelete ( ObjectName (i));
     }
  }
 

Vladislav에게 감사합니다. 모든 것이 작동합니다. 포럼 회원의 도움으로 MQL이 훨씬 더 흥미로워집니다. 흥미로운 사이트, 감사합니다!

 

안녕하세요. 위치가 나타난 후 추적이 중지되는 이유를 알아내도록 도와주세요.

의미는 다음과 같습니다. 두 위치가 1, 2로 열려 있습니다. 동일한 가격에 첫 번째 위치는 후행으로 마감되고,   두 번째 트레일링은 포지션 개시 가격에 하나의 포지션만 있는 조건에서 켜집니다.

모든 것이 제대로 작동하고 위치 1은 닫히고 위치 2는 후행,   그러나 두 개의 위치 3, 4가 다른 가격으로 열리면 흔적은 위치 2를 더 이상 추적하지 않습니다.

그는 왜 트롤링을 중단합니까?

 void Tral_SL_one( int _TrailingStop= 0 , int _TrailingStep= 0 )
  {
   if (_TrailingStop<= 0 )
       return ;
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       if (!( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )))
         continue ;
       if ( OrderSymbol ()!= Symbol ())
         continue ;
       if ( OrderMagicNumber ()!=_MagicNumber)
         continue ;
       if ( OrderType ()== OP_BUY )
        {
         if (NumPosByPrice( Symbol (), OP_BUY , OrderOpenPrice (),_MagicNumber)== 1 )
           {
             if ( NormalizeDouble ( Bid - OrderOpenPrice (), Digits )> NormalizeDouble (_TrailingStop * Point , Digits ))
              {
               if ( NormalizeDouble ( OrderStopLoss (), Digits )< NormalizeDouble ( Bid -(_TrailingStop+_TrailingStep- 1 )* Point , Digits ) || OrderStopLoss ()== 0 )
                 {
                   if ( OrderModify ( OrderTicket (), OrderOpenPrice (), NormalizeDouble ( Bid -_TrailingStop* Point , Digits ), OrderTakeProfit (), OrderExpiration ()));
                   
                 }
              }
           }
        }

       if ( OrderType ()== OP_SELL )
        {

         if (NumPosByPrice( Symbol (), OP_SELL , OrderOpenPrice (),_MagicNumber)== 1 )
           {
             if ( NormalizeDouble ( OrderOpenPrice ()- Ask , Digits )> NormalizeDouble (_TrailingStop * Point , Digits ))
              {
               if ( NormalizeDouble ( OrderStopLoss (), Digits )> NormalizeDouble ( Ask +(_TrailingStop+_TrailingStep- 1 )* Point , Digits ) || OrderStopLoss ()== 0 )
                 {
                   if ( OrderModify ( OrderTicket (), OrderOpenPrice (), NormalizeDouble ( Ask +_TrailingStop* Point , Digits ), OrderTakeProfit (), OrderExpiration ()));
                    
                 }
              }
           }
        }
     }
  }
//===
int NumPosByPrice( string sy= "" , int op=- 1 , double pp= 0 , int mn=- 1 ) 
  {
   double px,py;
   int     d,i,k= OrdersTotal (),num= 0 ;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) 
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) 
        {
         if (( OrderSymbol ()==sy || sy== "" ) && (op< 0 || OrderType ()==op)) 
           {
             if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) 
              {
               if (mn< 0 || OrderMagicNumber ()==mn) 
                 {
                  d= MarketInfo ( OrderSymbol (), MODE_DIGITS );
                  px= NormalizeDouble (pp, d);
                  py= NormalizeDouble ( OrderOpenPrice (), d);
                   if (pp<= 0 || px==py) num++;
                 }
              }
           }
        }
     }
   return (num);
  }
 
mila.com :

안녕하세요. 위치가 나타난 후 추적이 중지되는 이유를 알아내도록 도와주세요.

의미는 다음과 같습니다. 두 위치가 1, 2로 열려 있습니다. 동일한 가격에 첫 번째 위치는 후행으로 마감되고,   두 번째 트레일링은 포지션 개시 가격에 하나의 포지션만 있는 조건에서 켜집니다.

모든 것이 제대로 작동하고 위치 1은 닫히고 위치 2는 후행,   그러나 두 개의 위치 3, 4가 다른 가격으로 열리면 흔적은 위치 2를 더 이상 추적하지 않습니다.

그는 왜 트롤링을 중단합니까?


심각한 오류만 지적하겠습니다.

   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       if (!( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )))
         continue ;
       if ( OrderSymbol ()!= Symbol ())
         continue ;
       if ( OrderMagicNumber ()!=_MagicNumber)
         continue ;
       if ( OrderType ()== OP_BUY )
        {
         if (NumPosByPrice( Symbol (), OP_BUY , OrderOpenPrice (),_MagicNumber)== 1 )


주문을 정렬한 다음 위치 수를 계산하는 기능을 실행합니다. 따라서 NumPosByPrice 함수에서 다른 위치를 선택합니다.

그래서 추가 건설:

 if ( NormalizeDouble ( Bid - OrderOpenPrice (), Digits )> NormalizeDouble (_TrailingStop * Point , Digits ))


거의 작동하지 않습니다.


여러 가지 방법으로 이 문제를 해결할 수 있습니다.

예를 들어:

 void Tral_SL_one( int _TrailingStop= 0 , int _TrailingStep= 0 )
  {
   if (_TrailingStop<= 0 )
       return ;
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       if (!( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )))
         continue ;
       if ( OrderSymbol ()!= Symbol ())
         continue ;
       if ( OrderMagicNumber ()!=_MagicNumber)
         continue ;
       if ( OrderType ()== OP_BUY )
        {
         if (NumPosByPrice( Symbol (), OP_BUY , OrderOpenPrice (),_MagicNumber)== 1 )
           {
OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
             if ( NormalizeDouble ( Bid - OrderOpenPrice (), Digits )> NormalizeDouble (_TrailingStop * Point , Digits ))


이것은 근본적으로 잘못된 것이지만 빠른 이해를 위해 도움이 될 것입니다.

후에:


 if (NumPosByPrice( Symbol (), OP_BUY , OrderOpenPrice (),_MagicNumber)== 1 )

추가하다 :

 OrderSelect (i, SELECT_BY_POS , MODE_TRADES );
 
Vladislav Andruschenko :


심각한 오류만 지적하겠습니다.

여러 가지 방법으로 이 문제를 해결할 수 있습니다.

감사합니다, 알겠습니다, tralit)

 

MT4에서 알림 창을 다시 여는 방법을 알려주시겠습니까? 나는 가짜 신호를 생성하고 경고 창을 여는 스크립트를 가지고 있었는데, 지금은 시스템을 다시 설치한 후 인터넷에서 찾을 수 없습니다. 아마도 누군가가 있습니까?

 
amenrazp :

MT4에서 알림 창을 다시 여는 방법을 알려주시겠습니까? 나는 가짜 신호를 생성하고 경고 창을 여는 스크립트를 가지고 있었는데, 지금은 시스템을 다시 설치한 후 인터넷에서 찾을 수 없습니다. 아마도 누군가가 있습니까?

경고 (""); 그런 스크립트?
 
Vladislav Andruschenko :
알리다(""); 그런 스크립트?

그것은 그것처럼 보인다. 여기에 붙일 능력이 있습니까?