Domanda sul consulente multivaluta - pagina 11

 
Vinin >> :

Creare due array. Uno per numero di biglietto, il secondo per prezzo. Poi ordinate l'array per prezzo, spostando i numeri dei biglietti allo stesso tempo (senza interrompere la connessione). Quindi a un'estremità della matrice ci sarà il prezzo più basso, all'altra il prezzo più alto. Ora dobbiamo cambiare uno degli ordini estremi.

>> Grazie.
Non ho ancora praticamente lavorato con gli array.
Supponiamo, per esempio, che io abbia 10 ordini BUYSTOP. Ho fissato i loro prezzi d'installazione:

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 байстоп



Poi, ho impostato un array di prezzi di setup, con l'ordine 1 che è il prezzo più vicino al prezzo corrente.

int ArrayCents = { prezzo1,prezzo2,prezzo3,prezzo4,prezzo5,prezzo6,prezzo7,prezzo8,prezzo9,prezzo10 }

E come creare un array per ticket non mi è chiaro. Dove trovo i biglietti per l'ordine?

 

Cos'è qualcosa del genere

// Функция возвращает номер тикета ордера с самой маленькой ценой или с самой большой
// По умолчанию сортировка по возрастанию
// Только вот что за цену брать, я возьму стоп (цену открытия мы менять не можем)
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);
}

   
Non ha controllato il codice.
 
Grazie, Vinin! Ci darò un'occhiata.
 

Apparentemente la funzione funziona così:

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

Parametri:
lSymbol= - nome del simbolo ("" - qualsiasi simbolo, NULL - il simbolo corrente)

lOP=-1 - operazione (-1 - qualsiasi ordine, nel nostro caso -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - qualsiasi mago)

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

Ma cosa significa "int reversi=0" - non mi è molto chiaro!

La funzione è stata copiata normalmente:

0 - prezzo più basso

1 - il più grande?


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

E inoltre, -perché esattamente abbiamo preso lo stoploss come prezzo?

E perché non possiamo cambiare il prezzo di apertura?

OP_BUYSTOP - perché questi sono ordini pendenti (e non posizioni), e solo il risultato finale dell'evento è quello di cambiare il prezzo di apertura (trigger) di un ordine specifico.

 
rid писал(а) >>

Apparentemente la funzione funziona così:

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

Parametri:
lSymbol= - nome dello strumento (" - qualsiasi simbolo, NULL - simbolo corrente)

lOP=-1-operazione (-1 - qualsiasi ordine, nel nostro caso -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - qualsiasi magia)

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

Ma cosa significa "int reversi=0" - non mi è molto chiaro!

La funzione è stata copiata normalmente:

0 - il prezzo più piccolo

1 - il più grande?


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

E inoltre, -perché esattamente abbiamo preso lo stoploss come prezzo?

E perché non possiamo cambiare il prezzo di apertura?

OP_BUYSTOP - questi sono ordini pendenti (e non posizioni) il che significa che alla fine dobbiamo cambiare il prezzo di apertura dell'ordine scelto.

Quindi prendete qualsiasi prezzo di cui avete bisogno. Il prezzo aperto per gli ordini in sospeso. L'ho fatto solo come esempio.

 

Penso che sia più facile impostare un array bidimensionale e ordinare per la prima dimensione. E lì, di conseguenza, potete mettere quello che vi serve. Nel suo caso, il prezzo.

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 >> :

Penso che sia più facile impostare un array bidimensionale e ordinare per la prima dimensione. E lì, di conseguenza, potete conservare ciò che vi serve. Nel tuo caso è il prezzo.

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

   double Price_Ticket[][2];
   
   int size = 10;
   ArrayResize( Price_Ticket, size);
È nell'inite. Il tacchino è solo appeso. La funzione di avvio è vuota, costruire 220.
 
Vinin >> :

Quindi prendete il prezzo che volete. Per i ciondoli, prendete il prezzo di apertura. L'ho fatto solo come esempio.

Supponiamo che io abbia 10 ordini bystop impostati. Non sono messi in ordine, ma sono separati dal tempo.

Ho bisogno di cancellare l'ordine che è attualmente più lontano dal prezzo corrente.

È questo il modo corretto di trovare questo ordine? -

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

p.s.

Ho inserito una funzione nel commento.

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

Ma continua a restituire "-1". Anche se ci sono da 5 a 10 ordini sul grafico.

c'è un errore da qualche parte...

// Функция возвращает номер тикета ордера с  с самой
// малой или , 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 писал(а) >>

Ho, diciamo, 10 ordini bystop effettuati. Non sono messi in ordine, ma sono separati dal tempo.

Ho bisogno di cancellare l'ordine che è attualmente più lontano dal prezzo corrente.

È questo il modo corretto di trovare questo ordine? -

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

p.s.

Ho messo la funzione nel commento.

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

Ma la funzione restituisce costantemente "-1". Anche se ci sono da 5 a 10 ordini sul grafico.

C'è un errore da qualche parte...

Comment( MiniMaxOrderPrice("", -1, OP_BUYSTOP, 1 )); // qualsiasi simbolo

Comment( MiniMaxOrderPrice(Symbol(), -1, OP_BUYSTOP, 1 )); // simbolo corrente

 

OK! Grazie Vinin!

La funzione sembra funzionare! Indagherò più a fondo!

Motivazione: