Uzmanlar için soru - sayfa 2

 

Burada bir kod buldum.

Bunu Uzman Danışmanıma nasıl ekleyebilirim????????????

 //+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -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 :

Şu anda danışmanla garip bir şey oluyor. pozisyonların taahhütlü kapanışı çalışmıyor. Aynı türden birkaç pozisyon açık olabilir ve aynı anda çalışabilir. Ve sonuç: değiştirilmiş bir versiyonda olsa da her şey aynı problem üzerinde birleşiyor!!??

Düzeltildi, deneyin.

 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 ) ;
}
 

Merhaba.

Bir sinir ağını programlarken aşağıdaki sorunla karşılaştım.

Bir dizi var:

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

Comment(X[3]);

4 yerine test ederken, iki boyutlu bir dizide aynı şey olan 0 alıyorum, ne yapmalıyım?

Ve bu fırsatı değerlendirerek ikinci soruyu soracağım: anladığım kadarıyla, mql4'te bir değişkene rastgele sayılar atamak için belirli bir aralık belirlemek imkansız mı?

Delphi'de böyle görünüyor

rastgele;

i:=Rastgele(10); // 0 ile 10 arasında aynı aralık

 
Chris_Brown >> :

..Bir dizi var:

4 yerine test ederken, iki boyutlu bir dizide aynı şey olan 0 alıyorum, ne yapmalıyım?

Bir dizi ile her şey basittir, [3] boyutunu tanımladınız ve dördüncü, eksik hücreyi çağırdınız.

doubleX[4] yazın; ve her şey işe yarayacak.

 
granit77 >> :

Bir dizi ile her şey basittir, [3] boyutunu tanımladınız ve dördüncü, eksik hücreyi çağırdınız.

doubleX[4] yazın; ve her şey işe yarayacak.

Teşekkürler, deneyeceğim, peki ya rastgele?

 

Ve eğer iki boyutlu bir dizi, 4'e 9'luk bir matris varsa ve her elemana 0,1 değeri atanırsa , bunun gibi bir şey mi olacak?


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 >> :

Ve eğer iki boyutlu bir dizi, 4'e 9'luk bir matris varsa ve her elemana 0,1 değeri atanırsa, bunun gibi bir şey mi olacak?

Çalışmalı. Çok tembel değilseniz ve yorumlarda tüm matrisi satır satır görüntülerseniz, sonucu net bir şekilde göreceksiniz.

Bu arada, bir yorumu bir fonksiyon haline getirebilir ve dizinin içeriğini kontrol etmek için kullanabilirsiniz.

Ve rastgele ev hakkında - geçiş. Sadece geçiyordum ve hatayı gördüm. :))

 
Chris_Brown писал(а) >>

Teşekkürler, deneyeceğim, peki ya rastgele?

double i=MathRand()/32767.0*10; 
yardımın içindedir.
 
Chris_Brown писал(а) >>

Ve eğer iki boyutlu bir dizi, 4'e 9'luk bir matris varsa ve her elemana 0,1 değeri atanırsa, bunun gibi bir şey mi olacak?

Kullanılabilir

int ArrayInitialize ( double &dizi[], double value)
Sayısal bir dizinin tüm öğelerini aynı değere ayarlar. Başlatılan öğelerin sayısını döndürür.

 
Chris_Brown писал(а) >>

Ve eğer iki boyutlu bir dizi, 4'e 9'luk bir matris varsa ve her elemana 0,1 değeri atanırsa, bunun gibi bir şey mi olacak?

 int i , j ;

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

İşe yarayacak, ancak şöyle yazmak daha iyi:

 int i , j ;

double W [ 4 ] [ 9 ] ;

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