[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 312

 
silhouette:

Ne faites pas attention aux freins, c'est la première fois que j'utilise des tableaux multidimensionnels :)

Il est plus facile de s'orienter si vous considérez un tableau multidimensionnel comme quelque chose d'autre. En effet, si vous trouvez un modèle pour le tableau qui en capture l'essence - le modèle est plus facile à garder sous les yeux.

Un tableau unidimensionnel est constitué d'objets sur une ligne (un rayon de coordonnées partant de zéro). Un exemple d'un tel tableau serait une file d'attente dans un magasin. Le premier de la file d'attente est la personne qui se trouve juste derrière la personne qui achète maintenant. La personne qui achète ne peut pas être appelée le premier de la file d'attente - il achète - il est zéro. Il se trouve dans la cellule zéro du tableau unidimensionnel.

Un tableau à deux dimensions est constitué d'objets dans un plan (plan de coordonnées). Un exemple serait un auditorium. Telle ou telle rangée, tel ou tel endroit. Ajoutez la ligne zéro et le siège zéro à ce modèle, et vous avez un modèle exact d'un tableau à deux dimensions.

Un tableau tridimensionnel est un objet dans l'espace (espace de coordonnées) - les coordonnées de l'objet sont données par trois valeurs. C'est un cube, avec des faces. Un modèle pourrait être un immeuble résidentiel avec une entrée numéro zéro, un étage numéro zéro et un appartement numéro zéro (parmi tous les autres). A condition que dans chaque entrée, la numérotation des appartements commence à zéro.

Un tableau à quatre dimensions est similaire à un tableau à une dimension. Il s'agit d'un rayon de coordonnées, dont tous les points sont des tableaux tridimensionnels. Le modèle est une rue. Le tableau de coordonnées sera spécifié par les valeurs suivantes : numéro de maison, numéro d'entrée, numéro d'étage, numéro d'appartement.

Et ainsi de suite dans l'enndimensionnalité - des rues aux quartiers, des quartiers aux villes, des quartiers aux villes, des villes aux pays, des pays aux planètes...

 
GarKain:
Quelqu'un peut-il expliquer comment ouvrir un ordre à n'importe quel moment d'une barre et ouvrir l'ordre suivant seulement à la barre suivante ?

Nous devrions parcourir en boucle la liste des commandes. Si l'heure d'ouverture du prochain ordre est supérieure ou égale à l'heure d'ouverture de la barre actuelle (Time[0]), nous devons activer le drapeau interdisant l'ouverture des ordres sur la paire de devises actuelle. Au chandelier suivant, la boucle détectera qu'un tel ordre n'existe pas et ne placera pas d'interdiction, c'est-à-dire qu'elle effacera le drapeau interdisant l'ouverture d'ordres.
 
drknn:

Nous parcourons en boucle la liste des commandes. Si l'heure d'ouverture de l'ordre suivant est supérieure ou égale à l'heure d'ouverture de la barre actuelle (Time[0]), alors nous activons le drapeau interdisant l'ouverture d'ordres sur cette paire de devises.
Merci beaucoup.
 
drknn, merci beaucoup pour cette clarification. Je vais le garder ;)
 
GarKain:
Merci beaucoup.


Si le code ne fonctionne que sur une paire de devises, alors mettez une ligne pour couper les ordres des autres paires.

if(OrderSymbol()!=Symbol()){continue;}
 
drknn:


Si le code ne fonctionne que sur une paire de devises, il faut ajouter une ligne pour écarter les ordres des autres paires.

question. si le code fonctionne sur plusieurs paires de devises et simultanément sur plusieurs horizons temporels, pouvez-vous mettre des nombres magiques différents sur eux et effectuer un tamisage ?
 

Tu peux.

if(OrderMagicNumber()!=MAGIC) { continue;}
 
drknn:

Vous pouvez.



bool Times=true ;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1 ; g>=0 ; g--){
datetime t ;
OrderSelect(g,SELECT_BY_POS) ;
if (OrderMagicNumber()!=MagicNumber){continue;}
si (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime() ;

si (t>=Time[0]) Times=false;}}


Est-ce correct ?

 
GarKain:

bool Times=true ;
si (OrdersTotal()>0){
for(int g=OrdersTotal()-1 ; g>=0 ; g--){
date t ;
OrderSelect(g,SELECT_BY_POS) ;
if (OrderMagicNumber()!=MagicNumber){continue;}
si (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime() ;

si (t>=Time[0]) Times=false;}}


Est-ce correct ?


Non. Il n'est pas nécessaire de déclarer une variable à l'intérieur de la boucle à chaque itération de celle-ci.

bool Torg=true;
for(int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);}
    else {
     if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) { continue;} 
     if(OrderOpenTime()>=Time[0]){
       Torg=false;
     }
   }  
 }


// теперь используем результат работы цикла
// Если есть сигнал и торг разрешён, то открываем ордер
 
GarKain:

bool Times=true ;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1 ; g>=0 ; g--){
datetime t ;
OrderSelect(g,SELECT_BY_POS) ;
if (OrderMagicNumber()!=MagicNumber){continue;}
si (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime() ;

si (t>=Time[0]) Times=false;}}


Est-ce correct ?

pas remarqué l'erreur.

bool Times=true ;
datetime t=Time[1] ;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1 ; g>=0 ; g--){
OrderSelect(g,SELECT_BY_POS) ;
if (OrderMagicNumber()!=MagicNumber){continue;}
si (t<OrderOpenTime()) t=OrderOpenTime() ;

si (t>=Time[0]) Times=false;}}


Est-ce correct ?