Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 403

 
Link_x:

Und wenn Sie die Funktion zerlegen, sollten Sie die Kopfzeile der Funktion nicht abschneiden, denn dort befinden sich wichtige Informationen.

Gibt den Typ der zuletzt geöffneten Position oder -1 zurück - das heißt, wenn es keine geschlossenen Positionen gibt, ist der Wert beim Aufruf der Funktion gleich -1

sy - Name des Instruments (Währungspaar)

mn - magische Zahl. Wenn wir -1 setzen, gibt die Funktion den Typ der letzten abgeschlossenen Bestellung zurück, egal welche magische Zahl

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней открытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
 
Link_x:
Punkt für Punkt antworten, tut mir leid.
1 - ein Programmiergenie?
2 - um fair zu sein, ist nichts überflüssig, außer Fäkalien und andere Zerfallsprodukte (offene Meinung, bereit zu debattieren, aber in einem anderen Thread :) ).
3 - jetzt ergibt alles einen Sinn. :)
4 - so wahr. Ich weiß, ich habe mich etwas "vertan" und mit der Funktion "OrderSend" getippt.

Vielen Dank für Ihren Beitrag zur Vorlage "Function-Brick parsing". :)

1. Lassen wir den Sarkasmus beiseite, ja? Es machte das Lernen bequem und einfach. Was hat das mit Genialität zu tun?
2. Argumentativ.
3. du verstehst überhaupt nichts, wenn man deine Kommentare im Code betrachtet.
4. Das kommt vor.

int GetTypeLastClosePos(string sy="", int mn=-1) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal(), r=-1;          // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   if (sy=="0") sy=Symbol();                          // Если в функцию в качестве значения символа передан NULL, то будет использоваться текущий символ графика
   for (i=0; i<k; i++) {                              // Цикл по истории от нуля до OrdersHistoryTotal()
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if ((OrderSymbol()==sy || sy=="") &&         // если переданный символ совпадает с символом ордера или передано значение по-умолчанию
             (mn<0 || OrderMagicNumber()==mn)) {      // если передано значение по-умолчанию или магик ордера равен переданному в функцию значению
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) { // если это или Buy или Sell
// --------------------- определение последнего закрытого ордера --------------------               
               if (t<OrderCloseTime()) {                       // если значение, записанное в t меньше времени закрытия ордера
                  t=OrderCloseTime();                          // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
                  r=OrderType();                               // запоминаем тип ордера
                  }                                            // Конец блока определения времени закрытия.
               }                                               // Конец блока обработки найденного нужного ордера по типу (одного из возможных)
            }                                                  // Конец блока проверки по символу и магику
         }                                                     // Конец блока обработки выбранного ордера
      }                                                        // Идём проверять следующий ордер (если i всё ещё меньше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                                  // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                              // Аминь. 

Zu Punkt 2, ein Beispiel:

int GetTypeLastClosePos(string sy, int mn) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal()-1, r=-1;        // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   for (i=k; i>=0; i--) {                             // Обратный цикл по истории от OrdersHistoryTotal()-1 до нуля 
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if(OrderMagicNumber()!=mn) continue;         // если магик не тот - идём выбирать следующий ордер в истории
         if(OrderSymbol()!=sy)      continue;         // если переданный символ не равен символу ордера - идём выбирать следующий ордер в истории
         if (OrderType()>1)         continue;         // если это не Buy и не Sell - идём выбирать следующий ордер в истории
// --------------------- дальше имеем выбранный нужный нам ордер --------------------        
// -------------------------- определяем время его закрытия -------------------------               
         if (t<OrderCloseTime()) {                    // если значение, записанное в t меньше времени закрытия ордера
            t=OrderCloseTime();                       // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
            r=OrderType();                            // запоминаем тип ордера
            }                                         // Конец блока определения времени закрытия.
         }                                            // Конец блока обработки выбранного ордера
      }                                               // Идём проверять следующий ордер (если i всё ещё больше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                         // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                     // Аминь. 

Es gibt weniger unnötige Dinge

 
Link_x:

Hier ist ein Beispiel für die praktische Anwendung einer benutzerdefinierten Funktion:

.
Ich danke Ihnen.
Sie müssen also den Namen der Funktion eingeben, um sie zu verwenden, und die Variable "r" selbst wird so gesetzt, dass sie den Wert dieser Funktion bestimmt!
Hier ist eine kleine Entdeckung für mich! ^^
Nochmals vielen Dank, Juri. :)


Zur endgültigen Klärung ist dies möglich:

?


Ihre Beispiele sind nicht korrekt. Wenn Sie eine Funktion mit Parametern aufrufen, müssen Sie die Werte dieser Parameter in Klammern und durch Kommata getrennt angeben. Sie sollten auch beachten, dass nicht allen Funktionen Werte zugewiesen sind. Wenn der Funktionstyp void ist, hat er keine Bedeutung und ist dazu bestimmt, eine Aktion durchzuführen oder einige Variablen zu berechnen. Im letzteren Fall ist es notwendig, die Namen dieser Variablen zu kennen, um die Ergebnisse dieser Funktion verwenden zu können.

 
Link_x:

if(GetTypeLastClosePos == OP_BUY)

Der Compiler gibt in dieser Zeile eine Fehlermeldung aus, dass die Variable nicht deklariert ist.

sollten Sie zumindest dies tun:

if(GetTypeLastClosePos() == OP_BUY)
 
artmedia70:

Zu Punkt 2, ein Beispiel:

Es gibt weniger unnötige Gegenstände



Entschuldigen Sie die dumme Frage, aber warum wühlen Sie sich durch die gesamte Historie, um die letzte abgeschlossene Bestellung zu finden? Du findest den ersten vom Ende aus und kommst gleich wieder raus, denke ich.
 
Roger:


Entschuldigen Sie die dumme Frage, aber warum wühlen Sie sich durch die Geschichte, um die letzte abgeschlossene Bestellung zu finden? Man findet den ersten vom Ende aus und verlässt ihn sofort, so wie ich es verstanden habe.
Es gab einmal eine Diskussion über ein Problem, bei dem die Historie in der Form gespeichert wurde, in der der Benutzer sie sortiert hatte. Daher ist (um sicher zu gehen) die Suche genau so.
 
artmedia70:
Es gab einmal eine Diskussion über ein Problem, bei dem der Verlauf so gespeichert wurde, wie der Benutzer ihn sortierte. Daher (um sicher zu gehen) ist die Suche genau so.

Der Benutzer kann die Historie nur für die visuelle Wahrnehmung sortieren, die Positionsnummern in der Historie können nicht geändert werden.
 
Roger:
Der Benutzer kann die Geschichte nur visuell sortieren, die Positionsnummern in der Geschichte können nicht geändert werden.

Das ist eine gute Sache. Aber früher war das anders. Jetzt werde ich nicht mehr im Forum nach Informationen suchen - das ist schon lange her. Also habe ich mich gefragt, was ist, wenn es wieder passiert? Ich würde lieber die Aufträge durchgehen, als ein falsches Ergebnis zu erhalten.
 
Roger:
Der Benutzer kann die Geschichte nur visuell sortieren, die Positionsnummern in der Geschichte können nicht geändert werden.

Eigentlich kann man nur auf Ordnung im Tester hoffen.
 
TheXpert:
Eigentlich kann man nur auf Ordnung im Tester hoffen.


Ich habe es nicht bemerkt, aber gut, ich werde mich nicht dagegen wehren. Machen Sie die Tiefe 10-20, sollte genug sein. Aber die ganze Geschichte... Das ist meiner Meinung nach ein bisschen viel.