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

 
LBatters:

Hallo zusammen)

Ich habe versucht, eine Funktion zu schreiben, um einen Teil der Position zu schließen, aber wenn ich den Tester ausführe, erscheint 138 ein Fehler, ich verstehe nicht, was das Problem ist, bitte helfen Sie mir.

Hier ist ein EA, in dem diese Funktion funktionieren sollte)

138 - "Der angefragte Preis ist veraltet oder Geld- und Briefkurs sind vertauscht".

Der Eröffnungs-/Schlusskurs kann nicht neu berechnet werden, denn er ist vorhanden, und hier liegt das Problem(Sie müssen den Kurs abfragen und ihm mit MarketInfo einen Wert geben, und diesen in eine andere Variable umbenennen):

                 PriceCl    = NormalizeDouble((takeprofit + OrderOpenPrice())/t,Digits);  //примерную цену закрытия
                 order = OrderTicket();    //получили ордер
                 if(Bid>PriceCl) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order,NormalizeDouble(lot*percent/100,2),PriceCl,3);}
 
7Konstantin7:

Hallo zusammen.

Ich versuche, ein einfaches Schleppnetz EA von Kim zu aktualisieren, um ausstehende Aufträge nach dem Schließen aller Marktaufträge zu löschen, es schlägt fehl(

Ich habe eine Funktion zum Löschen ausstehender Aufträge hinzugefügt:

Ich habe ein weiteres Problem gefunden, das ich nicht lösen kann, weil ich nicht allzu gut im Programmieren bin.

Ich schätze, ich sollte eine Bedingung wie die folgende schreiben:

Dies ist nur ein Beispiel für einen anderen EA.


Bitte helfen Sie mir weiter.

Kostya, starten Sie eine Schleife, die die Anzahl der Aufträge der gewünschten Typen berechnet, und löschen Sie sie dann, wie Sie wollen.
 
_new-rena:
Kostya, machen Sie eine Schleife, um die Anzahl der Aufträge für die gewünschten Typen zu berechnen, und löschen Sie dann nach Belieben, werden Sie nicht unvernünftig.

Ich bin ein Code-Nerd) Ich habe dort mehr Pausen eingefügt, vielleicht hilft das ja)

  if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7:

Ich bin ein Code-Nerd.) Ich habe ein paar mehr Pausen eingefügt, vielleicht hilft das.)

Die Hervorhebung ist nicht das Problem. Das Problem ist, dass Sie, bevor Sie die Pausen einfügen, hätten überlegen sollen: "Was ist für Sie drin?" Es wird nichts bewirken... und hat es einen Sinn, sie hinzuzufügen?

Den Rest habe ich nicht verstanden, ich bin betrunken und respektiere Kims Codes nicht... sorry...

 
AlexeyVik:

Das Hervorgehobene ist nicht das Problem. Das Problem ist, dass Sie, bevor Sie die ausstehenden Aufträge hinzufügen, hätten überlegen sollen: "Was ist für Sie drin?" Es wird nichts bewirken... und hat es einen Sinn, sie hinzuzufügen?

Und den Rest habe ich nicht verstanden, ich bin betrunken und respektiere Kims Codes nicht ... sorry ...

Nichts) Ich dachte so, ich muss eine Bedingung schreiben und jetzt denke ich.

Ja, die Codes sind nicht wirklich drin) zumindest kostenlos, über bezahlte weiß ich nicht.

 
7Konstantin7:

Es hat nichts gebracht), dachte ich, ich muss eine Bedingung schreiben, denke ich.

Ich weiß nicht, wie man das macht, aber ich habe einen anderen Code für die echten.

Für die echten hat jedes Maklerhaus seinen eigenen Code, es gibt also keinen universellen.

 

Problem gelöst) lange und intensiv nachgedacht) danke ich Ihnen allen.

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
    if (DeleteOrders) DeleteOrders();
  }
 

Hallo zusammen!

Ich habe ein Problem mit der Schließung von Gegenaufträgen an einer Fünf-Marke. Der Punkt ist, dass ich z.B. 20 Kaufaufträge und 33 Verkaufsaufträge schließen muss, wenn der Gesamtgewinn erreicht ist. Und ich möchte 20 Kauf- und 20 Verkaufsaufträge mit der Funktion OrderCloseBy() schließen und die restlichen 13 Verkaufsaufträge mit der Funktion OrderClose() schließen.

Wenn wir einen festen Spread von 4 Ziffern haben, haben wir keine Probleme mit dem Schließen des Spreads und wir speichern den Spread auch, wenn wir die Funktion OrderCloseBy() verwenden. Wenn wir einen 5-stelligen Spread haben, ist der Spread fließend und das ist der Grund, warum ich denke, dass die Aufträge nicht geschlossen werden, wenn der Gesamtgewinn erreicht ist und das Protokoll OrderCloseBy() sagt. Wenn wir es jedoch im Prüfgerät laufen lassen, ist alles normal geschlossen.

Aufträge in einer Richtung werden, wenn der Gesamtgewinn erreicht ist, problemlos geschlossen.

Wer ist schon einmal auf ein solches Problem gestoßen und welche Möglichkeiten gibt es, es zu lösen?

Hier ist die Funktion zum Schließen von Aufträgen.

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}  
 

Bitte geben Sie an, wie Sie Aufträge in der Reihenfolge schließen können, in der sie eröffnet wurden.

Ich möchte diese Funktion neu erstellen:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7:

Bitte geben Sie an, wie Sie Aufträge in der Reihenfolge schließen können, in der sie eröffnet wurden.

Ich möchte diese Funktion neu erstellen:

Die Antwort liegt auf der Hand. Sortieren Sie offene Stellen nach dem Zeitpunkt ihrer Eröffnung. Und dann schließen Sie sie in der Liste aus dem sortierten Array.