Question sur le conseiller multi-devises - page 11

 
Vinin >> :

Créez deux tableaux. L'un par numéro de billet, le second par prix. Ensuite, triez le tableau par prix, en déplaçant les numéros de tickets en même temps (sans rompre la connexion). Ainsi, à une extrémité du tableau se trouvera le prix le plus bas, à l'autre le prix le plus élevé. Maintenant, nous devons changer un des ordres extrêmes.

>> Merci.
Je n'ai pas encore pratiquement travaillé avec des tableaux.
Par exemple, disons que j'ai 10 ordres BUYSTOP. Je fixe leurs prix d'installation :

double price1 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 1);//цена 1 байстоп
double price2 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 2);//цена 2 байстоп
double price3 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 3);//цена 3 байстоп
double price4 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 4);//цена 4 байстоп
double price5 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 5);//цена 5 байстоп
double price6 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 6);//цена 6 байстоп
double price7 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 7);//цена 7 байстоп
double price8 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 8);//цена 8 байстоп
double price9 = GetOrderOpenPrice(NULL,OP_BUYSTOP, 9);//цена 9 байстоп
double price10= GetOrderOpenPrice(NULL,OP_BUYSTOP, 10);//цена 10 байстоп



Ensuite, je définis un tableau de prix de configuration, l'ordre 1 étant le prix le plus proche du prix actuel.

int ArrayCents = { price1,price2,price3,price4,price5,price6,price7,price8,price9,price10 }

Et comment créer un tableau par ticket n'est pas clair pour moi. Où puis-je obtenir les billets de commande ?

 

C'est quelque chose comme ça

// Функция возвращает номер тикета ордера с самой маленькой ценой или с самой большой
// По умолчанию сортировка по возрастанию
// Только вот что за цену брать, я возьму стоп (цену открытия мы менять не можем)
int MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0){
   double   ArrayPrice[];
   int      ArrayTicket[];
   int      Total=OrdersTotal();
   int      tmpTicket;
   double   tmpPrice;
   bool     bSort=true;
   
   ArrayResize( ArrayPrice, Total);
   ArrayResize( ArrayTicket, Total);
   int i, count=0;
   for ( i=0; i< Total; i++) {
      if (!OrderSelect( i, SELECT_BY_POS))             continue;
      if (!(OrderSymbol()== lSymbol || lSymbol==""))   continue;
      if (!(OrderMagicNumber()== lMagic || lMagic==-1))continue;
      if (!(OrderType()== lOP || lOP==-1))             continue;
      ArrayPrice[ count]=OrderStopLoss();
      ArrayTicket[ count]=OrderTicket();
      count++;
   }
   
   
   if ( count>0) {
      ArrayResize( ArrayPrice, count);
      ArrayResize( ArrayTicket, count);
      while ( bSort) {
         bSort=false;
         for ( i=1; i< count; i++) {
            if ( ArrayPrice[ i-1]> ArrayPrice[ i]) {
               tmpPrice= ArrayPrice[ i-1];
               ArrayPrice[ i-1]= ArrayPrice[ i];
               ArrayPrice[ i]= tmpPrice;
               tmpTicket= ArrayTicket[ i-1];
               ArrayTicket[ i-1]= ArrayTicket[ i];
               ArrayTicket[ i]= tmpTicket;
               bSort=true;
            }
         }
      }
      if ( reversi==0) return( ArrayTicket[0]); else return( ArrayTicket[ count-1]);
   }
   return(-1);
}

   
Je n'ai pas vérifié le code.
 
Merci, Vinin ! Je vais m'en occuper.
 

Apparemment, la fonction fonctionne comme suit :

MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0)

Paramètres :
lSymbol= - nom du symbole ("" - n'importe quel symbole, NULL - le symbole actuel)

lOP=-1 - opération (-1 - n'importe quel ordre, dans notre cas -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - n'importe quel magicien)

//---------------------------------------------------------------------------------------------

Mais que signifie "int reversi=0" - ce n'est pas très clair pour moi !

La fonction a été copiée normalement :

0 - prix le plus bas

1 - le plus grand ?


//-------------------------------------------------------------------

Et aussi, -pourquoi exactement avons-nous pris le stoploss comme prix ?

Et pourquoi ne pouvons-nous pas changer le prix d'ouverture ?

OP_BUYSTOP - parce qu'il s'agit d'ordres en attente (et non de positions), et que le résultat final de l'événement est de modifier le prix d'ouverture (de déclenchement) d'un ordre spécifique.

 
rid писал(а) >>

Apparemment, la fonction fonctionne comme suit :

MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0)

Paramètres :
lSymbol= - nom de l'instrument (" - tout symbole, NULL - symbole courant)

lOP=-1-opération (-1 - ordre quelconque, dans notre cas -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - toute magie)

//---------------------------------------------------------------------------------------------

Mais que signifie "int reversi=0" - ce n'est pas très clair pour moi !

La fonction a été copiée normalement :

0 - le plus petit prix

1 - le plus grand ?


//-------------------------------------------------------------------

Et aussi, -pourquoi exactement avons-nous pris le stoploss comme prix ?

Et pourquoi ne pouvons-nous pas modifier le prix d'ouverture ?

