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

 
Rustam Bikbulatov:
Hallo, ich brauche einen Rat. Warum wird mein letzter Text nicht angezeigt? Was ist hier falsch? Können Sie mir bitte sagen, wie man das beheben kann?

Wozu brauchen Sie eine Schleife, wenn Sie immer nur den Namen eines Objekts nehmen?

for(int no1=0; no1<ObjectsTotal(OBJ_TEXT); no1++)
  {
   if(ObjectName(0)=="Profit1"+iBarShift(NULL,1440,0))
     {
      double name;
      name = ObjectDescription(0);;
      Comment(name);
     }
  }
 

Iurii Tokman:

no1<=ObjectsTotal(OBJ_TEXT);

Dies ist nicht möglich, da es den Rahmen des Arrays sprengen würde. Wenn es 10 Objekte gibt, ist der Index des letzten Objekts 9. Denn sie zählt von Null an.

 
Artyom Trishkin:

Wozu eine Schleife, wenn man nur den Namen eines Objekts auf einmal nimmt?

sagen Sie mir genau, wie ich den vorletzten Text dieses Objekts bestimmen kann.

 
Rustam Bikbulatov:

sagen Sie mir genau, wie ich den vorletzten Text dieses Objekts bestimmen kann.

Es ist schwer zu wissen, was man will.

 
void Profit()
  {
   ObjectCreate("Profit"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.6);
   ObjectSetText("Profit"+iBarShift(NULL,1440,0),DoubleToStr(AccountProfit(),2),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit1()
  {
   double  Prof = ObjectDescription("Profit1"+iBarShift(NULL,1440,0));
   double  P = -Prof;
   ObjectCreate("Profit1"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.1);
   ObjectSetText("Profit1"+iBarShift(NULL,1440,0),DoubleToStr(MathMax(-AccountProfit(),-P),1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit1"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit2()
  {
   ObjectCreate("Profit2"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.4);
   ObjectSetText("Profit2"+iBarShift(NULL,1440,0),iBarShift(NULL,1440,0)-1000,11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit2"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit3()
  {
   for(int no1=0; no1<=ObjectsTotal(OBJ_TEXT); no1++)
     {
      if(ObjectFind(1,"Profit2"+iBarShift(NULL,1440,0))!=0)
        {

         string   obj_name;
         obj_name = ObjectName(3);
         string   name;
         name = ObjectDescription(obj_name);
         Comment(obj_name);
        }
     }

   ObjectCreate("Profit3"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.9);
   ObjectSetText("Profit3"+iBarShift(NULL,1440,0),DoubleToStr(name,1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit3"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }

Provit - zeigt die Gesamtgewinne während des Tests am Tag an

Provit1 - zeigt die maximale Absenkung für den Tag an

Provit2 - normale numerische Zeile, beginnend mit eins

Provit3 - Ziel! Addieren Sie Provit1 und dividieren Sie durch Provit2. Ich möchte den durchschnittlichen täglichen Drawdown für die gesamte Dauer des Tests wissen. Hilfe zum Verständnis von Provit3

 

Liebe Kolleginnen und Kollegen - was könnte dieser Fehler sein und wie kann man ihn beheben? Hier ist der Code unten, wenn der Gewinn überschritten wird - schließen Sie alle unidirektionalen Positionen. Ich danke Ihnen.

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     if(takeprofit < ProfitB)    
      {   
        Print(" ЗАКРЫТИЕ BUY POSITIONS. общий ProfitB = ", ProfitB," мин общий takeprofit buys positions = ", takeprofit);   
        for (i=OrdersTotal()-1; i>=0; i--)         
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {             
             if(OrderType()==OP_BUY)    
                             //if(OrderOpenPrice()+takeprofit*Point<=MarketInfo(Symbol(),MODE_BID) || 
                             //   OrderOpenPrice()-stoploss*Point>=MarketInfo(Symbol(),MODE_BID))   
                     
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray))  
                   Print(" закрытие бай, тикет = ", OrderTicket());
               else  Print(" ошибка закрытия бай, Error = ", GetLastError());          
            }
       }     
      
       if(takeprofit < ProfitS)     
        { 
         Print(" ЗАКРЫТИЕ СЕЛЛов. общий ProfitS = ", ProfitS," мин общий takeprofit СЕЛЛов = ", takeprofit);   
 
         for (i=OrdersTotal()-1; i>=0; i--)      
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {                       
             if(OrderType()==OP_SELL)    
                             //  if(OrderOpenPrice()-takeprofit*Point>=MarketInfo(Symbol(),MODE_ASK) ||
                             //     OrderOpenPrice()+stoploss  *Point<=MarketInfo(Symbol(),MODE_ASK))                
             
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray)) 
                   Print(" закрытие SELL,  тикет = ", OrderTicket());
               else   Print(" ошибка закрытия sell, Error = ", GetLastError());     
            }       
         }    
           
 
Roman Shiredchenko:

Kolleginnen und Kollegen - was kann das für ein Abschlussfehler sein und wie geht man damit um? Wenn ich den nachstehenden Code verwenden möchte, muss ich alle einseitigen Positionen schließen, wenn sie rentabel sind. Ich danke Ihnen.

Was ist der Fehler? falscher Bildschirm

Theoretisch sollte es funktionieren, aber ich habe noch keine so ausgeklügelte Schließung gesehen, die den Spread berücksichtigt und ihn als Slippage hinzufügt - imho ist Slippage nicht das Wichtigste, worauf man achten muss, wenn man sich für eine Schließung entscheidet, wichtiger sind Schließungsfehler, dann Requotes, dann ist die Verbindung komplett verloren


Nehmen Sie OrderClose(....) weg und ersetzen Sie es durch Kims ClosePosBySelect()https://www.mql5.com/ru/forum/131859/page2#comment_3359664

verwenden, dann werden Sie deutlich sehen, wo es bricht - entweder in Ihren Abschlussbedingungen oder der Server hat einen Fehler

 
Igor Makanu:

Was ist der Fehler? falscher Bildschirm

Theoretisch sollte es funktionieren, aber ich habe noch kein so ausgeklügeltes Schließen gesehen, das den Spread berücksichtigt und ihn als Slippage hinzufügt - imho ist Slippage nicht das Wichtigste, worauf man achten muss, wenn man sich zum Schließen entschieden hat, wichtiger sind Schließungsfehler, dann Requotes, dann geht die Verbindung komplett verloren


OrderClose(....) entfernen und das Ticket stattdessen an Kims ClosePosBySelect() übergeben, dann wird klar, wo es nicht funktioniert - entweder in Ihren Abschlussbedingungen oder der Server hat einen Fehler

Er hat dort einen Preis von Null nahe. Dementsprechend müssen wir kontrollieren, was von der MarketInfo-Funktion zurückgegeben wurde, aber es gibt keine Kontrolle. Doch wie üblich auf vier, sind einige Leute verwendet werden, um zu schreiben - etwas erhalten, was - nicht überprüfen, aber ein Argument gesendet.

 
Artyom Trishkin:

Er hat dort einen Preis von Null nahe. Dementsprechend müssen wir kontrollieren, was von der MarketInfo-Funktion zurückgegeben wurde, aber es gibt keine Kontrolle. Allerdings, wie üblich auf die vier einige Leute verwendet werden, um zu schreiben - etwas erhalten, was - nicht überprüfen, aber das Argument gesendet.

Ich habe es gesehen, ich bezweifle, dass er in der Lage sein wird, alles selbst rückgängig zu machen, deshalb schlug ich vor, geprüfte ClosePosBySelect() zu verwenden, um die ausgewählte Bestellung überOrderSelect( ) zu schließen - er kann das tun, zumindest habe ich gesehen, wie er Codes mit Konstruktor zusammenstellt )))

SZY: Ich habe einen weiteren Verdacht, dass ein Auftrag zweimal geschlossen wird, aber die Funktion von Kim druckt in das Protokoll, es scheint, dass es keine separaten Schleifen gibt, die durch die zweite Bedingung geschlossen werden

 
Igor Makanu:

Ich habe es gesehen, ich bezweifle, dass es in der Lage sein wird, alles von selbst zu entprimpen, deshalb habe ich vorgeschlagen, den bewährten Abschluss einer markierten Bestellung über OrderSelect() zu verwenden

Sicher, Igors Funktionen werden alles für den Benutzer tun (und sogar einige Benutzer schaffen es, einen Fehler mit ihnen zu machen). Aber in diesem Fall wird er nie lernen, selbst etwas zu tun. Obwohl, natürlich - ihre Wahl.