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

 
rajak:

Hallo zusammen!

Können Sie beraten, wenn jemand weiß, was das Problem ist, nach dem Kompilieren Datei ex4 nicht erscheinen, durch metalang zu. Was kann ich dagegen tun, und vor ein paar Tagen funktionierte noch alles einwandfrei.

Die Kompilierung läuft ohne Fehler, auch wenn Sie diese absichtlich einführen.

Wenn Sie Windows 7 haben, versuchen Sie, in den virtuellen Ordner zu schauen

c:\Benutzer\Ihr OrdnerAppData\Local\VirtualStore\Programme (x86)\MT4-Ordner\experts\

Ersetzen Sie anstelle Ihres Ordners und des MT4-Ordners Ihre echten Verzeichnisse.

 
lottamer:

Vor einiger Zeit wurde ich von netten Leuten darauf hingewiesen, wie man aus der Funktion "Rückgabe der letzten geschlossenen Position" die Funktion "Rückgabe der letzten beiden geschlossenen Positionen" macht.

Und als ich die Funktion "Tickets für drei geschlossene Positionen" benötigte, konnte ich sie (durch Ähnlichkeit und Auswahlmethode) nicht implementieren

Bitte um Hilfe,

Sie können sehen, dass es zwei Kopien gibt, die zweite mit einigen Änderungen, aber ich konnte sie fortsetzen...

Ich habe diese Variante für das 3. Ticket... und es liefert aus irgendeinem Grund wieder das Ticket der ersten Position...


Ersetzen Sie

if(OrderTicket()==A && (OrderTicket()==B) )continue;

zu

if(OrderTicket()==A || (OrderTicket()==B) )continue;

Es ist nur nicht klar, was Sie tun, um drei Werte aus einer Funktion zurückzugeben

 
Roger:


Ersetzen Sie

unter

Es ist nur nicht klar, was Sie tun, um drei Werte aus einer Funktion zurückzugeben



Es geht darum, das Ergebnis der letzten N Positionen zu berechnen. Dazu rufe ich ihre Karten auf, und dann ist es eine Frage der Technik

fLastClosetPoz();
     OrderSelect( Ticket1,SELECT_BY_TICKET); X=OrderProfit(); SL1=OrderType(); TM1=OrderOpenTime();      Print (Ticket1); Print (SL1,"_",X); //ПОСЛЕДНИЙ 
     OrderSelect( Ticket2,SELECT_BY_TICKET); Y=OrderProfit(); SL2=OrderType(); TM2=OrderOpenTime();      Print (Ticket2); Print (SL2,"_",Y); //ПРЕДпоследний
     OrderSelect( Ticket3,SELECT_BY_TICKET); Z=OrderProfit(); SL3=OrderType(); TM3=OrderOpenTime();      Print (Ticket3); Print (SL3,"_",Z); //ПРЕД-ПРЕДпоследний
 
Roger:


Ersetzen durch

zu


Ehrlich gesagt, hatte ich die Idee, OR durch AND.... zu ersetzen, aber ... :)))))))))))))))))))))

Danke! Jetzt verstehe ich die Logik, obwohl ich, um 15 geschlossene zu zählen, den Code auf die Größe eines Ballons aufblasen muss!

Kann man das Ganze in eine Schleife packen und nur den Parameter für die Anzahl der erforderlichen Abschlüsse N ersetzen?

 
Zhunko:

1. Sie sollten das nicht tun. Es drückt sogar meine Bewunderung für seinen Algorithmus aus. Das ist der HENRYFIX. Damals hatte er einen anderen Spitznamen.

Die Vorsilbe des Skriptnamens ist der erste Buchstabe unseres Spitznamens.

===============

2. Dmitry, egal was passiert, ich bin aufrichtig froh, dass Sie ein geheimes Problem mit einem geheimen Algorithmus gelöst haben, der nicht veröffentlicht werden darf.

