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

 
trader781:
Du wirst den letzten Verlierer bekommen, was damit zu tun ist und welche Parameter du für dich selbst einstellen musst, das wirst du schon herausfinden.

Danke, ich glaube, ich habe es verstanden.

Wie kann ich erreichen, dass das Los nach der Gewinnmitnahme wieder seinen ursprünglichen Wert erreicht?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
so funktioniert es nicht)
 
wishmast:

Danke, ich glaube, ich habe es verstanden.

Wie kann ich erreichen, dass das Los nach der Gewinnmitnahme wieder auf seinen ursprünglichen Wert zurückfällt?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
so funktioniert es nicht)

Ich habe das folgende Schema

if (AufträgeSumme()==0)

{

offen mit Anfangspartie

}

sonst

...

d.h. wenn es keine Aufträge gibt, wird es nicht mit der alten Partie eröffnet

Natürlich ist es möglich, sich jede Reihenfolge einzuprägen, aber sie sagen uns nicht, wie man das macht.
 
Vitalie Postolache:
Ein Zähler sollte gestartet und auf seinen Anfangswert zurückgesetzt werden, wenn ein bestimmter Schwellenwert erreicht wird:

Ich danke Ihnen.

Helfen Sie mir, ein Problem zu lösen.
Es gibt 3 Kaufpositionen, eine Verkaufsposition ist aufgetaucht, wir müssen die Verkaufsposition und die älteste Kaufposition schließen. Zwei Kaufpositionen sollten bestehen bleiben.
Ich habe sie alle geschlossen.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

Erklären Sie, warum die Funktion OrderProfit()<0 nicht funktioniert?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

Ich möchte sehen, wie viele Stop-Losses es pro Wochentag gibt.

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

und hier denke ich, dass es derselbe Grund ist, warum es nicht funktioniert

 
wishmast:

Erklären Sie, warum die Funktion OrderProfit()<0 nicht funktioniert?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

Ich möchte sehen, wie viele Stop-Losses es pro Wochentag gibt.

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

und hier nehme ich an, dass es derselbe Grund ist, warum es nicht funktioniert

Denn DayOfWeek() gibt die Ordnungszahl des Wochentags der letzten bekannten Serverzeit zurück.

Und Sie benötigen den Wochentag des Auftragsschlusses: TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin:

Denn DayOfWeek() gibt die Ordnungszahl des Wochentags der letzten bekannten Serverzeit zurück.

Und Sie benötigen den Wochentag des Auftragsschlusses: TimeDayOfWeek(OrderCloseTime());

Aber das Ergebnis ist das gleiche, als ob ignorieren, wenn(OrderProfit()<0) und es ist eine Schleife, Variablen erhalten große Werte.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

Ich habe sie hier falsch kopiert und das Vorzeichenif(OrderProfit()>0&&OrderType()<2) korrigiert, aber das ändert nichts am Kern der Sache, die Schleife funktioniert auch ohne diese Bedingung korrekt.

 
wishmast:

Aber das Ergebnis ist dasselbe, dennwenn(OrderProfit()<0) ignoriert wird und es eine Schleife gibt, haben die Variablen große Werte.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

Und über die Schleife mit viel? Ich habe es hier falsch kopiert, korrigiert das Zeichenif(OrderProfit()>0&&OrderType()<2), aber es ändert nicht das Wesen, die Schleife funktioniert richtig ohne diese Bedingung.

Wo werden Tag1 und Tag2 angegeben?
 
Artyom Trishkin:
Wo werden Tag1 und Tag2 angegeben?
als global, am Anfang, vor OnTick () und vor allen Funktionen
 
Artyom Trishkin:
Wo werden Tag1 und Tag2 angegeben?

Ich vermute, dass ich die Reihenfolge falsch auswähle, es funktioniert nicht(OrderProfit()<0), ich muss genauer sein, welche Reihenfolge ich brauche. Ich weiß nicht, warum eine Bestellung übersprungen wird, wenn die letzte am Take-Point abgeschlossen wurde und es keine weiteren gibt. Vielleicht sollte die Schleife anders aufgebaut werden, wenn ich die Historie durchsuchen möchte?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

Der Grund dafür ist, dass Expert Advisors Schleifen mit ähnlichen Bedingungen erstellen und diese wie gewünscht funktionieren, aber sie arbeiten mitOrdersTotal().

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
Ich danke Ihnen.

Helfen Sie mir, ein Problem zu lösen.
Es gibt 3 Kaufpositionen, eine Verkaufsposition ist aufgetaucht, wir müssen die Verkaufsposition und die älteste Kaufposition schließen. Zwei Kaufpositionen sollten bestehen bleiben.
Sie sind alle geschlossen.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

Dies kann nicht in einem einzigen Zyklus gelöst werden. In dieser Schleife sollten Sie sich die Ticker der zu löschenden Aufträge im Array merken, in der nächsten Schleife sollten Sie sie nach Tickern löschen.

Darüber hinaus haben Sie ein Durcheinander mit geschweiften Klammern, Sie arbeiten mit Aufträgen außerhalb desOrderSelect{}-Blocks, das ist nicht korrekt.