Question pour les connaisseurs - page 2

 

J'ai trouvé une variante du code ici.

comment l'insérer dans mon EA ????????????

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

Une chose étrange se passe avec le Conseiller Expert maintenant. Il ne fonctionne pas avec les fermetures de positions. Il peut y avoir plusieurs positions du même type ouvertes et actives en même temps. Et le résultat : tout se perd sur le même problème, mais dans une version modifiée !

C'est réparé, essayez-le.

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

Bonjour.

Lors de la programmation d'un réseau neuronal, j'ai rencontré le problème suivant.

J'ai un tableau :

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

Comment(X[3]);

Lorsque je le teste, j'obtiens 0 au lieu de 4. La même chose se produit dans un tableau à deux dimensions, que dois-je faire ?

Et j'en profite pour poser une deuxième question : si je comprends bien, mql4 ne peut pas définir une plage spécifique pour affecter une variable à des nombres aléatoires ?

Dans Delphi, cela ressemble à ceci

Randomiser ;

i:=Random(10) ; // la même plage de 0 à 10

 
Chris_Brown >> :

...j'ai un tableau :

Lors du test, j'obtiens 0 au lieu de 4. La même chose se produit dans un tableau à deux dimensions, que dois-je faire ?

Le tableau est simple, vous avez défini la dimension [3], et vous appelez la quatrième cellule manquante.

Écrivez double X[4] ; et tout fonctionnera.

 
granit77 >> :

Avec un tableau, c'est simple, vous définissez la dimension [3], mais vous appelez la quatrième cellule manquante.

Écrivez double X[4] ; et tout fonctionnera.

Merci, je vais essayer, mais qu'en est-il du hasard ?

 

Et s'il s'agit d'un tableau à deux dimensions, une matrice de 4 par 9 et que chaque élément se voit attribuer une valeur de 0,1, est-ce que cela serait correct ?


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

Et si vous avez un tableau à deux dimensions, une matrice de 4 par 9, et que vous attribuez la valeur 0.1 à chaque élément, ce sera comme ceci ?

Cela devrait fonctionner. Si vous ne vous sentez pas paresseux et que vous affichez toute la matrice ligne par ligne dans le commentaire, vous verrez le résultat.

À propos, vous pouvez faire de ce commentaire une fonction et l'utiliser pour vérifier le contenu du tableau.

Et pour le côté aléatoire, je passe mon tour. Je passais juste par là et j'ai vu l'erreur. :))

 
Chris_Brown писал(а) >>

Merci, je vais essayer, mais qu'en est-il du hasard ?

double i=MathRand()/32767.0*10; 
l'aide est là-dedans.
 
Chris_Brown писал(а) >>

Et s'il s'agit d'un tableau à deux dimensions, d'une matrice de 4 par 9 et que chaque élément se voit attribuer une valeur de 0,1, cela donnerait-il quelque chose comme ceci ?

Peut être utilisé

int ArrayInitialize( double &array[], double valeur)
Définit tous les éléments d'un tableau numérique à la même valeur. Renvoie le nombre d'éléments initialisés.

 
Chris_Brown писал(а) >>

Et si vous avez un tableau à deux dimensions, une matrice de 4 par 9, et que vous attribuez une valeur de 0,1 à chaque élément, cela fonctionnera-t-il comme ceci ?

int i, j;

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

Cela fonctionnerait, mais il faudrait l'écrire comme ceci :

int i, j;

double W[4][9];

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