Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 69

 
Alexey Viktorov:
Par exemple ici https://docs.mql4.com/ru/basis/preprosessor/compilation
Merci !
 
trader781:

Dans l'exemple actuel, je veux pouvoir placer un nombre infini d'ordres avec des lots quelconques afin de ne pas dépasser ses limites.

Bien sûr, nous connaissons tous les limites, mais je veux le faire de cette façon.

Je pars du fait que si vous spécifiez un élément entre parenthèses, ce sera le dernier.

Donc j'ai eu ce genre de conneries. Je m'attendais à un ordre par ordre... Je veux que le résultat (lot d'un tel ordre *coefficient) soit ajouté à l'ordre au lieu du lot.

et la question de la récupération des données à partir de là

Je veux obtenir le résultat suivant tel que je le vois

MonRéseau[0][0.01]

MonRéseau[1][0.01]

MonRéseau[2][0.02]

etc...

Alors quelle est la vraie question ?

Vous avez écrit un tableau avec des lots, puis vous le triez par taille de lot, il sera trié par les numéros d'ouverture, car dans votre cas, chaque position suivante s'ouvre avec un lot plus grand.

double BPosMass[];
double SPosMass[];

void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
     if(OrderType()==OP_BUY) {
      b++;
       ArrayResize(BPosMass,b+1);
       BPosMass[b]= OrderLot();
     }
     if(OrderType()==OP_SELL) {
      s++;
       ArrayResize(SPosMass,s+1);
       SPosMass[s]= OrderLot();
     }
  }}} // конец записи массив

// Читаем отсортированный массив с лотами
// Buy
  if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Buy лот: ",    BPosMass[0],
            "\nПоследний Buy лот: ",     BPosMass[b],
            "\nПредпоследний Buy лот: ", BPosMass[b-1]
           );

  } // end Buy

// Sell
  if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Sell лот: ",    SPosMass[0],
            "\nПоследний Sell лот: ",     SPosMass[s],
            "\nПредпоследний Sell лот: ", SPosMass[s-1]
           );

  } // end Sell
  
// Конец функции OnTick()
}


Ensuite, appliquez la procédure suivante : comptez le nombre total de positions, et si moins de trois, n'accédez pas au tableau, si plus, lisez le tableau et prenez des données.

La sortie du tableau n'est pas au moment de l'écriture, mais au moment de la lecture.

 
Vitaly Muzichenko:


La sortie du tableau ne se fait pas au moment de l'écriture, mais au moment de la lecture.

Non. Au moment d'accéder à un index de tableau inexistant.
 
Vitalie Postolache:
Non. Au moment d'accéder à un index de tableau inexistant.
Alors, qu'est-ce que j'ai écrit ?
 
Vitaly Muzichenko:
Alors, qu'est-ce que j'ai écrit ?

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5 : MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5 : MyArray[CountOrders][0]0.01

CountOrders constant et le lot change. Ça ne devrait pas être comme ça, mais ça ne fonctionne pas autrement.

Idéalement, l'entréeMonTableau [CountOrders][OrderLots()]

donc la sortie seraitMon tableau[0][0.01]Mon tableau[1][0.01]

mais cela ne fonctionnera pas en µl.

et ensuite l'extraire d'une manière ou d'une autre de la fonction vers le flux
 
trader781:

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5 : MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5 : MyArray[CountOrders][0]0.01

CountOrders constant et le lot change. Ça ne devrait pas être comme ça, mais ça ne fonctionne pas autrement.

Idéalement, l'entréeMonTableau [CountOrders][OrderLots()]

donc la sortie seraitMon tableau[0][0.01]Mon tableau[1][0.01]

Mais cela ne fonctionne pas en µl

Les structures vous aideront. Vous créez une structure avec les champs nécessaires, déclarez un tableau de telles structures, le remplissez de données d'ordre dans la boucle par temps d'ouverture, puis recherchez dans ce tableau tout ce dont vous avez besoin. Vérifiez les champs de la structure par l'index et comparez-les avec la valeur nécessaire. L'index indiquera le numéro de l'ordre par son heure d'ouverture, et toutes les données nécessaires sur cet ordre spécifique seront affichées dans les champs de la structure.
 
Artyom Trishkin:
Les structures vous aideront. Vous créez une structure avec les champs nécessaires, déclarez un tableau de telles structures, le remplissez de données d'ordre dans la boucle par temps d'ouverture, puis recherchez tout ce dont vous avez besoin dans ce tableau. Vérifiez les champs de la structure par l'index et comparez-les avec la valeur nécessaire. L'index indiquera le numéro de l'ordre par son heure d'ouverture, et toutes les données nécessaires sur cet ordre spécifique seront indiquées dans les champs de la structure.

C'est le genre de merde que nous avons.

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Je veux sortir, par exemple, le lot 5 d'une commande et le comparer avec le lot 3.

additionner le prix d'ouverture et diviser par le nombre de positions

nous avons besoin d'une entrée de commande pour ce genre de choses.

 
trader781:

On a ce genre de merde.

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Je veux sortir, par exemple, le lot 5 d'une commande et le comparer au lot 3.

additionner le prix d'ouverture et diviser par le nombre de positions

J'ai besoin d'une entrée en soi sous forme de commandes pour ce genre de chose

Comme l'indice i de la boucle fait référence à n'importe quel ordre, et pas seulement à ceux dont vous avez besoin, vous devez déclarer une variable (par exemple, n=0 ;) dans la fonction qui sera chargée de la taille du tableau. Après avoir passé les contrôles, on augmente la valeur de cette variable à l'intérieur de la boucle, on augmente la taille du tableau par la valeur de cette variable et on remplit les champs de la structure en fonction de l'indice n-1 : commandes[n-1].xxx=XXX ;

 

Veuillez me dire pourquoi la fonction OrdersTotal() écrit -1 lors de la recherche des commandes.

Exemple : pour (i=OrdersTotal()-1 ;i>=0 ; i--)

pourquoi pas simplement OrdersTotal() ?

Le nombre d'ordres dans cette fonction commence-t-il à 0 ou à 1 ? En d'autres termes, s'il y a une seule commande, la fonction OrdersTotal() est-elle égale à 0 ou à 1 ?

 
Artyom Trishkin:

Puisque l'indice de boucle i fait référence à n'importe quel ordre, et pas seulement à ceux dont vous avez besoin, vous devez déclarer une variable (par exemple n=0 ;) dans la fonction qui sera responsable de la taille du tableau. Après avoir passé les contrôles, augmenter la valeur de cette variable à l'intérieur de la boucle, augmenter la taille du tableau par la valeur de cette variable et remplir les champs de la structure par l'indice n-1 : commandes[n-1].xxx=XXX ;

Puisque nous avons un paquet de commandes, pourquoi ne pouvons-nous pas simplement sortir la bonne commande ? (ceux qui sont nécessaires) et faire ce que nous voulons faire avec eux ? par exemple, commander (i-4)
Raison: