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

 
Arles:
Bitte geben Sie mir einen Rat, wie ich das Problem lösen kann: Derselbe EA ist auf mehreren Charts, ein Signal zum Öffnen einer Order erscheint z.B. auf zwei Charts zur gleichen Zeit. Die zweite Bestellung darf sich jedoch nicht öffnen. Der EA hat eine Prüfung auf einen offenen Auftrag, aber das hilft nicht, weil der erste EA den Auftrag öffnen muss und der zweite auch eine Anfrage zum Öffnen des Auftrags sendet. Haben Sie eine Lösung?
Es ist nicht ganz klar, für welche Zwecke mehrere identische EAs auf mehreren Charts eingesetzt werden. - Ausgehend von diesem Verständnis wäre es logischer, etwas zu empfehlen. Nach den uns vorliegenden Informationen können Sie jedoch, wenn nur ein EA handeln soll, den zweiten EA entweder in den Einstellungen (sofern im EA vorhanden) oder auf der Registerkarte "Allgemein" - EA den Handel erlauben (das Kontrollkästchen deaktivieren) vom Handel ausschließen.
Übrigens, alle Expert Advisors arbeiten nicht parallel im selben Terminal, sondern nacheinander. - Solange der 1. seine Arbeit nicht beendet hat, kann der 2. keine Daten verarbeiten. Wenn der EA also richtig geschrieben ist, d.h. er prüft auf die erteilte Order, dann wird die zweite diese Order bereits berücksichtigen. - Dies ist eine. Dies ist jedoch nur möglich, wenn die Expert Advisors so eingerichtet sind, dass sie kohärent arbeiten. Nehmen wir an, sie haben die gleiche Magie und Buchhaltung für Geldmanagement. Ansonsten nur durch Deaktivierung "überflüssiger" EAs. - Warum werden sie dann eingesetzt...?
 
Chiripaha:
Es ist nicht ganz klar, für welche Zwecke mehrere identische EAs auf mehreren Charts eingesetzt werden.

Der Expert Advisor analysiert nur das Paar, über dem er schwebt. Bei dem Paar, bei dem das Signal zuerst erscheint, wird eine Order eröffnet. Aber manchmal erscheint ein Signal auf zwei Paaren gleichzeitig. Und, so seltsam es auch klingen mag, es werden 2 Aufträge geöffnet, obwohl der Expert Advisor für jeden offenen Auftrag eine Prüfung durchführt und den zweiten nicht öffnen sollte. Das ist notwendig, weil wir nicht genug Geld auf der Kaution haben.

Solange der 1. seine Arbeit nicht beendet hat, wird der 2. keine Daten verarbeiten.

Ja, aber wenn der erste die Arbeit beendet und einen Auftrag eröffnet hat, sieht der zweite, der mit der Arbeit begonnen hat, für kurze Zeit NICHT, dass es bereits einen Auftrag gibt. Entweder macht er sich an die Arbeit, bevor die Bestellung geöffnet wird.
--

Noch eine Sache: Wenn der 1. EA Sleep(1000) ist, wartet der zweite EA oder beginnt er zu arbeiten?

 

Guten Tag zusammen!

Kodiert die folgende Idee

Bedingung N1 ..Wenn High[1] einen bestimmten Höchstwert überschreitet X

und zur gleichen Zeit

Bedingung N2 .Die Differenz zwischen High[1] und Low der ersten der nächsten 150 Kerzen >= 150 p.

------------------------------------------------------------------

Aktion N1 . Vorherige Bestellung löschen

Aktion N2 ...Pending Order platzieren

Aktion N3 . Weisen Sie den Variablen Werte zu.

PROBLEM. Trotz der Tatsache, dass der schwebende Auftrag nur dann erteilt werden sollte , wenn es keine Aufträge auf dem Markt gibt oder der letzte Auftrag nicht auf dem aktuellen Balken erteilt wird. if (ot==0|| last_order_bar>0)

Wenn Bedingung N1 und Bedingung N2 erfüllt sind, werden MEHRERE anhängige Aufträge gleichzeitig erteilt.

Ich möchte nur EINEN schwebenden Auftrag erteilen.

-----------------------------------------------

Die Werte ot und last_order_bar werden oben in diesem Code berechnet

                                                                                                                        
                                                                                                                
int last_order_bar = 0;                                                                                                                 
int ot = OrdersTotal();                                                                                                                 
                                                                                                                        
 if (ot>0) //если есть ордера в рынке                                                                                                                   
 {                                                                                                                      
   if (OrderSelect (ot-1,SELECT_BY_POS)) //выбрали последний ордер                                                                                                                      
      if ( OrderType ()==OP_SELLSTOP) //проверили тип
        last_order_bar = iBarShift (Symbol (),0,T ); //запомнили, на каком  баре открыт последний ордер (если он есть)                                                                                                                  
 }                                                                                                                      
if(High[1] > X )
 {
   
   for(int i=1;i<150;i++)
     {
      if((High[1]-Low[i])>=1500*Point)//
      break;         //
             {
     if (ot>0) 
         {
           bool R = OrderDelete(OrderTicket());  
         }
if(R==0)                      //если последний выставленный SELLSTOP удален
         {
if (ot==0 || last_order_bar>0)        
int Ticket=OrderSend(Symbol(),OP_SELLSTOP,0.1,iHigh( Symbol (), 0,1)-1500*Point,1,iHigh( Symbol (), 0,1),iHigh( Symbol (), 0,1)-1610*Point,"jfh",123 );//выставить новый SELLSTOP       
if (Ticket>0)                // если SELLSTOP выставлен
 N = (OrderTicket());        //запомнить в глобальную переменную N тикета данного SELLSTOP .
 T = Time [0];               //запомнить в глобальную переменную время выставления данного SELLSTOP
 X=iHigh( Symbol (), 0,1);   //запомнить в глобальную переменную High свечи N1 после которой был выставлен данный SELLSTOP
   
 }
 }
 }
 }
}
 }   
                        
return(0);
 
Arles:

Der Expert Advisor analysiert nur das Paar, über dem er schwebt. Auf welchem Paar ein Signal zuerst erscheint, eröffnet es einen Auftrag. Aber manchmal erscheint ein Signal auf zwei Paaren gleichzeitig. Und, so seltsam es klingen mag, es werden 2 Orders geöffnet, obwohl der Expert Advisor eine Prüfung für jede offene Order hat und die zweite nicht öffnen sollte. Das ist notwendig, weil wir nicht genug Geld auf der Kaution haben.

Ja, aber wenn der erste seine Arbeit beendet und einen Auftrag eröffnet hat, sieht der zweite, der mit seiner Arbeit begonnen hat, für kurze Zeit nicht, dass der Auftrag bereits existiert. Oder er macht sich an die Arbeit, bevor die Bestellung geöffnet wird.
--

Noch eine Sache: Wenn der 1. EA Sleep(1000) ist, wartet der zweite EA oder beginnt er zu arbeiten?

Zur ersten Frage: Ich habe festgelegt, dass, wenn die EAs richtig geschrieben sind... Natürlich kann es so passieren, wie Sie es beschrieben haben, wenn es im EA keine Prüfung für eine platzierte (offene) Order und für die Berechnung des Money Managements gibt - das hängt alles vom Niveau (und der Faulheit) des Programmierers ab - ob er diese Dinge durchdacht und im EA vorgeschrieben hat oder nicht. Wenn alles richtig umgesetzt wird, wird keine Ihrer Befürchtungen eintreten. - Das Signal, ja, kann bei 2 Paaren gleichzeitig erscheinen, aber (siehe den vorherigen Beitrag), die Expert Advisors arbeiten sequenziell. Solange also der erste EA die Kurse nicht verarbeitet hat, kann der nächste nicht arbeiten. - Ich denke, das ist der Grund, warum wir uns für eine sequentielle Reihenfolge entschieden haben (selbst wenn es möglich wäre, Zitate parallel zu verarbeiten, wäre das ein anderes Thema).

Es hängt auch von der Ebene des EA ab. Denn all die Dinge, nach denen Sie gefragt haben, sind ziemlich mühsam zu verschreiben - keine kleine Aufgabe, die Kenntnisse über Finanzen erfordert. Aus diesem Grund sind EAs in der Regel "einfach" und darauf ausgerichtet, das gesamte Konto für die aktuelle Währung zu erhalten. In der Regel wird eine Währung gehandelt. Denn für den Handel mit mehreren Währungen braucht man zum Beispiel eine ganz andere Art von Einlagen, und solche einfachen Systeme sind dort nicht wirklich anwendbar. Die einzige Ausnahme hiervon sind Absicherungsgeschäfte (ich habe den genauen Begriff vergessen, ich werde ihn anders formulieren), bei denen man zu einem Preis eröffnet und sofort zu einem anderen (oder sogar mehreren) wieder eröffnet - die Differenz ist für sich selbst. Aber dies ist eine andere Art von EA und alles wird dort berücksichtigt (alles in einem). - Und im Allgemeinen, meiner Meinung nach, wenn es nicht mehr Geld als Liquidität auf einem Paar gibt, dann ist der Handel auf allen Paaren auf einmal ein schlechter Ton. (dies ist jedoch meine private Meinung) Portfolios usw. - Dies ist nicht für den spekulativen Handel gedacht. Aus irgendeinem Grund wird das von den Menschen überhaupt nicht beachtet. - Wenn Sie kein Unternehmen sind, das international produziert oder Handel treibt, brauchen Sie nicht viele Währungen. - Das ist mein Punkt - warum werden solche Blöcke zur Berücksichtigung verschiedener Währungen in EAs normalerweise nicht implementiert - weil sie irrelevant sind.

Und zur zweiten Frage: Ehrlich gesagt, habe ich selbst diese Frage offen - ich bin nicht ganz sicher, wie das Terminal reagiert, wenn Sleep(1000) funktioniert - ich appelliere an diejenigen, die das wissen, mir Ratschläge zu geben. Im Idealfall verarbeitet das Terminal zu diesem Zeitpunkt nur die Streaming-Preise, d.h. es empfängt Kurse und zeichnet Charts und Indikatoren. Aber während dieser EA "wartet", wird er seinen Zug nicht an jemand anderen weitergeben. - Aber das ist meine Annahme, bei der ich mir nicht ganz sicher bin. Eine weitere Ausnahme von dieser "Warteschlange" sind vielleicht Skripte, die zur Ausführung gestartet werden können, während der EA wartet. - Ich habe die gleiche Frage.

Ich kann diese Unwissenheit jedoch überwinden, indem ich meine Expert Advisors auf der Grundlage der Korrektheit des ersten Punktes aufbaue.

 
solnce600:

Guten Tag zusammen!

Kodiert die folgende Idee

Bedingung N1 ..Wenn High[1] einen bestimmten Höchstwert überschreitet X

und zur gleichen Zeit

Bedingung N2 .Die Differenz zwischen High[1] und Low der ersten der nächsten 150 Kerzen >= 150 p.

------------------------------------------------------------------

Aktion N1 . Vorherige Bestellung löschen

Aktion N2 ...Pending Order platzieren

Aktion N3 . Weisen Sie den Variablen Werte zu.

PROBLEM. Trotz der Tatsache, dass der schwebende Auftrag nur dann erteilt werden sollte , wenn es keine Aufträge auf dem Markt gibt oder der letzte Auftrag nicht auf dem aktuellen Balken erteilt wird. if (ot==0 || last_order_bar>0)

Wenn Bedingung N1 und Bedingung N2 erfüllt sind, werden ALLE ausstehenden Aufträge gleichzeitig erteilt.

Ich brauche nur EINEN schwebenden Auftrag zu erteilen.

: )) Andrey, du stellst die Fragen, die bereits im Lehrbuch erklärt werden. Schauen Sie sich das Terminal-Beispiel im Tutorial an, wo die Prinzipien und die Logik, wie Aufträge berücksichtigt werden müssen, detailliert beschrieben sind. - Dann werden die meisten Ihrer Fragen von selbst verschwinden. Generell ist das Tutorial so aufgebaut, dass der Aufbau JEDES kompetenten Expert Advisors vollständig als Beispiel dargestellt wird. - Das ist das Schöne daran. + Es werden grundlegende theoretische Konzepte der Programmierung vermittelt. Aber es hat einen Haken - es ist nicht für den faulen Leser gedacht - es ergibt sich aus der Struktur des Geschriebenen. Das heißt, um Fragen zu bestimmten Punkten zu klären, müssen Sie das gesamte Lehrbuch lesen. Aber nur wenige werden sich bereit erklären, es (das Lehrbuch) nachzuerzählen.

Sie bauen Stapel auf der Buchhaltung von Aufträgen auf. - Sie brauchen einen einfacheren Ansatz. Der Auftrag ist entweder da oder nicht - und es spielt keine Rolle, auf welchem Balken (unter Ihren Bedingungen) er geöffnet ist. - Diese Komplexität führt dazu, dass wir bei der Betrachtung von Aufträgen und Bedingungen durcheinander kommen. - Daraus ergeben sich die algorithmischen Fehler, auf die jeder Programmierer achten sollte. Ändern Sie die Logik beim Schreiben des Programms, und die algorithmischen Fehler werden (von selbst) verschwinden.

 
OK. Danke.
 
Arles:

Der Expert Advisor analysiert nur das Paar, über dem er schwebt. Bei dem Paar, bei dem das Signal zuerst erscheint, wird eine Order eröffnet. Aber manchmal erscheint ein Signal auf zwei Paaren gleichzeitig. Und, so seltsam es auch klingen mag, es werden 2 Aufträge geöffnet, obwohl der Expert Advisor für jeden offenen Auftrag eine Prüfung durchführt und den zweiten nicht öffnen sollte. Das ist notwendig, weil wir nicht genug Geld auf der Kaution haben.

Das ist ganz elementar! Der erste Expert Advisor eröffnet einen Auftrag. Wenn es keine Rolle spielt, welcher EA den Auftrag eröffnet hat, dann erstellen Sie eine Bedingung in beiden EAs. Erstellen Sie eine boolesche Funktion, die die zuletzt geöffnete Bestellung findet und den Zeitpunkt der Öffnung extrahiert. Wenndiese Eröffnungszeit gleich der Eröffnung des aktuellen Balkens ist, verlassen wir die Funktion mit TRU. Setzen Sie die Funktion an den Anfang desStarts, und wenn der Modus TRU ist, dann verlassen Sie den Start.
 
Chiripaha:

Und was die zweite Frage betrifft: Um ehrlich zu sein, habe ich selbst diese Frage offen - ich bin nicht ganz sicher, wie das Terminal reagiert, wenn Sleep(1000) funktioniert - ich appelliere auch an diejenigen, die es wissen - mir eine Antwort zu geben. Im Idealfall verarbeitet das Terminal zu diesem Zeitpunkt nur die Streaming-Preise, d.h. es empfängt Kurse und zeichnet Charts und Indikatoren. Aber während dieser EA "wartet", wird er seinen Zug nicht an jemand anderen weitergeben. - Aber das ist nur meine Annahme, bei der ich mir nicht ganz sicher bin. Eine weitere Ausnahme von dieser "Warteschlange" sind vielleicht Skripte, die zur Ausführung gestartet werden können, während der EA wartet. - Ich habe die gleiche Frage.

Ich versuche jedoch, aus dieser Unwissenheit herauszukommen, indem ich meine Expert Advisors auf der Grundlage der Richtigkeit des ersten Punktes aufbaue.



Soweit ich das verstanden habe, schläft der Expert Advisor nach Sleep() einfach ein, d.h. seine Arbeit wird unterbrochen und in diesem Moment empfängt er Kurse und reagiert auf nichts. Dementsprechend übergibt das Terminal die "Warteschlange" an ein anderes Terminal.

Wer anderer Meinung ist, möge mich bitte korrigieren!

 
hoz:


Soweit ich weiß, schläft der Expert Advisor nach der Ausführung von Sleep() einfach ein, d. h. seine Arbeit wird unterbrochen, und in diesem Moment empfängt er weder Kurse, noch reagiert er auf irgendetwas. Dementsprechend übergibt das Terminal die "Warteschlange" an ein anderes Terminal.

Wer anderer Meinung ist, möge mich bitte korrigieren!

Ich bin nicht bereit, dem zuzustimmen. - Denn von dieser Position aus geht die Logik der korrekten Arbeit und Berechnung sowohl von Geld als auch von Positionen durch Expert Advisors verloren. - Dies ist eine. Zweitens. - Wenn mein EA schläft, zum Beispiel, für 100 Millisekunden, und ein anderes beginnt, zur gleichen Zeit zu arbeiten, dann was wird passieren, dass, sobald diese 100 Millisekunden vergehen, der andere wird seine Arbeit zu stoppen... und leiten es an diesen in der Mitte zurück und so weiter... Andererseits. Ich habe gesehen (nicht selten) in EAs, wenn sie zu "schlafen" für Minuten und viele Male bei jeder Ausführung Block senden. - Wenn dann alle anderen Eulen während dieser Zeit nicht arbeiten, ist das auch irgendwie falsch. - Die Frage ist also durchaus berechtigt. Ich würde gerne die Logik der Operation an dieser Stelle verstehen. Aber ich habe in offiziellen Dokumenten keine detaillierte Erklärung gefunden.

Aber von zwei Übeln würde ich das letzte wählen. In diesem Fall würde ich die Eule, bei der ich mir sicher bin, einfach stehen lassen. Wenn nicht, ist das auch nicht schlimm, denn zumindest die Korrektheit der Neuberechnungen bleibt erhalten, auch wenn ihre Arbeit verlangsamt wird.

Das Problem ist nicht so trivial, wie es scheint. - Der Punkt ist, dass meine Experimente gezeigt haben, dass, wenn das Kästchen"EAs den Handel erlauben" nicht markiert ist, die Arbeit des EAs nicht aufhört - alle Berechnungen werden bei jedem Tick auf die gleiche Weise durchgeführt. Nur die Transaktionen des EA werden nicht an den Server gesendet. Aber wenn diese Berechnungen mit diesen "Ausrutschern" (nicht ganz korrekt) gefüllt werden, dann können sie, wenn es 5-10 solcher EAs gibt, gezielt die Ausführung des eigentlichen EAs, der gerade handelt, verlangsamen.

Ja, einige Programmierer kontrollieren die Berechtigungen für den Handel und lassen die Arbeit der Eule auf dieser Grundlage aus. Aber es wird nicht öfter gemacht. Und wenn der Code geschlossen ist, können wir überhaupt nicht verstehen, ob der Vorgang gebremst wird oder nicht (und welche Eule genau). - Jetzt werde ich dieses Thema auf der Forensuche durchstöbern. Etwas hat sich verlangsamt.

Vielen Dank , Arles, für die Frage, für die Erinnerung und für die Aktualisierung. Ich war nicht erfahren genug, um zu verstehen, was zu diesem Thema geschrieben wurde. Ich werde es jetzt wieder tun.

 
Arles:

Der Expert Advisor analysiert nur das Paar, über dem er schwebt. Bei dem Paar, bei dem das Signal zuerst erscheint, wird eine Order eröffnet. Aber manchmal erscheint ein Signal auf zwei Paaren gleichzeitig. Und, so seltsam es auch klingen mag, es werden 2 Aufträge geöffnet, obwohl der Expert Advisor für jeden offenen Auftrag eine Prüfung durchführt und den zweiten nicht öffnen sollte. Das ist notwendig, weil wir nicht genug Geld auf der Kaution haben.

Ja, aber wenn der erste seine Arbeit beendet und einen Auftrag eröffnet hat, sieht der zweite, der mit seiner Arbeit begonnen hat, für kurze Zeit nicht, dass der Auftrag bereits existiert. Oder er macht sich an die Arbeit, bevor die Bestellung geöffnet wird.
--

Noch etwas: Wenn der 1. EA Sleep(1000) wartet der zweite oder beginnt er zu arbeiten?

Mit einer kleinen Einlage handelt man nicht auf mehreren Paaren (weltlicher Rat).

Um verschiedene EAs dazu zu bringen, die Gesamtzahl der Aufträge zu berücksichtigen, können wir dieses Schema ausprobieren:

    int li_total - OrdersTotal();
    if (li_total == 0) Sleep (1000);
    li_total - OrdersTotal();
    if (li_total == 0) OrderSend();

Ich weiß nicht, wie gut es funktionieren wird (es sollte mit 2 funktionieren). Es wäre sicherer, dies über globale Variablen des Terminals zu tun, die "Semaphore" anordnen und sequentiell arbeiten. Dann spielt es keine Rolle, wie viele Expert Advisors parallel arbeiten.