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

 
MisterD:
Hallo noch einmal, können Sie mir bitte sagen, wo es einen Fehler in den folgenden Code?
Ich rufe die Schleife im Moment von "deinit" auf.
Es werden alle Bestellungen bis auf die letzte gelöscht.
Ich denke, diese Zeile ist höchstwahrscheinlich ein Fehler >> for (int i=1; i<=OrdersTotal(); i++) <<
Aber logisch scheint alles richtig zu sein... was habe ich übersehen?

Vielen Dank im Voraus!


Die Schleife rückwärts ausführen

//-------------------------------------------------------------------------------------------
for (int i=OrdersTotal()-1; i>=0; i--)
{
   if (OrderSelect(i,SELECT_BY_POS)==true)
   {
      int Type=OrderType();
      if (OrderSymbol()!= Symbol() || Type <2)continue;
      int Ticket=OrderTicket();
      bool Modify =OrderDelete(Ticket);
      if (Modify == true) Alert ("Ордер Удалён");continue;
      if (Modify != true) Alert ("Удаление ордера не удалась");
   }
} 
//-------------------------------------------------------------------------------------------
 
MisterD:
Hallo noch einmal, können Sie mir bitte sagen, wo es einen Fehler in den folgenden Code?
Ich rufe die Schleife im Moment von "deinit" auf.
Es werden alle Bestellungen bis auf die letzte gelöscht.
Ich denke, diese Zeile ist höchstwahrscheinlich ein Fehler >> for (int i=1; i<=OrdersTotal(); i++) <<
Aber logisch scheint alles richtig zu sein... was habe ich übersehen?

Vielen Dank im Voraus!

//-------------------------------------------------------------------------------------------
for (int i=1; i<=OrdersTotal(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
int Type=OrderType();
wenn (OrderSymbol()!= Symbol() || Typ <2)weiter;
int Ticket=OrderTicket();
bool Ändern =OrderDelete(Ticket);
if (Modify == true) Alert ("Order Deleted"); weiter;
if (Ändern != true) Alert ("Auftrag gelöscht");
weiter;
}
}
//-------------------------------------------------------------------------------------------


Versuchen Sie es so:

for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,......................
 

Guten Tag. Ich brauche ein wenig Hilfe. Es gibt eine Funktion, die eine der fettesten Partien in Bezug auf den Gewinn schließt.

Ich muss eine Schleife machen.

Bitte beraten Sie, wie diese Funktion zu verwenden, zum Beispiel, wenn mein Konto Eigenkapital ist mehr als 5 Pips dann diese Funktion funktionieren sollte.

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  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 (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  } 

}

 
sannin:

Guten Tag. Ich brauche ein wenig Hilfe. Es gibt eine Funktion, die eine der fettesten Partien in Bezug auf den Gewinn schließt.

Ich muss eine Schleife machen.

Wenn zum Beispiel mein Kontostand höher als 5 Pips ist, dann sollte diese Funktion funktionieren.

Zum Beispiel, wenn der Kontowert höher als 5 Pips ist (für 4 Zeichen) - im realen Markt, wenn die Anzahl der Aufträge höher als 3-4 ist, werden sie leicht ins Minus drehen (nach den Ergebnissen der Löschung). :)))

P.S. Soweit ich verstanden habe, brauchen Sie einen fertigen Code, während der Algorithmus zur Lösung eines solchen Problems für Sie nutzlos ist!

 
TarasBY:
5 Pips (für 4 Zeichen) - auf dem realen Markt, wenn die Anzahl der Aufträge größer als 3-4, ist es leicht zu drehen (durch die Ergebnisse der Entfernung) in minus. :)))


Ich für meinen Teil... und ich habe in letzter Zeit auf das Gold geachtet... es reagiert nicht so schnell, wie ich dachte.

Ich habe noch nicht mit solchen Funktionen gearbeitet ... deshalb bitte ich um Unterstützung

 
Guten Tag, ich habe ein Problem mit der Entwicklung der Expert Advisor, es nicht schließen Aufträge, obwohl die Bedingungen für die Schließung durch einen Indikator vorgeschrieben, bitte erklären, was es ist, danke im Voraus
Dateien:
 
sannin:


Nun, ich für meinen Teil... und ich habe in letzter Zeit auf das Gold geachtet... es ist nicht so schnell, wie ich dachte.

Ich habe noch nicht mit den Funktionen in diesem Formular gearbeitet ... daher hier eine Anfrage an den Support

