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

 
a196012a:

Ich habe Ihren Code mit einem Block ergänzt, um eine Order mit dem Volumen 0.1 zu eröffnen (direkt nach der Funktion void start())

Aber aus irgendeinem Grund eröffnet das Programm keine Aufträge mit erhöhtem Volumen (jeweils 0,3 Lots) als Reaktion auf die Schließung dieser Aufträge

DIE DINGE, DIE ICH IN IHREM CODE NICHT VERSTEHE

1. Wenn ich richtig verstanden habe, weisen Sie МН=123 nur Aufträgen mit einem Volumen von 0,3 Lots zu.

In der Datetime-Funktion SearTim (int s) suchen Sie nach einem Auftrag mit MH=123, aber mit einem Volumen von 0,1.

Aber der Auftrag mit dem Volumen 0,1 kann nicht МН=123 haben, weil dieses MM nur Aufträgen mit dem Volumen 0,1 zugeordnet ist.

In den Körpern der Funktionen datetime SearTim(int s) und int sear() und insbesondere in den Kommentaren ist es erforderlich, einen Auftrag mit einem Volumen von 0,3 zu eröffnen

Ich verstehe nicht, warum ich einen Auftrag mit einem größeren Volumen zu denselben Bedingungen mehrmals eröffnen muss.

Sie haben bereits im ersten Block Aufträge mit erhöhtem Volumen eröffnet.



Ich wäre Ihnen sehr dankbar, wenn Sie einen Code schreiben könnten, der nach dem Schließen jeder 0,1-Order eine Order mit 0,3 Volumen eröffnet und den Wert von 0,1 beibehält.

In diesem Fall werde ich mein Bestes tun, um alle Antworten auf meine Fragen in Ihrem Code mit Hilfe der Funktion Print (), meinem bescheidenen Wissen und Nachschlagewerken zu finden.

HINWEIS:

Ich habe die gleiche Art von Aufträgen mit 0,1 und 0,3 Volumen - nur SEL. Deshalb müssen wir, wenn ich mich nicht irre, die Auftragsart (BAY oder SEL) in der Funktion int sear() nicht berechnen.

Ich möchte Sie noch einmal daran erinnern, dass das Endziel meines Programms darin besteht, den Stundenwert (keine Minute, keine Sekunde, sondern nur eine Stunde) der Eröffnung einer 0,1-Order zu speichern, nachdem sie zu ihrem Schlusskurs durch eine 0,3-Order geschlossen wurde, die zum SL geschlossen wurde


Es tut mir leid, dass ich Ihnen nicht viel erklären kann, denn Sie müssen die Programmiersprache kennen. Ich denke, Sie sind bereits Programmierer und ich habe mich auf jemanden verlassen, der sich mit Programmierung auskennt.

Sie müssen zuerst programmieren lernen. Wenn ich Ihnen erkläre, was und wie, wird es das Erlernen einer Programmiersprache sein.

Schauen Sie sich Beispiele von EAs an, wie sie geschrieben werden, und versuchen Sie, Programme von Anfang an zu schreiben. Und Sie versuchen, ein Programm zu schreiben, das bereits kompliziert ist.

Schauen Sie sich das Tutorial und die Beispiele an, wie man Befehle und Beispielmodule schreibt.

Dateien:
MQL4.zip  2226 kb
 

Ich spreche diese unkomplizierte Frage an, hier ist der Schlussblock.

Wenn der Gewinn eines Auftrages positiv wird, schließt er diesen Auftrag und auf diesem gesamten Gewinn, wie viel von einer Verlustposition möglich ist. Wenn Perekr aktiviert ist.


Wir müssen es so ändern, dass beide Positionen nur dann geschlossen werden, wenn der Gewinn einer gewinnbringenden Position den Verlust einer verlustbringenden Position vollständig ausgleicht, d. h. wenn der Gewinn der einen Order gleich oder größer ist als der Verlust der anderen.

if(Mas_Tip[1]>0)

     {

      if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))

        {

         Profit=AccountBalance()-StartProfit;

         Askt=NormalizeDouble(Ask,Digits);

         Bidt=NormalizeDouble(Bid,Digits);

         for(int i=1; i<=OrdersTotal(); i++)

           {

            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL && 

               OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

              {

               if(Razn<2)

                 {


                  if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие

                    {

                     double profit=OrderProfit();

                     Print("закрываю по перекрытию");


                     ClosePosBySelect(OrderLots());

                     for(int f=OrdersTotal()-1;f>=0;f--)

                       {

                        if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY && 

                           OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

                          {

                           if(OrderProfit()<0)

                             {

                              if(profit>=MathAbs(OrderProfit()))

                                {

                                 Print("закрываю по перекрытию");


                                 ClosePosBySelect(OrderLots());

                                }

 

Freunde, hallo. Ich brauche etwas Hilfe von einem Neuling.

Ich möchte per E-Mail über das Überschreiten eines Indikators durch den Preis informiert werden. Ich habe verstanden, wie es geht, aber sobald der Übergang vollzogen ist, erhalte ich Hunderte von E-Mails, die so lange gesendet werden, bis die aktuelle Kerze geschlossen ist. Was tun, um nur eine Nachricht zu senden? Hier ist ein Beispiel:

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Kaufsignal", "Kaufsignal");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Verkaufssignal", "Verkaufssignal");

}

 
ev85:

Freunde, hallo. Ich brauche etwas Hilfe von einem Neuling.

Ich möchte per E-Mail über das Überschreiten eines Indikators durch den Preis informiert werden. Ich habe verstanden, wie man das macht, aber sobald der Kurs die Grenze überschreitet, erhalte ich Hunderte von E-Mails, und sie werden so lange verschickt, bis die aktuelle Kerze geschlossen ist. Was tun, um nur eine Nachricht zu senden? Hier ist ein Beispiel:

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Kaufsignal", "Kaufsignal");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Verkaufssignal", "Verkaufssignal");

}

Bei der Parabel ist es einfach, eine Fahne in den Zustand zu setzen. Oder eine einfache Variable vom Typ int, deren Wert sich bei jedem Signal ändert.

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

Guten Tag zusammen, könnten Sie mir bitte mit Trailing Stop helfen. Ich habe einen Trailing Stop unter der Bedingung geschrieben, dass ich zunächst SL = 100 habe und der Trailing Stop ausgelöst werden soll, wenn der Preis 30 Pips über der Positionseröffnung liegt. Aber es ändert sich sofort, nachdem die Position eröffnet wurde, und ändert den Standard-SL auf 30 und verschiebt ihn dann.

void Trailing()

{

int SLoss = 1;

double StopL = NormalizeDouble (OrderOpenPrice() + SLoss*Point, Digits);

double StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Digits);

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

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderType() == OP_BUY && OrderStopLoss() >= StopL)

{

wenn (Bid - StopL > TrailingStop*Point)

{

wenn (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))

Print("Fehler bei der Auftragsänderung!");

}

}

}

if (OrderType() == OP_SELL && OrderStopLoss() <= StopL2)

{

wenn (StopL2 - Ask > TrailingStop*Point)

{

wenn (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))

Print("Fehler bei der Auftragsänderung!");

}

}

}

}

}

}

}

 
Alexey Viktorov:

Bei der Parabel ist es einfach, eine Fahne in den Zustand zu setzen. Oder eine einfache Variable vom Typ int, deren Wert sich mit jedem Signal ändert.

Vergessen Sie einfach else - sonst bleibt die statische Variable nach dem ersten Signal wahr
 
AlGuru:

Guten Tag zusammen, könnten Sie mir bitte mit Trailing Stop helfen. Ich habe einen Trailing Stop unter der Bedingung geschrieben, dass ich zunächst SL = 100 habe und der Trailing Stop ausgelöst werden soll, wenn der Preis 30 Pips über der Positionseröffnung liegt. Es wird sie direkt nach dem Öffnen der Position ändern und die Standard-SL auf 30 ändern und dann verschieben.

...
Wie kann es helfen? Ich habe dort eine Vorlage gepostet, aus der Sie sich das machen können, was Sie wollen.
 
Artyom Trishkin:
Ich habe nur vergessen, dass sonst die statische Variable nach dem ersten Signal wahr bleibt

Was hat es mit der Elza auf sich? Ich denke, flag == true; oder flag == false; was im Code steht

if(flag && ****

if(! flag && ****

Wenn es eine Kreuzung auf der einen Seite gibt, warten wir auf eine Kreuzung auf der anderen Seite... Und damit ist der Kreis geschlossen. Aber wie man es am Anfang richtig anschließt, soll er sich selbst überlegen. Oder fragen Sie ihn später...

 
Alexey Viktorov:

Wozu ist die Elza da drin? Ich denke, flag == true; oder flag == false; was im Code steht

Wenn wir die eine Seite überqueren, warten wir auf den Übergang zur anderen Seite... ...und so ist der Kreislauf geschlossen. Aber wie man es beim ersten Start richtig anschließt, soll er selbst herausfinden. Oder fragen Sie ihn später...

Wenn es zwei Signale auf verschiedenen Balken in einer Richtung gibt?

Sie haben nur Schwung.

Die Signale sollten jedoch immer dann gesendet werden, wenn ein Signal vorhanden ist, aber die Entscheidung, ein Signal zu geben, wird separat getroffen.

Meiner Meinung nach wäre es optimal, für jede Richtung eine eigene Flagge zu haben und diese hin und her zu schalten. Aber nicht so, dass die Signale der einen Richtung von den Signalen der anderen Richtung abhängen.

 
Artyom Trishkin:

Wenn die beiden Signale auf verschiedenen Balken in dieselbe Richtung zeigen?

Sie bekommen nur einen Schlag.

Die Signale sollten jedoch immer dann gesendet werden, wenn ein Signal vorhanden ist, aber die Entscheidung, ein Signal zu geben, wird separat getroffen.

Meiner Meinung nach ist es optimal, für jede Richtung eine eigene Flagge zu haben und diese hin und her zu schalten. Aber nicht so, dass die Signale der einen Richtung von den Signalen der anderen Richtung abhängen.

Artem, ich habe meine Antwort an Sie mit den folgenden Worten begonnen

Die Parabel hat einen strengen Wechsel, zwei Signale in einer Richtung, auch auf verschiedenen Balken, sind unmöglich. Und dafür braucht man gar nichts zu erfinden, es klappert auch bei Nullbars nicht wie der MA.