Nützliche Funktionen von KimIV - Seite 113

 
togomsk:


Hallo!

Aus irgendeinem Grund funktioniert der externe Operator nicht mehr, wenn Ihre Bibliothek angeschlossen ist, d.h. Variablen werden definiert, alles wird normal kompiliert, und im Prinzip funktioniert der EA, aber gleichzeitig hat der EA keine Parameter, wenn er den Typ startet, obwohl es eine ganze Menge Parameter gibt. Was könnte der Grund dafür sein?


Finden Sie im Code

#property library

Und löschen.

 

Ich habe dieser Funktion eine Variable j hinzugefügt, die für die vorletzte Transaktion steht.

double GetProfitLastClosePos(string sy="", int op=-1, int mn=-1, int j=0) {
datetime o;
double p=-1;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if(OrderSelect(i-j, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (o<OrderCloseTime()) {
o=OrderCloseTime();
p=OrderProfit();
}
}
}
}
}
}
}
zurück(p);
}
 
abdul1:

Ich habe dieser Funktion eine Variable j hinzugefügt, für vorletzte Geschäfte.

Wenn man bedenkt, dass die abgeschlossenen Aufträge in OrdersHistoryTotal() nach dem Zeitpunkt des Abschlusses von rechts nach links (der letzte nach rechts) berücksichtigt werden:

double GetProfitLastClosePos (string sy="", int op=-1, int mn=-1,
                              int j=0)          // Искомый (по номеру) ордер от последнего закрытого 
{
    int k = OrdersHistoryTotal(), li_cnt = 0;
//----
    if (sy == "0" || sy == "") sy = Symbol();
    for (int i = k - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue;
        if (OrderSymbol() != sy) continue;
        if (OrderType() > 1) continue;
        if (op >= 0) if (OrderType() != op) continue;
        if (mn >= 0) if (OrderMagicNumber() != mn) continue;
        if (j == li_cnt) return (OrderProfit());
        li_cnt++;
    }
//----
    return (-1.0);
}

Die Funktion gibt den j-ten Gewinn der letzten abgeschlossenen Bestellung zurück, "gefiltert" nach Symbol, Magie, Typ. Und die Zahlen werden von 0 an gezählt.

 
TarasBY:

Wenn wir berücksichtigen, dass geschlossene Aufträge in OrdersHistoryTotal() nach dem Zeitpunkt des Abschlusses von rechts -> links (der letzte ganz rechts) gezählt werden:

Die Funktion gibt den j-ten Gewinn des letzten geschlossenen Auftrags zurück, "gefiltert" nach Instrument, Magik, Typ. Und die Zahlen werden von 0 an gezählt.

Das ist es, was ich brauche!
 

Hallo zusammen.

Benötigt wird eine Funktion zum Schließen von Kauf- und Verkaufsaufträgen mit gleichen Lots durch Gegenaufträge, wenn deren Gewinn auf + geht. Ich habe versucht, diese Funktion auszuführen, aber es wird die Fehlermeldung 4108 ausgegeben (falsche Tickets)

Können Sie mir sagen, was das Problem ist?

//+------------------------------------------------------------------+
int fCloseBu(){
        // Закрываем встречные
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
          }
        }
       if (PrB>0 && PrS>0 && LotB==LotS) {
          OrderCloseBy(TicketB,TicketS,CLR_NONE);
          Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
          }  
        }
      }
    }
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
Aufträge sollten geschlossen werden, wenn der gesamte Prüfzyklus abgeschlossen ist, d.h. nach der for-Anweisung, nicht innerhalb.
 
Können Sie mir bitte mitteilen, wo ich einen EA finden kann, der beim Überschreiten eines gleitenden Durchschnitts mit der Möglichkeit, den gleitenden Durchschnitt in den Einstellungen zu verschieben, funktioniert?
 
Roger:
Aufträge sollten geschlossen werden, wenn der gesamte Prüfzyklus abgeschlossen ist, d.h. nach der for-Anweisung, nicht innerhalb.


Ich danke Ihnen! Falls noch jemand eine solche Funktion benötigt, wird sie so aussehen:

//+------------------------------------------------------------------+
//|    Закрываем встречные                                           |
//+------------------------------------------------------------------+
int fCloseBu(){
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
             }
           }
         }
       }
     }
   }//for
   if(PrB>0 && PrS>0 && LotB==LotS) {
     OrderCloseBy(TicketB,TicketS,CLR_NONE);
     Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
Gibt es Video-Tutorials zu dieser Sprache?
 
Andrei5:
Gibt es Video-Tutorials zu dieser Sprache?
Es gibt ein Buch, das Sie online lesen oder auf Ihren Computer herunterladen können. Siehe oben -> "Tutorial".
Grund der Beschwerde: