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

 
Artyom Trishkin:

Niemand hat Sie einen "Trottel" genannt, das ist nicht wahr. Aber auch 4-6 Zeilen Code sorgen für Verwirrung - denn wenn ein Mensch etwas lernt, muss er schon etwas ausprobieren, er hat schon versucht, etwas zu schreiben, und sieht deutlich, dass 4-6 Zeilen nicht dazu passen.

Zeigen Sie uns, was Sie zu tun versucht haben - wir wollen versuchen, es zu verstehen.

Ich kann eine alternative, vereinfachte Variante anbieten - suchen Sie nicht nach einem Preisniveauübergang nach Ticks, sondern nach MA(1) - dann werden der MA auf Bar 1 und der MA auf Bar 0 als Indikator für den notwendigen Niveauübergang verwendet.


Entschuldigen Sie die lange Verzögerung bei der Beantwortung. Ich bin froh, dass es sich als bloße Verwirrung herausstellte, ich war verwirrt. Und was meine Frage betrifft, so ist es mir gelungen, einen Code zu schreiben, der einen normalen Auftrag öffnet, wenn er den Preis erreicht, und der nach Überschreiten dieses Preises nicht wieder geöffnet wird. Aber ich habe es auf diese Weise gemacht:
double b = 5;
int start()
{
Doppeltes Gebot = Gebot;
wenn (bid==0.7777 && b==5)
{
b=b+1;
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0,0,0);
}

Rückkehr;

Ich habe bereits verstanden, dass dies eine "Kindergarten"-Methode ist, die nicht angewandt werden kann, weil es zu viele Nuancen gibt und sie überhaupt nicht praktisch ist. Können Sie sagen, in welcher Situation dieser Code nicht funktioniert, oder wie Sie ihn ändern können, damit er funktioniert? P.s. "suchen Sie es auf MA(1) - dann MA auf bar 1 und MA auf bar 0 wird Ihnen als Indikator für die Überschreitung der Ebene, die Sie wollen dienen. "Ich weiß nicht wirklich, worum es geht, also kann ich es vorerst aufschieben, bis ich mehr Material studiert habe.


 
maxon777:

Entschuldigung, dass ich so lange gebraucht habe, um zu antworten. Ich bin froh, dass es sich nur als Verwirrung herausstellte, ich war verwirrt. Und was meine Frage betrifft, so ist es mir gelungen, einen Code zu schreiben, der einen normalen Auftrag öffnet, wenn er den Preis erreicht, und der nach Überschreiten dieses Preises nicht wieder geöffnet wird. Aber ich habe es auf diese Weise gemacht:
double b = 5;
int start()
{
Doppeltes Gebot = Gebot;
wenn (bid==0.7777 && b==5)
{
b=b+1;
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0,0,0);
}

Rückkehr;

Ich habe bereits verstanden, dass dies eine "Kindergarten"-Methode ist, die nicht angewandt werden kann, weil es zu viele Nuancen gibt und sie überhaupt nicht praktisch ist. Können Sie sagen, in welcher Situation dieser Code nicht funktioniert, oder wie Sie ihn ändern können, damit er funktioniert? P.s. "suchen Sie es auf MA(1) - dann MA auf bar 1 und MA auf bar 0 wird als Indikator für die Überschreitung der Ebene, die Sie benötigen dienen. "Ich weiß nicht wirklich, worum es hier geht, also kann das erst einmal verschoben werden, bis ich mehr Material erfahre.



Vergleich auf Gleichheit zweier Zahlen, Typ double, das ist keine gute Operation.

Zum Beispiel:NormalizeDouble(A - B , 5)==0, denke ich.

 

Guten Abend zusammen!

Bitte helfen Sie mir, ich kann keinen Fehler im Code finden.

Ich muss feststellen, ob ich einen Gewinn auf mein Paar hatte und wenn ich tat, ich sollte nicht weiter handeln und schließen Sie die EA.

einen schwebenden Auftrag erteilen.

Das Problem ist, dass wenn ich den EA ausführe, er sofort gelöscht wird, d.h.ExpertRemove() wird ausgelöst, obwohl ich noch keinen Gewinn erzielt habe.

Nachfolgend finden Sie einige Codes:

void OnTick()

{

wenn (TakeProfit ()>0)

{

ExpertRemove();

}

wenn (TakeProfit ()<=0)

{

Hier legen wir eine Pause ein

}

}

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

////////Überprüfen Sie, ob hier Geschäfte mit Gewinn abgeschlossen wurden!!!!!!!!

int Gewinnmitnahme ()

