Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 408

 
khorosh:
Um die Korrektheit des Codes zu beurteilen, muss man genau wissen, was der Autor erreichen wollte. Ihre Informationen sind unzureichend. Was Sie erreichen wollten, ist nicht ganz klar. Wenn Sie den Verlust nach der Schließung des Gitters ausgleichen wollen, indem Sie eine entgegengesetzte Order eröffnen und erwarten, dass der Preis einige Punkte in Richtung der letzten Order geht, hängt der Ausgleichsprozess sowohl von der Menge dieser Order als auch von der Strecke ab, die der Preis in die günstige Richtung geht. Das bedeutet, dass Sie bei der Berechnung des Loses auch die Strecke festlegen sollten, die der Kurs zurücklegen muss, um den Verlust auszugleichen. Aber vielleicht meinen Sie etwas anderes.


Ja, ich hätte mich genauer ausdrücken sollen. Es ist nur so, dass ich bereits zweimal ausführlich dargelegt habe, was diese Funktion tun soll, aber niemand hat geantwortet. Noch einmal, was diese Funktion tun soll. Angenommen, ich habe ein Raster von Aufträgen. Ob sie mit demselben Schritt geöffnet werden oder nicht, spielt keine Rolle. Eine Order wurde früher und eine andere später eröffnet, d.h. jede Position hat eine andere Anzahl von Punkten mit einem anderen Lot überschritten. Das Netz wird unter bestimmten Bedingungen geschlossen, und ich muss die LOT berechnen, die erforderlich ist, um den Verlust zu decken, der durch dieses Netz für TP-Punkte entsteht. Um zu vermeiden, dass zwei Spiegelfunktionen geschrieben werden, habe ich einen otype-Parameter in die Funktion eingeführt.

Allerdings habe ich irgendwo einen Fehler gemacht. Bitte helfen Sie mit, ihn zu korrigieren.

double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после 
                               //закрытия сетки ордеров
{
  double Lot=0; double TotalLot=0;
  for (int i = OrdersTotal()-1; i>0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
       {
         if (otype == OP_BUY)
         {
           Lot = NormalizeDouble (((OrderOpenPrice()-Bid)*Point)*OrderLots()/TP,2); 
           if (Lot>0)
           {
              TotalLot= TotalLot+Lot;
           }
         }
           
       
         else if (otype == OP_SELL)
         {
           Lot = NormalizeDouble (((Ask-OrderOpenPrice())*Point)*OrderLots()/TP,2);
           if (Lot>0)
           {
            TotalLot= TotalLot+Lot;
           }
           
         }
       }
     }
   }
   return (TotalLot);
   
 }
 
BeerGod:

Gibt es eine Möglichkeit, dies korrekt zu implementieren, so dass die Schließung bei Null beginnt? Wenn möglich, bitte eine Code-Zeile.
Gehen Sie die gesamte Liste (der Aufträge) in der gewünschten Richtung durch und legen Sie die Ticket-Werte in einem Array ab, und löschen Sie dann die Aufträge durch rohe Gewalt in diesem Array.
 
BeerGod:

Gibt es eine Möglichkeit, dies korrekt zu implementieren, so dass die Schließung bei Null beginnt? Wenn möglich, bitte eine Code-Zeile.


Nur eine schnelle Lösung:

//+------------------------------------------------------------------+
//|                 Закрыть все ордера                               |
//+------------------------------------------------------------------+


double ClossAllOrders ()

{
  for(int i=0; i<OrdersTotal(); )
  {
    if ( !OrderSelect(i, SELECT_BY_POS) )
      break;
    
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Lime );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Lime );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Print("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      i++;
      Sleep(500);
    }  
  }
}

// End
 
Trader7777:

Ja, ich hätte mich genauer ausdrücken sollen. Es ist nur so, dass ich bereits zweimal ausführlich dargelegt habe, was diese Funktion tun soll, aber niemand hat geantwortet. Noch einmal, was diese Funktion tun soll. Angenommen, ich habe ein Raster von Aufträgen. Ob sie mit demselben Schritt geöffnet werden oder nicht, spielt keine Rolle. Eine Order wurde früher und eine andere später eröffnet, d.h. jede Position hat eine andere Anzahl von Punkten mit einem anderen Lot überschritten. Das Netz wird unter bestimmten Bedingungen geschlossen, und ich muss die LOT berechnen, die erforderlich ist, um den Verlust zu decken, der durch dieses Netz für TP-Punkte entsteht. Um nicht zwei Spiegelfunktionen zu schreiben, habe ich einen otype-Parameter in die Funktion eingeführt.

Aber irgendwo ist immer noch ein Fehler. Bitte helfen Sie mir, das Problem zu lösen.



Ich würde einen anderen Weg einschlagen. Zunächst würde ich den Verlust durch das Schließen des Netzes berechnen. Und so einfach ist es dann auch. Verlust = Gewinn aus dem nächsten Auftrag. Drücken Sie den Gewinn aus dem Auftrag durch das Lot und den TP aus und finden Sie das Lot aus der Gleichung.
 
Contender:


Ein schneller Handjob:


Vielen Dank, jetzt funktioniert alles einwandfrei, vielen Dank an alle, die geantwortet haben!


 
khorosh:
Ich würde einen anderen Weg einschlagen. Zunächst würde ich den Verlust durch das Schließen des Netzes berechnen. Und so einfach ist es dann auch. Verlust = Gewinn aus dem nächsten Auftrag. Drücken Sie den Gewinn aus dem Auftrag durch das Lot und den TP aus und finden Sie das Lot aus der Gleichung.


Wird der Verlust am Ende des Rasters in Geld oder in Pips angegeben?
 
Trader7777:

Ist der Verlust beim Schließen des Rasters in Geld oder in Pips?
In der Währung der Einlage.
 
Was ist mit der Tatsache, dass jedes Paar einen anderen Punktpreis hat?
 
Trader7777:
Was ist mit der Tatsache, dass jedes Paar einen anderen Punktpreis hat?
Warum sollten Sie das tun wollen?
 
Trader7777:
Was ist mit der Tatsache, dass jedes Paar einen anderen Punktpreis hat?

Hier können Sie sehen, wie es umgesetzt wird


https://www.mql5.com/ru/code/7275

https://www.mql5.com/ru/forum/113937/page2

https://docs.mql4.com/ru/constants/marketinfo