[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 285

 
gyfto:

Richtig. Ich glaube, ich bin fertig. Hier ist der überarbeitete Zeckensammler mit seiner Verpackung in zweite Kerzen.

Das war es:

Wurde:

Kommentare zum Code.

1. Um CPU-Zeit zu sparen, wurde in der virtuellen Candlestick-Auswahl kein Groß-/Kleinbuchstabenwechsel vorgenommen, stattdessen wurden die Abschnitte mit der Auswahl auskommentiert (da die Auswahl für bestimmte Zwecke einmal vor der Kompilierung durchgeführt wird).

2. Bei der Arbeit mit der Ortszeit (also offline) nicht in den Sinn gekommen. In der"while(time==TimeLocal()){///bis eine Sekunde vergangen ist"-Schleife vermute ich, dass esMarketInfo in FileWriteDouble geben muss (klingt für mich wie die Spitze eines Idioten). Wenn Sie mir sagen, was dort logischer aussehen würde, wäre ich Ihnen dankbar.

3. Das Konstrukt eines Autors

Ich habe sie ganz am Ende von init() deklariert.

4. Zu Beginn von init() dynamische Arrays

anstelle der verwendeten Variablen.

5. Zur Optimierung können Sie theoretisch WinAPI-Dateifunktionen verwenden und in einem Block von 44 Bytes (Länge der MarketInfo-Struktur oder was auch immer es in .hst ist) in die Historie schreiben.

6. Die Modellierung der Zeit für das Schreiben in die Zelle Time[] durch den Autor wurde vollständig entfernt. Aus demselben Grund wird in der Kopf-/Während-Schleife nicht auf TimeLocal(), sondern nur auf TimeCurrent() geprüft.

7. Was schlagen Sie sonst noch zur Optimierung des Codes vor?

Unter Punkt 4 muss man verstehen, dass Sie einen Indikator gemacht haben, dann sind solche Aktionen nicht klar:

ArrayResize (bid, 1);//урезаем и обнуляем использованные массивы
ArrayResize (ask, 1);

ArrayInitialize() ist am ehesten geeignet?!

Und höchstwahrscheinlich sollten Sie sich weigern, Indikator-Arrays zu verwenden.

 
TarasBY:

ArrayInitialize() funktioniert wahrscheinlich?!

ArrayInitialize(ask, EMPTY_VALUE); Sie meinen? Das habe ich nicht. Warum habe ich es genau abgeschnitten, ich hatte Angst vor so einem Fall:

(a, b, c)//Werte in ask nach drei Ticks pro Sekunde (fantastisch, aber nehmen wir mal an).

ArrayInitialize(ask, 0);//be (0, 0, 0)

FileWriteDouble(hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- Die Zelle Close erhält den Wert 0. Deshalb lege ich die Größe neu fest, um dies zu verhindern. Check ArrayInitialize(ask, EMPTY_VALUE);.

TarasBY:

Sie müssen aufhören, Indikator-Arrays zu verwenden.

Sie sind dynamisch, darauf bin ich hereingefallen. Weniger Befehle, geringere Anzahl von Prozessorzyklen. Sie müssen bei jeder theoretisch möglichen Zeit 500 Millisekunden verarbeiten... ...um es zu schaffen.

 
Wissen Sie, ob es möglich ist, Send- und Close-Aufträge in einem EA durch ein manuelles Fenster zu ersetzen und durch dieses Fenster in den Markt einzutreten? Das ist für jene Broker notwendig, die die Verwendung von EAs nicht erlauben.
 
gyfto:

ArrayInitialize(ask, EMPTY_VALUE); Sie meinen? Das habe ich nicht. Ich hatte Angst vor einem solchen Fall, deshalb habe ich angefangen, sie zu kürzen:

(a, b, c)//Werte in ask nach drei Ticks pro Sekunde (fantastisch, aber anzunehmen).

ArrayInitialize(ask, 0);//be (0, 0, 0)

FileWriteDouble(hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]

- Die Zelle Close erhält den Wert 0. Deshalb lege ich die Größe neu fest, um dies zu verhindern. ArrayInitialize(ask, EMPTY_VALUE);; überprüfen Sie sie.


Sie sind dynamisch, darauf bin ich hereingefallen. Weniger Befehle, weniger Taktzyklen. Sie müssen bei jedem theoretisch möglichen Engpass 500 Millisekunden Verarbeitungszeit bewältigen... ...um es zu schaffen.

Das meine ich nicht: Irgendetwas sagt mir, dass Sie es nicht schaffen werden, das Indikatorfeld zu verkleinern. Außerdem, wenn es ungefüllte Zellen in einem solchen Array gibt, gibt es dort IMMER irgendeinen Wert: 0 oder EMPTY_VALUE, und was erhalten Sie in diesen Berechnungen:

bid[ArrayMaximum(bid)];
ask[ArrayMinimum(ask)];
Und nach allgemeiner Logik: Ich würde die gesamte Tick-Sammlung in einer Schleife laufen lassen und die Zeit separat kontrollieren und, sobald die Zeit des "neuen Taktes" vergangen ist, in die Datei schreiben, wobei die Arbeitsfelder auf Null gesetzt und beschnitten werden.
 
ex_kalibur:
Wenn ich weiß, ist es möglich, Senden und Schließen von Aufträgen in Advisor zu ändern, um das Handelsfenster manuell aufzurufen und den Markt durch dieses Fenster zu betreten, ist es für jene Broker notwendig, die die Verwendung von Advisors nicht erlauben
Fenster "Eigenschaften" des Beraters -> Registerkarte "Allgemein" -> "Automatischer Handel". -> Setzen Sie ein Häkchen bei "Manuelle Bestätigung" - eine andere Möglichkeit kenne ich nicht.
 
TarasBY:

Und nach allgemeiner Logik: Ich würde die gesamte Tick-Sammlung in einer Schleife laufen lassen und die Zeit separat kontrollieren und, sobald die Zeit für den "neuen Balken" verstrichen ist, in die Datei schreiben, wobei die Arbeitsfelder auf Null gesetzt und beschnitten werden.


Seltsam... Ich habe es so... Der einzige Unterschied besteht darin, dass die Zeit im Tick-Sammelzyklus selbst gesteuert wird und das Arbeitsfeld erst dann abgeschnitten wird, wenn eine Kopie des Ticks so oft gezeichnet wurde, wie es keine Ticks minus eine Sekunde gegeben hat. Eine Sekunde vergeht - ein neuer Tick wird gezeichnet, zwei - eine Kopie des vorherigen Ticks und ein neuer Tick, drei - zwei Kopien des vorherigen Ticks und ein neuer Tick, usw. Anstelle von Kopien des vorherigen Ticks ist es möglich, einen Strich bei der Close-Ebene zu zeichnen, diese Variante ist im Code kommentiert.
 
gyfto:

Seltsam... Ich habe es so... Das Einzige ist, dass die Zeit in der Schleife selbst gesteuert wird und das Arbeitsfeld nicht abgeschnitten wird, bis eine Kopie des Ticks so oft gezeichnet wurde, wie es keine Ticks minus eins gab. Eine Sekunde vergeht - ein neuer Tick wird gezeichnet, zwei - eine Kopie des vorherigen Ticks und ein neuer Tick, drei - zwei Kopien des vorherigen Ticks und ein neuer Tick, usw. Anstelle von Kopien des vorherigen Ticks ist es möglich, einen Strich bei der Close-Ebene zu zeichnen, diese Variante ist im Code kommentiert.

Sie und ich sprechen von unterschiedlichen Zyklen. Ich spreche hiervon:

    while (!IsStopped() && IsExpertEnabled())
    {
        //---- Сбор тиков
    }
 
Kann mir jemand sagen, wie ich die Nullen nach dem Komma entfernen kann? Ich habe aus irgendeinem Grund 4 Dezimalstellen in meinem Code. Hier ist der Code. string l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
 
Demon2057:
Kann mir jemand sagen, wie ich die Nullen nach dem Komma entfernen kann? Ich habe aus irgendeinem Grund 4 Dezimalstellen in meinem Code. Hier ist der Code. string l_dbl2str_12 = DoubleToStr(g_ibuf_140[0] - g_ibuf_144[0],3);
https://docs.mql4.com/ru/strings/StringSubstr
 

Können Sie mir sagen, was ich falsch mache...

Ich benötige eine Variable vom Typ double, die das Datum 0,20130429164459 (also 2013.04.29 16:44:59) enthält.

Teil des EA-Codes:

#include <stdlib.mqh>
bool once=false;
int start()
  {
  if (once==false)
     {
    double DTM; // дата и время в формате 0,20130429164459
    int YY=TimeYear(   TimeCurrent());   // Year
    int MN=TimeMonth(  TimeCurrent());   // Month         
    int DD=TimeDay(    TimeCurrent());   // Day
    int HH=TimeHour(   TimeCurrent());   // Hour         
    int MM=TimeMinute( TimeCurrent());   // Minute
    int SS=TimeSeconds(TimeCurrent());   // Second
    DTM = YY*0.0001+MN*0.000001+DD*0.00000001+HH*0.0000000001+MM*0.000000000001+SS;
    
   Alert ("Значение переменной DTM с 06 знаками равно ", DoubleToStrMorePrecision(DTM,6));
   Alert ("Значение переменной DTM с 07 знаками равно ", DoubleToStrMorePrecision(DTM,7));
   Alert ("Значение переменной DTM с 08 знаками равно ", DoubleToStrMorePrecision(DTM,8));
   Alert ("Значение переменной DTM с 09 знаками равно ", DoubleToStrMorePrecision(DTM,9));
   Alert ("Значение переменной DTM с 10 знаками равно ", DoubleToStrMorePrecision(DTM,10));
   Alert ("Значение переменной DTM с 11 знаками равно ", DoubleToStrMorePrecision(DTM,11));
   Alert ("Значение переменной DTM с 12 знаками равно ", DoubleToStrMorePrecision(DTM,12));
   Alert ("Значение переменной DTM с 13 знаками равно ", DoubleToStrMorePrecision(DTM,13));
   Alert ("Значение переменной DTM с 14 знаками равно ", DoubleToStrMorePrecision(DTM,14));
   Alert ("Значение переменной DTM с 15 знаками равно ", DoubleToStrMorePrecision(DTM,15));
   once=true;
      }
   return(0);
  }

Das Ereignisprotokoll für Präzision 12, 13 und 14 liefert ein falsches Ergebnis, siehe Abbildung