Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 574

 
Anton Balakirew:
Die Idee der Eröffnung von Aufträgen auf ein Kauf-oder Bärengriff Signal, wie man es so, dass es nur ein Kauf / Verkauf Handel und eine schwebende Ordnung Handel, habe ich eine offene auf jedem Tick des Handels. Helfen Sie mit, das Problem zu lösen.
Überprüfen Sie die Anzahl der eingestellten Aufträge und die Anzahl der offenen Positionen, bevor Sie eine neue Position eröffnen oder einen neuen schwebenden Auftrag erteilen.
 
Artyom Trishkin:

Nun, es gibt eine andere Möglichkeit: Für jede Kerze im Bereich werden Streichhölzer geschrieben. In der vorherigen Version wurden die Übereinstimmungen nur für eine Kerze geschrieben - d.h. es wurde keine Übereinstimmung für die Kerze geschrieben, die mit dieser übereinstimmt.

Artem, ich danke dir. Ich werde mich damit befassen.

pako:

Die hohen Werte können gerundet werden, z. B. können wir den Wert 1,23456 auf 1,2346 runden.


Ich verstehe, was ich meine. Ich füge auch eine Variable in den Einstellungen hinzu, in der Sie die Abweichung vorgeben können, innerhalb derer die Werte von hoch als gleich angesehen werden. Das ist notwendig, weil es bei vierstelligen Anführungszeichen oft kein solches Problem gibt, aber bei fünfstelligen Anführungszeichen ist die Suche nach exakten Übereinstimmungen unendlich oft möglich.

 
Andrey Koldorkin:

Artem, ich danke dir. Ich werde es mir ansehen.

Die Rundung ist eindeutig. Ich habe auch eine Variable in die Einstellungen eingefügt, mit der ich den Abweichungswert vorgeben kann, innerhalb dessen die hohen Werte als gleich angesehen werden. Das ist notwendig, weil es bei vierstelligen Anführungszeichen oft kein solches Problem gibt, aber bei fünfstelligen Anführungszeichen ist die Suche nach genauen Übereinstimmungen endlos.

Bitte sehr. In der zweiten Fassung ist mir eine Ungenauigkeit unterlaufen. Da in der ersten Version die Suche nach den Übereinstimmungen bei der nächsten Kerze ab dem Schleifenindex begann, wurde die Hauptschleife nach der Anzahl der Kerzen minus eins durchlaufen, um die beiden äußersten Kerzen zu vergleichen. In der zweiten Version suchen wir nun für jede Kerze nach Übereinstimmungen über den gesamten Bereich, also in der Zeile

for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"

sollten Sie die Anzahl der Balken ändern in

for(int i=0; i<copy_bars; i++) {                             // цикл по скопированным данным от начала до конца диапазона
 
Artyom Trishkin:
Überprüfen Sie die Anzahl der eingestellten Aufträge und die Anzahl der offenen Positionen, bevor Sie eine neue Position eröffnen oder einen neuen schwebenden Auftrag erteilen.

d.h. ist es notwendig, eine Bedingung hinzuzufügen, um die Anzahl der Aufträge und Positionen in den Bedingungen für einen Handel zu überprüfen?

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&h2>h1&h1<o2&o1<c1&&l2>l1&&o3>c3&&o4>c4){ //first condition

if (OrdersTotal()==0) //zweite Bedingung

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); } ................................... und so für jeden Handel?

Und welche Funktion zählt die Anzahl der offenen Stellen?

Ich glaube, ich habe das Problem gelöst:

if (Stunde()>=0&Stunde()<23){

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

wenn (PositionenGesamt()<=1)

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); } //eröffnet Kaufen

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

if (PositionenGesamt()==1&Auftragsart()==0)

OrderSend(Symbol(), OP_SELLSTOP,Lot,l2,10,h2,0);} //Aufgeschobener SellStop-Auftrag

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

wenn (PositionenGesamt()<=1)

OrderSend(Symbol(),OP_SELL,Lot,o,10,h1,0); } //Öffnet Verkauf

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

if (PositionenGesamt()==1&Auftragsart()==1)

OrderSend(Symbol(), OP_BUYSTOP,Lot,h2,10,l2,0);} //Aufgeschobener BuyStop-Auftrag

}

//+------------------------------------------------------------------+

//Funktion, die die Gesamtzahl der offenen Positionen zurückgibt |

// |

//+------------------------------------------------------------------+

int PositionsTotal() {

int pos = 0;

for (int i=0; i<OrdersTotal(); i++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

pos++;

}

return(pos);

}

//+------------------------------------------------------------------+

 
Artyom Trishkin:

Nun, hier ist eine andere Möglichkeit: Für jede Kerze im Bereich werden Streichhölzer geschrieben. In der vorherigen Version wurden die Übereinstimmungen nur für eine Kerze geschrieben - d.h. es wurde keine Übereinstimmung für die Kerze geschrieben, die mit dieser übereinstimmt.

Gut. Aber wenn der Höchststand der Kerze 2 mit dem Tiefststand der Kerze 7 zusammenfällt, werden zwei Übereinstimmungen gefunden: 2 <=> 7, 7 <=>2. Und wie sieht es mit der Berücksichtigung von Umkehrpaaren aus, aber ohne die zusätzliche Schleife?

Können Sie das Problem nicht in einem Durchgang lösen, ohne verschachtelte for-Schleifen zu verwenden:)))?

 
Vasiliy Sokolov:

Gud. Wenn das Hoch der Kerze 2 mit dem Hoch der Kerze 7 übereinstimmt, werden zwei Übereinstimmungen gefunden: 2 <=> 7, 7 <=>2. Und wie sieht es mit der Berücksichtigung inverser Paare aus, allerdings ohne die zusätzliche Schleife?

Wie wäre es, das Problem in einem Zug zu lösen, ohne verschachtelte for-Schleifen zu verwenden:)))?

:) Versuchen Sie nicht, michschwach zu machen ;) Natürlich denke ich, dass man das Problem mit einer Schleife lösen kann, aber ich war zu faul, um länger darüber nachzudenken, und habe es so gemacht, wie es mir auf Anhieb einfiel.

Natürlich werden hier alle gepaarten oder mehr Kerzen in den Matchdaten jeder Kerze erfasst. Deshalb gibt es Querverweise zwischen ihnen. Ich schlage nur Varianten vor, ohne zu wissen, wofür sie sind.

Außerdem ist es möglich, die Aufgabe der Optimierung von Berechnungen zu lösen, aber ich brauche das nicht.

Und was ist, wenn Sie genau die Daten für jede Kerze und alle Streichhölzer benötigen, und was ist, wenn plötzlich, plötzlich ... gibt es nur ....

Ich habe also keine Zeit und keine Lust. Ich habe meine Zeit verschwendet, anstatt meine eigenen Codes zu schreiben.

SZY, vielleicht sollten Sie auch Kohonen-Methoden verbinden, wenn Sie den erforderlichen Eingabeparameter kennen.

 
Artyom Trishkin:

Im Allgemeinen - keine Zeit und keine Lust. Und so verschwendete ich Zeit, anstatt meinen eigenen Code zu schreiben.

Das ist schade, wirklich schade.
 
Vasiliy Sokolov:
Das ist schade, das ist schade.
Ja, das ist eine interessante Aufgabe, aber leider habe ich keine Zeit dafür.
 
Artyom Trishkin:

Bitte sehr. In der zweiten Fassung ist mir eine Ungenauigkeit unterlaufen. Da in der ersten Version ab der nächsten Kerze ab dem Schleifenindex nach Übereinstimmungen gesucht wurde, wurde die Hauptschleife um die Anzahl der Kerzen minus eins erweitert, um die beiden äußersten Kerzen zu vergleichen. In der zweiten Version suchen wir nun für jede Kerze nach Übereinstimmungen über den gesamten Bereich, also in der Zeile

sollten Sie die Anzahl der Balken ändern in

Bitte erklären Sie uns die Bedeutung dieser Zeilen:

input int Search_Period=10; // Anzahl der zu kopierenden Candlesticks

int searchPeriod=(Search_Period<1)?1:Search_Period; // was bedeuten die Symbole "?", ":"?

input int Delta=2; // Anzahl der Zulassungspunkte

int delta=(Delta<0)?0:Delta; // was bedeuten die Symbole "?", ":"?

 
Andrey Koldorkin:

Bitte erklären Sie mir die Bedeutung dieser Zeilen:

input Search_Period=10; // Anzahl der zu kopierenden Candlesticks

int searchPeriod=(Search_Period<1)?1:Search_Period; // was bedeuten die Zeichen "?", ":"?

input int Delta=2; // Anzahl der Zulassungspunkte

int delta=(Delta<0)?0:Delta; // was bedeuten die Symbole "?", ":"?

// строку int searchPeriod=(Search_Period<1)?1:Search_Period;
// можно расписать так:

input int Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройках
int searchPeriod;           // Сюда будем записывать входной параметр
if(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен единице
else searchPeriod=Search_Period;    // иначе примем входной параметр

// соответственно и строку int delta=(Delta<0)?0:Delta;
// можно расписать точно так же

Von der Referenz:

Bedingter Operator ?

Die allgemeine Form eines ternären Operators sieht wie folgt aus:

Ausdruck1? Ausdruck2: Ausdruck3

Als erster Operand kann "expression1" ein beliebiger Ausdruck sein, der einen Wert vom Typ bool ergibt. Wenn das Ergebnis wahrist , wird der durch den zweiten Operanden "expression2" angegebene Operator ausgeführt .

Wenn der erste Operand falsch ist, wird der dritte Operand, "expressionZ", ausgeführt. Der zweite und dritte Operand, d. h. "expression2" und "expressionZ", müssen Werte desselben Typs zurückgeben und dürfen nicht vom Typ "void" sein. Das Ergebnis der Ausführung des bedingten Operators ist das Ergebnis von "Ausdruck2" oder das Ergebnis von "Ausdruck3", je nach dem Ergebnis von "Ausdruck1".

//--- Renormierung der Differenz zwischen Eröffnungs- und Schlusskurs durch die tägliche Spanne

double true_range = (High==Low)?0:(Schließen-Öffnen)/(Hoch-Tief);

Dieser Eintrag ist gleichbedeutend mit folgendem

double_range;

if(High==Low)true_range=0;// wenn High und Low gleich sind

else true_range=(Close-Open)/(High-Low);// wenn High ungleich Null ist

Grund der Beschwerde: