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

 
Hallo liebe Programmierer!

Es besteht Bedarf an folgender Analyse: Das Programm soll die ihm übergebenen Parameter analysieren und das Ergebnis in einem separaten Fenster in Form einer Tabelle mit einer Reihe von Daten ausgeben. Das heißt, das Programm sollte die Historie analysieren und die notwendigen Daten anzeigen.

Ist es möglich, dies in MQL4 zu tun oder ist es besser, den Verlauf zu exportieren und die Daten mit einem in einer anderen Sprache geschriebenen Programm zu analysieren?

Vielen Dank im Voraus!
 
GygaByte:


Richtig, aber wie die Praxis zeigt - nicht immer.

Wenn die fünfte Dezimalstelle = 5 (1.xxxx5) ist, ist der Wert immer noch verzerrt:

die Frage ist immer noch gültig...

P.S. Im Allgemeinen muss ich MagicNumber einen Preiswert zuweisen... Geben Sie hier MagicNumber - int ein, und versuchen Sie, mit

Wer kann mir sonst noch Ratschläge geben?

Ich danke Ihnen.

Sie geben die Daten mit unterschiedlichen Rundungen aus, so dass Sie nicht die volle Zahl sehen, und Sie denken, dass etwas verzerrt ist. Bei der Ausgabe von reellen Zahlen wird standardmäßig auf die 4. Stelle gerundet. Bei 5-stelligen Zahlen müssen Sie die Ausgabe explizit runden:

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

Schauen Sie sich Ihr eigenes Bild an - Ausgabegebot ohne DoubleToStr() und mit DoubleToStr().

 
hoz:

Artyom und Boris, danke, dass ihr meine Frage "durchgekaut" habt. Es gibt Phasen, in denen ich bei ganz einfachen Dingen nicht weiterkomme, so wie es diesmal der Fall war...

Jetzt gibt es eine neue Frage.

Ich habe der Funktion, die die Anzahl der offenen Aufträge t berechnet, die Suche nach Aufträgen eines bestimmten Typs mit bestimmten Gewinnen und den Vergleich ihrer Gewinne mit einem bestimmten Wert (derzeit 0) hinzugefügt. Außerdem, wenn es keine offenen Aufträge gibt, werden 2 Flags mit dem Wert True mit den Parametern der Funktion FindOrders() zurückgegeben, das bedeutet, dass Sie einen Auftrag senden können, aber wenn es Aufträge gibt, wird der Gewinn geprüft, um sicherzustellen, dass er höher als der eingestellte Wert ist, wenn er niedriger als der eingestellte Wert ist, werden 2 Flags mit dem Wert False mit den Parametern der Funktion FindOrders() zurückgegeben, so dass, wenn es Verlustaufträge in einer Richtung gibt, es keine Investitionen in die Verlustrichtung gibt.

Danach rufe ich die Funktion FindOrders() in der Signalfunktion auf:

Die Aufträge haben sich überhaupt nicht bewegt. Die Logik scheint richtig zu sein. Können Sie vielleicht erkennen, wo ich einen Fehler gemacht habe?

Ich verstehe, dass alles mit einer separaten Funktion einfacher zu erledigen ist, und ich kann das auch. Aber ich möchte verstehen, warum es in dieser Version nicht funktioniert.

Victor, ich kann deinen Algorithmus nicht ganz verstehen, aber ich kann dir einen Rat geben! Das passiert mir auch, wenn es einen Fehler in der Logik gibt. Das Programm wird abgebrochen, wenn sich herausstellt, dass Ihre Bedingungen nicht eindeutig sind oder sich gegenseitig ausschließen. Vielleicht wissen Sie, was Sie wollen, können aber die Logik des Codes nicht richtig aufbauen. Achten Sie auf diese Pannen und notieren Sie die gesamte Reihenfolge, in der die Bedingungen ausgeführt werden sollen, eine nach der anderen auf einem Blatt Papier mit Pfeilen zur Verdeutlichung! Viel Glück!
 
borilunad:
Victor, ich kann deinen Algorithmus nicht ganz verstehen, aber ich kann dir einen Rat geben! Das passiert mir auch, wenn ein Fehler in der Logik vorliegt. Das Programm wird abgebrochen, wenn sich herausstellt, dass Ihre Bedingungen nicht eindeutig sind oder sich gegenseitig ausschließen. Vielleicht wissen Sie, was Sie wollen, können aber die Logik des Codes nicht richtig aufbauen. Achten Sie auf diese Pannen und notieren Sie die gesamte Reihenfolge, in der die Bedingungen ausgeführt werden sollen, eine nach der anderen auf einem Blatt Papier mit Pfeilen zur Verdeutlichung! Viel Glück!


Es gibt also eine einfache Logik. Wenn es keine offenen Aufträge gibt, werden die Aufträge durch das Signal geöffnet.

Und wenn es offene Orders gibt, dann sollen die Orders durch ein bestimmtes Signal geöffnet werden, wenn der Gewinn der Orders in einer bestimmten Richtung (Kauf oder Verkauf) höher als ein bestimmter Wert ist, d.h. zumindest nicht im Minus. (Ich habe dort zu Testzwecken 0 eingestellt).

Ich habe einen logischen Fehler gefunden. Hier ist das Ergebnis:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

Jetzt werden die Verkaufsaufträge beim Sitzen korrekt geöffnet, aber die Kaufaufträge werden überhaupt nicht geöffnet. Obwohl das Flag den Wert beider Variablen 1 hat, d.h. wahr ist.

 

Ich habe dieses Problem mit mt4.

Beim Start der mt4-Broker-Software (nämlich der 3, die ich seit einer Woche benutze) auf meinem Computer erscheint ein "Run as user"-Fenster auf meinem Computer (wie bei "run as user"). Bei jeder Aktionsauswahl öffnet sich mt4 normal.

Wie kann ich mt4.eh wieder ohne dieses Fenster zum Laufen bringen? Wer weiß oder versteht vielleicht, was los ist...

 

Guten Tag, ich hatte das Bedürfnis, alle ausstehenden Aufträge schnell zu stornieren. OrderClose ignoriert die schwebenden Aufträge. Welcher Operator ist am bequemsten zu verwenden, und ist diese Option verfügbar?

 
Notter:

Guten Tag, ich hatte das Bedürfnis, alle ausstehenden Aufträge schnell zu stornieren. OrderClose ignoriert die schwebenden Aufträge. Welcher Operator ist am bequemsten zu verwenden, und ist diese Option verfügbar?


Sie können nur Marktaufträge schließen, und Sie benötigen den Operator OrderDelete, um die ausstehenden Aufträge zu löschen.
 

hoz

Ich danke Ihnen!

 
hoz:


Die Logik ist also ganz einfach. Wenn keine Aufträge offen sind, werden die Aufträge durch das Signal geöffnet.

Und wenn es offene Orders gibt, dann sollen die Orders durch ein bestimmtes Signal geöffnet werden, wenn der Gewinn der Orders in einer bestimmten Richtung (Kauf oder Verkauf) höher als ein bestimmter Wert ist, d.h. zumindest nicht im Minus. (Ich habe dort zu Testzwecken 0 eingestellt).

Ich habe einen logischen Fehler gefunden. Hier ist das Ergebnis:

Jetzt werden die Verkaufsaufträge beim Sitzen korrekt geöffnet, aber die Kaufaufträge werden überhaupt nicht geöffnet. Obwohl das Flag den Wert beider Variablen 1 hat, d.h. wahr ist.

Victor, überprüfen Sie das! Indem Sie den Long-Buy auskommentieren, können Sie im Log nachsehen, wie der Short-Sell funktioniert! Und umgekehrt, dann sehen Sie, was der Unterschied ist und finden Sie heraus, warum es nicht funktioniert!
 
borilunad:
Victor, lass es uns überprüfen! Indem Sie die lange Seite auskommentieren, überprüfen Sie, wie die kurze Seite im Protokoll funktioniert! Und umgekehrt, dann sehen Sie, was der Unterschied ist und finden Sie heraus, warum es nicht funktioniert!


Boris, wenn Sie eine der Bedingungen in int GetGeneralSignal() auskommentieren, ist die Öffnung klar.

Ich habe es nachverfolgt. Das Kennzeichen ändert seinen Wert nicht, wenn die Rentabilität der derzeit offenen Aufträge im Minus ist. Hier ist die umgeschriebene Funktion, die die Werte der Flags short und long auf false setzen soll, d.h. uns daran hindert, eine Position zu eröffnen, wenn es Minusaufträge gibt:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

Hier ist die aufrufende Funktion:

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}