Frage zum Berater für mehrere Währungen - Seite 11

 
Vinin >> :

Erstellen Sie zwei Arrays. Eine nach Ticketnummer, die zweite nach Preis. Dann sortieren Sie das Feld nach dem Preis und verschieben gleichzeitig die Ticketnummern (ohne die Verbindung zu unterbrechen). Am einen Ende des Feldes steht dann der niedrigste Preis, am anderen der höchste Preis. Jetzt müssen wir einen der extremen Aufträge ändern.

>> Danke.
Ich habe praktisch noch nicht mit Arrays gearbeitet.
Nehmen wir zum Beispiel an, ich habe 10 BUYSTOP-Aufträge. Ich lege ihre Einrichtungspreise fest:

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



Dann lege ich eine Reihe von Einrichtungspreisen fest, wobei Auftrag 1 der Preis ist, der dem aktuellen Preis am nächsten kommt.

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

Und wie man ein Array nach Ticket erstellt, ist mir nicht klar. Wo erhalte ich die Bestellscheine?

 

Was ist so etwas wie das

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

   
Ich habe den Code nicht überprüft.
 
Vielen Dank, Vinin! Ich werde es mir ansehen.
 

Offensichtlich funktioniert die Funktion folgendermaßen:

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

Parameter:
lSymbol= - Symbolname ("" - beliebiges Symbol, NULL - das aktuelle Symbol)

lOP=-1 - Operation (-1 - beliebige Reihenfolge, in unserem Fall -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - beliebiger Zauberer)

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

Aber was bedeutet "int reversi=0" - das ist mir nicht ganz klar!

Die Funktion wurde normal kopiert:

0 - niedrigster Preis

1 - der größte ?


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

Und außerdem: Warum genau haben wir den Stoploss als Preis genommen?

Und warum können wir den Eröffnungspreis nicht ändern?

OP_BUYSTOP - weil es sich hierbei um schwebende Aufträge (und nicht um Positionen) handelt und das Endergebnis des Ereignisses lediglich darin besteht, den Eröffnungskurs (Auslösepreis) eines bestimmten Auftrags zu ändern.

 
rid писал(а) >>

Offensichtlich funktioniert die Funktion folgendermaßen:

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

Parameter:
lSymbol= - Name des Instruments ("" - beliebiges Symbol, NULL - aktuelles Symbol)

lOP=-1-Vorgang (-1 - beliebige Reihenfolge, in unserem Fall -OP_BUYSTOP )
lMagic=-1 - MagicNumber (-1 - beliebige Magie)

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

Aber was bedeutet "int reversi=0" - das ist mir nicht ganz klar!

Die Funktion wurde normal kopiert:

0 - der kleinste Preis

1 - der größte ?


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

Und außerdem: Warum genau haben wir den Stoploss als Preis genommen?

Und warum können wir den Eröffnungspreis nicht ändern?

OP_BUYSTOP - dies sind schwebende Aufträge (und keine Positionen), was bedeutet, dass wir am Ende den Eröffnungskurs des gewählten Auftrags ändern müssen.

Nehmen Sie also den Preis, den Sie brauchen. Der offene Preis für die schwebenden Aufträge. Ich habe es nur als Beispiel getan.

 

Ich denke, es ist einfacher, ein zweidimensionales Array einzurichten und nach der ersten Dimension zu sortieren. Und dort können Sie entsprechend lagern, was Sie brauchen. In Ihrem Fall ist es der Preis.

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

Ich denke, es ist einfacher, ein zweidimensionales Array einzurichten und nach der ersten Dimension zu sortieren. Und dort können Sie entsprechend lagern, was Sie brauchen. In Ihrem Fall ist es der Preis.

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

   double Price_Ticket[][2];
   
   int size = 10;
   ArrayResize( Price_Ticket, size);
Das steht in der Einleitung. Der Truthahn hängt einfach auf. Die Startfunktion ist leer, Build 220.
 
Vinin >> :

Nehmen Sie also den Preis, den Sie wollen. Bei Anhängern nehmen Sie den Eröffnungspreis. Ich nenne nur ein Beispiel.

Angenommen, ich habe 10 By-Stop-Aufträge eingestellt. Sie sind nicht der Reihe nach angeordnet, sondern zeitlich getrennt.

Ich muss den Auftrag löschen, der derzeit am weitesten vom aktuellen Kurs entfernt ist.

Ist dies der richtige Weg, um diesen Auftrag zu finden? -

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

p.s.

Ich habe eine Funktion in den Kommentar eingefügt.

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

Aber es wird immer "-1" zurückgegeben. Obwohl es 5 bis 10 Aufträge auf dem Diagramm gibt.

irgendwo liegt ein Fehler vor...

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

Ich habe, sagen wir mal, 10 By-Stop-Bestellungen aufgegeben. Sie sind nicht der Reihe nach angeordnet, sondern zeitlich getrennt.

Ich muss den Auftrag löschen, der derzeit am weitesten vom aktuellen Kurs entfernt ist.

Ist dies der richtige Weg, um diesen Auftrag zu finden? -

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

p.s.

Ich habe die Funktion in den Kommentar geschrieben.

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

Aber die Funktion gibt ständig "-1" zurück. Obwohl es 5 bis 10 Aufträge auf dem Diagramm gibt.

Es liegt irgendwo ein Fehler vor...

Comment( MiniMaxOrderPrice("", -1, OP_BUYSTOP, 1 )); // beliebiges Symbol

Comment( MiniMaxOrderPrice(Symbol(), -1, OP_BUYSTOP, 1 )); // aktuelles Symbol

 

OK! Vielen Dank, Vinin!

Die Funktion scheint zu funktionieren! Ich werde mir das genauer ansehen!

Grund der Beschwerde: