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

 
skyjet:

Hallo! Ich suche nach Fehlern in dieser Funktion.

Die Idee ist, dass schwebende Aufträge, die nicht eröffnet wurden, zwei Tage nach ihrer Erteilung gelöscht werden sollten.

min=1440;

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
         {  if(TimeCurrent()-OrderOpenTime()>=min)
            {  OrderDelete(OrderTicket());
               return;
         }  }
}  }  }
 
skyjet:

Hallo! Ich suche nach Fehlern in dieser Funktion.

Die Idee ist, dass schwebende Aufträge, die nicht eröffnet wurden, zwei Tage nach ihrer Erteilung gelöscht werden sollten.

min=1440;


Warum sollten Sie ausstehende Aufträge verfolgen und löschen wollen? Sie sollten deren Gültigkeitsdauer auf expiration=TimeCurrent()+min*60+sec setzen; sie werden dann nach min*60+sec selbst gelöscht.
 
Sepulca:

Warum müssen Sie schwebende Aufträge überwachen und löschen? Sie müssen datetime expiration=TimeCurrent()+min*60+sec einstellen; sie löschen sich dann nach min*60+sec.
Vielleicht wird der schwebende Auftrag nach einem Algorithmus geschlossen, so dass er in einem Tag geschlossen wird, wenn es eine andere Bedingung gibt, zum Beispiel 2 Tage. 2 Tage.
 
Sepulca paladin80 Danke! datetime expiration ist genau das, was wir brauchen :)
 

paladin80:

OrderOpenTime() gibt den Zeitpunkt der Auftragsöffnung zurück.

Bei einem schwebenden Auftrag gibt diese Funktion Null zurück.

 
PapaYozh:

OrderOpenTime() gibt den Zeitpunkt der Auftragsöffnung zurück.

Bei einem schwebenden Auftrag gibt diese Funktion Null zurück.

Hmm, ich habe den Code schnell geändert, ohne die Funktionen selbst zu überprüfen. Richtig, OrderOpenTime() zeigt den Zeitpunkt der Positionseröffnung durch den Makler an, aber nicht den Zeitpunkt der Annahme der schwebenden Order durch den Makler. D.h., wahrscheinlich wäre es besser, den Zeitpunkt des Abschlusses direkt in der Bestellung anzugeben oder den Zeitpunkt des Absendens der Bestellung in der magischen Zahl zu erfassen (wenn sie nicht ohnehin verwendet wird) und TimeCurrent() mit OrderMagicNumber( ) zu vergleichen.
 

Guten Tag. Helfen Sie mir, mit dem benutzerdefinierten Indikator umzugehen.

Ich löse das Problem der Bestimmung des Abstands zur Trendlinie. Ich muss den Abstand zur Trendlinie genau auf dem Zeitrahmen erhalten, auf dem sie gezeichnet wird (unabhängig vom Zeitrahmen, der im Terminal geöffnet ist). Der aktuelle Wert der Trendlinie kann mit der Funktion ObjectGetValueByShift ermittelt werden. Da Berechnungen nur über die Öffnungszeit durchgeführt werden können, habe ich einen kleinen Indikator geschrieben. Ich fand es interessant, dass die iCustom-Funktion den Parameter timeframe hat, aber ich frage mich, wie sehr dieser Parameter beim Aufruf des Indikators berücksichtigt wird.

Hier ist der Indikator:


#property indicator_chart_window
#property indicator_buffers 1
//--------------------------------------------------------------------   
extern string TL_name = "TL_1";
//--------------------------------------------------------------------   
double valueBuf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   //---- indicators
   SetIndexBuffer(0,valueBuf);
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, White);
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   //----
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int i;
   int    counted_bars = IndicatorCounted();
   //----
   i = Bars - counted_bars - 1;           // Индекс первого непосчитанного
   
   // Цикл по непосчитанным барам
   while(i>=0) {
      valueBuf[i] = NormalizeDouble(ObjectGetValueByShift(TL_name,i), Digits);
      i--;
   }     
   //----
   return(0);
}

Der Indikator berücksichtigt den aktuellen Wert des Trends.
Ich rufe den Indikator selbst auf:

TL_price_now = iCustom(NULL,PERIOD_D1,"TL_value",TL_name,0,0);

Hier wird dem Indikator z.B. die Zeit PERIOD_D1 als Parameter übergeben, auf dem der Trend aufgetragen wird und für den der Abstand berechnet werden soll.

Ich berechne den Abstand zum Trend einfach:

dist = NormalizeDouble(TL_price_now - Bid, Digits);
Das scheint so zu sein, ist es aber nicht: Wenn ich auf andere Timings umschalte (anders als D1), gibt der Indikator andere Werte zurück (korrekt für die Timings, auf die ich umschalte).
Hier stellt sich eine Frage: Inwieweit wird ein Zeitraum beim Aufruf der iCustom-Funktion berücksichtigt ?
Oder habe ich vielleicht den Indikator durcheinander gebracht?
 
pako:


t = OrdersTotal();

warum zählt???????


Also habe ich es getan, um den Wert per Referenz zu übergeben. Die Logik ist einfach!
 
artmedia70:

In meiner Version ist die Funktion kürzer ... :)



Ja, diese Art der Umsetzung ist übrigens intelligenter. Nur beim Start war mehr Platz für zusätzliche Funktionen vorhanden. Das Ergebnis sah folgendermaßen aus:

void FindOrders(int& massive[])
{
   int oType;
   ArrayInitialize(massiveOfOrders, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massiveOfOrders[oType] = massiveOfOrders[oType] + 1;
   }
}

int start()
{
   int i, oTotal = 0, oPending = 0;
   
   FindOrders(massiveOfOrders);
   
   for (i=0; i<=7; i++)
   {
       if (i > 1 && i < 6)
       {
           oPending += massiveOfOrders[i];
       }
       if (i < 6)
       {
          oTotal += massiveOfOrders[i];
       }
   }
   pr ("FindOrders(): " + "oTotal = " + oTotal);
   pr ("FindOrders(): " + "oPending = " + oPending);

Es ist ja nicht so, dass es etwas zu optimieren gäbe, oder?

Ich meine, es ist viel bequemer, wenn am Anfang gar nichts da ist. Und alles wird rein über Funktionen aufgerufen. Und beim letzten Mal stellte sich heraus, dass der Start eine Menge aller Arten von Überwucherungen der Hauptfunktionen und Überwucherungen von zusätzlichen Funktionen hat...

 

Guten Tag!

Bitte helfen Sie mir und erklären Sie mir, warum der Expert Advisor nicht funktioniert oder nicht handelt?