[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 718

 
Roger:
Vous lisez le fichier ligne par ligne et vous attribuez des valeurs à vos variables à chaque fois. Lorsque le fichier se termine, les variables auront les dernières valeurs.

Comment mettre cela en œuvre ?

Je ne sais pas quoi utiliser

 
zheleznii:

Comment mettre cela en œuvre ?

Je ne sais pas quoi utiliser


Beaucoup de choses ont déjà été écrites et réécrites à ce sujet, essayez https://www.mql5.com/ru/forum/118349.
 

Encore une fois, bonne nuit ! J'ai récemment commencé à écrire un EA multidevises qui ouvre des ordres sur une paire de devises et qui ouvre des ordres sur une autre paire.

J'ai arraché le stop suiveur le plus proche de l'EA et j'ai commencé à jouer avec, mais cela n'a pas fonctionné. Voici le code :

// ну так сообственно вызываю функцию - TrailingStop();
//вот что в функции
 void TrailingStop()
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()!=Symbol()) continue; 
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(Bid/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(Ask/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

Voici ce que je n'arrive pas à comprendre. Comme le conseiller expert est un conseiller expert multidevises, il ouvre les ordres pour les devises de manière imprévisible et les ouvre parfois au même moment pour plusieurs devises.

Dans le code qui suit, je calcule les ordres ouverts pour(int i=0 ; i<OrdersTotal() ; i++) et ensuite je sélectionne les ordres OrderSelect etc. Je comprends que chaque ordre ouvert pour une certaine paire de devises nécessite des données bid, ask, etc. Mais ici je veux savoir quelles données charger et comment sélectionner un ordre pour les changements. Je n'ai qu'une seule variante à l'esprit, la pire étant d'écrire un stop suiveur pour chaque devise) Veuillez me conseiller sur ce qui peut être fait.

 
Infinity:

Encore une fois, bonne nuit ! J'ai récemment commencé à écrire un EA multidevises qui ouvre des ordres sur une paire de devises et qui ouvre des ordres sur une autre paire.

J'ai arraché le stop suiveur le plus proche de l'EA et j'ai commencé à jouer avec, mais cela n'a pas fonctionné. Voici le code :

Voici ce que je n'arrive pas à comprendre. Comme le conseiller expert est un conseiller expert multidevises, il ouvre les ordres pour les devises de manière imprévisible et les ouvre parfois au même moment pour plusieurs devises.

Dans le code de suivi, je calcule les ordres ouverts pour(int i=0 ; i<OrdersTotal() ; i++) et ensuite la sélection des ordres OrderSelect etc. Je comprends que chaque ordre ouvert pour une certaine paire de devises nécessite des données bid, ask, etc. Mais ici, je veux savoir quelles données doivent être téléchargées et comment sélectionner un ordre pour les changements ? Je n'ai qu'une seule variante à l'esprit, la pire étant d'écrire un stop suiveur pour chaque devise) Veuillez me conseiller sur ce qui peut être fait.

Essayez de passer un symbole d'outil dans le code de chalutage. Ensuite, pour chaque paire, vous appellerez le chalut.
void TrailingStop(string sy)

if (sy == "" || sy == "0") sy = Symbol();
Et en fonction de la valeur de sy, attribuer d'autres valeurs à des données de symbole spécifiques... La même demande avec Bid, par exemple...
 

Infinity:

Je ne comprends pas bien la technologie, comment cela va fonctionner.


 
Roger:

Beaucoup de choses ont déjà été écrites et réécrites à ce sujet - essayez https://www.mql5.com/ru/forum/118349.

int a1 ;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';') ;
FileWrite(handle,a1) ;

FileClose(handle) ;

Dans le fichier a1=5 ;

Je ne comprends pas les principes de base.

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';') ;
ici nous assignons la valeur 5 à a1

FileClose(handle) ;

très nécessaire

 
Infinity:
Attribuez des valeurs aux variables du code de chalutage en fonction des données de la paire passée à la fonction. Vous devez finaliser le code de chalutage... Par exemple, la variable Bid ne doit pas seulement être déclarée,

mais déclaré avec une valeur qui lui est attribuée :

int ask = MarketInfo(sy, MODE_ASK), bid=MarketInfo(sy, MODE_BID), open, stop, level;

En conséquence,

bid=MathRound(Bid/Point);

devrait déjà être écrit autrement, par exemple :

bid=MathRound(MarketInfo(sy, MODE_BID)/Point);

Ou bien créez une autre variable, par exemple PriceBid et écrivez

PriceBid=MathRound(Bid/Point);

et ensuite utiliser PriceBid au lieu de Bid dans le code...

Examinez l'ensemble de votre code et utilisez des variables pour un symbole particulier lorsque cela est nécessaire.
Et ce symbole, vous le passerez à la fonction chalut lors de son appel :

 TrailingStop( EURUSD);     // Тралим ЕвроБаксы
 TrailingStop("");         // Тралим символ графика

ou

TrailingStop(NULL);         // Тралим символ графика

C'est plus clair ?

 
artmedia70:
Attribuez des valeurs aux variables du code de chalutage en fonction des données de la paire passée à la fonction. Vous devez finaliser le code de chalutage... Par exemple, la variable Bid ne doit pas seulement être déclarée,

mais déclaré avec une valeur qui lui est attribuée :

Par conséquent,

devrait déjà être écrit autrement, par exemple :

Ou bien créez une autre variable, par exemple PriceBid et écrivez

et ensuite utiliser PriceBid au lieu de Bid dans le code...

Examinez l'ensemble de votre code et utilisez la récupération des valeurs de variables pour un symbole particulier.
Et ce symbole, vous le passerez à la fonction chalut lors de son appel :

ou

C'est plus clair ?





La seule chose que je ne comprends pas est quelle paire de devises doit m'être envoyée à quel moment. Je ne sais pas où obtenir l'information que, par exemple, 4 ordres sont ouverts sur telle paire et que ces paires doivent m'être envoyées.

Je ne sais pas si je le fais bien ou pas... de toute façon ....

в блоке start  определяю открытые ордера и определяю по каким парам они открыты
 for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()=="EURUSD") {sy="EURUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
      if (OrderSymbol()=="GBPUSD") {sy="GBPUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
       
      } 
  TrailingStop(sy);

а в функции делаю следующее

void TrailingStop(string sy)
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level,point; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()==sy)  
      bid=MarketInfo(sy,MODE_BID);
      ask=MarketInfo(sy,MODE_ASK);
      point=MarketInfo(sy,MODE_POINT);
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(bid/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(ask/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

Mais pour une raison quelconque, j'ai obtenu une erreur EURUSD : zero divide - cette erreur signifie probablement quelque part dans la variable 0, probablement pendant une opération de type split. Est-ce que j'essaie de l'appliquer correctement ?

 
zheleznii:

int a1 ;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';') ;
FileWrite(handle,a1) ;

FileClose(handle) ;
Dans le fichier a1=5 ;

Incompréhension de l'essentiel. Veuillez expliquer - en remplissant le formulaire proposé.

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';') ;
ici nous assignons la valeur 5 à a1

FileClose(handle) ;

J'en ai vraiment besoin.

Donc, dans l'ordre.

Si seules les dernières données sont nécessaires, alors pourquoi sauvegarder les précédentes ? ("avant l'écriture" se produit avec la combinaison des modes FILE_READ|FILE_WRITE).
Il est donc plus logique d'utiliser le mode FILE_CSV|FILE_WRITE, où les enregistrements précédents sont supprimés avant l'écriture de nouvelles données.

Commençons à écrire 4 variables dans le fichier.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a1 = 3;
   double punkt = 0.4;
   double nn = 1128;
   double mm = 1000;

   handle=FileOpen("a1.csv",FILE_CSV|FILE_WRITE,';');
   FileWrite(handle,a1,punkt,nn,mm);
   FileClose(handle);           
}
//+------------------------------------------------------------------+

L'essentiel est de se souvenir de l'ordre dans lequel les variables sont écrites, car c'est dans cet ordre que nous les lirons.

Commençons à lire les données dans les variables à partir du fichier.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a;
   double p;
   double n;
   double m;   
   handle=FileOpen("a1.csv",FILE_CSV|FILE_READ, ';');         
   
   a = FileReadNumber(handle);    //считываем первую цифру, соответствующую переменной a1 и далее по порядку...
   p = FileReadNumber(handle);    //punkt
   n = FileReadNumber(handle);    //nn
   m = FileReadNumber(handle);    //mm
   
   FileClose(handle);           
}
//+------------------------------------------------------------------+

En utilisant la fonction FileReadNumber(), nous lisons le numéro après le numéro dans l'ordre dans lequel ils ont été écrits.
C'est tout ce qu'il y a à faire, rien de compliqué :)

 
Infinity:


La seule chose que je ne comprends pas est quelle paire de devises doit m'être envoyée à quel moment. Où puis-je obtenir l'information que, par exemple, 4 ordres sont ouverts sur ces paires et que ces paires doivent m'être envoyées ?

Je ne sais pas si je le fais bien ou pas ... de toute façon ....

Mais j'ai obtenu EURUSD : zero divide error. Apparemment, cette erreur indique que j'ai 0 dans une variable quelque part, probablement, c'est une opération de division. Est-ce que j'essaie de l'appliquer correctement ?

Effectuez une relecture après chaque opération d'affectation de variable, ou avant chaque opération de division, pour voir où vous obtenez un zéro, puis partez de là.
Raison: