Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1719

 
Snajper007 Verkaufsauftrag wird eröffnet, die Funktion berechnet den Durchschnittspreis. Wenn jedoch der 3. Auftrag geöffnet wird, zeigt diese Funktion den vorherigen und den neuen Wert an (ich habe mir den Ausdruck im Journal angesehen), aber als Ergebnis bleibt der vorherige Wert erhalten. Was habe ich falsch gemacht?
//+----------------------------------------------------------------------------+
//| Расчет среденй цены (0)-buy (1)-sell                                       |
//+----------------------------------------------------------------------------+
double GetAveragePrice(int ot=-1)
  {
   double order_lots = 0, order_price = 0, avg_price = 0;
     {
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType()==ot||ot<0)
                 {
                  order_lots += OrderLots();
                  order_price += OrderOpenPrice() * OrderLots();
                 }
              }
           }
        }
     }
   avg_price = NormalizeDouble(order_price / order_lots, Digits);
   return(avg_price);
  }
//+----------------------------------------------------------------------------+
 
MakarFX #:
Ich danke Ihnen!
 
Guten Tag, wer kann helfen, einen auf Indikatoren basierenden Handelseröffnungsfilter zu implementieren?
 
Sergei Pimenov #:
Guten Tag, wer kann helfen, einen auf Indikatoren basierenden Handelseröffnungsfilter zu implementieren?
Mehr lesen
 

Helfen Sie mir, die Logik zu verfeinern. Ich benötige eine Pause in Stunden zwischen den abgeschlossenen Aufträgen und der Eröffnung eines neuen Auftrages. Ich habe ein paar Dinge ausgearbeitet. Aber es funktioniert nicht.

OrderCloseTime() > 0 && TimeCurrent() - OrderCloseTime() > FstOrderTimeHour*3600 // сигнал на открытие ордера

OrderCloseTime() == 0 // сигнал на открытие первого ордера

где int FstOrderTimeHour = 1 // пауза в часах
 
Порт-моне тв #:

Helfen Sie mir, die Logik zu verfeinern. Ich benötige eine Pause in Stunden zwischen den abgeschlossenen Aufträgen und der Eröffnung eines neuen Auftrages. Ich habe ein paar Dinge ausgearbeitet. Aber es funktioniert nicht.

//--- input parameters
input int HourPause = 1;   // Пауза в часах
//--- global parameters
datetime  pause;
//+------------------------------------------------------------------+
void OnTick()
  {
   pause=GetInfoLastPos(3)+(HourPause*60*60);
   // выключаем торговлю
   if(TimeCurrent()<pause) return;
  .......
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                             MakarFX|
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
//+----------------------------------------------------------------------------+

Wenn der Magier nicht notwendig ist - löschen Sie gelb.

 
MakarFX #:

Bevor Sie eine Bestellung öffnen, speichern Sie das aktuelle max_ticket in prev_ticket

Gute Zeit Makar, diese Methode der Definition des vorletzten Bestellscheins hat einen gravierenden Nachteil. Diese Methode funktioniert, wenn der maximale Auftrag im Raster geöffnet wird, und wenn das nicht geschieht, ist der vorletzte Auftrag der letzte im Raster (siehe Abbildung). Ich versuche, eine Funktion zu schreiben, aber es funktioniert nicht, das letzte Ticket wird erkannt. Die hervorgehobene Bedingung will nicht funktionieren.

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket)
                     if(penultimate_ticket < GetTicketMaxOrder())
                        penultimate_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }

 
EVGENII SHELIPOV #:

Gute Zeit Makar, diese Methode für den vorletzten Bestellschein hat einen gravierenden Nachteil. Diese Methode funktioniert, wenn der maximale Auftrag im Raster geöffnet ist. Ist dies nicht der Fall, ist der vorletzte Auftrag gleich dem letzten, siehe die Abbildung. Ich versuche, eine Funktion zu schreiben, aber es funktioniert nicht, das letzte Ticket wird erkannt. Die hervorgehobene Bedingung will nicht funktionieren.

Ich habe Ihnen einen funktionierenden Code gegeben!
 
MakarFX #:
Ich habe Ihnen einen funktionierenden Code gegeben!

Dieser Code ist das, was ich oben geschrieben habe, und es gibt sogar ein Bild von ihm

 
EVGENII SHELIPOV #:

Dieser Code ist das, was ich oben geschrieben habe, und es gibt sogar ein Bild von ihm

Der Fehler liegt nicht im vorletzten Suchcode, sondern höchstwahrscheinlich in der Ausgabe der Informationen in Text