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

 
rabanik:
Guten Tag. Bitte helfen Sie mir, den folgenden Code für einen EA zu schreiben. Ich möchte durch ein Array zu tun (wenn Sie eine bessere Option haben, bitte helfen). Im Allgemeinen sendet der EA Nachrichten, aber ich möchte, dass er sie über ein Array (temporär) sendet. D.h. wenn der Expert Advisor mit dem Senden der Nachricht beginnt, prüft er, ob die Nachricht schon früher gesendet wurde (prüft, ob die Nachricht im Array gespeichert ist), wenn nicht, sendet er die Nachricht, wenn die Nachricht gefunden wird, wird das Senden ausgelassen. Ich hoffe, es ist klar) Vielen Dank!

Sind Sie sich bei der Problemstellung sicher?

Ganz einfach, es gibt Optionen:

- Wiederholen Sie die letzte Nachricht nicht

- die veraltete Nachricht zu ignorieren (es wird eine gewisse Zeitverzögerung eingestellt), d.h. die Nachricht muss wiederholt werden.

P.S. Die erste Variante ist ein Spezialfall der zweiten, aber sie ist viel einfacher zu implementieren. Ihre Definition des Problems ist auch ein Spezialfall der zweiten Variante mit unendlicher Verzögerung.

Wenn es Sie interessiert, hier ist die Lösung für Ihr Problem.

Wir definieren zwei Arrays: ein Text-Array, in dem die Nachrichten gespeichert werden, und ein Index-Array, in dem die Nachrichten gesucht werden.

Das Index-Array ist vom Typ int. In die erste Dimension schreiben wir die Prüfsumme der Textnachricht. In der zweiten - die Zeilennummer des ersten Arrays. Ein Index-Array wird nach der ersten Dimension sortiert.

Wir erhalten eine neue Nachricht. Lesen Sie die Prüfsumme. Mit der Funktion ArrayBsearch() finden Sie eine solche Nachricht. Wenn sie nicht gefunden wird, ist die Nachricht original. Fügen Sie sie dem Nachrichten-Array hinzu und bilden Sie die Prüfsumme mit Bezug auf das Index-Array, wobei Sie daran denken, sie zu sortieren.

Welche Optionen gibt es für die Prüfsumme? Ich würde das hier nehmen: Berücksichtigen Sie die Anzahl der Zeichen und die Prüfsumme des Textes. Die Prüfsumme des Textes ist z. B. die Summe der Zeichencodes. Angesichts der jüngsten Änderungen kann sie 65 536*256 nicht überschreiten. Das heißt, die Prüfsumme der Nachricht kann wie folgt aussehen:

die Anzahl der Zeichen multipliziert mit 10 Millionen und addiert die Textprüfsumme.

 

pro! Es gibt ein Problem mit der Linie am Winkel.

Ich habe einTRENDBYANGLE mit Koordinaten erstellt.

ObjectCreate(0,"anglestok",OBJ_TRENDBYANGLE,0,0,0);
ObjectSet("anglestok",OBJPROP_TIME1,X1); ObjectSet("anglestok",OBJPROP_PRICE1,Y1);
ObjectSet("anglestok",OBJPROP_TIME2,X2); ObjectSet("anglestok",OBJPROP_PRICE2,Y2);

- Ich brauche eine Perspektive.

anglestok= ObjectGetDouble(0,"anglestok",OBJPROP_ANGLE);

Hilfe sagt, dass die vom Programm erzeugte Linie - der Winkel von NULL - in Ordnung ist.

Ich habe denselben Code noch einmal an denselben Koordinaten ausgeführt, ohne die Linie zu berühren - es erscheint die richtige Gradzahl, nicht Null. Warum, wie kann ich es beim ersten Mal richtig machen?

oder ich gebe eine koordinate an - ich frage nach dem winkel - er sagt 0. ich gebe gleich eine weitere an - er sagt winkel der vorherigen koordinaten. unsinn

 
In welchen Fällen wird const hinter die Beschreibung der Funktionssignatur gesetzt? Ich kann dazu keine Informationen finden.
void qwe(int abc) const {...}
 
Ich scheine hier keine wirklich sachkundigen Leute zu finden, habe mich einfach umsonst angemeldet =/
 
K_i_r_i_t_o:
Ich habe diesen Kommentar an den Anfang verschoben, weil niemand geantwortet hat, aber ich brauche ihn wirklich =/
Ist es möglich, dies zu implementieren:wenn ich eine beliebige Taste drücken, ein Teil des Indikators Code eingeschaltet ist (verantwortlich für die Erstellung eines Objekts mit einem Mausklick), dann, wenn ein Ereignis eintritt (der zweite Teil des Codes, kann das Ereignis sein, die Erstellung des gleichen Objekts zum Beispiel), dann ist der erste Teil des Codes deaktiviert (und wenn nicht dies tun, wird das Objekt von jedem Klick erstellt), und läuft auch, wenn Sie die Taste drücken, und so weiter um den Kreis)
Sie können. OnChartEvent-Block hinzufügen. Notieren Sie darin die notwendigen Drücke und Messungen und beschreiben Sie die Reaktion auf diese entsprechend Ihrer Idee.
 
SunnYtheDreamer:
Sie können. OnChartEvent-Block hinzufügen. Verfolgen Sie darin die notwendigen Belastungen und Messungen und beschreiben Sie die Reaktion darauf, entsprechend Ihrer Idee.
DieDeaktivierung eines Teils des Codes für die Zeit vor dem Drücken der Taste ist unmöglich =/ Es gibt eine einfachere Variante, aber es gibt ein Problem:Wenn ich die Taste drücke, mussich ihren Wert an den Anfang der ersten if-Anweisung zurückgeben
#define  VK_D 0x44
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam) // параметр события типа string 
{ 
 Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);

int      y     =(int)dparam;
datetime dt    =0;
double   price =0;  
int      window=0;
int i;
int x=(int)lparam;

if (id==CHARTEVENT_CLICK)
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

if(id==CHARTEVENT_KEYDOWN) 
{ switch(int(lparam)) 
{ case VK_D:
i=rand();
}}}}
 
K_i_r_i_t_o:
Ich kann nicht implementieren Deaktivieren Teil des Codes für den Punkt vor dem Tastendruck =/ Es gibt einen einfacheren Weg, aber es gibt ein Problem:i mussseinen Wert an den Anfang der ersten if-Anweisung zurück, wenn die Taste gedrückt wird.
if (id==CHARTEVENT_CLICK)
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

   if(id==CHARTEVENT_KEYDOWN) 
   {
      switch(int(lparam)) 
      {
         case VK_D: i=rand();
      }
   }
}
Dieser Code wird nur ausgeführt, wenn die Maus angeklickt wird. In diesem Fall wird nach 3 Codezeilen das Ereignis des Tastendrucks überprüft. Und diese 3 Codezeilen werden in wenigen Millisekunden ausgeführt, und selbst wenn sich die ID während des aktuellen Aufrufs von OnChartEvent ändern kann, ist die Chance, dass während der Ausführung von 3 Codezeilen die Taste gedrückt wird = 0%. Offensichtlich ist es sinnlos, id in einem Block zu prüfen, der bei einem bestimmten id-Wert ausgelöst wird, und dort auf einen anderen Wert zu warten. Prüfen Sie zunächst den Tastendruck, speichern Sie in einem separaten Block in einer Variablen die Nummer der Taste oder einfach nur die Tatsache, dass Sie die gewünschte Taste gedrückt haben. Und mit dieser Variable aktivieren oder deaktivieren Sie das Codestück, das sich im Block für den Mausklick befindet.
char key = -1; //эта переменная должна быть объявлена за пределами блока OnCharEvent
if(id==CHARTEVENT_KEYDOWN)
key = lparam;

if (id==CHARTEVENT_CLICK && key == 'D')
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
   i=rand();
   key = -1;
}
 
SunnYtheDreamer:
Dieser Code wird nur ausgeführt, wenn die Maus angeklickt wird, mit 3 Codezeilen, die auf ein Tastendruckereignis prüfen. Und diese 3 Zeilen Code werden in ein paar Millisekunden ausgeführt, und selbst wenn id während des aktuellen Aufrufs OnChartEvent ändern kann, ist die Chance, dass während der Zeit, die Ausführung von 3 Zeilen Code, die Taste gedrückt wird = 0%. Offensichtlich ist es sinnlos, id in einem Block zu prüfen, der bei einem bestimmten id-Wert ausgelöst wird, und dort auf einen anderen Wert zu warten. Prüfen Sie zunächst den Tastendruck, speichern Sie in einem separaten Block in einer Variablen die Nummer der Taste oder einfach nur die Tatsache, dass Sie die gewünschte Taste gedrückt haben. Und mit dieser Variable aktivieren oder deaktivieren Sie das Codestück, das sich im Block für den Mausklick befindet.

Vielen Dank!) Das ist die Zeile, nach der ich gesucht habe if (id==CHARTEVENT_CLICK && key == 'D'), konnte keine Verbindung zwischen zwei Ereignissen herstellen, das hat nicht funktioniert if (id==CHARTEVENT_CLICK & id==CHARTEVENT_KEYDOWN) Vielen Dank nochmals)

 

Hallo, ich habe eine Funktion, die die durchschnittliche Größe einer Kerze aus den letzten n Kerzen berechnet. manchmal gibt es die folgenden Werte: "5e-05.0". ich brauche sie nicht, zu meiner Schande weiß ich nicht quantitativ, wie viele und wie man sie abschneiden. NormalizeDouble() hilft nicht. Bitte sagen Sie mir, wie man solche Zahlen programmatisch berechnet, um sie abzuschneiden

 
pycha:

Hallo, ich habe eine Funktion, die die durchschnittliche Größe einer Kerze aus den letzten n Kerzen berechnet. manchmal gibt sie die folgenden Werte aus: "5e-05.0". ich brauche sie nicht, zu meiner Schande weiß ich nicht, wie viel sie sind und wie man sie abschneidet. NormalizeDouble() hilft nicht. Bitte sagen Sie mir, wie man solche Zahlen programmatisch berechnet, um sie abzuschneiden


5e-05 (5*10 zur -5ten Potenz) = 0,00005.
Was soll man also abschneiden?
if(val >= 0.00001)
Solche kleinen Kerzen, 5 Pips, können nur auf einem niedrigen Breitengrad, auf einem 5-stelligen Konto, auf niedrigen Zeitrahmen auftreten. Wenn Sie nicht mit Scalping zu tun haben, aber der Durchschnitt ist manchmal so klein für n Kerzen, dann sollte die Umsetzung der Funktion verdächtig sein.
Grund der Beschwerde: