[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 101

 
kon12 :

이해 ... 다시 그리는 다른 방법이 있다면?
코드를 보여주면 즉시 답변을 받을 수 있습니다.
 
Lisi4ka330 :


안녕하세요! ArrayMo(f-I는 밀도 곡선의 최대값을 반환함) 함수를 이해하도록 도와주세요.

 double ArrayMo ( double & x [] , int d = 4 ) {
   double e , s = 0 ;
   double m [][ 2 ] ;             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
   int      i , k = ArraySize ( x ) ;
   int      n ;                   // номер строки временного массива m
   int      r ;                   // количество строк во временном массиве m

   if ( k > 0 ) {
     for ( i = 0 ; i < k ; i ++ ) {
       e = NormalizeDouble ( x [ i ] , d ) ;
       n = ArraySearchDouble ( m , e ) ;
       if ( n < 0 ) {
         r = ArrayRange ( m , 0 ) ;
         ArrayResize ( m , r + 1 ) ;
         m [ r ][ 0 ] ++;
         m [ r ][ 1 ] = e ;
       } else m [ n ][ 0 ] ++;
     }
     ArraySort ( m , WHOLE_ARRAY , 0 , MODE_DESCEND ) ;
     s = m [ 0 ][ 1 ] ;
   } else Print ( " ArrayMo(): Массив пуст! " ) ;

   return ( s ) ;
}

다음과 같은 질문이 생겼습니다.

1. 임시 배열을 만드는 목적은 무엇입니까?

 m [][ 2 ]

2. 임시 배열의 값을 가져오는 것이 명확하지 않으므로 이 배열을 검색하는 방법이 명확하지 않습니다.

 n = ArraySearchDouble ( m , e )

3. 그런 다음 일반적으로 진실은 나에게 깊이 숨겨져 있습니다.))))) 값이 없음을 확인한 후 "어떤 값이 명확하지 않은지" 배열의 크기를 결정하기 시작합니다.

나는 이 이야기의 한 줄기 빛에 대해 매우 감사할 것입니다))))


기능이 아직 제대로 작성되지 않은 것 같습니다. 가장 큰 이유는 발표 이후

 double m [][ 2 ] ;

꼭 필요한

 ArrayResize (m, 0 );

그렇지 않으면 ( 인용 )

int 배열 크기 조정 ( 무효 배열[], int new_size)
배열의 첫 번째 차원에서 새 크기를 설정합니다. 성공하면 이 함수는 크기 조정 후 배열에 포함된 모든 요소의 수를 반환하고, 그렇지 않으면 -1을 반환하고 배열 크기가 조정되지 않습니다.
!!!참고: 크기가 조정된 함수에서 로컬로 선언된 배열은 함수가 종료된 후에도 변경되지 않은 상태로 유지됩니다. 함수가 다시 호출되면 이러한 배열은 선언된 것과 다른 크기를 갖게 됩니다.!!!

따라서 수많은 호출로 함수는 "과거로 떨어집니다")

알고리즘의 작동에 관하여. 배열 m[][2] 자체는 다양한 값에 대한 변수 x[i]의 적중 횟수의 직접 경험적 분포를 나타냅니다. 저것들. 배열의 각 요소는 특정 값(첫 번째 필드)의 적중 횟수와 이 값 자체의 두 가지 숫자로 구성됩니다. 루프에서 각 x[i]에 대해 m 배열에서 동일한 값을 검색하고, 발견되면 수량 필드를 추가하고, 그렇지 않으면 ArrayResize() 및 우리의 x[i]를 사용하여 새 요소를 생성합니다. 거기에 쓰여 있습니다.

또한 배열이 채워진 후 최대 히트 수, 즉 정의에 따라 분포 모드 x가 있는 요소를 찾으면 됩니다.

라인으로 완성됩니다

     ArraySort ( m , WHOLE_ARRAY , 0 , MODE_DESCEND ) ;
     s = m [ 0 ][ 1 ] ;

그것은 나에게 보이지만 (다차원 배열에 대해 확실하지 않음) 단순히

    s=m[ ArrayMaximum (m)][ 1 ];

일반적으로 나는 (코드 작성자를 존중하여) 모든 단점이 수정되더라도 이 알고리즘은 극도로 비효율적이며 종종 잘못된 결과를 줄 수 있다고 말할 수 있습니다. 그 이유는 우리가 이중 유형으로 작업하고 있기 때문입니다. 즉, x[i] 값이 매우 가깝지만 여전히 구별 가능한 값에 빠질 확률이 상당히 큽니다. 이것은 샘플 크기가 도메인 x[i]가 허용되는 총 간격 수보다 훨씬 더 큰 경우(수백 배 이상) 눈에 띄지 않을 수 있습니다. 그러나 이 제약 조건이 충족되지 않는 수많은 경우에는 잘못된 계산이 많이 있을 것입니다.

모드를 계산하는 더 정확한 방법은 다음과 같습니다. 경험적 분포 함수가 만들어지고(빈도 분포와 혼동되지 않도록), 그 후 조각별 선형에서 평활로 보간되며, 마지막으로 도함수의 최대점은 다음과 같습니다. 찾았다. 이러한 알고리즘은 위에 나열된 단점이 없으며 작은 샘플 크기에서도 매우 효율적으로 작동합니다. 최소한 MQL에서 비슷한 수의 간격으로 50-100개 요소의 샘플에서 모드를 찾는 문제만 해결해야 했고 모든 것이 정상이었습니다. 한 가지 단점이 있습니다. 보간에서는 일반적으로 계산 속도가 급격히 떨어집니다. 물론 질적으로 매끄럽게 처리하려는 경우는 예외입니다.

 
안녕하세요, 포럼 회원 여러분, 고문을 작성하기 위해 연락할 수 있습니다. 지표가 없는 Expert Advisor는 우리 방향으로 움직이지 않을 때 2배를 기반으로 합니다.
 
Glazunov :
안녕하세요, 포럼 회원 여러분. 고문을 쓰기 위해 연락할 수 있습니다. 지표가 없는 Expert Advisor는 우리 방향으로 움직이지 않을 때 2배를 기반으로 합니다.
여기: https://www.mql5.com/ru/job
 
ilunga :
여기: https://www.mql5.com/ru/job

고맙습니다. 어쩌면 더 많은 옵션이 있습니다.
 
Glazunov :

고맙습니다. 어쩌면 더 많은 옵션이 있습니다.
사이트의 검색에 "martingale"을 입력하십시오-당신은 놀랄 것입니다
 
YOUNGA :
사이트의 검색에 "martingale"을 입력하십시오. 놀랄 것입니다.

이미 보았다! 하지만 내가 원하는 것은
 
Glazunov :
안녕하세요, 포럼 회원 여러분. 고문을 쓰기 위해 연락할 수 있습니다. 지표가 없는 Expert Advisor는 우리 방향으로 움직이지 않을 때 2배를 기반으로 합니다.


여기 봐

https://www.mql5.com/ru/forum/136747

 

안녕하세요. MQL4에서 막 시작했습니다.

OrderModify 기능에 대해 알려주세요. 교과서와 예에서 이 기능은 트롤링을 위해 고려됩니다. 손실 변경을 중지합니다. 오픈 오더에 대해서만 이익실현 을 변경해야 합니다 . 오픈 시 손절매가 설정되지 않았으며 수정하는 동안에도 0으로 유지되어야 합니다.

주문 계산 및 선택은 어떻게 해야 합니까?

최종 목표는 다음과 같아야 합니다.

if (OrderType()==OP_BUY && OrderOpenPrice()-Bid>kof*Point) // 매수가 있지만 kof에 의해 하락
{
OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+tpnew*Point,0,CLR_NONE);// TP를 이전에 설정한 것보다 낮게 이동

판매도 비슷합니다.

답장을 보내주셔서 감사합니다.

 

다시 안녕! :)

생각대로 문제가 있었습니다. 다음은 코드입니다. 요점은 테스터의 주문이 TP에 의해 마감되고, Trailing Stop 동안 주문이 수정될 때 TP가 제거된다는 것입니다.

 double my_ord[ 31 ][ 2 ];                                           //ордера советника
                                                                 //[][0] Ticket
                                                                 //[][1] Вид операции 
//---------------------------------------------------------------------------------

void FindMyOrders()                                             //ищем свои ордера(от советника)
   {
     for ( int a = 0 ;a< 32 ;a++)                                     //во избежание ошибок заполняем все нулями
      {
       my_ord[a][ 0 ]= 0 ;
       my_ord[a][ 1 ]= 0 ;
      }
     int pos = 0 ;
     for ( int i= 0 ; i< 32 ; i++)
      {
       if (Mas_Ord_New[i][ 8 ]== 1 )                                 //есть ли комментарий
         {
           int num = Mas_Ord_New[i][ 4 ];
           OrderSelect (SELECT_BY_TICKET, num);
           string str = OrderComment ();
           if (str == "AO Day Profiter Trade" )                   //наш ли это комментарий
            {
             my_ord[pos][ 0 ] = num;
             my_ord[pos][ 1 ] = Mas_Ord_New[i][ 6 ];                 //если наш, записываем Ticket и вид операции
             pos++;
            }
           else { }
         }
       else { }
      }
   }
//---------------------------------------------------------------
void TrailStop( int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
     int minDist = MarketInfo (symb, MODE_STOPLEVEL);
     if (TStop<minDist)
      {
       TStop = minDist;
      }
     else { }
     if (TStop> 0 )
      {
       OrderSelect (ticket, SELECT_BY_TICKET);
       if ( OrderType ()==OP_BUY)
         {
           if (Bid - OrderOpenPrice ()> Point *TStop)
            {
             if ( OrderStopLoss ()<Bid- Point *TStop)
               {
                 OrderModify ( OrderTicket (), OrderOpenPrice (), 
                Bid- Point *TStop, 0 , 0 , Blue );
                 return ;
               }
             else { }
            }
             else { }
         }
       else if ( OrderType ()==OP_SELL)
         {
           if ( OrderOpenPrice () - Ask> Point *TStop)
            {
             if ( OrderStopLoss ()>Ask + TStop* Point )
               {
                 OrderModify ( OrderTicket (), OrderOpenPrice (), 
                Ask+ Point *TStop, 0 , 0 , Blue );                           //ordertakeprofit!!
                 return ;
               }
             else { }
            }
           else { }
         }
       else { }
      }
     else { }
    }
//-----------------------------------а это кусочек Start(), отвечающий за трейлинг стоп
   for ( int i = 0 ; i< 32 ; i++)                                   //трейлинг стоп для наших ордеров
      {
       if (my_ord[i][ 0 ]> 0 )
         {
          TrailStop(my_ord[i][ 0 ], TralingStop);
         }
       else { break ;}
      }
이는 테스터 로그에 잘못된 TP 및 SL에 대한 오류가 없는 동안 후행 중지가 실행되지 않음을 의미합니다. 뭐가 잘못 되었 니?