Questions des débutants MQL4 MT4 MetaTrader 4 - page 121

 
Ihor Herasko:

Écrivez au moins un bloc et montrez-le. L'étape suivante consiste à vous donner un indice ici.

Sur les tableaux : ici j'ai déclaré 4 tableaux au niveau global :

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

Je les ai ensuite remis à zéro dans la fonction d'ouverture de position:

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

Comment puis-je les remplir maintenant ? Dans l'exemple avec lequel j'essaie de le faire, une variable supplémentaire est appliquée, mais je ne comprends pas comment l'utiliser :

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

Bien que la raison de tous ces tableaux ne soit pas très claire, alors que je peux obtenir les valeurs du ticket, du type de position, du prix d'ouverture et de l'heure d'ouverture avec la fonction correspondante.

 
novichok2018:

Sur les tableaux : ici j'ai déclaré 4 tableaux au niveau global :

Je les ai ensuite remis à zéro dans la fonction d'ouverture de position:

Comment puis-je les remplir maintenant ? L'exemple que j'essaie d'utiliser applique une variable supplémentaire, mais je ne comprends pas comment l'utiliser :

Bien que la raison de tous ces tableaux ne soit pas très claire, alors que je peux obtenir les valeurs du ticket, du type de position, du prix d'ouverture et de l'heure d'ouverture avec la fonction correspondante.

Essayez d'écrire à partir de zéro, en sortant toutes les données intermédiaires en utilisant Alert(. Par exemple

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

Et si vous prenez l'exemple de quelqu'un, prenez-le complètement et étudiez-le. Qui sait ce que l'auteur de l'exemple utilise dans les tableaux ?

 
novichok2018:

Sur les tableaux : ici j'ai déclaré 4 tableaux au niveau global :

Utilisez un tableau de structures. Il sera beaucoup plus facile d'y accéder. Voici une variante avec un tableau statique. Il est plus facile à comprendre. Mais j'utilise moi-même des tableaux dynamiques. Mais le code sera un peu plus grand avec eux.

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

Puis je les ai remis à zéro dans la fonction d'ouverture de la position:

Non, vous ne l'avez pas fait. Parce que les tableaux dynamiques déclarés ont une taille nulle par défaut. Donc, dans ce cas, ces quatre lignes de code ne font rien.

Maintenant, comment les remplir ? L'exemple que j'essaie d'utiliser comporte une variable supplémentaire, mais je ne comprends pas comment l'utiliser :

Ensuite, une boucle d'ordres est organisée, dans laquelle chaque ordre "propre" est stocké dans un tableau :

g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
      continue;

   if (OrderMagicNumber != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
      continue;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
      continue;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();

   ++g_nOrdersCnt;
}

Cependant, je ne sais pas vraiment à quoi servent tous ces tableaux, alors que je peux obtenir les valeurs du ticket, du type de position, du prix d'ouverture et de l'heure d'ouverture en utilisant la fonction correspondante.

Il est beaucoup plus rapide et plus pratique de travailler avec des tableaux, car en général, tous les ordres présents sur le compte ne doivent pas être traités par cet EA particulier. Et nous économiserons ainsi beaucoup d'efforts et d'argent.

De plus, ce que j'ai mentionné ci-dessus est un cas général. L'universalisme n'est pas toujours nécessaire, bien sûr. En général, ces tableaux sont créés en fonction des exigences d'une stratégie. Par exemple, nous pouvons tout de suite diviser les commandes par type : Acheter, Vendre, BuyStop, SellStop, BuyLimit, SellLimit. Nous aurons donc besoin de quatre tableaux de ce type. Mais nous n'aurons plus besoin de passer en revue toute la liste des ordres ouverts lorsque nous prendrons des décisions commerciales. Il suffit de connaître le nombre de commandes d'un certain type et de se référer au tableau nécessaire.

Il y a un autre élément important à prendre en compte : la modification du tableau des ordres pendant le traitement d'un tick. Il se peut très bien qu'une liste d'ordres ait été reçue à l'entrée de OnTick, et une autre quelque part au milieu. Cela entraînera une erreur dans le fonctionnement du programme qui sera difficile à détecter. Et le tableau des ordres qui était déjà formé lors de l'entrée dans OnTick ne changera pas (sauf si, bien sûr, vous le modifiez vous-même pendant l'exécution du programme).

 
STARIJ:

string s=FileReadString(F1) ; // Lire la chaîne du fichier texte
StringSplit(s, "," , a) ; // Les éléments de chaîne séparés par des virgules dans un tableau
datetime T1=StrToTime(a[4]) ; // En outre, la transformation ...
int ord=StrToInteger(a[8]) ;
double Prix=StrToDouble(a[12]) ;

Merci, juste ce que je voulais.



Ensuite, il y a 5 produits fabriqués

Nous ajoutons une lecture d'alerte (n'importe laquelle)

par exemple, le niveau "200".

Quand l'alerte se déclenche, quelque chose ouvre la pose, quelque chose se supprime, quelque chose fait d'autres choses. Je veux mettre en place un mécanisme pour donner un signal de cette manière


P.S.

J'ai terminé ce que je voulais, je peux l'envoyer pour examen. Il se range parfaitement. Mais il est interdit de poster ici.

 
Ihor Herasko:

Par exemple, il est possible de diviser les commandes par type en une seule fois : Acheter, Vendre, BuyStop, SellStop, BuyLimit, SellLimit. Nous aurons donc besoin de quatre tableaux de ce type. Mais nous n'aurons plus besoin de passer en revue toute la liste des ordres ouverts lorsque nous prendrons des décisions commerciales. Il suffit de connaître le nombre de commandes d'un certain type et de se référer au tableau nécessaire.

C'est exactement ce dont j'ai besoin, ou plutôt seulement pour lesachats et les ventes. L'essentiel pour ma stratégie simple est de ne pas laisser les positions ouvertes interférer entre elles pour voir les conditions de clôture. Peut-être qu'on peut se passer des tableaux ? Je ne les comprends pas : comment les créer, comment les aborder - je suis dans le noir. Peut-être que ma situation sera plus claire pour vous sur la capture d'écran :

Il semble que tout dans le code soit simple et fonctionne clairement, mais c'est le seul cas d'incompréhension.

 
novichok2018:

C'est exactement ce dont j'ai besoin, ou plutôt seulement pour lesachats et les ventes. Pour ma stratégie simple, le plus important est que les positions ouvertes n'interfèrent pas avec les conditions de clôture des autres. On peut peut-être se passer des tableaux ? Je ne les comprends pas : comment les créer, comment les aborder - je suis dans le noir. Peut-être que ma situation sera plus claire pour vous sur la capture d'écran :

Il semble que tout dans le code soit simple et fonctionne clairement, mais c'est le seul cas d'incompréhension.

Bien sûr, dans les cas les plus simples (et de complexité moyenne), il est plus pratique de se passer de tableaux. Et lorsque vous en arrivez à utiliser des centaines de commandes, c'est beaucoup plus facile. Par exemple, selon OrderType() - l'un pour acheter 0, l'autre pour vendre 1. La stratégie de votre trader est bonne - vous pouvez gagner un jour ou perdre la moitié d'un jour. La seule chose dont nous avons besoin est de savoir comment attraper ces flèches. Et ils sont trop fréquents. Il est logique d'apprendre d'abord à donner des signaux : Acheter et vendre.
 
LRA:
Bien sûr, dans les cas les plus simples (et de complexité moyenne), l'absence de tableaux est plus pratique. Mais quand vous en arrivez à utiliser des centaines de commandes, alors...

Serait-ce la raison de ma situation que le journal écrit : 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5 : OrderClose error 138 et se répète solidement jusqu'à

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5 : Alerte : Total des ordres = 3 ? Sur la capture d'écran, vous pouvez voir que cette période capture deux conditions de clôture de la VENTE.

Et les signaux pour ouvrir une position sont déclenchés par une combinaison de plusieurs indicateurs et fermés par un indicateur. Et ils ne fonctionnent pas si souvent : il peut être silencieux pendant quelques jours pendant cinq minutes. Par exemple, depuis le 1er février de cette année, seuls 14 postes ont été déclenchés.


 
novichok2018:

Serait-ce la raison de ma situation que le journal écrit : 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5 : OrderClose error 138 et se répète solidement jusqu'à

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5 : Alerte : Total des ordres = 3 ? Dans la capture d'écran, vous pouvez voir que cette période capture deux conditions de clôture

Quelle est votre situation ? Voulez-vous dire que le terminal fait une entrée de journal qui cause l'erreur ? et que signifie 138 ? Savez-vous où chercher ? Ce que vous voyez dans la capture d'écran est la moitié de la bataille. Comment expliquer cela au conseiller expert ? Vous devez écrire une condition mathématique - au lieu de visualiser la capture d'écran, le conseiller expert fonctionne avec des chiffres.

 
LRA:

Vous voulez dire que le terminal fait une entrée dans le journal, ce qui provoque l'erreur ? ... Que signifie la 138 ? Savez-vous où chercher ?

Non, je dis que le testeur échoue à cet intervalle d'histoire, ce qui empêche les signaux de fonctionner correctement. Parce que les requêtes ne peuvent pas durer 24 heures.

 
novichok2018:

Non, ce que je veux dire, c'est qu'il y a un problème dans le testeur à ce moment de l'histoire, qui empêche les signaux de fonctionner correctement. Parce que les requêtes ne peuvent pas durer 24 heures.

Des requêtes dans le testeur ? C'est la première fois que j'en entends parler. Le testeur est idéal - il n'y a même pas de glissement.

...quelque chose fait bouger l'indicateur - tendance à la hausse. Je vais acheter... Je l'ai... Bien que ce ne soit pas suffisant, j'ai voulu faire monter TP - il fonctionnait déjà...

Configurez donc un EA qui, s'il fait cela, sortira et continuera sur le prochain tick. Et essayez-le sur la démo

Raison: