Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 124

 
Игорь:
Hallo!
Können Sie mir sagen, wie man die Balken neu malen, ohne Vorlagen in mt4 !??
Oder wie man ein Farbschema anwendet !?
Kontextmenü Diagramm, Eigenschaften, Farben - haben Sie das schon ausprobiert?
 
Ihor Herasko:

Ich werde die Antwort ein wenig vereinfachen, um Verwirrung zu vermeiden. Das (&)-Zeichen zeigt an, dass ein Funktionsargument seinen Wert zur Laufzeit ändern kann und mit einem anderen Wert an die Stelle zurückkehrt, von der aus die Funktion aufgerufen wurde. Im vorliegenden Fall kann die Funktion SaveOrder den Inhalt der Arrays g_arrstBuyOrderInfo und g_arrstSellOrderInfo sowie die Variablen g_nBuyOrdersCnt und g_nSellOrdersCnt ändern.

Ich danke Ihnen. Es wird ein bisschen klarer. Es ist nur nicht klar, wie man das alles herausfinden kann, ohne sich auf das Forum zu beziehen. Solche Erklärungen habe ich in den Tutorials nicht gefunden.

Bitte geben Sie mir weitere Ratschläge:

1) Der Compiler schreibt - 'g_nBuyOrdersCnt' - Deklaration ohne Typ ; 'g_nSellOrdersCnt' - Deklaration ohne Typ. Gehe ich recht in der Annahme, dass g_nBuyOrdersCnt und g_nSellOrdersCnt global deklariert werden sollten, um einen Fehler durch den Compiler zu vermeiden?

2) Compiler:'for' - Ausdrücke sind im globalen Bereich nicht erlaubt. Das ist hier nicht klar.

3) In der Funktionvoid SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) schreibt der Compiler: declaration of 'arrstOrderInfo' hides global declaration. see previous declaration of 'arrstOrderInfo'. Es ist auch nicht sehr klar.

4) 'nOrderCnt' ist ein nicht deklarierter Bezeichner. Warum wird sie nirgends angegeben?

Und noch eine letzte Sache: Ich verstehe immer noch nicht, woher.n und.f kommen und was sie bedeuten.




 
Игорь:

Hallo!

Können Sie mir sagen, wie man die Balken neu malen, ohne Vorlagen in mt4 !??

Oder wie wendet man ein Farbschema an?

Wenn programmatisch, siehe ChartSetInteger() und ChartGetInteger() Funktionen.

 
novichok2018:

Ich danke Ihnen. Das ergibt langsam mehr Sinn. Es ist nur nicht klar, wie man all das herausfinden kann, ohne sich auf ein Forum zu beziehen. In den Lehrbüchern konnte ich solche Erklärungen nicht finden.

Bitte geben Sie mir noch einige Ratschläge:

1) Der Compiler schreibt - 'g_nBuyOrdersCnt' - Erklärung ohne Typ ; 'g_nSellOrdersCnt' - Erklärung ohne Typ. Liege ich richtig in der Annahme, dass g_nBuyOrdersCnt und g_nSellOrdersCnt global deklariert werden sollten, um einen Fehler durch den Compiler zu vermeiden?

2) Compiler:'for' - Ausdrücke sind im globalen Bereich nicht erlaubt. Das ist hier nicht klar.

3) In der Funktionvoid SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) schreibt der Compiler: declaration of 'arrstOrderInfo' hides global declaration. see previous declaration of 'arrstOrderInfo'. Es ist auch nicht sehr klar.

4) 'nOrderCnt' ist ein nicht deklarierter Bezeichner. Warum wird sie nirgends angegeben?

Wenn Sie den Code als Ganzes betrachten, sollte er folgendermaßen aufgebaut sein:

#property strict

input       int i_nMagicNumber = 12876;

#define  MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

int         g_nBuyOrdersCnt, 
            g_nSellOrdersCnt;

OrderInfo   g_arrstBuyOrderInfo[MAX_ORDERS_CNT], 
            g_arrstSellOrderInfo[MAX_ORDERS_CNT];

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert initialization function                                                                                                                                                                    |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   return INIT_SUCCEEDED;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert deinitialization function                                                                                                                                                                  |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                                                                                                              |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick()
{
    FindOrders();
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Fills the orders arrays                                                                                                                                                                           |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void FindOrders()
{
   g_nBuyOrdersCnt = 0;
   g_nSellOrdersCnt = 0;
   for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
   
      if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
         continue;
   
      if (OrderMagicNumber() != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
         continue;
   
      if (OrderType() == OP_BUY)
         SaveOrderInfo(g_arrstBuyOrderInfo, g_nBuyOrdersCnt);
      if (OrderType() == OP_SELL)
         SaveOrderInfo(g_arrstSellOrderInfo, g_nSellOrdersCnt);
   }
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Saves one selected order in the specified array                                                                                                                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt)
{
   if (nOrdersCnt >= MAX_ORDERS_CNT)
      return;

   arrstOrderInfo[nOrdersCnt].nTicket = OrderTicket();
   arrstOrderInfo[nOrdersCnt].nType = OrderType();
   arrstOrderInfo[nOrdersCnt].fOpenPrice = OrderOpenPrice();
   arrstOrderInfo[nOrdersCnt].fSL = OrderStopLoss();
   arrstOrderInfo[nOrdersCnt].fTP = OrderTakeProfit();

   ++nOrdersCnt;
}
 
novichok2018:

Eine letzte Sache: Ich verstehe immer noch nicht, woher.n und.f kommen und was sie bedeuten.

Der "Punkt"-Operator zeigt den Zugriff auf ein Mitglied einer Struktur oder Klasse an. In diesem Fall handelt es sich um eine Struktur.

Die Buchstaben n und f sind eine Möglichkeit, die Art der in einer Variablen gespeicherten Daten anzugeben. Schließlich ist es bei einer großen Anzahl von Variablen unmöglich, sich den Typ jeder einzelnen zu merken. Und wenn im Namen der Variable die Angabe ihres Typs sein wird, verschwindet die Notwendigkeit des Erinnerns von selbst. n ist ein Vorzeichen einer ganzen Zahl (von Numeric), f ist eine reelle Zahl (von float - Gleitkommazahl). Diese Art, Variablennamen zu schreiben, wird ungarische Notation genannt.

 
Ihor Herasko:

Der Punktoperator zeigt den Zugriff auf ein Mitglied einer Struktur oder Klasse an. In diesem Fall ist es eine Struktur.

Mit den Buchstaben n und f wird die Art der Daten angegeben, die in einer Variablen gespeichert sind. Schließlich ist es bei einer großen Anzahl von Variablen unmöglich, sich den Typ jeder einzelnen zu merken. Und wenn im Namen der Variablen die Angabe ihres Typs sein wird, verschwindet die Notwendigkeit des Erinnerns von selbst. n ist ein Vorzeichen einer ganzen Zahl (von Numeric), f ist eine reelle Zahl (von float - Gleitkommazahl). Diese Art der Notation von Variablennamen wird als ungarische Notation bezeichnet.

Da ist es!!! Es stellt sich heraus, dassg_ undg_n nicht nur eine Abkürzung sind, sondern Präfixe, die besagen, dass es sich um globale und globale ganzzahlige Variablen handelt!!! Igitt... Und ich konnte nicht herausfinden, warum diese Bindestriche in variablen Bezeichnungen... Wie ist es für einen Anfänger, der mit solchen Feinheiten nicht vertraut ist, möglich, Code mit Arrays, Strukturen usw. zu schreiben? Ich dachte, ich könnte meine einfache Strategie in einfacher Sprache formulieren, ohne mich in die Wildnis zu begeben.

Könnten Sie mir einen Link zu einem ausführlichen (erweiterten) Tutorium über mcl4 geben, das ich zusammen mit Ihren Ratschlägen studieren kann?

Und könnten Sie den obigen Code schreiben, ohne die ungarische Notation für den Vergleich zu verwenden? Sind Sie sicher, dass die MT4-Plattform dies richtig versteht?


Und eine Frage zum Code: Wozu dient dascontinue;?

for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
Wenn ein Auftrag in der ersten Iteration nicht ausgewählt wird, wird er auch in den folgenden Iterationen nicht ausgewählt, und der Zyklus wird unbegrenzt fortgesetzt? Denn die Anzahl der Aufträge ändert sich nicht. Wäre es nicht korrekter, mit einer Fehlermeldungabzubrechen?
 
STARIJ:
Kontextmenü-Grafiken, Eigenschaften, Farben - haben Sie das schon ausprobiert?

Danke, ich habe es schon gefunden!!!

 
Ihor Herasko:

Wenn programmatisch, siehe ChartSetInteger() und ChartGetInteger() Funktionen.

Danke, dass Sie es mit Ihrer Hilfe schon gefunden haben!!!

 
novichok2018:

Da ist es!!! Es stellt sich heraus, dassg_ undg_n nicht nur eine Abkürzung sind, sondern Präfixe, die besagen, dass es sich um globale und globale ganzzahlige Variablen handelt!!! Igitt... Und ich konnte nicht herausfinden, warum diese Bindestriche in variablen Bezeichnungen... Wie ist es für einen Anfänger, der mit solchen Feinheiten nicht vertraut ist, möglich, Code mit Arrays, Strukturen usw. zu schreiben? Ich dachte, meine einfache Strategie ließe sich in einfacher Sprache formulieren, ohne dass ich mich in die Wildnis stürzen müsste.

Um etwas tun zu können, müssen wir uns mit den Feinheiten beschäftigen. Es gibt keinen anderen Weg.

Könnten Sie mir einen Link zu einem ausführlichen (erweiterten) Tutorium über mcl4 geben, das ich zusammen mit Ihren Ratschlägen studieren kann?

Ich kenne nur ein Lehrbuch über MQL4 - das von Sergey Kovalev.

Und könnten Sie den obigen Code schreiben, ohne die ungarische Notation für den Vergleich zu verwenden? Sind Sie sicher, dass die MT4-Plattform dies richtig versteht?

Gewöhnen Sie sich gleich an eine korrekte Code-Formatierung )) Die ungarische Notation wurde von recht erfahrenen Programmierern erfunden.

Und eine Frage zum Code: Wozu dient dascontinue;?

Wenn also ein Auftrag in der ersten Iteration nicht ausgewählt wird, wird er auch in den nächsten Iterationen nicht ausgewählt, und die Schleife wird bis ins Unendliche fortgesetzt? Denn die Anzahl der Aufträge ändert sich nicht. Wäre es nicht korrekter, mit einer Fehlermeldungabzubrechen?

Wenn wir einen Auftrag nicht auswählen konnten, bedeutet das nicht, dass wir den nächsten Auftrag nicht auswählen können. Daher ist es sinnvoll, die Schleife fortzusetzen.

Учебник по MQL4
Учебник по MQL4
  • book.mql4.com
В настоящее время персональный компьютер стал незаменимым помощником в жизни каждого человека. Благодаря развитию Интернета и увеличению мощности современных компьютеров открылись новые возможности во многих областях деятельности. Ещё десять лет назад торговля на финансовых рынках была доступна только банкам и узкому кругу специалистов. Сегодня...
 
Ihor Herasko:

Wird ein Auftrag nicht ausgewählt, bedeutet dies nicht, dass der nächste Auftrag nicht ausgewählt werden kann. Daher ist es sinnvoll, den Zyklus fortzusetzen.

Und es ist nicht nötig, eine Fehlermeldung anzuzeigen? Vielleicht wäre es hilfreich zu wissen, warum ein Auftrag nicht gefunden wird und wie man dies vermeiden kann?