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

 
gyfto:

Oder vereinfachen Sie es weiter.

Dabei ist Δ die Bedeutung der Differenz, d. h.Schließen[i] - Öffnen[i], und ^ ist das Zeichen für den Grad. const - Konstante in diesem Ausdruck, d.h.i_sizeOfSequentialCorrectionBar * pt, standardmäßige mathematische Notation, ich habe mir nichts ausged acht.2*bVar-1 ist ähnlich wie±1, bVar ist hier eine beliebige bool-Variable. Und der Ausdruck 2*bVar-1 nimmt nicht die Werte 0 und 1 an, sondern -1 und +1.≥ ist MQL4 >=, ebenfalls eine mathematische Standardnotation.step ist ein Schritt, d.h. step ist gleich 1 bei cnt++, und step ist gleich -cnt bei cnt=0. Was war sonst noch unklar an Notationen?

gyfto, danke für die Erklärung. Aber es gibt einen Punkt. Jedenfalls können wir das Problem nicht lösen, indem wir die Ausgangsziffer des Ausdrucks ändern. Derzeit müssen beim Nullstellen der Eröffnungs- und der Schlusskurs "getauscht" werden. D.h. meiner Meinung nach kann die Universalität nicht erreicht werden. Das ist es, worüber ich nachgedacht habe.

Vadim schrieb vor einiger Zeit, dass das Einfügen einer Funktion in die Schleife den Code um eine Größenordnung verlangsamt. Ich frage mich, ob dies nur für Fälle gilt, in denen eine Funktion ihre Werte bei jeder Schleifeniteration berechnet, oder auch für jeden anderen Fall? Bis ich beispielsweise den Expert Advisor fertig geschrieben hatte, schrieb ich die Funktion, die ich vereinfachen wollte, nach folgendem Schema um:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                            // Счётчик идущих друг за другом свечей с..
       cntDn;                                                                                // .. требуемыми признаками
       
   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if (directionMA == CROSS_UP)
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                     // .. прибавим 1 к счётчику

         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                   // .. счётчик обнуляем

         if (cntDn == i_sequentBarsСount)                                                   // Если cnt баров в подряд медвежьи..
             return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                         // .. Выходим из функции
      }

      if (directionMA == CROSS_DN)
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                     // .. прибавим 1 к счётчику

         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                   // .. счётчик обнуляем
     
         if (cntUp == i_sequentBarsСount)                                                   // Если cnt баров в подряд бычьи..
             return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                         // .. Выходим из функции
      }
   }
}

Ich habecntUp undcntDn zu unterschiedlichen Zählern gemacht, weil eseinen Wert auf einmal haben kannund dann einen anderen, wenn Berechnungsbalken in einem Zyklus verwendet werden.Und der Zähler kann einen Wert aufsummieren und mit dem Aufsummieren eines weiteren Wertes fortfahren. Und wenn die Variable gleich ist, wird die Anzahl der Balken des einen Merkmals zum Zähler der Balken des anderen Merkmals addiert.

Hier ist der Rat gefragt, vielleicht ist es besser, auf eine andere Weise zusammenzufassen?

Das Problem ist, dass der Expert Advisor noch nicht sehr groß ist. Ich habe die Waggons und diese Funktion. Ich habe das Gefühl, dass anstelle von lang die Eule verkauft wird und umgekehrt. Ich versuche zu verstehen, wie das passieren kann. Vielleicht ist hier etwas falsch?

 

Hallo, ich habe angefangen, mql4 zu lernen, ich habe ein Skript geschrieben, das Verlustaufträge sperrt. Ein Problem kann ich nicht lösen: Das Skript sperrt alle Aufträge mit Verlusten ab -10, aber es sperrt sie so lange, wie der Preis unter -10 liegt. Wie kann man erreichen, dass die Sperrung nur einmal erfolgt? D.h. wenn der Verlust -10 erreicht, hat das Skript diesen Auftrag gesperrt und belässt ihn dort, auch wenn der Verlust weiter steigt.

extern double StopLoss=150;

extern double Profit=-10;

//+------------------------------------------------------------------+

//----
void start()
{
double profit=Gewinn;
double Lots=0;
for(int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS))
continue;

if(OrderType()==OP_BUY && OrderProfit()<Profit*Point)
Lots+=OrderLots();
if(OrderType()==OP_SELL && OrderProfit()<Profit*Point)
Lots-=OrderLots();


}
if(Lots>0)
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,0,NULL,Red);
if(Lots<0)
OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,Bid-StopLoss*Point,0,NULL,Blue);
//----
return(0);
}

 

Guten Tag.

Bitte sehen Sie sich den Code an, ich möchte die durchschnittliche Zeit eines Handels (Pending Order Trading) berechnen

//+------------------------------------------------------------------+
//| Расчет среднего времени сделки            |
//+------------------------------------------------------------------+
double Sredneevremyasdelky(){
datetime Tsd=0; // общее время сделок
datetime Tsvsd=0; // среднее время сделки 
int n=0;
int orders=HistoryTotal();  // history orders total

        for(  int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                  n++;
                 Tsd=Tsd+(OrderCloseTime()-OrderOpenTime());
                   }
            if (n>0) Tsvsd=Tsd/n/60;


            return(Tsvsd);
         }

Von der Auftragsauslösung bis zum Abschluss.

 
Stells:

Guten Tag.

Bitte sehen Sie sich den Code an, ich möchte die durchschnittliche Zeit eines Handels (Pending Order Trading) berechnen

Von der Auftragsauslösung bis zum Abschluss.


Warum berechnen Sie die durchschnittliche Zeit im Zyklus? Vielleicht wäre es besser, dies nach dem Zyklus zu tun. Und es wäre eine gute Idee, den Berechnungszeitraum festzulegen
 
Vinin:

Warum berechnen Sie die durchschnittliche Zeit im Zyklus? Das ist eine unnötige Operation. Vielleicht wäre es besser, dies nach dem Zyklus zu tun. Und es wäre eine gute Idee, den Berechnungszeitraum festzulegen
Sie haben es aus der Schleife genommen. Wie legen Sie den Berechnungszeitraum fest?
 
Stells:
Es wurde aus dem Kreislauf herausgenommen. Wie berechne ich den Zeitraum?

Externe Variablen, z. B.
 

Ich verstehe schon, das Datum muss irgendwie herausgebracht werden.

Um welche Funktion handelt es sich?

 
Stells:

Ich verstehe schon, das Datum muss irgendwie herausgebracht werden.

Um welche Funktion handelt es sich?


Warum die Dinge verkomplizieren, wenn es einen Externen gibt?
 

hoz ,ich ziehe ein, sobald ich frei bin.

Ich habe eine Frage zur Optimierung. Ich arbeite mit dem EMA-Algorithmus. Wie Sie wissen, ist es die Rekursion, die tatsächlich Zeit spart. Unter Bezugnahme auf den ursprünglichen Code:

...

Übertragen aufhttps://www.mql5.com/ru/forum/144691

 
gyfto:

hoz ,ich ziehe ein, sobald ich frei bin.

Ich habe eine Frage zur Optimierung. Ich arbeite mit dem EMA-Algorithmus. Wie Sie wissen, ist es die Rekursion, die tatsächlich Zeit spart. Unter Bezugnahme auf den ursprünglichen Code:

Ich habe Matcad speziell für den Umgang mit den von EMA erzeugten Gewichten genommen:

Übrigens ist mir jetzt klar, warum die Indikatoren, die den EMA verwenden (der eigentlich eine Potenzfunktion und keine Expotentialfunktion sein sollte), eine Periode von 14 verwenden. Warum also die letzte Gewichtung so hoch ansetzen, wenn man einfach eine Potenzfunktion verwenden kann, wenn die nächste Gewichtung wichtiger ist als die vorherige? Ich frage nicht einmal mehr, warum man eine Rekursion verwenden sollte, wenn die endgültigen Gewichte nach der Rekursion durch eine Formel abgeleitet werden können (siehe F(n,x) und y(n,x)).


Vielleicht sollten Sie Ihre eigene Filiale eröffnen. Warum brauchen Sie einen "Anfängerzweig"?