OP_BUYSTOP - il s'agit d'ordres en attente (et non de positions), ce qui signifie qu'à la fin, nous devons modifier le prix d'ouverture de l'ordre choisi.

Alors prenez le prix que vous voulez. Le prix ouvert pour les ordres en attente. Je l'ai juste fait à titre d'exemple.

 

Je pense qu'il est plus facile de mettre en place un tableau à deux dimensions et de trier par la première dimension. Et là, en conséquence, vous pouvez mettre ce dont vous avez besoin. Dans votre cas, le prix.

double Price_Ticket[][2]
int total=OrdersTotal();
ArrayResize( Price_Ticket, total);
for (int i=0; i< total; i++) if (OrderSelect( i, SELECT_BY_POS))
{
 Price_Ticket[ i][0]=OrderOpenPrice();
 Price_Ticket[ i][1]=OrderTicket();
}
ArraySort( Price_Ticket);
 
Xupypr >> :

Je pense qu'il est plus facile de mettre en place un tableau à deux dimensions et de trier par la première dimension. Et là, en conséquence, vous pouvez stocker ce dont vous avez besoin. Dans votre cas, c'est le prix.

   SetIndexBuffer(0, Test);
   SetIndexStyle(0, DRAW_HISTOGRAM);
//---- indicators
//----

   double Price_Ticket[][2];
   
   int size = 10;
   ArrayResize( Price_Ticket, size);
C'est dans l'inite. La dinde raccroche. La fonction de départ est vide, construire 220.
 
Vinin >> :

Alors prenez le prix que vous voulez. Pour les pendentifs, prenez le prix d'ouverture. Je l'ai juste fait à titre d'exemple.

Supposons que j'ai 10 ordres d'arrêt définis. Ils ne sont pas placés dans l'ordre, mais ils sont séparés par le temps.

Je dois supprimer l'ordre qui est actuellement le plus éloigné du prix actuel.

Est-ce la bonne façon de trouver cet ordre ? -

//******************************

p.s.

J'ai inséré une fonction dans le commentaire.

Commentaire( MiniMaxOrderPrice(NULL, -1, OP_BUYSTOP, 1 ) ;

Mais il renvoie toujours "-1". Bien qu'il y ait de 5 à 10 ordres sur le graphique.

il y a une erreur quelque part...

// Функция возвращает номер тикета ордера с  с самой
// малой или , int reversi=0,большой ценой
// По умолчанию сортировка по возрастанию


int MiniMaxOrderPrice(string lSymbol="", int lMagic=-1, int lOP=-1, int reversi=0 ){
   double   ArrayPrice[];
   int      ArrayTicket[];
   int      Total=OrdersTotal();
   int      tmpTicket;
   double   tmpPrice;
   bool     bSort=true;
   
   ArrayResize( ArrayPrice, Total);
   ArrayResize( ArrayTicket, Total);
   int i, count=0;
   for ( i=0; i< Total; i++) {
      if (!OrderSelect( i, SELECT_BY_TICKET, MODE_TRADES))     continue;
      if (!(OrderSymbol()== lSymbol || lSymbol==""))   continue;
      if (!(OrderMagicNumber()== lMagic || lMagic==-1))continue;
      if (!(OrderType()== lOP || lOP==-1))             continue;
      ArrayPrice[ count]= OrderOpenPrice();
      ArrayTicket[ count]=OrderTicket();
      count++;
   }
   
   
   if ( count>0) {
      ArrayResize( ArrayPrice, count);
      ArrayResize( ArrayTicket, count);
      while ( bSort) {
         bSort=false;
         for ( i=1; i< count; i++) {
            if ( ArrayPrice[ i-1]> ArrayPrice[ i]) {
               tmpPrice= ArrayPrice[ i-1];
               ArrayPrice[ i-1]= ArrayPrice[ i];
               ArrayPrice[ i]= tmpPrice;
               tmpTicket= ArrayTicket[ i-1];
               ArrayTicket[ i-1]= ArrayTicket[ i];
               ArrayTicket[ i]= tmpTicket;
               bSort=true;
            }
         }
      }
      if ( reversi==0) return( ArrayTicket[0]); else return( ArrayTicket[ count-1]);
   }
   return(-1); }
 
rid писал(а) >>

J'ai, disons, 10 commandes d'arrêt placées. Ils ne sont pas placés dans l'ordre, mais sont séparés par le temps.

Je dois supprimer l'ordre qui est actuellement le plus éloigné du prix actuel.

Est-ce la bonne façon de trouver cet ordre ? -

//******************************

p.s.

J'ai mis la fonction dans le commentaire.

Commentaire( MiniMaxOrderPrice(NULL, -1, OP_BUYSTOP, 1 )) ;

Mais la fonction renvoie constamment "-1". Bien qu'il y ait de 5 à 10 ordres sur le graphique.

Il y a une erreur quelque part...

Comment( MiniMaxOrderPrice("", -1, OP_BUYSTOP, 1 )) ; // tout symbole

Comment( MiniMaxOrderPrice(Symbol(), -1, OP_BUYSTOP, 1 )) ; // symbole actuel

 

OK ! Merci Vinin !

La fonction semble fonctionner ! Je vais étudier la question de plus près !