3. Alles sah sehr geheimnisvoll aus. Danke fürs Angeben. Du bist zweifellos der coolste Programmierer in diesem Forum und vielleicht sogar im ganzen Universum!

1. ach ja! nachdem du herausgefunden hast, dass es dein Code war, oder der deines Freundes. Abalde war das Beschissenste und Peinlichste, jetzt ist es sofort bewundernswert geworden.

2. Mit dem, was ich programmiere, was ich weiß und wie ich es weiß und kann, mit dem, was ich nicht weiß und nicht kann - damit werde ich irgendwie fertig.

3. Die Aufgabe ist absolut nicht geheim, sie ist absolut klar, sie ist hier offen definiert worden. Alle, die in der Lage sind, es zu verstehen, haben es sofort und ohne Probleme verstanden. Sie wurde nicht durch geheime und magische Methoden gelöst, sondern durch die üblichen und offensichtlichen (und weltbekannten) Methoden. Ich gebe hier nicht an, und über dich, mein Wunder, lache ich. Nur Ihr Größenwahn hindert Sie daran, dies zu verstehen und zu erkennen.

 
Integer:

1. ja, nachdem sich herausgestellt hat, dass es Ihr Code oder der Ihres Freundes ist. Abaldez, das war das Beschissenste und Peinlichste, jetzt ist es sofort bewundernswert.

2. Mit dem, was ich programmiere, was ich weiß und wie ich es weiß und kann, mit dem, was ich nicht weiß und nicht kann - damit werde ich irgendwie fertig.

3. Die Aufgabe ist keineswegs geheim, sie ist absolut klar, sie ist hier offen definiert worden. Alle, die in der Lage sind, es zu verstehen, haben es sofort und ohne Probleme verstanden. Sie wurde nicht durch geheime und magische Methoden gelöst, sondern durch die üblichen und offensichtlichen (und weltbekannten) Methoden. Ich gebe hier nicht an, ich lache über dich, du Wunder. Nur Ihr Größenwahn hindert Sie daran, das zu verstehen und zu erkennen.




Die Leute lösen hier PRAKTISCHE Probleme, und Sie überhäufen den Thread mit Emotionen...
 
lottamer:


Die Leute lösen hier PRAKTISCHE Probleme. Sie überhäufen den Thread mit Emotionen...


Warum schreiben Sie mir das? Nehmen Sie Junko und schreiben Sie das, es ist sein vierter Tag hier, er kann nicht verstehen, worüber wir reden, alle anderen haben es am ersten Tag verstanden.
 

Natürlich muss es bei jeder Debatte Grenzen geben. Andernfalls könnte sie bereits die Grenzen der Zumutbarkeit überschreiten.

Nachdem beide Standpunkte dargelegt worden sind, können sich die Parteien einigen oder auch nicht. - Das ist ihr gutes Recht. Auch wenn die Menschen sich irren. Jeder hat das Recht, sich zu irren.

Wenn es sich um eine öffentliche Debatte wie diese handelt, sehen die Zuschauer die Argumente beider Seiten, und unabhängig davon, ob ein Konsens in der Sache erzielt wird oder nicht, hat jeder die Möglichkeit, seine Version der Lösung (oder beide) zu wählen.

Aber wenn man sich auf Anschuldigungen und Appelle an die Person (und nicht an die Aufgabe, das Thema, den Fall) beschränkt, macht man sich bereits unglaubwürdig. Es ist unnötig und verwerflich (wegen Beleidigung einer Person).


Da die Argumente und Lösungsansätze längst dargelegt sind, schlage ich vor, dass beide Seiten in dieser Frage innehalten und sich gegenseitig ansprechen.

Die Debattanten sind zwar Profis bei der Lösung programmatischer Fragen, aber Neulinge bei der Diskussion von Themen. Das ist nicht unpassend zum Thema des Threads, sondern ermöglicht es, professionellen Rat zu geben. Ich hoffe, dass dieser Rat beherzigt wird.

 
Integer:

