Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 69

 
Alexey Viktorov:
Zum Beispiel hier https://docs.mql4.com/ru/basis/preprosessor/compilation
Ich danke Ihnen!
 
trader781:

Im aktuellen Beispiel möchte ich in der Lage sein, eine unendliche Anzahl von Aufträgen mit beliebigen Lots zu platzieren, um die Limits nicht zu überschreiten.

Natürlich kennen wir alle die Grenzen, aber ich möchte es auf diese Weise machen

Ich gehe davon aus, dass, wenn Sie ein Element in Klammern angeben, es das letzte sein wird

Ich habe also diese Art von Mist. Ich hatte einen Auftrag nach Auftrag erwartet... Ich möchte, dass das Ergebnis (Los eines solchen Auftrags *Koeffizient) zum Auftrag hinzugefügt wird und nicht das Los

und die Frage des Abrufs von Daten von dort

Ich möchte das folgende Ergebnis erhalten

MyArray[0][0.01]

MyArray[1][0.01]

MyArray[2][0.02]

usw...

Was ist also die eigentliche Frage?

Sie haben ein Array mit Losen geschrieben, dann sortieren Sie es nach Losgröße, es wird nach Eröffnungsnummern sortiert, denn in Ihrem Fall wird jede nächste Position mit einem größeren Los eröffnet

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()
}


Dann gilt: Zählen Sie die Gesamtzahl der Positionen, und wenn weniger als drei, dann greifen Sie nicht auf das Array zu, wenn mehr, dann lesen Sie das Array und nehmen Sie Daten daraus.

Die Ausgabe des Arrays erfolgt nicht zum Zeitpunkt des Schreibens, sondern zum Zeitpunkt des Lesens.

 
Vitaly Muzichenko:


Die Ausgabe des Arrays erfolgt nicht zum Zeitpunkt des Schreibens, sondern zum Zeitpunkt des Lesens.

Nein. In dem Moment, in dem auf einen nicht existierenden Array-Index zugegriffen wird.
 
Vitalie Postolache:
Nö. Im Moment des Zugriffs auf einen nicht vorhandenen Array-Index.
Also, was habe ich geschrieben?
 
Vitaly Muzichenko:
Was habe ich also geschrieben?

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 konstant und das Los ändert sich. Es sollte nicht so sein, aber es funktioniert nicht anders

Im Idealfall wird der EintragMyArray[CountOrders][OrderLots()]

Die Ausgabe wäre alsoMyArray[0][0.01]MyArray[1][0.01]

aber das wird in µl nicht funktionieren.

und dann irgendwie aus der Funktion in den Stream extrahieren
 
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 konstant und das Los ändert sich. Es sollte nicht so sein, aber es funktioniert nicht anders

Im Idealfall wird der EintragMyArray[CountOrders][OrderLots()]

Die Ausgabe wäre alsoMyArray[0][0.01]MyArray[1][0.01]

Aber das funktioniert nicht in µl

Die Strukturen werden Ihnen helfen. Sie erstellen eine Struktur mit den erforderlichen Feldern, deklarieren ein Array solcher Strukturen, füllen es in der Schleife mit Auftragsdaten, indem Sie die Zeit öffnen, und durchsuchen es dann nach allem, was Sie brauchen. Prüfen Sie die Felder der Struktur anhand des Index und vergleichen Sie sie mit dem erforderlichen Wert. Der Index zeigt die Auftragsnummer nach der Öffnungszeit an, und alle notwendigen Daten zu diesem spezifischen Auftrag werden in den Feldern der Struktur angezeigt.
 
Artyom Trishkin:
Die Strukturen werden Ihnen helfen. Sie erstellen eine Struktur mit den erforderlichen Feldern, deklarieren ein Array solcher Strukturen, füllen es in der Schleife mit Auftragsdaten, indem Sie die Zeit öffnen, und suchen dann alles, was Sie brauchen, darin. Prüfen Sie die Felder der Struktur anhand des Index und vergleichen Sie sie mit dem erforderlichen Wert. Der Index verweist auf die Auftragsnummer anhand der Eröffnungszeit, und alle erforderlichen Daten zu diesem spezifischen Auftrag werden in den Feldern der Struktur angegeben.

Das ist die Art von Scheiße, die wir haben

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();
     }
}    


Ich möchte z.B. das Los 5 eines Auftrags herausnehmen und mit dem Los 3 vergleichen

den Eröffnungskurs addieren und durch die Anzahl der Positionen dividieren

wir brauchen einen Befehlseintrag für diese Art von Dingen.

 
trader781:

Wir haben diese Art von Scheiße.

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();
     }
}    


Ich möchte z.B. das Los 5 eines Auftrags herausnehmen und mit dem Los 3 vergleichen

den Eröffnungskurs addieren und durch die Anzahl der Positionen dividieren

Ich brauche einen Eintrag selbst in Form von Befehlen für diese Art von Dingen

Da sich der Schleifenindex i auf jede beliebige Reihenfolge bezieht, nicht nur auf die, die Sie benötigen, sollten Sie in der Funktion eine Variable deklarieren (z. B. n=0;), die für die Größe des Arrays zuständig ist. Nachdem die Prüfungen bestanden sind, erhöhen Sie den Wert dieser Variablen innerhalb der Schleife, vergrößern Sie das Array um den Wert dieser Variablen und füllen Sie die Strukturfelder entsprechend dem Index n-1 aus: orders[n-1].xxx=XXX;

 

Bitte sagen Sie mir, warum die Funktion OrdersTotal() bei der Suche nach Bestellungen -1 schreibt.

Beispiel: for (i=OrdersTotal()-1 ;i>=0; i--)

warum nicht einfach OrdersTotal()?

Beginnt die Zählung der Aufträge in dieser Funktion bei 0 oder bei 1? Das heißt, wenn es eine Bestellung gibt, ist OrdersTotal() gleich 0 oder 1?

 
Artyom Trishkin:

Da sich der Schleifenindex i auf beliebige Aufträge bezieht, nicht nur auf die, die Sie benötigen, sollten Sie in der Funktion eine Variable deklarieren (z.B. n=0;), die für die Array-Größe zuständig ist. Nachdem die Prüfungen bestanden sind, erhöhen Sie den Wert dieser Variablen innerhalb der Schleife, vergrößern Sie das Array um den Wert dieser Variablen und füllen Sie die Strukturfelder um den Index n-1 aus: orders[n-1].xxx=XXX;

Da wir einen Stapel von Aufträgen haben, warum können wir nicht einfach den richtigen Auftrag herausziehen? (die notwendigen) und tun, was wir mit ihnen tun wollen? z.B. Bestellung (i-4)
Grund der Beschwerde: