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

 
MrBrooklin # :

팁 감사합니다, Alex! 먼저 이 스레드에서 답변을 기다리겠습니다. 하지만 침묵이 흐른다면 오류, 버그, 질문 주제로 넘어가겠습니다.

안부 인사를 전합니다. 블라디미르.

이 스레드에서는 개발자의 답변을 기다리지 않을 것입니다. 우리는 실수를 발견했습니다. 우리는 그것이 정말로 실수인지 확인했습니다. 그들은 Alexei가 목소리를 내는 지점에 보고했습니다. 이 문제에 대한 중재자의 조치를 기다릴 필요가 없습니다. 우리도 사람이고 때로는 시간이 없습니다.

 
Artyom Trishkin # :

이 스레드에서는 개발자의 답변을 기다리지 않을 것입니다. 우리는 실수를 발견했습니다. 우리는 그것이 정말로 실수인지 확인했습니다. 그들은 Alexei가 목소리를 내는 지점에 보고했습니다. 이 문제에 대한 중재자의 조치를 기다릴 필요가 없습니다. 우리도 사람이고 때로는 시간이 없습니다.

안녕하세요 Artyom입니다!

공습 경보 해제.

안부 인사를 전합니다. 블라디미르.

 

오늘의 좋은 시간 !!!!

다음은 그리드 Expert Advisor의 두 가지 기능입니다. 첫 번째 기능은 수익성이 없는 주문의 부분 마감을 고려한 이익 계산입니다.

 //+----------------------------------------------------------------------------+
//| Калькуляция сетки ордеров                                                  |
//+----------------------------------------------------------------------------+
bool CalculiteProfit()
  {
   double oProfit= 0 ,oLoss= 0 ,percent;
   int i;
   nOrd= 0 ;
   for (i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!= Symbol () || OrderMagicNumber()!=Magic || OrderType()>OP_SELL)
         continue ;
       if (OrderProfit()>= 0 )
         oProfit += OrderProfit();
       else
        {
         oLoss+=OrderProfit();
         Ord_ticket[nOrd]=OrderTicket();
         Ord_lot[nOrd]=OrderLots();
         nOrd++;
        }
     }
   oLoss = MathAbs (oLoss+GetOrderSwap()+GetOrderCommission());
   if (oLoss> 0 )
      percent=oProfit/oLoss* 100 ;
   else
      percent= 100 ;
   if (percent<MinPercentForClose) //MinPercentForClose переменная из настроек 
       return ( false );
   for (i= 0 ; i<nOrd; i++)
     {
      Ord_lot[i]=( MathCeil ((Ord_lot[i]*RowLots)*percent)/ 100 )/RowLots;
     }
   return ( true );
  }

주문을 마감하는 두 번째 기능, 또한 수익성이 없는 주문의 일부를 마감하는 기능

 //+----------------------------------------------------------------------------+
//| Закрытие сетки ордеров при заданной команде с учетом части ордеров         |
//+----------------------------------------------------------------------------+
void ClosseAll()
  {
   int i,j,tkt;

   for (i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!= Symbol () || OrderMagicNumber()!=Magic)
         continue ;
      tkt=OrderTicket();
      RefreshRates();
       if (OrderProfit()>= 0 )
        {
         if (OrderType() == OP_BUY)
           {
             if (!OrderClose(OrderTicket(), OrderLots(), Bid, slip))
               Print ( "Не удалось закрыть ордера на покупку!" );
           }
         else
             if (OrderType() == OP_SELL)
              {
               if (!OrderClose(OrderTicket(), OrderLots(), Ask, slip))
                   Print ( "Не удалось закрыть ордер на продажу!" );
              }
        }
       else
         for (j= 0 ; j<nOrd; j++)
             if (tkt==Ord_ticket[j])
              {
               if (OrderLots()<Ord_lot[j])
                  Ord_lot[j]=OrderLots();
               Ord_lot[j]=NRL(Ord_lot[j]);
               if (OrderType() == OP_BUY)
                 {
                   if (!OrderClose(OrderTicket(), Ord_lot[j], Bid, slip))
                     Print ( "Не удалось закрыть ордера на покупку!" );
                 }
               else
                   if (OrderType() == OP_SELL)
                    {
                     if (!OrderClose(OrderTicket(), Ord_lot[j], Ask, slip))
                         Print ( "Не удалось закрыть ордер на продажу!" );
                    }
               break ;
              }
     }
  }

상황은 다음과 같다

문제는 이 두 함수를 기반으로 수익성이 없는 주문을 계산하는 함수를 작성하는 것이 가능한지, 아니면 주문이 마감되어야 하는 부분이 가능한가 하는 것입니다.

그렇다면 작성을 도와주세요.

감사해요

 
EVGENII SHELIPOV # :

오늘의 좋은 시간 !!!!

그렇다면 작성을 도와주세요.

지금은 시기가 좋지 않습니다.

당신을 위해 쓰라는 말입니까?

 
Andrey Sokolov # :

지금은 시기가 좋지 않습니다.

당신을 위해 쓰라는 말입니까?

자신을 찢지 마십시오 알렉산더

 

초등학교에서 길을 잃다:

트롤에 대한 포즈 검색을 어떻게 구성할 수 있습니까? - 동방향, 어떤 이유로 하나의 포즈, 즉 트롤을 트롤합니다. 넘어가지 않는다... MT5

 for (i= 0 ; i< PositionsTotal (); i++)   
     if (a_position.Select( _Symbol ))       
     if ( PositionSelect ( _Symbol )) if ( Symbol ()== PositionGetSymbol (i))  
     if (Magic== PositionGetInteger ( POSITION_MAGIC ))  
   //  magic = myposition.Magic();   
      {
         //  ------------   перевод в бу  BUY   ------------    
         //if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 
         if (a_position.PositionType() == POSITION_TYPE_BUY )
           if (NLb_fun > 0 )
            {
                 Print ( " перевод в безубыток BUY, _SL = " , _SL, " POSITION_PRICE_OPEN: " ,
                     NormalizeDouble ( PositionGetDouble ( POSITION_PRICE_OPEN ), _Digits ),
                     " NLb_fun = " , NormalizeDouble (NLb_fun, _Digits ));
               Modify = true ;
 if (Modify)
              {
               Print ( " серия рыночных позиций BUY назначена к переводу в безубыток, текущией позы POSITION_PRICE_OPEN = " ,
               NormalizeDouble ( PositionGetDouble ( POSITION_PRICE_OPEN ), _Digits ), " тикет = " , PositionGetInteger ( POSITION_TICKET ));
                
               trade.PositionModify( _Symbol , SymbolInfoDouble ( _Symbol , SYMBOL_BID ) - 50 * _Point , PositionGetDouble ( POSITION_TP ));
               Print ( " Перенос в бу стоп лосса позиции Buy № " ,   PositionGetInteger ( POSITION_TICKET ));
    ...
           } // к if(Modify)
        }     // к if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 

...

HEDGE 시장 포지션(ATP)과 함께 후행 포즈를 검색하는 데 코드 조각을 사용할 수 있습니다.

문제가 해결되었습니다! ATP, 다시 한 번 블라디미르 카르푸토프에게!!!

그의 트롤과 함께!

https://www.mql5.com/ru/code/17263

핵심 기능은 인덱스를 통해 루프를보고 티켓으로 옵션을 수정하는 것입니다 !!!

 //--- при таком методе мы будет сюда попадать на каждом тике.
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
       if (m_position.SelectByIndex(i))
         if (m_position. Symbol ()== Symbol () && m_position.Magic()==m_magic)
           {
             //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
             if (m_position.PositionType()== POSITION_TYPE_BUY )
              {
               //--- когда у позиции ещё нет StopLoss
               if (m_position.StopLoss()== 0 )
                 {
                   //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                   if (m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(), 0.0 );
                    }
                 } 
TrailingStop
TrailingStop
  • www.mql5.com
Пример советника с реализацией Trailing Stop.
 

간단한 작업: ArrayI 배열의 요소와 인덱스 및 값이 일치하는 모든 요소를 ArrayJ 배열에서 밀어내야 합니다 .

 int OnInit ()
  {
   int CommonArray[]={ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 };
   int ArrayI[ 20 ]=   { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , 9 , 10 ,   0 , 12 , 13 , 13 , 13 , 13 ,   0 ,   0 , 13 ,   0 };
   int ArrayJ[];

   for ( int j= 0 ; j< ArraySize (ArrayI); j++)
   {
       ArrayResize (ArrayJ,j+ 1 );
      ArrayJ[j]=CommonArray[j];
   }

   ArrayPrint (ArrayI);
   ArrayPrint (ArrayJ);

   for ( int i= 0 ; i< ArraySize (ArrayI); i++)
       if (ArrayI[i])
         for ( int j= 0 ; j< ArraySize (ArrayJ); j++)
             if (ArrayI[i]==ArrayJ[j])
               ArrayRemove (ArrayJ,j, 1 );

   ArrayPrint (ArrayJ);
//---
   return ( INIT_SUCCEEDED );
  }

핵심 라인이 강조 표시됩니다. 결과:

 2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         0    0    0    0    0    0    0    8    9 10    0 12 13 13 13 13    0    0 13    0
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7    8    9 10 11 12 13 13 13 13 13 13 13 13
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7 11

예상되는:

 2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         0    0    0    0    0    0    0    8    9 10    0 12 13 13 13 13    0    0 13    0
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7    8    9 10 11 12 13 13 13 13 13 13 13 13
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7            11                  13 13      13

ArrayJ는 동적입니다. 뭔가 잘못된 것 같지만 ... 정적이 필요하지 않습니다.

나는 내 마음을 다 무너뜨렸다. 차던트? 아니면 정말 오래된 노래의 아날로그인가요?

https://www.mql5.com/ru/forum/1111/page3141#comment_27152680

그리고

https://www.mql5.com/ru/forum/1111/page3142#comment_27371998

명명된 상수에 대해?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2022.01.28
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
x572intraday 합니다 .

핵심 라인이 강조 표시됩니다. 결과:

예상되는:

ArrayJ는 동적입니다. 뭔가 잘못된 것 같지만 ... 정적이 필요하지 않습니다.

1. ArrayResize는 주기 동안 꺼내는 것이 좋습니다.

 ArrayResize (ArrayJ, ArraySize (ArrayI));
for ( int j= 0 ; j< ArraySize (ArrayI); j++)
   {
      ArrayJ[j]=CommonArray[j];
   }

2. ArrayRemove는 배열 요소를 "비워두지" 않고 후속 요소를 그 자리로 "이동"합니다. 따라서 후속 인덱스의 요소 대응이 위반됩니다.

 
JRandomTrader # :

1. ArrayResize는 주기 동안 꺼내는 것이 좋습니다.

2. ArrayRemove는 배열 요소를 "비워두지" 않고 후속 요소를 그 자리로 "이동"합니다. 따라서 후속 인덱스의 요소 대응이 위반됩니다.

2에 대한 질문은 없으며 명확성을 위해 간격을 설정했습니다. 또한 도움말은 정적 배열에 대해 다음과 같이 말합니다. " 함수가 고정 크기 배열에 사용되는 경우 배열 자체의 크기는 변경되지 않습니다. 이 경우 나머지 "꼬리"가 시작 부분 에 물리적으로 복사됩니다. position . " 도움말의 예제도 고정 크기 배열을 사용하지만 내 것은 동적입니다.

1에 관하여. 실제 작업에서는 ArrayJ나 ArrayI의 크기를 미리 알 수 없고 CommonArray는 자체 크기를 가지고 있기 때문에 루프에서 빼낼 방법이 없습니다. 모두 일치하지 않습니다. .

위의 예와 같이 요소 밀어내기가 중간에 중단되지 않는 또 다른 예가 있습니다.

 int OBJTFVArray[]={ 1 , 2 , 3 , 4 , 5 , 6 , 10 , 12 , 1520 , 30 , 16385 , 16386 , 16387 , 16388 , 16390 , 16392 , 16396 , 16408 , 32769 , 49153 , 49154 , 49155 , 49156 , 49157 , 49158 , 49159 , 49160 };
int PArray[ 20 ]={ 0 , 0 , 0 , 0 , 0 , 00 , 16390 , 16392 , 163960 , 32769 , 49153 , 49153 , 49153 , 49153 , 0 , 0 , 49153 , 0 };
int PArray_[];

int OnInit ()
  {
   for ( int p_= 0 ; p_< ArraySize (PArray); p_++)
   {
       ArrayResize (PArray_,p_+ 1 );
      PArray_[p_]=OBJTFVArray[p_+ 8 ];
   }

   ArrayPrint (PArray);
   ArrayPrint (PArray_);

   for ( int p= 0 ; p< ArraySize (PArray); p++)
       if (PArray[p])
         for ( int p_= 0 ; p_< ArraySize (PArray_); p_++)
             if (PArray[p]==PArray_[p_])
               ArrayRemove (PArray_,p_, 1 );

   ArrayPrint (PArray_);

   return ( INIT_SUCCEEDED );
  }

유효한 결과:

 0      0      0      0      0      0      0 16390 16392 16396      0 32769 49153 49153 49153 49153      0      0 49153      0
15      20      30 16385 16386 16387 16388 16390 16392 16396 16408 32769 49153 49154 49155 49156 49157 49158 49159 49160
15      20      30 16385 16386 16387 16388                    16408              49154 49155 49156 49157 49158 49159 49160

하지만 그 옵션이 작동해야 합니다. 개그는 분명히 오른쪽 꼬리에 같은 값을 가진 요소가 연속적으로 들어가면 발생합니다(이전 게시물 참조). 이것은 이미 위에서 언급한 문제처럼 보입니다.

 
x572intraday # :

2에 대한 질문은 없으며 명확성을 위해 간격을 설정했습니다. 또한 도움말은 정적 배열에 대해 다음과 같이 말합니다. " 함수가 고정 크기 배열에 사용되는 경우 배열 자체의 크기는 변경되지 않습니다. 이 경우 나머지 "꼬리"가 시작 부분 에 물리적으로 복사됩니다. position . " 도움말의 예제도 고정 크기 배열을 사용하지만 내 것은 동적입니다.

1에 관하여. 실제 작업에서는 ArrayJ나 ArrayI의 크기를 미리 알 수 없고 CommonArray는 자체 크기를 가지고 있기 때문에 루프에서 빼낼 방법이 없습니다. 모두 일치하지 않습니다. .

위의 예와 같이 요소 밀어내기가 중간에 중단되지 않는 또 다른 예가 있습니다.

유효한 결과:

하지만 작동하려면 해당 옵션이 필요합니다. 개그는 분명히 오른쪽 꼬리에 같은 값을 가진 요소가 연속적으로 들어가면 발생합니다(이전 게시물 참조). 이것은 이미 위에서 언급한 문제처럼 보입니다.

1. 내가 보여준 것처럼 사이클에서 벗어날 수 있고 제거해야 합니다. 루프 중에 ArrayI의 크기가 변경되지 않는 한.

2. 다음, 그런 것

 int k= 0 ; // объявляем до цикла - чтобы использовать после
for ( int i= 0 ; i< ArraySize (ArrayI); i++) // после предыдущего кода (1) размеры ArrayI и ArrayJ равны
   if (ArrayI[i]!=ArrayJ[i])
    {
     ArrayJ[k++]=ArrayI[i];
    }
ArrayResize (ArrayJ,k);
사유: