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

 
FAQ:
Warum merken Sie sich nicht das Ticket des Auftrags und nicht seine Position? Und was passiert bei einer direkten Überweisung, wenn es keinen solchen Auftrag gibt? löschen Sie den Nullauftrag?


Ich habe es bereits versucht. Auch das funktioniert nicht:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = 1,                                  // Тикет искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      }
   }
   if (s_ticket != -1)
   {
      OrderDelete(s_ticket,Black);
   }
   return (0);
}
 
hoz:


Ich habe das schon einmal ausprobiert. Auch das funktioniert nicht:

Sie müssen vorsichtiger sein.
//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = 1,                                  // Тикет искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      }
   }
   if (s_ticket != -1)
   {
      OrderDelete(s_ticket,Black);
   }
   return (0);
}
 

Es klappt endlich! Es hat im Prinzip funktioniert, und die vorherige Version. Der Hauptfehler lag im Funktionsaufruf, nicht in der Funktion selbst.

Aus der Sicht eines Fachmanns sollten alle Variablen beim Eintritt in eine Funktion auf Null gesetzt werden, es sei denn, sie sind statisch, d.h. es besteht keine Notwendigkeit, ihren Wert spezifisch zu halten, richtig?

 
hoz:

Es klappt endlich! Es hat im Prinzip funktioniert, und die vorherige Version. Der Hauptfehler lag im Funktionsaufruf, nicht in der Funktion selbst.

Aus der Sicht eines Fachmanns sollten alle Variablen beim Eintritt in eine Funktion auf Null gesetzt werden, es sei denn, sie sind statisch, d.h. es besteht keine Notwendigkeit, ihren Wert spezifisch zu halten, richtig?

Initialisieren Sie die Variablen in der Funktion mit Werten, die keine Fehlfunktion der Funktion verursachen und die am schwersten zu findenden Fehler sind.

Ich verwende in der Regel entweder 0 oder -1, je nach dem Zweck der Variablen. Wenn die Variable in der Funktion den gefundenen Positionsindex speichern soll, dann initialisieren Sie sie mit -1. Wenn Sie ihn mit Null initialisieren, können Sie nach der Suche nach der richtigen Position und deren Fehlen immer noch die Position mit dem Index 0 wählen, obwohl es nicht die gesuchte Position ist. Bei -1 wird die Position nicht gewählt. Dies ist eines von vielen möglichen Beispielen dafür, dass ein Fehler schwer zu finden ist - in der Funktion scheint alles richtig zu sein, aber die Ausgabe ist völlig falsch... und der EA funktioniert nicht mit der Reihenfolge/Position, die wir erwartet haben...

 

Eine Funktion muss kurz (optional, aber wünschenswert) und vollkommen klar sein (ihr Zweck). wie 2*2=4. d.h. der Programmierer muss klar verstehen, wofür sie da ist und welche Operation sie ausführt. dann sollte er sie aus seinem Gedächtnis löschen und vergessen, was in ihr steckt, und sie als "Black Box" benutzen.

Alle von einer Funktion verwendeten Variablen müssen ihr als Argumente übergeben werden. Die Verwendung globaler Variablen, ohne sie als Argumente zu übergeben, ist nur dann gerechtfertigt, wenn es sich beispielsweise um Externs handelt (im Falle von MT). Wenn ein Rückgabewert fehlt, übergeben Sie die Variablen per Verweis in der Argumentliste.

Das heißt, wenn Sie diese Funktion wegwerfen müssen, dann müssen Sie sich nicht daran erinnern, warum die abgespeckte Version nicht funktioniert, weil alle Globals in dieser Funktion geändert wurden. Damit soll sichergestellt werden, dass es nicht zu einer Kettenreaktion kommt, wenn Sie den Vorgang wiederholen müssen.

 

Hallo zusammen!

Prüfung Pfund-En.

Der Auftrag hätte beim TAKE PROFIT vor dem STOP LOSS geschlossen werden müssen.

Aber mein Auftrag wurde aus irgendeinem Grund nicht mit Take Profit geschlossen.

FRAGE: WARUM WURDE MEIN AUFTRAG NICHT, WIE IN DER HANDELSFUNKTION VORGESCHRIEBEN, MIT DEM TAKE PROFIT GESCHLOSSEN?

Modellierungsmethode - alle Häkchen.

Beispiel im Link

http://clip2net.com/s/55pdDU

HINWEIS.solche Fälle - nicht passieren oft.in den meisten Fällen, Trades sind bei 10 Pips zu schließen. in der Zeit.

D.h., es scheint mir, dass es wahrscheinlich nichts mit dem akzeptablen Mindestabstand zwischen dem Preis und dem Stop zu tun hat.

Was könnte sonst der Grund sein?

Ich danke Ihnen.

 

Hilfe bei der Übernahme von Daten in globale Variablen aus einem Indikator

ungefähr:

USD 6,5

6,6 EUR

GBP 3,3

usw.

Vielen Dank im Voraus für Ihre Hilfe!

/*Dekompiliert wird entfernt. Warnung*/.

 
FAQ:

Eine Funktion muss kurz (optional, aber wünschenswert) und vollkommen klar sein (ihr Zweck). wie 2*2=4. d.h. der Programmierer muss klar verstehen, wofür sie da ist und welche Operation sie ausführt. dann sollte er sie aus seinem Kopf streichen und vergessen, was in ihr steckt, und sie als "Black Box" benutzen.

Alle von einer Funktion verwendeten Variablen müssen ihr als Argumente übergeben werden. Die Verwendung globaler Variablen, ohne sie als Argumente zu übergeben, ist nur dann gerechtfertigt, wenn es sich beispielsweise um Externs handelt (im Falle von MT). Wenn ein Rückgabewert fehlt, übergeben Sie die Variablen per Verweis in der Argumentliste.

Das heißt, wenn Sie diese Funktion wegwerfen müssen, dann müssen Sie sich nicht daran erinnern, warum die abgespeckte Version nicht funktioniert, weil alle Globals in dieser Funktion geändert wurden. All dies soll dazu dienen, dass es nicht zu einer Kettenreaktion kommt, wenn ich es noch einmal machen muss.


Danke, und Artem natürlich auch! Sie haben mir die Augen für die Punkte geöffnet, die im Prinzip logisch sind, aber manchmal aus Mangel an Erfahrung unbemerkt bleiben.

Es gibt nur einige andere Missverständnisse. Sie haben geschrieben, dass, wenn es in EA globale Variablen gibt, diese nur in Funktionen verwendet werden sollten, indem sie als Argumente übergeben werden, richtig?

Ich versuche nur zu verstehen, gibt es irgendwelche Gründe, globale Variablen (nicht Externs) zu erstellen... Wenn sie nur durch Argumente übergeben werden müssen, kann eine lange Kette von abhängigen Funktionen eine Menge von Argumenten sammeln, und die Namen von Funktionen mit Argumenten werden sehr lang sein.

Und auch hier können Sie eine globale Variable erstellen, sie per Referenz an eine Funktion übergeben und mit ihr tun, was Sie wollen, und sie per Referenz an global zurückgeben, richtig?

Als ich heute Ihren Beitrag las, begann ich darüber nachzudenken und übertrug einige Variablen von global auf eine Funktion. Dann habe ich festgestellt, dass diese Variablen in einer anderen Funktion benötigt werden, die nichts mit der Funktion zu tun hat, in der ich sie deklariert habe. Wenn Sie Ihnen hier zuhören: "Das Ändern von Globals und der Funktion ist nicht akzeptabel", dann stellt sich heraus, dass die Funktion, die direkt die benötigten Variablen erhält, an verschiedenen Stellen aufgerufen werden sollte? Aber es macht den Code schon sozusagen nicht schön. Sie wollen, dass die Funktion nur dann aufgerufen wird, wenn Sie sie brauchen, und nicht öfter, als Sie sie brauchen. Zum Beispiel die Funktion, die nach allen Erzen, Kauf- und Verkaufsaufträgen sucht. Es ist vernünftig anzunehmen, dass sie nur einmal pro Tick und nicht öfter als einmal aufgerufen werden sollte. Wenn sie jedoch zu Beginn aufgerufen wird, kann nicht jede Funktion, die diese von der Auftragssuchfunktion zurückgegebenen Variablen verwendet, über ihre Parameter übergeben werden. Dann kehren wir doch zu den globalen Variablen zurück, oder was?

 

Bitte helfen Sie bei der Lösung des Problems mit dem Grenzwert für die Verschiebung in iHigh(Symbol(),timeframe,shift), der auf die Zahl 1000 begrenzt ist.

iTime(Symbol(),timeframe,1001) ergibt 1970.01.01 00:00
 
Wie zum Teufel schaltet man die Warnmeldung aus ???????? warum es nach dem Drücken der Leertaste ?(!%"?:? ständig piept ??????????