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

 
hoz:

Ich verstehe, was dort steht. Aber es ist nicht klar, warum es auf diese Weise umgesetzt wird.

Jede einzelne Bibliotheksfunktion ist Teil des Ganzen, und eine einzelne Bibliothek ist Teil des gesamten Komplexes meiner Bibliotheken - ohne dieses Bewusstsein ist es unmöglich, den Code zu verstehen.

hoz:

Sie können Ihre Bibliotheken ohnehin nicht in ihrer ursprünglichen Form verwenden, d.h. Sie haben dort alles gebunden. Jede Funktion auf der Packung der anderen...

Und genau da liegst du falsch. Haben Sie jemals über die Struktur eines "durchschnittlichen" EA nachgedacht? Was einen EA individuell macht, sind die Strategiebedingungen (d. h. die Ein- und Ausstiegsbedingungen), alles andere ist Standardcode. So erstelle ich EAs, auch solche, die auf Aufträgen basieren: Ich nehme eine Vorlage (z. B. SAR, wenn ein Netzwerk-EA benötigt wird) und verbinde damit eine zusätzliche Bibliothek, in die die Bedingungen einer neuen Strategie geschrieben werden (ich erstelle sie neu).

hoz:

Ich wollte es auf keinen Fall überprüfen. Es besteht auch kein Zweifel daran, dass alles sehr kompetent geschrieben ist. Ich verstehe einfach nicht alles, deshalb habe ich gesagt, dass ich das nicht glaube. Ich schaue, ich denke... Aber ich verstehe nicht alles. Deshalb habe ich gefragt.

P.S. Bei bs_Symbol verstehe ich es immer noch nicht.

Um die Implementierung zu verstehen, müssen Sie die Quelldaten kennen. Die Bibliotheken wurden mit der Fähigkeit erstellt, mit jedem Instrument (Forex) und sowohl im Ein- als auch im Mehrwährungsmodus zu arbeiten, daher die Einführung der globalen Variable bs_Symbol, die den Wert des aktuellen Instruments enthält.
 
IIya:

Freunde, ich brauche Hilfe bei der Feinabstimmung eines EA.

Es gibt einen Code, der eine Bestellung unter einer bestimmten Wenn-Bedingung öffnet. Die Ausführung der Bedingung kann bei jedem Tick erfolgen, da sie im Body von int start() platziert ist.

Wir brauchen:

1. Nach der Ausführung der Bedingung (und der Eröffnung eines Auftrags), Pause für die Eröffnung neuer Aufträge, Pause für n Bars. Wenn der EA beispielsweise auf dem Zeitrahmen M30 läuft und ich eine Pause für 3 Stunden benötige, sollte die Pause 6 Bars betragen.

2. Dieses Programm sollte mit dem Strategietester funktionieren.

Welcher Code wird benötigt? Und was wäre der richtige Ort dafür?

Die Funktion iBarShift() wird Ihnen dabei helfen. Zunächst müssen Sie den Zeitpunkt der letzten Auftragseröffnung ermitteln und an diese Funktion übergeben. Anschließend müssen Sie den von dieser Funktion zurückgegebenen Wert überwachen, indem Sie ihn mit einer Zahl (in Ihrem Fall 6) vergleichen.
 
TarasBY:
Die Funktion iBarShift() wird Ihnen dabei helfen. Zunächst müssen Sie den Zeitpunkt der letzten Auftragseröffnung ermitteln und an diese Funktion übergeben. Anschließend müssen Sie den von dieser Funktion zurückgegebenen Wert überwachen, indem Sie ihn mit einer Zahl (in Ihrem Fall 6) vergleichen.

Lassen Sie uns das gemeinsam klären.)

Wir übergeben dieser Funktion den Zeitpunkt der letzten Auftragsöffnung und erhalten die zurückgegebene Zahl. Dies ist ungefähr:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

Ok, wir haben die Bar-Nummer. Wie können wir nun eine Pause einlegen, um Aufträge für 6 Takte zu öffnen?

 
IIya:

Lassen Sie uns das gemeinsam klären.)

Wir übergeben der Funktion den Zeitpunkt der letzten Auftragseröffnung und erhalten die Zahl ungefähr zurück:

Ok, wir haben die Bar-Nummer. Wie können wir nun eine Pause einlegen, um Aufträge für 6 Takte zu öffnen?

Dies ist ein unkluger Ansatz:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Da es aber für diesen Fall nicht direkt relevant ist, gehen wir nicht darauf ein. Das Schema sieht folgendermaßen aus:

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
Es gibt keine offensichtlichen Fehler in der Logik. Drucken Sie den Code Schritt für Schritt aus. Das Handelsverfahren ist an den Wert der Ticketvariablen gebunden. Verfolgen Sie zunächst seine Veränderungen. Achten Sie auch auf den Wert der globalen Variable "TRADECONTEXT" - ihr Wert muss 0 sein.

Ich danke Ihnen! Ich verstehe einfach nichts(((, ich bin wie ein blindes Kätzchen bei diesen Codes(((...
 
al7bar:

Ich danke Ihnen! Aber ich verstehe gar nichts(((, ich bin wie ein blindes Kätzchen bei diesen Codes(((...
Es hat sich herausgestellt, dass Sie nicht der Autor dieses Codes sind. Dann ist es einfacher, den Autor zu kontaktieren.
 
TarasBY:

Jede einzelne Bibliotheksfunktion ist Teil des Ganzen, und jede einzelne Bibliothek ist Teil des gesamten Komplexes meiner Bibliotheken - ohne dieses Bewusstsein ist es unmöglich, den Code zu verstehen.

Ich versuche, es zu verstehen, und stoße dabei auf alle möglichen Nuancen. Deshalb frage ich Sie, denn Sie wissen es am besten. Sie sind der Autor...

TarasBY:

Und genau da liegst du falsch. Haben Sie schon einmal über die Struktur eines "durchschnittlichen" Expert Advisors nachgedacht? Was einen EA individuell macht, sind seine Strategiebedingungen (d. h. die Ein- und Ausstiegsbedingungen), alles andere ist Standardcode. So erstelle ich Expert Advisors, auch solche, die auf Aufträgen basieren: Ich nehme eine Vorlage (z. B. SAR, wenn ein Netzwerk-EA benötigt wird) und verbinde damit eine zusätzliche Bibliothek, in die die Bedingungen einer neuen Strategie geschrieben werden (ich erstelle sie neu).

Ich verstehe das. Ich möchte nur nicht die gesamte Bibliothek kopieren. Sie verstehen, dass es günstiger ist, eine Stiftung zu gründen, mit der Sie persönlich arbeiten können.

TarasBY:

Um die Umsetzung zu verstehen, müssen Sie die Ausgangsdaten kennen. Die Bibliotheken wurden mit der Möglichkeit erstellt, mit jedem Tool (Forex) und sowohl im Mono- als auch im Multicurrency-Modus zu arbeiten, daher wurde die globale Variable bs_Symbol eingeführt, die den Wert des aktuellen Symbols enthält.

Und wo wird diese Variable explizit gesetzt, wenn es sich nicht um ein Geheimnis handelt? :) Ich sehe in der Bibliothekb-PSI@Base.mqh, dass sie nur deklariert ist:

 bs_Symbol,                            // текущий инструмент

Aber in Wirklichkeit gibt es nichts weiter. In jedem Fall wird der Wert des aktuellen Werkzeugs standardmäßig durch Symbol() zurückgegeben. Warum also brauchen wir hier eine Variable?

 
TarasBY:

Dies ist ein unkluger Ansatz:

Da es aber für diesen Fall nicht direkt relevant ist, gehen wir nicht darauf ein. Und das Muster sieht so aus:

Jetzt funktioniert unser Code. In meiner Version funktioniert es folgendermaßen:
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:) Aber wenn sie in den Expert Advisor eingeführt wird, wie es jetzt der Fall ist, beginnt alles falsch zu funktionieren.

Soweit ich weiß, ist dies auf diesen Eintrag zurückzuführen:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Was ist los?

 
Hallo an alle. Bitte reagieren Sie auf alle, die ein Skript, das die Lose bei der Eröffnung der Transaktion erhöht erstellen können. Details schreiben in einem persönlichen.
 
IIya:
Unser Code funktioniert jetzt. In meiner Version funktioniert es folgendermaßen:

:) Wenn es jedoch so in den EA implementiert wird, wie es jetzt der Fall ist, beginnt alles falsch zu funktionieren.

Ich verstehe das aufgrund dieses Eintrags:

Was ist los?

Ich habe nur ein Schema skizziert, während Ihre Aufgabe darin bestand, die weitere Logik zu überdenken:

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}
Grund der Beschwerde: