전문가를 위한 질문 - 페이지 2

 

여기에서 코드를 찾았습니다.

내 Expert Advisor에 어떻게 삽입합니까????????????

 //+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos ( string sym = "" , int tf = 0 , int op =- 1 , int mn =- 1 ) {
  datetime oot ;
  int      i , k = OrdersTotal () ;
 
  if ( sym == "" ) sym = Symbol () ;
  for ( i = 0 ; i < k ; i ++ ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
      if ( OrderSymbol () == sym ) {
        if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
          if ( op < 0 || OrderType () == op ) {
            if ( mn < 0 || OrderMagicNumber () == mn ) {
              if ( oot < OrderOpenTime ()) oot = OrderOpenTime () ;
            }
          }
        }
      }
    }
  }
  return ( iBarShift ( sym , tf , oot , True )) ;
}
 
Kostay :

지금 고문에게 이상한 일이 일어나고 있습니다. 약속된 포지션 청산은 작동하지 않습니다. 동일한 유형의 여러 위치를 열고 동시에 작동할 수 있습니다. 그리고 결과: 수정된 버전이지만 모든 것이 동일한 문제에 병합됩니다!!??

수정했습니다. 시도해 보세요.

 extern double Lots = 0.1 ;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start () {
   double P_up0 , P_down0 , P_up1 , P_down1 ;
   double st_m1 , st_s1 , st_m2 , st_s2 , Pivot , ma_s1 ;
   int i , cnt , ticket , total ;
   bool flag = true ;

   if ( Bars < 100 ) {
       Print ( " bars less than 100 " ) ;
       return ( 0 ) ; 
   }
// Проверяем стоит ли открываться
   
   cnt = OrdersHistoryTotal () - 1 ;
   for ( i = cnt ; i >= 0 ; i -- ) {
       if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_HISTORY )) continue ;
       if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag = false ;
         break ;
       }
   }
   cnt = OrdersTotal () - 1 ;
   for ( i = cnt ; i >= 0 ; i -- ) {
       if ( ! OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) continue ;
       if ( OrderOpenTime () >= Time [ 0 ]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag = false ;
         break ;
       }
   }
   
//-----------------------------------------------
   P_up0 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 0 , 0 ) ;
   P_down0 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 1 , 0 ) ;
   P_up1 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 0 , 1 ) ;
   P_down1 = iCustom ( 0 , 0 , " Ценовой канал " , 11 , 1 , 1 ) ;
   st_m1 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 ) ;
   st_s1 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 1 ) ;
   st_m2 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_MAIN , 2 ) ;
   st_s2 = iStochastic ( 0 , 0 , 10 , 3 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 2 ) ;
   Pivot = iCustom ( 0 , 0 , " Pivot " , 0 , 1 ) ;
   ma_s1 = iMA ( 0 , 0 , 4 , 0 , MODE_SMA , PRICE_CLOSE , 1 ) ;
//задали все данные 

// Проверка свободной маржи
   if ( AccountFreeMargin () < ( 1000 * Lots )) {
       Print ( " We have no money. Free Margin = " , AccountFreeMargin ()) ;
       return ( 0 ) ; 
   }
   total = OrdersTotal () ;
// Условие открытие позиции BUY
   if ( st_m2 > st_s2 && st_m1 > st_s1 && st_m2 < 25 && Pivot < ma_s1 ) {
       if (( total > 0 ) || ( ! flag )) return ( 0 ) ;
       ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , 0 , 0 , "" , 0 , 0 , Green ) ;
       if ( ticket > 0 ) {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
             Alert ( " Покупка: " , OrderOpenPrice ()) ; 
       }    else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
       return ( 0 ) ; 
   }
      
// Условие открытие позиции SELL
   if ( st_m2 < st_s2 && st_m1 < st_s1 && st_m2 > 75 && Pivot > ma_s1 ) {
       if (( total > 0 ) || ( ! flag )) return ( 0 ) ;
       ticket = OrderSend ( Symbol () , OP_SELL , Lots , Bid , 3 , 0 , 0 , "" , 0 , 0 , Red ) ;
       if ( ticket > 0 ) {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ))
             Alert ( " Покупка: " , OrderOpenPrice ()) ; 
       }    else Alert ( " ошибка:по цене " , OrderOpenPrice ()) ; 
       return ( 0 ) ; 
   }
  
   for ( i = cnt ; i >= 0 ; i -- ) {
       OrderSelect ( cnt , SELECT_BY_POS , MODE_TRADES ) ;
       if ( OrderType () <= OP_SELL && OrderSymbol () == Symbol ()) {
         if ( OrderType () == OP_BUY ) { // длинная позиция открыта
// условие закрытие длинной позиции
             if ( P_down1 > P_down0 ) {
               OrderClose ( OrderTicket () , OrderLots () , Bid , 3 , Violet ) ; 
               return ( 0 ) ; 
             }
         }    else {
// условие закрытия короткой позиции
               if ( P_up1 < P_up0 ) {
                   OrderClose ( OrderTicket () , OrderLots () , Ask , 3 , Violet ) ; 
                   return ( 0 ) ; 
               }
             }
       }
   }
   return ( 0 ) ;
}
 

안녕하세요.

신경망 을 프로그래밍할 때 다음과 같은 문제가 발생했습니다.

배열이 있습니다:

double X[3];
   X[0]=1;
   X[1]=2;
   X[2]=3;
   X[3]=4;

Comment(X[3]);

4 대신 테스트할 때 0이 나오는데 2차원 배열에서도 마찬가지입니다. 어떻게 해야 합니까?

그리고 이 기회에 나는 두 번째 질문을 할 것입니다. 내가 이해하는 한 mql4에서는 변수에 난수를 할당하기 위한 특정 범위를 설정하는 것이 불가능합니까?

델파이에서는 다음과 같이 보입니다.

무작위화하다;

i:=랜덤(10); // 0에서 10까지 같은 범위

 
Chris_Brown >> :

..배열이 있습니다.

4 대신 테스트할 때 0이 나오는데 2차원 배열에서도 마찬가지입니다. 어떻게 해야 합니까?

배열을 사용하면 모든 것이 간단합니다. 차원 [3]을 정의하고 네 번째 누락된 셀을 호출합니다.

쓰기 doubleX[4]; 모든 것이 작동합니다.

 
granit77 >> :

배열을 사용하면 모든 것이 간단합니다. 차원 [3]을 정의하고 네 번째 누락된 셀을 호출합니다.

쓰기 doubleX[4]; 모든 것이 작동합니다.

감사합니다. 시도해 보겠습니다. 하지만 무작위는 어떻습니까?

 

그리고 4 x 9 행렬인 2차원 배열이 있고 각 요소 에 0.1의 값이 할당 되면 다음과 같을까요?


int i , j ;

double W [ 4 ] [ 9 ] ;
   for ( i = 0 ; i < = 3 ; i + + )
   for ( j = 0 ; j < = 8 ; j + + )
       W [ i ] [ j ] = 0.1 ; 
 
Chris_Brown >> :

그리고 4 x 9 행렬인 2차원 배열이 있고 각 요소에 0.1의 값이 할당되면 다음과 같을까요?

작동해야 합니다. 너무 게으르지 않고 전체 행렬을 주석에 한 줄씩 표시하면 결과를 명확하게 볼 수 있습니다.

그건 그렇고, 당신은 주석 기능을 만들고 그것을 사용하여 배열의 내용을 확인할 수 있습니다.

그리고 임의의 집에 대해 - 패스. 그냥 지나가다가 오류를 봤습니다. :))

 
Chris_Brown писал(а) >>

감사합니다. 시도해 보겠습니다. 하지만 무작위는 어떻습니까?

double i=MathRand()/32767.0*10; 
도움말에 있습니다.
 
Chris_Brown писал(а) >>

그리고 4 x 9 행렬인 2차원 배열이 있고 각 요소에 0.1의 값이 할당되면 다음과 같을까요?

사용할 수 있습니다

int 배열초기화 ( 이중 및 배열[], 이중 값)
숫자 배열의 모든 요소를 동일한 값으로 설정합니다. 초기화된 요소의 수를 반환합니다.

 
Chris_Brown писал(а) >>

그리고 4 x 9 행렬인 2차원 배열이 있고 각 요소에 0.1의 값이 할당되면 다음과 같을까요?

 int i , j ;

double W [ 4 ] [ 9 ] ;
   for ( i = 0 ; i < = 3 ; i + + )
   for ( j = 0 ; j < = 8 ; j + + )
       W [ i ] [ j ] = 0.1 ; 

작동하지만 다음과 같이 작성하는 것이 좋습니다.

 int i , j ;

double W [ 4 ] [ 9 ] ;

   for ( i = 0 ; i < 4 ; i + + )
       for ( j = 0 ; j < 9 ; j + + )
         W [ i ] [ j ] = 0.1 ;