Zunächst berechnen Sie die BU-Linie einer aggregierten Position für das Instrument (sie wird verwendet, um die Bedingungen für das Schließen von Aufträgen zu bestimmen, wenn sie die Rentabilität in Pips erreichen):

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Определение Уровня БезУбытка по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_BreakEven (string fs_Symbol,     // Symbol
                       double fd_DeltaLots,  // разность объемов ордеров Buy и Sell
                       double fd_Profit)     // текущий профит по открытым ордера
{
    if (fd_DeltaLots == 0.) return (0.);
    double ld_BU = 0., ld_tickvalue = MarketInfo (fs_Symbol, MODE_TICKVALUE);   // цена одного пункта
//----
    //---- Уровень общего безубытка для открытых ордеров
    if (fd_DeltaLots > 0.) ld_BU = MarketInfo (fs_Symbol, MODE_BID) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
    else if (fd_DeltaLots < 0.) ld_BU = MarketInfo (fs_Symbol, MODE_ASK) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
//----
    return (ld_BU);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Berechnen Sie dann die Differenz zwischen dem aktuellen Kurs und der Breakeven-Linie. Wenn die "Differenz" zufriedenstellend ist, fahren wir mit dem Verfahren zum Löschen von Aufträgen fort. Als Erstes müssen Sie das Ticket der gewinnbringendsten/verlustbringendsten Bestellung finden:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Получаем Тикет самого прибыльного/убыточного ордера                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketWithControlProfit (string fs_Symbol = "",  // Инструмент
                                  int fi_Magic = -1,      // Magic
                                  int fi_Type = -1,       // OrderType
                                  int fi_TypeProfit = 0)  // Профитность ордера среди остальных ордеров:
                                                          // >= 0 -  с самым большим профитом;
                                                          // < 0 - самый убыточный
{
    double ld_Profit = 0., ld_curProfit;
    int    li_Total = OrdersTotal(), li_Ticket = -1;
//----
    if (fs_Symbol == "") fs_Symbol = Symbol();
    if (fi_TypeProfit < 0) ld_Profit = 10000000000.;
    for (int i = li_Total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (fi_Magic > -1) if (OrderMagicNumber() != fi_Magic) continue;
        if (fi_Type > -1) if (OrderType() != fi_Type) continue;
        if (fi_Type > 1) continue;
        ld_curProfit = OrderProfit() + OrderSwap() + OrderCommission();
        if (fi_TypeProfit >= 0) {if (ld_Profit <= ld_curProfit) continue;}
        else if (ld_Profit >= ld_curProfit) continue;
        ld_Profit = ld_curProfit;
        li_Ticket = OrderTicket();
    }
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Die Löschung kann in beide Richtungen erfolgen. Lassen Sie uns löschen:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция закрытия "своих" ордеров по признаку                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fClose_AllOrdersByProfit (string fs_Symbol = "",  // Инструмент
                              int fi_Magic = -1,      // Magic
                              int fi_Type = -1,       // OrderType
                              int fi_TypeProfit = 0)  // Направление закрытия ордеро по профитности:
                                                      // >= 0 - начиная от самого большого профита;
                                                      // < 0 - начиная от самого маленького профита;
{
    int li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit),
        li_cnt = 0;
//----
    while (li_Ticket > 0)
    {
         //---- Здесь вставите свою процедуру закрытия 
         //---- что-то типа:
         //ClosePosByTicket (li_Ticket);
         li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit);
         li_cnt++;
    }
//----
    return (li_cnt);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Die weitere Montage der gewünschten Einheit ist nicht allzu schwierig: Sie müssen es tun oder zur Arbeit gehen... :)

 
Ich möchte einer Variablen einen Preiswert zuweisen.

a=(NormalizeDouble(OrderOpenPrice(),5));


Aber aus irgendeinem Grund wird der Preis mit einem vierstelligen Wert bei 1,3360 gezeichnet

Können Sie mir den Fehler nennen?
 
lottamer:
Ich möchte einer Variablen einen Preiswert zuweisen.



Aber aus irgendeinem Grund wird der Preis mit einem vierstelligen Wert bei 1,3360 gezeichnet

Können Sie mir den Fehler mitteilen?

Vielleicht ist der DC vierstellig? Oder geben Sie den Preis ohne DoubleToStr(YourPrice,5) aus.
 
Sepulca:

Vielleicht ist der DC vierstellig? Oder den Preis ohne DoubleToStr(YourPrice,5) anzeigen


Der DC ist fünfstellig...

was bedeutet es OHNE DoubleToStr(YourPrice,5) ? ich habe nirgendwo DoubleToStr(YourPrice,5)