Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 19

 
Vitalie Postolache:
Seien Sie nicht so ))))
der Grund ist nicht mql4
 
Vitalie Postolache:

So funktioniert das nicht. Die Argumente dieser Funktion sind 1) die zu durchsuchende Zeichenkette; 2) die zu suchende Zeichenkombination; 3) der Beginn der Suche (standardmäßig ab dem Nullzeichen der Zeichenkette gemäß Punkt 1).

Sie gibt die Nummer der Position in der Zeichenkette zurück, an der die gesuchte Teilzeichenkette beginnt, oder -1, wenn keine Teilzeichenkette gefunden wird.

Es sollte also so geschrieben werden:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

Danke für die Antwort... So wird die FunktionStringFind mit ihren Parametern ( string_value, string match_substring, int start_pos=0 ) im allgemeinen Code in einer Zeile geschrieben mit

Argumente, die den Daten der Funktionsparameter entsprechen: string OrderComment(), string "[tp]", int 0 und wenn dieser Ausdruck ( in geschweiften Klammern) größer als -1 ist, wird derfolgende Code (in Klammern)ausgeführt

if(StringFind(Bestellkommentar(),"[tp]",0)>-1)

{

double OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," Gewinn: ", OrderTakeProfit());

sonst

Print("OrderSelect() gab Fehler zurück",GetLastError());

bool PlaySound(

string payment // wobei "payment"der Dateiname im MT4 Sound Ordner ist

);

}

... Wird dieser Code in MQL4 funktionieren? ...

 
bablusut:

Danke für die Antwort ... Es stellt sich heraus, dass die FunktionStringFind mit ihren Parametern ( string_value, string match_substring, int start_pos=0 ) im allgemeinen Code in einer Zeile geschrieben wird mit

Argumente, die den Daten der Funktionsparameter entsprechen: string OrderComment(), string "[tp]", int 0 und wenn dieser Ausdruck ( in geschweiften Klammern) größer als -1 ist, wird derfolgende Code (in Klammern)ausgeführt

if(StringFind(Bestellkommentar(),"[tp]",0)>-1)

{

double OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," Gewinn: ", OrderTakeProfit());

sonst

Print("OrderSelect() gab Fehler zurück",GetLastError());

bool PlaySound(

string payment // wobei "payment"der Dateiname im MT4 Sound Ordner ist

);

}

... Wird dieser Code in MQL4 funktionieren? ...

double OrderTakeProfit(); - der Code sollte beim Kompilieren einen Fehler aufweisen.

Soweit ich es verstehe (ich lerne es selbst noch), fordert OrderTakeProfit(); den Auftragsgewinn vom Markt an. Unser Expert Advisor stellt also 2 Anfragen für diese wenigen Zeilen OrderTakeProfit(); es sieht so aus, als sollte diese Zeile gelöscht werden (double OrderTakeProfit(); )

 
bablusut:

Danke für die Antwort ... Es stellt sich heraus, dass die FunktionStringFind mit ihren Parametern ( string_value, string match_substring, int start_pos=0 ) im allgemeinen Code in einer Zeile geschrieben wird mit

Argumente, die den Daten der Funktionsparameter entsprechen: string OrderComment(), string "[tp]", int 0 und wenn dieser Ausdruck ( in geschweiften Klammern) größer als -1 ist, wird derfolgende Code (in Klammern)ausgeführt

if(StringFind(Bestellkommentar(),"[tp]",0)>-1)

{

double OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," Gewinn: ", OrderTakeProfit());

sonst

Print("OrderSelect() gab Fehler zurück",GetLastError());

bool PlaySound(

string payment // wobei "payment"der Dateiname im MT4 Sound Ordner ist

);

}

... Wird dieser Code in MQL4 funktionieren? ...

Dies wurde bereits erwähnt:double OrderTakeProfit() - tun Sie das nicht. Diese Funktion wird automatisch deklariert und muss nicht erneut deklariert werden. Der Compiler wird einen Fehler erzeugen, da Standardfunktionen nicht vorher deklariert werden müssen.

if(OrderSelect(12, SELECT_BY_POS)==true) - in diesem Fall handelt es sich bestenfalls um eine andere Bestellung und nicht um diejenige, für die der Kommentar oben bearbeitet wurde. Die Reihenfolge muss bereits ganz am Anfang ausgewählt werden, bevorif(StringFind(OrderComment(),"[tp]",0)>-1) und der Schleifenzähler als Argument der Ordnungsnummer verwendet werden, nicht als Konstante, da sonst bei jeder Iteration die zwölfte Reihenfolge geprüft wird.

 
Vitalie Postolache:

Sie haben bereits darüber gesagt:double OrderTakeProfit() - tun Sie das nicht. Diese Funktion wird automatisch deklariert und darf nicht wiederholt deklariert werden. Der Compiler wird einen Fehler erzeugen, da Standardfunktionen nicht vorher deklariert werden müssen.

