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

 

Guten Tag, meine Herren. )) Entschuldigung für den Amateurismus...

Ich verstehe nicht, wie OrderClose funktioniert :(

Ich brauche maximal 1 Auftrag, d.h. bevor ich einen neuen Auftrag eröffne, möchte ich, dass der vorherige abgeschlossen wird...

Warum funktioniert es nicht auf diese Weise?


OrderClose(nom, 0.01, Bid,5, Red);

OrderSend(Symbol(), OP_SELL, 0.01 , NormalizeDouble(Bid,5), 3 , NormalizeDouble(Ask+0.0005,5), NormalizeDouble(Bid-0.0008,5), "", nom,0,Red);


das Protokoll flucht im Grunde über ein ungültiges Ticket.

in OrderClose anstelle von nom, was soll ich eintragen? oder denke ich überhaupt in die falsche Richtung?)

 
Sergey Voytsekhovsky:

Versuchen Sie minStopLoss = Aktueller Kurs +/- (MaxValue(2*Spread, StopLoss));

Ich habe es versucht. Zwei Spreads ist 24, wird nicht so funktionieren, beginnt bei 19 vom Schlusskurs zu arbeiten. Ab dem aktuellen Eröffnungskurs wird mit drei Spreads gearbeitet.
Ich erhöhte den Stopp um einen Punkt in der Schleife und eröffnete einen Auftrag. Sie wurde am 19. Die Frage ist nicht, wie man sie einstellt. Die Frage ist, wie man richtig rechnet. Es gibt keine Preise; sie werden bei der manuellen Eröffnung eines Auftrags angezeigt, wenn Sie den Stopp mit der Schaltfläche Stopp setzen. Das ist lächerlich. Ich lese dieses Forum in Massen. Ich habe einige Funktionen auf der 7. Seite gefunden (Nachricht #65). Ich werde Ihnen Bescheid geben, wenn ich es überprüft habe.

 
Sergey Voytsekhovsky:

Ich habe es studiert, aber nichts Neues, offenbar ist es (neu für mich) natürlich, offensichtlich für alle Eingeweihten, selbsterklärend. Ich konnte nichts Neues finden, außer der oben beschriebenen Eigenschaft der gegenseitigen Anordnung von Puffern während der Indizierung. Diese Sequenz respektiert, bekam ein noch kitschigeres Bild.

Bilder unten, Datei im Anhang

Vielleicht haben Sie Pech, aber ich mag es nicht, im Code anderer Leute herumzustochern. Umso mehr, wenn es darum geht, sie zu reparieren...

Die nächste Frage: Wie oft, glauben Sie, wird der Indikatorwert genau 50 betragen?

         ColorHistogram_2Buffer1[i]=50; 

So wie ich das Problem verstanden habe, sollte es eine Farbe >50 und eine andere <50 sein, aber ich habe keine ==50 gesehen. Um den Verlust im Fall ==50 auszuschließen, müssen wir natürlich einen der Vergleiche >=50 oder einen anderen <=50 hinzufügen, wie es die Religion erlaubt. Es könnte besser aussehen.

Und die zweite Frage: Wie oft, glauben Sie, war es notwendig, die gesamte Indizierung der Puffer zu ändern? Haben Sie nach der Neuindizierung alles im Code genau festgelegt? Vielleicht wäre es einfacher, den Farbpuffer auf Index 4 und die Hilfspuffer 5 und 6 entsprechend zu setzen. Es wäre weniger notwendig, den Text zu bearbeiten, und die Wahrscheinlichkeit, dass weitere Fehler auftreten, wäre geringer.

 
klok79:
Ich habe es versucht. Zwei Spreads ist 24, wird nicht so funktionieren, beginnt bei 19 vom Schlusskurs zu arbeiten. Ausgehend vom aktuellen Eröffnungskurs arbeitet er mit drei Spreads.
Ich erhöhte den Stopp um einen Punkt in der Schleife und eröffnete den Auftrag. Mit 19 wurde sie eröffnet. Es geht nicht darum, wie man auswählt. Die Frage ist, wie man richtig rechnet. Es werden keine Preise angezeigt, wenn ich einen Auftrag manuell eröffne, wenn ich mit der Schaltfläche einen Stopp setze. Das ist lächerlich. Ich lese dieses Forum in Massen. Ich habe einige Funktionen auf der 7. Seite gefunden (Nachricht #65). Ich werde das überprüfen und berichten.

Geprüft. Werke
Das ist alles seltsam, es sagt dasselbe minStopLoss = Current Price +/- (max value(2*Spread, StopLoss)), nur unter Current Price verstehen wir nicht den offenen Preis der Order, sondern den Spiegelpreis.
Warum ist die Doppelseite geeignet?
Es stellen sich zwei weitere Fragen.
1. Warum wird SymbolInfoInteger verwendet, um Digits() und Point(); Werte zu erhalten?
2. Warum wird vor dem Aufruf der Funktion SymbolInfoInteger ein Eintrag (int) verwendet? Soweit ich weiß, handelt es sich um eine Zwangsumwandlung.

 
klok79:

Ich habe es überprüft. Es funktioniert
Das ist alles seltsam, sie schreiben immer noch das gleiche minStopLoss = Current Price +/- (maxZen(2*Spread, StopLoss)), aber der Current Price ist nicht der Eröffnungskurs der Order, sondern der Spiegelkurs.
Warum ist die Doppelseite geeignet?
Es stellen sich zwei weitere Fragen.
1. Warum wird SymbolInfoInteger verwendet, um Digits() und Point(); Werte zu erhalten?
2. Warum wird vor dem Aufruf der Funktion SymbolInfoInteger ein Eintrag (int) verwendet? Soweit ich weiß, handelt es sich um eine Zwangsumwandlung.

Um Punkt() zu erhalten, wird SymbolInfoInteger in keiner Weise funktionieren.))

Im Allgemeinen ist zu beachten, dass Point() oder _Point nur für das aktuelle Symbol gilt. Für andere Zeichen als das, mit dem der EA arbeitet, müssen Sie genau diese Funktion verwenden.

Die Funktion SymbolInfoInteger liefert nicht nur int-Werte, sondern auch long, bool und Aufzählungen.

 

Sergey Voytsekhovsky, vielen Dank für Ihre Hilfe. Und noch eine Frage, wenn es Ihnen nichts ausmacht, schlagen Sie bitte die umgekehrte Funktion zur FunktionCharToStr
vor(um einen Code aus einem Symbol zu erhalten), denn ich habe Funktionen dafür in Beisic und Delphi, aber in C++ gibt es, soweit ich weiß, zwei Methoden:
1 -Ascii_cod-Funktion, die nicht in mql4 enthalten ist
2. - Direkte Typkonvertierung. Mein Code lautet jedoch
string st="A";
Print ("Zeichencode A=",(int)st);

Gibt Text aus Zeichencode A=0.

Was ist zu tun?

 
klok79:

Sergey Voytsekhovsky, ich danke Ihnen für Ihre Hilfe. Und eine weitere Frage, wenn Sie nichts dagegen haben, könnten Sie die Funktion Reverse-FunktionCharToStr
(um seinen Code von einem Symbol zu erhalten)vorschlagen, denn ich habe Funktionen für es in Beisic und Delphi, aber in C++, wie ich es verstehe, gibt es zwei Methoden:
1 -Ascii_cod-Funktion, die nicht in mql4 enthalten ist
2. - Direkte Typkonvertierung. Mein Code lautet jedoch
string st="A";
Print ("Zeichencode A=",(int)st);

Gibt Text aus Zeichencode A=0.

Was ist zu tun?

StringToCharArray konvertiert im Gegensatz zur Wiki-Funktion nicht nur ein Zeichen auf einmal, sondern kann eine Zeichenkette in ein Array vom Typ ucar mit den Codes aller Zeichen der Zeichenkette konvertieren .

mql4 hat ebenfalls eine solche Funktion.

Документация по MQL5: Преобразование данных / StringToCharArray
Документация по MQL5: Преобразование данных / StringToCharArray
  • www.mql5.com
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. [in]  Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо...
 
Alexey Viktorov:

Um Punkt() zu erhalten, wird SymbolInfoInteger in keiner Weise funktionieren.))

Im Allgemeinen ist zu beachten, dass Point() oder _Point nur für das aktuelle Symbol gilt. Für andere Zeichen als die, mit denen der Expert Advisor arbeitet, sollten Sie diese Funktion verwenden.

Die Funktion SymbolInfoInteger liefert nicht nur int-Werte, sondern auch long, bool und Aufzählungen.

Eigentlich hat Point den doppelten Wert. Dies bedeutet, dass wir es von SymbolInfoDouble aus aufrufen sollten

 
Konstantin Nikitin:

Nun, Point hat eigentlich einen Wert von Double. Dies bedeutet, dass die Anfrage von SymbolInfoDouble gestellt werden sollte.

Es geht um diese Funktionen für MQL4 aus Beitrag #65:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+

Ich habe nicht gesehen, wo Point über SymbolInfoInteger() erhalten wird.

 
Artyom Trishkin:

Es geht um die MQL4-Funktionen aus Beitrag #65:

Ich habe nicht gesehen, wo Point über SymbolInfoInteger() erhalten wird.

Ja, dasselbe. Wir sind da durchgerutscht. Die Hauptsache ist, dass er versteht, was los ist...