[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 312

 
silhouette:

Achten Sie nicht auf die Bremsen, das ist das erste Mal, dass ich mit mehrdimensionalen Arrays zu tun habe :)

Es ist einfacher, sich zu orientieren, wenn man sich ein mehrdimensionales Array als etwas anderes vorstellt. Wenn Sie nämlich ein Modell für die Anordnung finden, das ihr Wesen erfasst, ist es einfacher, das Modell vor Augen zu behalten.

Ein eindimensionales Array besteht aus Objekten auf einer Linie (einem Koordinatenstrahl, der bei Null beginnt). Ein Beispiel für eine solche Anordnung wäre eine Warteschlange in einem Geschäft. Der erste in der Warteschlange ist die Person, die direkt hinter der Person steht, die gerade kauft. Die Person, die kauft, kann nicht als erste in der Schlange bezeichnet werden - sie kauft - sie ist Null. Er befindet sich in der Nullzelle des eindimensionalen Feldes.

Ein zweidimensionales Feld sind Objekte in einer Ebene (Koordinatenebene). Ein Beispiel wäre ein Hörsaal. Diese und jene Reihe, dieser und jener Ort. Fügen Sie diesem Modell Zeile Null und Platz Null hinzu, und Sie haben ein exaktes Modell eines zweidimensionalen Arrays.

Ein dreidimensionales Feld ist ein Objekt im Raum (Koordinatenraum) - die Koordinaten des Objekts sind durch drei Werte gegeben. Es ist ein Würfel mit Flächen. Ein Modell könnte ein Wohngebäude mit der Eingangsnummer Null, der Etagennummer Null und der Wohnungsnummer Null (neben anderen) sein. Vorausgesetzt, dass die Wohnungsnummerierung in jedem Eingang bei Null beginnt.

Ein vierdimensionales Array ist ähnlich wie ein eindimensionales Array. Es handelt sich um einen Koordinatenstrahl, bei dem alle Punkte dreidimensionale Felder sind. Das Modell ist eine Straße. Das Koordinatenfeld wird durch die folgenden Werte spezifiziert: Hausnummer, Eingangsnummer, Stockwerknummer, Wohnungsnummer.

Und so weiter in die Enndimensionalität - von Straßen zu Stadtteilen, von Stadtteilen zu Städten, von Stadtteilen zu Städten, von Städten zu Ländern, von Ländern zu Planeten...

 
GarKain:
Kann jemand erklären, wie man eine Order zu einem beliebigen Zeitpunkt eines Balkens eröffnet und die nächste Order erst zum nächsten Balken eröffnet?

Wir sollten eine Schleife durch die Liste der Aufträge ziehen. Wenn die Eröffnungszeit der nächsten Order höher oder gleich der Eröffnungszeit des aktuellen Balkens (Time[0]) ist, sollten wir das Flag setzen, das die Eröffnung von Orders auf dem aktuellen Währungspaar verbietet. Beim nächsten Candlestick stellt die Schleife fest, dass es keinen solchen Auftrag gibt, und erteilt kein Verbot, d.h. sie löscht die Flagge, die die Eröffnung von Aufträgen verbietet.
 
drknn:

Wir gehen die Liste der Aufträge durch. Wenn die Eröffnungszeit des nächsten Auftrags größer oder gleich der Eröffnungszeit des aktuellen Balkens (Time[0]) ist, setzen wir das Flag, das die Eröffnung von Aufträgen für dieses Währungspaar verbietet.
Herzlichen Dank!
 
drknn, vielen Dank für die Klarstellung. Ich behalte es ;)
 
GarKain:
Ich danke Ihnen vielmals.


Wenn der Code nur für ein Währungspaar funktioniert, fügen Sie eine Zeile ein, um Aufträge für andere Paare auszuschließen

if(OrderSymbol()!=Symbol()){continue;}
 
drknn:


Wenn der Code nur für ein Währungspaar funktioniert, dann setzen Sie eine Zeile, um Aufträge für andere Paare zu verwerfen

Frage. wenn der Code funktioniert auf mehrere Währungspaare und gleichzeitig auf mehrere Zeitrahmen, können Sie verschiedene magische Zahlen auf sie und führen Sichtung auf sie?
 

Sie können.

if(OrderMagicNumber()!=MAGIC) { continue;}
 
drknn:

Sie können.



bool Times=true;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
datetime t;
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


Ist das richtig?

 
GarKain:

bool Times=true;
wenn (Auftragssumme()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
datetime t;
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


Ist das richtig?


Nein. Es ist nicht notwendig, bei jeder Schleifeniteration eine Variable innerhalb der Schleife zu deklarieren.

bool Torg=true;
for(int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);}
    else {
     if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) { continue;} 
     if(OrderOpenTime()>=Time[0]){
       Torg=false;
     }
   }  
 }


// теперь используем результат работы цикла
// Если есть сигнал и торг разрешён, то открываем ордер
 
GarKain:

bool Times=true;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
datetime t;
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


Ist das richtig?

den Fehler nicht bemerken.

bool Times=true;
datetime t=Time[1];
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime()) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


Ist das richtig?