if(OrderSelect(12, SELECT_BY_POS)==true) - in diesem Fall handelt es sich bestenfalls um eine andere Bestellung und nicht um diejenige, für die der Kommentar oben bearbeitet wurde. Der Auftrag muss bereits ganz am Anfang ausgewählt worden sein, bevorif(StringFind(OrderComment(),"[tp]",0)>-1).

A1exPit:

double OrderTakeProfit(); - hier soll es beim Kompilieren zum Absturz kommen.

Soweit ich es verstehe (ich verstehe es immer noch selbst), OrderTakeProfit(); fordert den Gewinn der Order vom Markt an. Unser Expert Advisor stellt also 2 Anfragen für diese wenigen Zeilen OrderTakeProfit(); es sieht so aus, als sollte diese Zeile gelöscht werden (double OrderTakeProfit(); )

Danke für den Kommentar - Sie hatten Recht.
 
"Vitalie Postolache:

Sie haben bereits darüber gesagt:double OrderTakeProfit() - tun Sie das nicht. Diese Funktion wird automatisch deklariert und darf nicht wiederholt deklariert werden. Der Compiler wird einen Fehler erzeugen, da Standardfunktionen nicht vorher deklariert werden müssen.

if(OrderSelect(12, SELECT_BY_POS)==true) - in diesem Fall handelt es sich bestenfalls um eine andere Bestellung und nicht um diejenige, für die der Kommentar oben bearbeitet wurde. Der Auftrag muss bereits am Anfang ausgewählt sein, bevorif(StringFind(OrderComment(),"[tp]",0)>-1) und wir sollten den Schleifenzähler als Argument der Auftragsnummer setzen, nicht als Konstante.

Danke für die Antwort ... Die Deklaration der Funktiondouble OrderTakeProfit() ist verständlich, lassen Sie uns diese streichen.

"Wenn wir im vorherigen Code nur einen Schleifenzähler haben, mussin der FunktionOrdersHistoryTotal der Schleifenoperator mit dem Rumpf(i=0;i<accTotal;i++) als Argument für die Bestellnummer verwendet werden, was bedeutet, dass wir den Rumpf des Operators durch den Rumpf der FunktionOrderSelect ersetzen sollten, und wir werden es bekommen

if(StringFind(Bestellkommentar(),"[tp]",0)>-1)

{

if(OrderSelect(i=0;i<accTotal;i++)==true)

Print("Order #",OrderTicket()," Gewinn: ", OrderTakeProfit());

sonst

Print("OrderSelect() gab Fehler zurück",GetLastError());

bool PlaySound(

string payment // wobei"payment"der Dateiname im MT4 Sound Ordner ist

);

}

... Wird dieser Code in MQL4 funktionieren? ...




 
bablusut:

Danke für die Antwort ... Die Deklaration der Funktiondouble OrderTakeProfit() ist eindeutig, lassen Sie uns diese löschen.

"Der Schleifenzähler sollte als Argument für die Bestellnummer verwendet werden" - im vorherigen Code haben wir nur einen Schleifenzähler, den Schleifenoperatorin der FunktionOrdersHistoryTotal mit dem Körper(i=0;i<accTotal;i++), das bedeutet, dass wir den Körper des Operators durch den Körperder FunktionOrderSelect ersetzen sollten, und wir werden ihn erhalten:

Nochmals. Bei der Arbeit mit dem Auftrag muss an erster Stelle OrderSelect stehen. Und dann alles andere.

Wenn wir in einer Schleife um den Auftrag arbeiten, ist die Reihenfolge der Operationen wie folgt

1. Prüfen if(OrderSelect())

2. Um zu prüfen, ob es sich um den richtigen Auftrag handelt, werden in der Regel das Symbol und die magische Zahl und dann der Typ geprüft if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - in diesem Fall werden nur Marktaufträge verarbeitet, die für das aktuelle Symbol und mit der angegebenen magischen Zahl erteilt wurden

Verarbeitung anderer Daten wie OrderComment(), OrderProfit(), etc.

Sie würde etwa so aussehen

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}
 
Wie prüfe ich, ob sich ein Signalwert in dem einen oder anderen Puffer des iCustom Indikators befindet?
 
Vitalie Postolache:
Noch einmal. OrderSelect sollte bei der Arbeit mit einem Auftrag an erster Stelle stehen. Dann alles andere.

Sie haben anscheinend durch Versuch und Irrtum entschieden, aber es ist teuer, ich habe es selbst erlebt...

Um ehrlich zu sein, klingeln mir die Ohren...

 
atik441:
Wie überprüfen Sie, ob sich ein Signalwert im Puffer des iCustom Indikators befindet?
Folgen Sie dem Link, er ist in Ihrem Beitrag hervorgehoben.