{

int count = 0;

for(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect (i,SELECT_BY_POS,MODE_HISTORY) == true && OrderMagicNumber() == Magic && OrderSymbol () == Symbol () && OrderProfit()>0,0)

{

zählen ++;

}

}

zurückgeben (count);




 
yaaarik777:

Guten Abend zusammen!

Bitte helfen Sie mir, ich kann keinen Fehler im Code finden.

Ich muss feststellen, ob ich einen Gewinn auf mein Paar hatte und wenn ich tat, ich sollte nicht weiter handeln und schließen Sie die EA.

einen schwebenden Auftrag erteilen.

Das Problem ist, dass wenn ich den EA ausführe, er sofort gelöscht wird, d.h. ExpertRemove() wird ausgelöst, obwohl ich noch keinen Gewinn erzielt habe.

Nachstehend finden Sie einen Teil des Codes:

////////Suchen Sie, ob es ... geschlossen mit Gewinn!!!!!!!!

int Gewinnmitnahme ()

{

int count = 0;

for(int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (OrderSelect (i,SELECT_BY_POS,MODE_HISTORY) == true && OrderMagicNumber() == Magic && OrderSymbol () == Symbol () && OrderProfit()>0,0)

{

zählen ++;

}

}

zurückgeben (count);

Wonach suchen Sie bei diesem Code?

Es wird der Gewinn der gesamten Historie betrachtet, nicht nur der einer geschlossenen Position, und wenn die gesamte Historie positiv ist, dann erhalten Sie auf jeden Fall OrderProfit()>0

 
Vitaly Muzichenko:

Wonach suchen Sie mit diesem Code?

Es wird nach einem Gewinn für die gesamte Historie gesucht, nicht speziell für eine geschlossene Position, und wenn die gesamte Historie positiv ist, dann erhalten Sie in jedem Szenario OrderProfit()>0 in der Ausgabe


Wie kann ich die Suche nicht nach der gesamten Geschichte, sondern nach geschlossenen Positionen ab dem Zeitpunkt der Arbeit des Beraters durchführen?

Das verstehe ich nicht.

Das verstehe ich nicht.

 
yaaarik777:


Wie kann ich erreichen, dass nicht der gesamte EA durchsucht wird, sondern nur die geschlossenen EAs ab dem Zeitpunkt, an dem der EA in Betrieb ist?

Das verstehe ich nicht.

Vielen Dank für die Hilfe.

Finden Sie die letzte geschlossene Position, die später als der Zeitpunkt des EA-Starts geschlossen wurde, oder die letzte geschlossene an diesem Tag, und sehen Sie deren Gewinn: OrderProfit()+OrderComission()+OrderSwap()
 
yaaarik777:


Wie kann ich erreichen, dass nicht der gesamte EA durchsucht wird, sondern nur die geschlossenen EAs ab dem Zeitpunkt, an dem der EA in Betrieb ist?

Das verstehe ich nicht.

Ich danke Ihnen für Ihre Hilfe.


Wie kann man feststellen, wann der EA funktioniert?

Hier ist mein Vorschlag;

double TakeProfit ()
{
 datetime момент работы советника=0;
 double p=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--){
    if (OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)){
       if (OrderMagicNumber() == Magic){
          if(OrderSymbol () == Symbol ()){
            if(момент работы советника<OrderCloseTime()){
               p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
 return(p);
}
   
 
Artyom Trishkin:
Finden Sie die letzte geschlossene Position, die später als der Zeitpunkt des EA-Starts geschlossen wurde, oder die letzte geschlossene an diesem Tag, und sehen Sie deren Gewinn: OrderProfit()+OrderComission()+OrderSwap()


Warum muss ich nach allen geschlossenen Positionen suchen, die später als der Startzeitpunkt des EA liegen?

Ich möchte, dass die Suche ab dem Start des EA beginnt, nicht vorher.

 
yaaarik777:


Warum später als die Startzeit des EA? Ich lasse ihn bereits nach allen geschlossenen Positionen suchen.

Sie müssen ab dem Beginn des EAs suchen, nicht vorher.


Wenn Sie darüber nachdenken, ist "von Anfang an und darüber hinaus" nach der Startzeit des EA ;)

Seien Sie nicht zu faul, das interaurale Organ zu benutzen.

 

Hallo.

Bitte helfen Sie mir, Daten aus einer Datei als Histogramm anzuzeigen.

In der Datei "file.txt" entspricht ein Datum einer Zahl.

Ich empfange Daten aus der Datei und drucke sie aus,