[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 118

 

Es erzeugt eine Menge Fehler


 

Tut mir leid, alex12, aber Sie sehen aus wie ein Bulldozer (nichts für ungut, das ist ein anerkannter Begriff). Sie setzen etwas aus verschiedenen Teilen zusammen und bringen es irgendwie zum Kompilieren, aber Sie verstehen die Bedeutung des Codes nicht.

Wenden Sie sich an den Job-Service.

 
alex12:

Es erzeugt eine Menge Fehler


Wenn Sie einige von Igor Kims Funktionen verwenden, stellen Sie sicher, dass Sie seine fehlenden Funktionen in Ihrem Code haben, auf die der Compiler Sie hinweist. Finden Sie sie in seinem Zweig und schreiben Sie sie in Ihren Code.
 
chief2000:
...

OrderOpenTime() zeigt die Zeit an, zu der die Position eröffnet wurde. Meine Frage ist, woher ich die Zeit weiß, zu der die STOP-Order gesetzt wurde?
Der MT4-Bericht hat diese Zeit, aber ist es möglich, sie aus dem Code herauszufinden?


Noch einmal.

Gehen Sie alle Ihre Stop-Aufträge in einem "Standard"-Zyklus durch und drucken Sie für sich selbst den Wert der OrderOpenTime() für sie aus - dies muss die Zeit sein, zu der sie (jeder von ihnen) gesetzt wurden. Hier ein Beispiel für Marktaufträge - passen Sie es ein wenig an, d.h. oder entfernen Sie diese Zeile ganz

wenn ((orderType != OP_BUY) && (orderType != OP_SELL)) weiter;

oder ersetzen Sie sie durch die Daten der Stoppaufträge, an denen Sie interessiert sind...

int orderCount = 0; // сбрасываем счетчик ордеров 
      // ------------------------------------------------Считаем только наши ордера---------------------------
   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue; // если ордер не выбран, то идем на следующий открытый
      if(OrderCloseTime()!=0) continue;                          // если тикет принадлежит закрытому ордеру, то берем следующий открытый
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))   continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))   continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера 
          Time = O rderOpenTime();
         
                     
         
      orderCount++;                     // считаем ордера (не больше i)           

    }   
 
Roman.:


Noch einmal.
Gehen Sie alle Ihre Stop-Orders in einer "Standard"-Schleife durch, und drucken Sie für sich selbst den Wert von OrderOpenTime() aus - dies muss der Zeitpunkt sein, zu dem sie (alle) gesetzt wurden. Hier ein Beispiel für Marktaufträge - passen Sie es ein wenig an, d.h. oder entfernen Sie diese Zeile ganz

wenn ((orderType != OP_BUY) && (orderType != OP_SELL)) weiter;

oder ersetzen Sie sie durch Daten von Stop-Aufträgen, an denen Sie interessiert sind...

An dieser Stelle bin ich auf ein Dilemma gestoßen - ich benötige den Zeitpunkt der Eröffnung eines STOP-Auftrags für einige "Statistiken", und ich möchte nicht, dass dieser Prozess die ganze Zeit läuft, sondern nur zu einem bestimmten Endzeitpunkt. Aus diesem Grund müssen wir nicht nach den zu diesem Zeitpunkt geöffneten Aufträgen suchen (OrdersTotal()), sondern nach den bereits geschlossenen Aufträgen => OrdersHistoryTotal().
Für STOP-Aufträge, die bereits geschlossen wurden, gibt OrderOpenTime() jedoch den Zeitpunkt der Positionseröffnung zurück, nicht den Zeitpunkt, zu dem der Auftrag erteilt wurde.
Infolgedessen läuft alles auf Folgendes hinaus: Ist es möglich, den Zeitpunkt abzurufen, zu dem die STOP-Aufträge aus der Liste von OrdersHistoryTotal() gesetzt wurden?
 
chief2000:
Hier geriet ich in ein Dilemma: Ich benötige die Öffnungszeit des STOP-Auftrags für einige "Statistiken", und ich möchte nicht, dass dieser Prozess die ganze Zeit läuft, sondern nur in einer bestimmten Endphase. Aus diesem Grund müssen wir nicht nach den zu diesem Zeitpunkt geöffneten Aufträgen suchen (OrdersTotal()), sondern nach den bereits geschlossenen Aufträgen => OrdersHistoryTotal().
Für STOP-Aufträge, die bereits geschlossen wurden, gibt OrderOpenTime() jedoch den Zeitpunkt der Positionseröffnung zurück, nicht den Zeitpunkt, zu dem der Auftrag erteilt wurde.
Infolgedessen läuft alles auf Folgendes hinaus: Ist es möglich, den Zeitpunkt abzurufen, zu dem die STOP-Aufträge aus der Liste von OrdersHistoryTotal() gesetzt wurden?

Ja... Die Herausforderung... ICH WEISS ES NICHT. Sieht so aus, als ob man das nicht kann - vor allem in der "Endphase"...

Sie müssen diesen Prozess ständig überwachen und im Auge behalten - siehe den FAQ-Beitrag auf der vorherigen Seite.

 
Roman.:

Ja... Die Herausforderung... ICH WEISS ES NICHT. Sieht so aus, als ob man das nicht kann - vor allem in der "Endphase"...

Sie müssen diesen Prozess ständig überwachen und im Auge behalten - siehe den FAQ-Beitrag auf der vorherigen Seite.

Wenn keine andere Lösung gefunden wird, werde ich die Aufträge aus OrdersTotal() verwenden.
Trotzdem vielen Dank!
 
In diesem Fall ist es einfacher, in eine Datei zu schreiben, es gibt weniger Probleme und die Statistiken können so organisiert werden, wie Sie sie brauchen, nicht wie das Terminal.
 
FAQ:
In diesem Fall ist es einfacher, in eine Datei zu schreiben, es gibt weniger Probleme und die Statistiken können so organisiert werden, wie Sie sie brauchen, nicht wie das Terminal.
Ich danke Ihnen!
 

Ich möchte einen Expert Advisor für das Pincer-Muster schreiben.

Ich habe gewählt

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2) bull_pincet=true;
if(High[1]==High2) bear_pincet=true;

   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   

Leider ist die Bedingung für mich falsch, da "sl" auf 100,00000 gesetzt ist und "tp" einen Fehler anzeigt.

Ich habe beschlossen, eine Bedingung hinzuzufügen, die 1 Tick berücksichtigt.

static datetime TimeSaveH1  = 0;
int init()
{
     TimeSaveH1  = iTime( Symbol(), Period(), 0); // берем открытия время текущего бара
}

int start()
{
         if (TimeSaveH1!=iTime( Symbol(), Period(), 0))
            {
               TimeSaveH1=iTime( Symbol(), Period(), 0); 
            }  

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bull_pincet=true;
if(High[1]==High2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bear_pincet=true;
   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   




}

Das Ergebnis ist das gleiche. Wie kann ich mein Problem lösen?