Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 69
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Zum Beispiel hier https://docs.mql4.com/ru/basis/preprosessor/compilation
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 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.
Die Ausgabe des Arrays erfolgt nicht zum Zeitpunkt des Schreibens, sondern zum Zeitpunkt des Lesens.
Nö. Im Moment des Zugriffs auf einen nicht vorhandenen Array-Index.
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 extrahieren2017.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 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
{
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.
Wir haben diese Art von Scheiße.
{
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?
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;