1. ja, nachdem sich herausgestellt hat, dass es Ihr Code oder der Ihres Freundes ist. Abaldez, das war das Beschissenste und Peinlichste, jetzt ist es sofort bewundernswert geworden.

2. Mit dem, was ich programmiere, was ich weiß und wie ich es weiß und kann, mit dem, was ich nicht weiß und nicht kann - damit werde ich irgendwie fertig.

3. Die Aufgabe ist keineswegs geheim, sie ist absolut klar, sie ist hier offen definiert worden. Alle, die in der Lage sind, es zu verstehen, haben es sofort und ohne Probleme verstanden. Sie wurde nicht durch geheime und magische Methoden gelöst, sondern durch die üblichen und offensichtlichen (und weltbekannten) Methoden. Ich gebe hier nicht an, und über dich, mein Wunder, lache ich. Nur Ihr Größenwahn hindert Sie daran, dies zu verstehen und zu erkennen.

1. Kennen Sie den Unterschied zwischen einem Code und einem Algorithmus? Außerdem hat der Algorithmus nichts mit dem Öffnen des Diagrammfensters zu tun. Ich habe den Code natürlich korrigiert. Die Stelle, an der sich das Diagramm öffnet, hat sich praktisch nicht verändert. Wir hatten zu diesem Zeitpunkt keine andere Möglichkeit. Ich habe es in der DLL anders gemacht. Sie ist zuverlässiger.

2. Das war großartig! Du bist der Beste!

3:

FAQ:

1) Problem: Jedes Skript (EA) muss sich der Anwesenheit aller anderen bewusst sein.

2) Problem: Wenn ein Fehler auftritt, bleiben die Globals des fehlgeschlagenen Projekts unberührt und die Warteschlange bleibt stecken.

3) Lösung:

Jeder exp organisiert 1 globalka mit Name - allgemeines Präfix + Fensterhandle + Symbol. Der Wert des globalka ist die Zeit des letzten Ticks auf diesem Instrument. 2 gemeinsame Globale mit eigenem Handle (nach der Arbeit schreibt es sein eigenes Handle hinein oder löscht es, wenn es das älteste ist)

Die Warteschlange ist in aufsteigender Reihenfolge angeordnet (Griffe), der ranghöchste setzt die zweite Globale auf Null

In jedem exp werden drei Arrays erstellt (in Ermangelung von Strukturen) - Symbol/Handle/letzte Zugriffszeit/letzte Tickzeit.

alle EXPs verfolgen die (letzte Zugriffszeit/letzte Tickzeit) für alle und sobald sie unterschiedlich sind (einer der EXPs fällt aus), werden beide Globals des ausgefallenen EXPs gelöscht und er wird als inaktiv betrachtet. seine Zellen in den Arrays werden gelöscht (das Array wird neu aufgebaut).

Warteschlange wird wiederhergestellt

Dies geschieht dadurch, dass der EA auf dem aktivsten Chart steht (häufige Ticks).

wenn es normal deinitialisiert wird, räumt jedes Expo nach sich selbst auf.

max skip - ein Häkchen.

ZS. und im Allgemeinen ist es besser, eine Mehrfachwährung zu verwenden.

Das ist also den telepathischen Fähigkeiten von Rustam zu verdanken. Es ist ein hypothetisches Problem und eine hypothetische Lösung. Was hat das mit Ihrem Problem zu tun? Sie haben nie etwas darüber gesagt. Ich musste nachhaken. Die Antwort ist nichts anderes als Beschimpfungen anstelle von konstruktiven Worten, die Sie immer wieder vorschlagen, aber nicht umsetzen.

Im Jahr 2008 hatte ich eine ähnliche Herausforderung. Geheimnisse werden nicht ausreichen, wie einige. Ich werde an einem konkreten Beispiel erläutern, um welche Art von Problem es sich handelt, wie es zu lösen ist und warum ich glaube, dass die Lösung solcher Probleme auf diese Weise nicht erfolgreich ist.

============================

Die Ausgangsdaten des Problems:

1. Die Aufgabe hat mehrere identische Experten in einer Schleife. D.h. völlig unabhängige Threads.

2. Es gibt eine Datenbank mit Koeffizienten, die in 8 Gruppen unterteilt sind und auf die einige Experten Zugriff haben. Die DB-Größe beginnt bei 2 Gb.

3. der DB wird manchmal wieder aufgefüllt. Aufgefüllt in Zeiträumen, die ein Vielfaches von 2 Stunden betragen. Die Bearbeitungszeit hängt vom Vielfachen der Tageszeit ab. Die Dauer variiert zwischen 5 und 45 Minuten, abhängig von der Tageszeit und der CPU-Kapazität.

Aufgabe:

Da die Ergänzung der Datenbank sehr zeitaufwendig ist, sollte nur ein Experte für die Ergänzung der Datenbank zuständig sein. Andernfalls können Sie möglicherweise nicht warten, bis es zu Ende ist.

2. Es ist notwendig, den Zugriff auf die Datenbank zu verbieten, während sie aktualisiert wird. Tun Sie dies in Gruppen, um die Aktualisierung der Koeffizienten, mit denen die Experten arbeiten, nicht wesentlich zu verlangsamen.

Experten, die mit Koeffizienten arbeiten, die gerade aktualisiert werden, sollten mit alten Koeffizienten arbeiten.

Sachverständige, die während des Aktualisierungszeitraums zu einer bestimmten Gruppe von Koeffizienten gewechselt sind, sollten mit einem einzigen Koeffizienten arbeiten und dies mitteilen. Wenn die Aktualisierung abgeschlossen ist, sollten sie zum neuen Koeffizienten wechseln. Das Gleiche gilt für Punkt 3.

Die damalige Lösung:

1. Es wird eine gemeinsame Warteschlange von Expertenkennungen erstellt, die aus ihren Indizes besteht.

2. Die Kennungen der Experten, die auf die Datenbank zugreifen, werden in eine Warteschlange gestellt, die aus ihren Indizes besteht.

Beide Warteschlangen sind eine gemeinsame Ressource. Der Zugriff auf die Warteschlangen wird durch ein einziges Synchronisationsobjekt synchronisiert.

Der erste Experte der zweiten Warteschlange ist für die Aktualisierung der Datenbank zuständig. 4.

5. Außerdem ist es fast so, wie Rustam es beschrieben hat. Durch die Implementierung in der DLL ist es ein wenig einfacher.

Die Bezeichner sind die durchgehenden Indizes. Wenn wir einen Expert Advisor löschen, wird die Kennung aus der Warteschlange entfernt. Eine Neuindizierung wird nicht durchgeführt. Die verbleibenden Experten werden ihre Indizes verlassen.

Wenn beim Hinzufügen eines neuen Experten der Index des letzten Experten nicht mit dessen Nummer übereinstimmt, wird der erste freie alte Index zugewiesen. Andernfalls werden neue Indizes zugewiesen.

Eine Bindung an den Deskriptor und das Karteninstrument ist nicht erforderlich. Es ist auch nicht nötig, einen Entladefehler zu verfolgen. Es hat noch nie einen Misserfolg gegeben. Selbst wenn es passiert ist, ist es keine Katastrophe. Die EA würde weiterhin mit den alten Verhältnissen arbeiten. Bei der nächsten Aktualisierung würde der Controller des Aktualisierungszählers keine Aktualisierung feststellen und die ID des federführenden EA aus der zweiten Warteschlange streichen. Der nächste Experte würde den Auftrag des Meisters übernehmen. Derselbe Controller würde dasselbe tun, wenn der Expert Advisor in den Datenbankverbindungsmodus wechselt. D. h., er stellt sie in die zweite Warteschlange. D.h. nur Experten, die an M1 arbeiten, wo der Koeffizientenwert nicht kritisch ist, wären davon betroffen.

Eine solche Lösung erfüllte die Aufgabe vollständig, aber ich mochte sie nicht, weil die Expert Advisors aneinander gebunden sind und der Expert Advisor eine ungewöhnliche Aufgabe hat, um die Datenbank aufzufüllen, was nicht zur Zuverlässigkeit beiträgt. Damals wusste ich noch nicht, wie man viele Dinge macht. Ein Jahr später habe ich es wieder gemacht.

Lösung 2:

1) Die Datenbank wird in einem separaten Thread verwaltet, wo sie sich nach einem Zeitplan selbst auffüllt.

2. Der Zugriff auf die Datenbank zum Zeitpunkt der Wiederauffüllung ist durch das Synchronisationsobjekt geschützt.

Es ist alles viel einfacher geworden. Ohne Warteschlangen. Aber es hat mir auch nicht besonders gefallen. Vor einer Auffüllung rief die Datenbank das Skript zum Auslagern von Zitaten auf, was manchmal zu einem Speicherüberlauf führte. Das verlangsamte MT4 erheblich. Zu dieser Zeit arbeitete MT4 mit 2 GB Speicher. Er läuft jetzt mit 4 GB.

Lösung 3:

1. die DB ist eine separate Anwendung. D.h. ein weiterer Prozess mit eigenem Speicher, der unabhängig von MT4 ist.

2. die DB füllt sich selbst auf.

Der Datenaustausch erfolgt durch Mapping. Dadurch wurden der Datenaustausch und die Auffüllung der Datenbank beschleunigt. Zuvor wurde alles von der Festplatte gelesen. Es war unmöglich, es anders zu machen. Der Arbeitsspeicher von МТ4 ist sehr begrenzt.

4. Die Historie wird von MT4 remote aus der DB-Anwendung gepumpt, wo man sie nach Bedarf kickt. Jede Störung von MT4 - sein Entladen und anschließendes Laden.

5. Punkt 4 wird durch die Erstellung eines symbolischen Links zum aktuellen MT4-Verzeichnis erledigt. D.h. es ist eine vollständige Kopie des aktuellen MT4. Die Historie wird on the fly direkt in die MT4-Verzeichnisse aktualisiert, ohne auf den funktionierenden MT4-Upload zu warten.

6. Synchronisierung des Zugriffs auf die Datenbank zum Zeitpunkt ihrer Aktualisierung durch Mutex, da der kritische Abschnitt nur für einen Prozess arbeitet.

========================

Also, Dmitry, ohne deine Aufgabe zu kennen, könntest du annehmen, dass sie ohne die Organisation der Warteschlange und die Unabhängigkeit der Expert Advisor Threads gelöst werden kann. Dadurch werden die Zuverlässigkeit und die Gesamtleistung erhöht. Ich spreche bereits seit mehreren Seiten darüber (Unabhängigkeit der Themen).

 

Entschuldigung. Darauf gibt es keine Antwort:

Integer:

Es handelt sich um eine atomare Zugriffseinheit und keine Synchronisierung. Es ist nicht sinnvoll, nur die Kaution auf diese Weise zu behandeln. Der Aufruf einer der Hinterlegungsparameter-Funktionen ist ohne weitere Anpassungen atomar. Wenn Sie dies atomar tun, wird die gesamte Arbeit des Expert Advisors übernommen. So löst man Probleme - man denkt, man hat etwas getan, aber in Wirklichkeit ist es eine Illusion.

Dmitry, du solltest nicht denken, dass es nur Dummköpfe gibt. Aus Sergejs Frage geht hervor, dass er das Problem gut verstanden hat.

Natürlich ist ein einfacher Verweis auf die Einzahlungsparameter mit Synchronisation sinnlos. Um diese Parameter zu ändern, ist eine Synchronisierung erforderlich. Damit der parallele Expert Advisor den korrekten Parameter erhält, der bereits geändert wurde, und nicht erst während der Änderung des Parameters.