[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 237

 

Hallo.

Können Sie mir sagen, was mit der folgenden Situation zusammenhängen könnte (der Prüfer gab zunächst das Fehlerticket 15 aus, schloss dann aber trotzdem diesen Auftrag)? Sollte ich dem mehr Aufmerksamkeit schenken?

Ich danke Ihnen im Voraus.

 
nemo811:

Sollte ich ihr mehr Aufmerksamkeit schenken?


Natürlich sollte es keine Fehler geben.
 

Bitte helfen Sie mir.

Liegt hier ein Fehler vor? (Der Code gibt ein Ticket für die letzte SELL-Order des Marktes zurück)

int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=0;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }

Ich danke Ihnen im Voraus.

 
int OrdTicketSell_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicketSell=-1;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_SELL)
           {
            OrdTicketSell=OrderTicket();
           }  
         }  
       }          
     }
   }
   if(OrderTicket()!= OrdTicketSell && OrdTicketSell>=0) OrderSelect(OrdTicketSell, SELECT_BY_TICKET);
   return(OrdTicketSell);
 }
 

Guten Tag.

Interessanter Punkt: in mql4 wird die Variable am Ende des { int var; } Blocks nicht zerstört, daher die Frage, ob es korrekt ist, die Variable in einer Schleife zu deklarieren?

Beispiel:

for(int i = 0; i < 500; i ++)

{

int var; // Was geschieht mit der Variablen während der Iteration?

}

Ich danke Ihnen.

 
sergeev:

Nein - er scheint noch nicht ins Schwarze getroffen zu haben. Der gleiche Fehler schleicht sich ein.

Es gibt noch einen letzten Teil des Codes, der damit zusammenhängen könnte:

     int SchSell=SchSell_b(MAGIC);
     int OrdTicketSell=OrdTicketSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }

Interessant ist, dass der Fehler auftritt, wenn versucht wird, einen Auftrag zu schließen, der zuvor ein Limit-Auftrag war, dann aber ausgelöst und zu einem Marktauftrag wurde. Wenn ein Auftrag, der ursprünglich ein Marktauftrag war, geschlossen wird, tritt der Fehler nicht auf.

 

Ich habe den Fehler gefunden, hier ist der Ausweg:

     int SchSell=SchSell_b(MAGIC);
     double MinLot=MarketInfo(SMB,MODE_MINLOT);

     if(ChastZakr)
      {
       int OrdTicketSell=OrdTicketSell_b(MAGIC);
       if(SchSell>1)
        {  
         OrderClose(OrdTicketSell,OrderLots(),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
         Alert(SMB,": произведено частичное закрытие Sell-позиции, тикет: ",OrdTicketSell,".");
        }   
       else
        {  
         if(SchSellLots>MinLot)
          { 
           OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);
           Alert(SMB,": произведено частичное закрытие Sell-ордера, тикет: ",OrdTicketSell,".");
          }  
        }  
      }
 
nemo811:

Ich habe einen Fehler gefunden, hier ist der Ausweg:


Darf ich Ihnen eine dumme Frage stellen? Eine seltsame Art der Normalisierung

OrderClose(OrdTicketSell,NormalizeDouble(OrderLots()/2,2),MarketInfo(OrderSymbol(), MODE_ASK),Proskalz,CLR_NONE);

Ich kann nicht verstehen, warum das so gemacht wird.

 
Vinin:


Darf ich Ihnen eine dumme Frage stellen? Es ist eine seltsame Normalisierung

Ich kann nicht verstehen, warum das gemacht wird.

Dies ist der Fall, wenn es sich um eine Partie von 0,03 handelt, wobei mindestens 0,01 zulässig ist. Wenn man 0,03 durch 2 teilt, erhält man 0,015, was meines Wissens nach nicht akzeptabel ist. Deshalb habe ich eine solche Normalisierung vorgenommen.

Urteilen Sie nicht zu hart - ich lerne gerade erst )). Aber wenn es ein Fehler ist - korrigieren Sie mich bitte.

 
artmedia70:
Fangen Sie damit an und wir helfen Ihnen dabei. Das sieht nach "Tu es für mich" aus. Da ist so ziemlich alles drin, was man braucht. Jetzt müssen Sie nur noch Take- und Stop-Punkte für Ihre Aufträge in der Schleife festlegen.

so werden die Aufträge eröffnet:

                ticketSell = OpenPendingOrderSell(1, Lots, SellLimit, slip, SellLimit, 0, 0, EAName + "-" + NumOfTradesSell, MagicNumber, 0, HotPink);
                if (ticketSell < 0)
                {
                        Print("Error: ", GetLastError());
                        return (0);
                }

Ich möchte, dass das Skript ein verlustfreies Skript wie dieses berechnet:

wenn

if (totalBuy > 1)
{ то ордерам ticketBuy присвоить цену без убытка + TakeProfitBuy, при достижении этой цены или ниже, закрыть ордера}

я думаю, что можно что то в роде такого сделать:

if (totalBuy > 1 && (без убыток + TakeProfitBuy) >= Bid)
{
CloseAllBuy();
}

wenn

if (totalSell > 1 && (без убыток + TakeProfitSell) <= Ask)
{
CloseAllSell();
}

wenn

if (totalSell > 1 && totalBuy > 1 && (без убыток + TakeProfitSell) >= Ask)
{
CloseAllBuy();
CloseAllSell();
}

wie man diesen Code zur Definition einer verlustfreien Linie richtig in den EA einfügt:

int start()
{
   int b,s;
   double price,price_b,price_s,lot,lot_s,lot_b,SLb,SLs;
   for (int i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {  if (OrderSymbol()==Symbol())
         {
            price = OrderOpenPrice();
            lot   = OrderLots();
            if (OrderType()==OP_BUY ) 
               {price_b = price_b+price*lot; b++;  lot_b=lot_b+lot;}
            if (OrderType()==OP_SELL) 
               {price_s = price_s+price*lot; s++;  lot_s=lot_s+lot;}
   }  }  }
   ObjectDelete("SLb");
   if (b!=0) 
   {  SLb = price_b/lot_b;
      ObjectCreate("SLb",OBJ_ARROW,0,Time[0],SLb,0,0,0,0);                     
      ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLb",OBJPROP_COLOR, Navy);
   }
   ObjectDelete("SLs");
   if (s!=0) 
   {  SLs = price_s/lot_s;
      ObjectCreate("SLs",OBJ_ARROW,0,Time[0],SLs,0,0,0,0);                     
      ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLs",OBJPROP_COLOR, Maroon);
   }
}
Grund der Beschwerde: