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

 
granit77:
Victor, du irrst dich. Dank dieser etwas langwierigen Diskussion beantworteten zwei Programmierer gleichzeitig Fragen von Neulingen, was dem Thema nur zuträglich war :))

Nun, ich habe es gerne gelesen. Und es war sehr aufschlussreich, die Haltung der fortgeschrittenen (ich weiß nicht, wie ich Sie jetzt nennen Programmierer oder nicht - ich bin jetzt verwirrt : )) ) - Sagen wir es mal so: Spezialisten, die fortgeschrittene Probleme lösen: ))) und ihre Ansichten über scheinbar einfache Aufgaben. Ich hoffe aufrichtig, dass dies trotz aller Meinungsverschiedenheiten eine emotionslose und freundliche Diskussion ist. Ich habe leider auch noch (ungelöste) Meinungsverschiedenheiten. Aber ich vertrete hier nur einen philosophischen Ansatz. Wenn die Lösung für ein Problem auf diese Weise nicht offensichtlich ist, muss man einen anderen Weg finden. Aber es ist sehr nützlich, über das Problem Bescheid zu wissen.

Vielen Dank für die Diskussion. Es ist bedauerlich, dass wir nicht zu einem Konsens gekommen sind. (Aber es hat sich noch kein Konsens herauskristallisiert... (ich denke dabei an das Lied "There, far away, by the metro"))

Und es ist natürlich schade, dass es keine offensichtlichen Antworten auf meine und Arles' Fragen gab. Ich denke, dass diese Fragen nicht nur für ihn und mich gelten, sondern für viele weniger erfahrene Fachleute, die es schwierig finden, ihre eigenen Threads und I.T. zu erstellen, und sich deshalb an Programme und Shells wenden, die von fortgeschrittenen Fachleuten geschrieben wurden.

Nun, das ist schon in Ordnung. Mit der Zeit werden wir auch diese Probleme lösen. : )) Herzlichen Dank für Ihre Bemühungen. Alle Parteien haben letztlich eine positive Einstellung (auch wenn sie unterschiedliche Lösungsansätze haben). Und es gefällt.

Übrigens, in meinen pädagogischen Forschungen sage ich oft: nicht alle Fragen sind lösbar, wir kennen oft nicht alle Antworten; deshalb können sie immer noch... offen bleiben. (Ich versuche, ein sanftes Ende der Diskussion zu finden) Nochmals vielen Dank!
 
Ich brauche Hilfe: 1. Wie erkenne ich den Preis des obersten offenen oder schwebenden Verkaufsauftrags? 2. Wie prüfe ich, ob es einen offenen oder schwebenden Verkaufsauftrag zu dem von mir angegebenen Preis gibt?
 

Sergei, welche Fragen sind ungelöst geblieben? Wenn dies:

Chiripaha:

D.h. um Arles Frage zu beantworten: Wenn ein EA Aufträge verbucht hat und eine Weile "schläft", wird in diesem Moment ein anderer EA, der das Limit der zugewiesenen Mittel nicht überschritten hat (nehmen wir an, 80 % der Einlage - beide EAs haben diese Größe), einen Auftrag erteilen (ein Geschäft auf dem Markt eingehen). Und wenn der 1. die Arbeit wieder aufnimmt (und das Money-Management-Terminal bereits am Vortag berechnet wurde), wird er/sie auch ein Geschäft eröffnen, das die vom Expert Advisor festgelegten Grenzen überschreitet?

Wenn dieses System (hypothetisch) durch mehrere EAs multipliziert wird, kann es dann eines geben, bei dem das Risikomanagement in einem kritischen System ist?

Verstehe ich dieses Multithreading richtig? - Wenn ja, dann ist es aus finanzieller Sicht natürlich eine Katastrophe. Aber da die Wahrscheinlichkeit bei kleinen Konten gering ist, ist dies nur hypothetisch. Und bei größeren Konten werden sie wahrscheinlich selbst etwas schreiben. Aber ist das wirklich der Fall?

Und ich habe eine Frage: Ist dies die offizielle Position oder sind es nur Spekulationen und Erfahrungen wie meine?

Es gibt einen Code auf Seite 378. Hier ist es wieder:

#property show_inputs

extern int Pause = 1000;

int    hwndChart = NULL; // Уникальный идентификатор скрипта.
string sName = "Condition";

void init()
 {
  hwndChart = WindowHandle(Symbol(), 0);
  // Создаём глобальную переменную синхронизации скриптов.
  if (!GlobalVariableCheck(sName)) GlobalVariableSet(sName, 0);
 }
 
void deinit()
 {
  GlobalVariableDel(sName);
 }

void start()
 {
  while (!IsStopped())
   {// Начало блока синхронизации.
    GlobalVariableSetOnCondition(sName, hwndChart, 0);
    if (GlobalVariableGet(sName) == hwndChart)
     {
      Print("Start");
      Sleep(Pause); // Имитация работы.
      Print("End");
     }
    GlobalVariableSetOnCondition(sName, 0, hwndChart);
    // Завершение блока синхронизации.
    Sleep(200);
   }
 }
Wenn es sich bei der Verzögerung um ein "Nachahmungswerk" handelt, fügen Sie einen Hinweis auf die Lagerstätte oder eine andere Quelle ein.

Sie können diesen Sync-Block in eine Funktion umwandeln und in der Bibliothek ablegen. Sie haben eine synchrone Funktion für den Zugriff auf das Depot von jedem EA aus.

 
Ersetzen Sie den Index durch den Griff des Diagrammfensters
 
FAQ:
Ersetzen Sie den Index durch den Handle des Diagrammfensters

Genau! Bei Indizes ist es schwer herauszufinden, was was ist.

Ich habe es neu gemacht.

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

Die Indizierung ermöglicht es jedoch, eine globale Variable ordnungsgemäß zu löschen.

Wir sollten den Index im Deinit dekrementieren. Und löschen Sie die globale Variable, wenn der Index gleich Null ist.

Aber dieses Dekrement erlaubt es nicht, das Skript nach dem Löschen neu zu laden. Die Indizes werden durcheinander gebracht.

Wir sollten ein globales Array mit den Indizes aller Module erstellen, die auf die Ressource zugreifen. Nun, und damit arbeiten.

Es ist auch möglich, zwei globale Variablen zu erstellen. Eine mit dem letzten Index, die andere mit der aktuellen Anzahl der Module. Die Indizes steigen nur. Wahrscheinlich wird es einfacher sein.

Oder lassen Sie die globale Variable ganz weg. Löschen Sie sie vor der ersten Ausführung manuell.

 
Dies funktioniert bis zum ersten Fehlschlag, wenn der Experimentator den Gesamtzähler nicht dekrementiert.
 
Ich hab's! Wir müssen auch synchron aussteigen. In deinit warten Sie, bis Sie an der Reihe sind und beenden Sie es mit dem Zurücksetzen der globalen Variablen. Wenn auf die Ressource nur kurzzeitig zugegriffen wird, ist sie beim Deinit in Ordnung.
 

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 unbesetzt 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.

 
Zhunko:

Sergei, welche Fragen sind ungelöst geblieben? Wenn das:

Es gibt einen Code auf Seite 378. Hier ist es wieder:

Bei einer Verzögerung der "Nachahmung eines Werks" fügen Sie einen Verweis auf die Hinterlegung oder eine andere Quelle ein.

Sie können diesen Sync-Block in eine Funktion umwandeln und in eine Bibliothek einfügen. Sie erhalten eine synchrone Funktion für den Zugriff auf das Depot von jedem Expert Advisor aus.

Dies ist ein atomarer Zugriffsblock und es findet keine Synchronisation statt. Es macht keinen Sinn, sich nur auf die Kaution zu beziehen. Der Aufruf einer der Funktionen für die Einzahlungsparameter erfolgt von selbst, ohne weitere Anstöße. 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.

 
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 unbesetzt 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 (Handles), die älteste 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.


Er wird nicht verstehen, zu schlecht gesehen von oben)))) Ich habe diese Aufgabe in etwa in diesem Stil gelöst. Es ist schön, jemanden zu haben, der das Wesen des Problems versteht. Nur habe ich noch eine Warteschlange, in welcher Reihenfolge die Aufgaben begonnen haben, ausgeführt zu werden, und werden weiter im Kreis ausgeführt.
Grund der Beschwerde: