Probleme bei der Prüfung auf offenen Handel

 

Hallo, ich habe dies zu meinem Code hinzugefügt, um zu prüfen, ob es bereits einen offenen Handel gibt. Das Problem ist, dass der Code einen Handel ausführt und das war's. Kann jemand ein Problem mit diesem Code sehen. Ich bin kein Superexperte im Programmieren


// Prüfen auf offene Geschäfte

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true;
}
else
{
tradeopen=false;
}

}

}

 
Ihr Code übernimmt schwebende und offene Geschäfte, ansonsten sieht es für mich gut aus.
 

Vielen Dank, Raptor, für deine prompte Antwort.


Wenn es Ihnen nichts ausmacht, hänge ich den gesamten Code an, vielleicht gibt es etwas, das ich irgendwo übersehen habe. Ich habe die Wand mit diesem im Moment getroffen.

Dateien:
daz.mq4  3 kb
 
dazamate:
Kann jemand ein Problem mit diesem Code sehen.

  1. Keine magische Zahl bedeutet, dass er mit jedem anderen EA und manuellem Handel und sich selbst auf demselben Paar/unterschiedlichen Zeitrahmen inkompatibel ist.
  2. Wenn die erste geöffnete Order nicht die des EA war, dann ist die Flagge falsch, auch wenn er offene Trades hat.
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

Vielen Dank, Raptor, für deine prompte Antwort.


Wenn es Ihnen nichts ausmacht, hänge ich den gesamten Code an, vielleicht gibt es etwas, das ich irgendwo übersehen habe. Ich bin im Moment mit diesem Thema überfordert.

Ein paar Kommentare . . .

Sie deklarieren i. .

int i;

. . . aber Sie setzen es nirgends, was ist i?

Sie setzen i. . .

static bool tradeopen = false;

. dann prüfen Sie, ob Sie einen Handel platzieren können . . . zu diesem Zeitpunkt wird es immer false sein . . dann haben Sie später Code, der es auf true setzen kann

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

barcount wird auf 0 gesetzt

static int barcount = 0;

Dies wird also immer wahr sein, wenn Sie mindestens 1 Balken auf Ihrem Diagramm haben...

if(Bars != barcount)

Sie müssen Ihren Code Zeile für Zeile durchgehen ... alles, was Sie nicht verstehen, müssen Sie nachschlagen und nachlesen ... nur so können Sie lernen.

 

Raptor, vielen Dank, dass du es durchgegangen bist. Wie ich schon sagte, ich bin kein Superexperte. Ich habe die Art und Weise gelesen, wie andere Leute Dinge codieren, und versucht, sie in mein Programm zu implementieren. Ich habe viel über die Funktionen gelesen. Es ist einfach frustrierend, wenn es nicht funktioniert und man nicht weiß, wie man sein eigenes Desaster diagnostizieren soll.

Als Antwort auf Ihre Kommentare

int i;

Es ist weg, ich habe es für etwas anderes verwendet und es versehentlich dort gelassen.


Ich werde erklären, was in meinem Kopf in Bezug auf den Barcounter vor sich geht. Ich bin mir immer noch nicht sicher, warum dieser Teil des Codes nicht gut ist.

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

Was die Überprüfung betrifft, ob es offene Geschäfte für das Paar gibt...

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

Am Ende der Ea wird geprüft, ob für das aktuelle Paar ein Handel offen ist oder nicht. Setzt tradeopen entweder auf true oder false. Ist es ein Problem, dass dieses Bit aus Code am Ende des EA verwendet wird?

Auch ein anderes Problem kann ich nicht lösen...

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
Warum gibt iBarHour immer 1 zurück? Ich möchte, dass es die aktuelle Stunde zurückgibt :(


WHRoeder


Spielt es eine Rolle, ob der EA eine magische Zahl verwendet oder nicht. Kann er nicht einfach alle offenen und schwebenden Geschäfte prüfen und ob eines davon das aktuelle Paar ist?


Noch einmal, Leute, ich weiß, dass ich ein Neuling bin, aber ich weiß, dass ich wahrscheinlich wieder wegen meiner fragwürdigen Kodierung in die Pfanne gehauen werde :P


Danke

 
dazamate:

Ich werde erklären, was in meinem Kopf in Bezug auf den Barcounter vor sich geht. Ich bin mir immer noch nicht sicher, warum dieser Teil des Codes nicht gut ist.

Entschuldigung, ich zeige wahrscheinlich meine Unkenntnis über die Verwendung von statischen Variablen . . . Ich verwende stattdessen globale Variablen, und alles, was ich bei der Initialisierung des Codes einstellen möchte, füge ich in die init-Funktion ein. https://docs.mql4.com/basis/functions/special

Wenn Sie diesen Teil des Codes während des Wochenendes ausführen, wird er sich nicht ändern, da er die Serverzeit verwendet, die bei jedem Ticken aktualisiert wird.

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

Wenn dieser Code funktioniert, wird dDayOpenPrice nur gesetzt, wenn iBarHour = 6 ist. Wenn iBarHour = 7 ist, wird dDayOpenPrice nicht mehr auf den richtigen Wert gesetzt. Wenn Sie dDayOpenPrice zu einer globalen Variable machen, wird ihr Wert gespeichert, während der Code läuft (wenn Sie sie statisch machen, funktioniert das wahrscheinlich auch). Wenn der Code neu gestartet wird, passiert allerdings nichts bis zum nächsten Tag ... nicht bis zum 6-Uhr-Balken.

WHRoeder

Spielt es eine Rolle, ob der EA eine magische Zahl verwendet oder nicht. Kann er nicht einfach alle offenen und schwebenden Trades überprüfen und feststellen, ob einer davon das aktuelle Paar ist?

Wenn Sie einen EA auf einem Diagramm nur mit keinem manuellen Handel ... dann können Sie wahrscheinlich weg, ohne eine magische Zahl, es ist gute Praxis, um es zu benutzen, obwohl, erhalten Sie Ihren Code arbeiten erste dann eine magische Zahl zu implementieren, wird es Ihnen helfen, zu lernen.

 

RaptorUK danke noch einmal.


Ich backtest die ea zu sehen, wenn Code funktioniert und Print() die Variable zu sehen, was los ist in ihnen zu helfen, den Code zu debuggen. Die ibarhour Code scheint zu funktionieren, es war nur nicht richtig zeigen in der Backtest, weil ich es eingestellt haben, ständig drucken ibarhour Wert, dass es nicht anzeigen kann, es schnell genug, wie der Code spuckt es aus, so dass der Backtester bekommt Jammed. Gibt es vielleicht eine Möglichkeit, eine Verzögerung auf den Druck-Code zu setzen?



Und ja, ich möchte, dass der Wert des Open der 06:00 Bar gespeichert wird :)


Ich habe den Code neu organisiert, und ich bin stolz auf mich, dass ich es geschafft habe, zu überprüfen, ob die Ea irgendwelche Trades für das aktuelle Paar eröffnet hat. Ich habe dasBeispielvonWHRoeder benutzt und es in eine separate Funktion verwandelt :) und die Funktion dazu gebracht, true oder false zurückzugeben. Juhu.



Da Sie offensichtlich eine Elite auf dem Gebiet der EA-Codierung sind. Wie viele Erfolgsgeschichten haben Sie von Leuten gehört, die ihre eigenen EAs erstellt haben? Ich habe nur schlechte Geschichten gehört/gesehen.











 
dazamate:

Da Sie offensichtlich eine Elite auf dem Gebiet der EA-Kodierung sind. Wie viele Erfolgsgeschichten haben Sie von Leuten gehört, die ihre eigenen EAs erstellen? Ich habe nur schlechte Geschichten gehört/gesehen.











LOL . . Ihr Kommentar sollte an WHRoeder gerichtet sein, nicht an mich, er ist ein viel, viel besserer Programmierer als ich, schauen Sie sich einige seiner letzten Beiträge an, den Code, den er geteilt hat, Sie können eine Menge lernen, wenn Sie seinen Code verstehen, ich weiß, dass ich es getan habe, danke WHRoeder :-).

Ich treibe mich hier herum, weil ich gerne versuche, Menschen zu helfen, sich selbst zu helfen ... und dabei lerne ich auch noch etwas.

Um einen erfolgreichen EA zu haben, braucht man zuerst eine erfolgreiche Methode ... wie viele davon gibt es? Viele Dinge funktionieren für einen kurzen Zeitraum, ein paar Dinge funktionieren für einen oder zwei Monate, sehr wenige funktionieren dauerhaft. Selbst wenn jemand eine gute Methode hat (woher er das ohne ordnungsgemäße Tests weiß, weiß ich nicht), hat er im Allgemeinen nicht das Wissen oder die Fähigkeit, diese in einen brauchbaren EA zu verwandeln. Jeder, der einen funktionsfähigen EA hat, wird kaum damit werben, dass er ihn benutzt und Geld verdient...

Es freut mich zu hören, dass du Fortschritte machst ... was dein Druckproblem angeht, könntest du Comment(iBarHour) verwenden; stattdessen wird es auf dem Bildschirm in der oberen linken Ecke ausgegeben.

 
  1. Gern geschehen. "Um etwas zu lernen, übe. Um es zu beherrschen, lehre."
  2. Bars ist unzuverlässig (sobald Sie die maximale Anzahl von Bars im Chart erreicht haben, ändert sich der Wert nicht mehr und der Code bricht ab.) Volume[0]==1 ist unzuverlässig, wenn Sie einen Tick verpassen, bricht der Code ab. Verwenden Sie immer die Zeit.
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. Das zeigt wahrscheinlich meine Unkenntnis über die Verwendung von statischen Variablen . . . Ich verwende stattdessen globale Variablen und alles, was ich bei der Initialisierung des Codes festlegen möchte. Wenn
    die Variable initialisiert werden muss, muss sie global sein. Wenn die Variable von zwei oder mehr Funktionen gemeinsam genutzt wird, muss sie global sein. Andernfalls muss sie lokal für die Funktion definiert werden, ggf. statisch.
  4. Spielt es eine Rolle, ob der EA eine magische Zahl verwendet oder nicht.
    Wahrscheinlich wird alles funktionieren, dann öffnen Sie ein anderes Diagramm, um es zu testen, und plötzlich geht alles schief. Machen Sie es von Anfang an richtig. In meinem Code überprüfe ich sowohl die magische Zahl als auch das Paar, nur für den Fall, dass ich es in ein anderes Diagramm einfüge, aber die magische Zahl nicht ändere.
 

Du hast Recht Raptor... Sorry WHRoeder, dass war unhöflich nicht danken Sie sind gut. Nun, dies ist der Beginn eines großen Projekts für mich, also hoffe ich wirklich, dass es euch nichts ausmacht, wenn ich euch störe.


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, Dieser Code sieht so einfach aus, aber ich kann mir nicht vorstellen, wie er funktioniert. Wird die if-Anweisung nicht immer wahr sein, wenn sie time0 gleich time[0] macht, jedes Mal wenn time0 gleich time[0] ist? Ich sage nicht, dass es nicht funktioniert, aber ich verstehe einfach nicht, wie es so strukturiert funktioniert.


2 weitere Fragen.

Wie würde ich vorgehen, um einen Zähler, wo, wenn ein Pending Order platziert ist und es ist nicht mit in x Menge von Bars ausgelöst dann ist es zu stornieren? Alles, was mir einfällt, ist ein Zähler, der jedes Mal zählt, wenn sich ein neuer Balken bildet, und wenn die Anzahl der gezählten Balken == die angegebene zulässige Anzahl von Balken ist, bevor die ausstehenden Aufträge storniert werden. Der Balkenzähler wird jedes Mal zurückgesetzt, wenn ein neuer schwebender Auftrag eröffnet wird? Wie hört sich das an?

Nächste Frage.

Diesmal habe ich keine Ahnung, wie ich vorgehen soll.

Ich möchte eine Funktion erstellen, die eurusd, usdchf, gbpusd, usdjpy auf 1hr tf scannt. Es geht zurück zu den letzten 06:00 gmt Kerze Aufzeichnungen der offenen, geht zurück eine weitere 24 Bars auf die prev 06:00 gmt Kerze Aufzeichnungen, die offene und zeichnet die 6gmt -6gmt Bereich für jedes Paar. Dann vergleicht die 6gmt - 6gmt Bereich von allen Paaren und gibt die eine, die am höchsten ist. Ist es möglich, für eine ea zu tun, dass aus, die an 1 Zeit-Chart?


Nochmals vielen Dank für Ihr Wissen und Ihre Patienten

Grund der Beschwerde: