Subtrahieren > Ein Problem für MQL5

 

Hallo zusammen,

ich habe gerade ein eher schräges Problem und komme nicht wirklich weiter.

In meiner MarketWatch sind Symbole von Aktien, ich habe einen Button, wenn man diesen drückt sollen nur noch die Symbole übrig bleiben die sich mehr als 2 Prozent bewegt haben im Verlauf des letzten Handelstages.

if ( sparam == "big_win_loss" )
   {
      int alle = SymbolsTotal(true);
      // Alle Symbole durchlaufen
      for ( int k = 0 ; k < alle ; k++ )
      {
         // Symbol ist eine Aktie
         if ( StringFind(SymbolName(k,true),".",0) > 0 )
         {
            double vola = 0;

            MqlRates Daten[];
            ArraySetAsSeries(Daten,true);
            CopyRates(SymbolName(k,true),PERIOD_D1,0,5,Daten);
            
            double A = NormalizeDouble(Daten[1].close,4);
            double B = NormalizeDouble(Daten[2].close,4);
            
            if ( A > B )
            {
               vola = A - B;
            }
            else
            {
               vola = B - A;
            }
            
            Alert(" Symbol = " + SymbolName(k,true) +
                  " close[1] = " + A + 
                  " close[2] = " + B + 
                  " vola = " + vola + 
                  " Aktie = " + (B * 0.02)); 
            
            if ( vola < B * 0.02 )
            {
               SymbolSelect(SymbolName(k,true),false);
            }          
         }
      } 
   }


Wenn ich mir dann anschaue was dabei rum kommt, siehe Anhang, bin ich baff....


Wo seht ihr den Fehler?


Danke!


Gruß Sven

Dateien:
ABC.PNG  17 kb
 

Wenn es dir um die Darstellung der double-Werte geht dann guck dir das hier mal an.

//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int alle = SymbolsTotal(true);
         // Alle Symbole durchlaufen
         for ( int k = 0 ; k < alle ; k++ )
         {
            // Symbol ist eine Aktie
            
         //   if ( StringFind(SymbolName(k,true),".",0) > 0 )
         //   {
               double vola = 0;
   
               MqlRates Daten[];
               ArraySetAsSeries(Daten,true);
               CopyRates(SymbolName(k,true),PERIOD_D1,0,5,Daten);
               
               double A = NormalizeDouble(Daten[1].close,4);
               double B = NormalizeDouble(Daten[2].close,4);
               
               if ( A > B )
               {
                  vola = A - B;
               }
               else
               {
                  vola = B - A;
               }
               
               Alert(" Symbol = " + SymbolName(k,true) +
                     " close[1] = " + A + 
                     " close[2] = " + B + 
                     " vola = " + vola  + 
                     " Aktie = " + (B * 0.02)); 
               
               Print("Aktie pur = "+ (B * 0.02));
               Print("A pur = " + A);
               Print("B pur = " + B);
               Print("Vola pur = "+ vola);               
               
               printf("Aktie optisch verbessert = %.2f",(B * 0.02)); 
               printf("A optisch verbessert = %.5f",A);
               printf("B optisch verbessert = %.5f",B);
               printf("Vola optisch verbessert = %.5f",vola);
               
               if ( vola < B * 0.02 )
               {
                  SymbolSelect(SymbolName(k,true),false);
                  
               }          
           // }
         } 
  }
//+------------------------------------------------------------------+
KR      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     Aktie pur = 2.265e-002
PF      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     A pur = 1.1311
PM      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     B pur = 1.1325
FG      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     Vola pur = 1.400000000000068e-003
PR      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     Aktie optisch verbessert = 0.02
PO      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     A optisch verbessert = 1.13110
PJ      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     B optisch verbessert = 1.13250
IO      0       12:24:49.598    Forum_button_vola_2perc (EURUSD,H1)     Vola optisch verbessert = 0.00140

Besser ?

Sonst die Frage genauer stellen.

Gruß

 

Hallo,

Danke für deine Antwort.

Die Darstellung ist nur die Kontrolle der Daten, das nehme ich später wieder raus. Die errechneten Werte Stimmen nicht!

Schauen wir uns BCP.PO an, Schlusskurs der Vortageskerze ist 3,292 €, gestern war er 3,258 €, ergo die Aktie ist im Handelsverlauf um 0,034 € gefallen, nicht 3,39...... und 2% vom Aktienpreis sind 0,065 € und nicht 6,58...?!

Entweder habe ich verlernt zu Subtrahieren, oder hier spielt mir jemand einen Streich..... :-(

Das Normalisieren der Double werte ist eigentlich unnötig, da der abgespeicherte Preis ja schon eine gewisse Anzahl an Kommastellen hat. lediglich bei der Multiplizierung ist eine Begrenzung sinnvoll, zur Darstellung, mehr aber auch nicht...
 
SveFic:

Hallo,

Danke für deine Antwort.

Die Darstellung ist nur die Kontrolle der Daten, das nehme ich später wieder raus. Die errechneten Werte Stimmen nicht!

Schauen wir uns BCP.PO an, Schlusskurs der Vortageskerze ist 3,292 €, gestern war er 3,258 €, ergo die Aktie ist im Handelsverlauf um 0,034 € gefallen, nicht 3,39...... und 2% vom Aktienpreis sind 0,065 € und nicht 6,58...?!

Entweder habe ich verlernt zu Subtrahieren, oder hier spielt mir jemand einen Streich..... :-(

Das Normalisieren der Double werte ist eigentlich unnötig, da der abgespeicherte Preis ja schon eine gewisse Anzahl an Kommastellen hat. lediglich bei der Multiplizierung ist eine Begrenzung sinnvoll, zur Darstellung, mehr aber auch nicht...

Die aktuelle Kerze hat auch den Index 0 und der Vortag demzufolge Index 1

des weiteren musst du bei CopyRates noch ArraySetAsSeries verwenden, sonst kopierst Du die werte vom anderen Ende des Charts

 
Schau dir nochmal die zahlen an.
Exponent minus 2 also wird aus 3.39  dann 0.034
Kommst du jetzt drauf?
 
https://www.mql5.com/de/docs/basis/types/double
 

Hallo,

jetzt funktionierts, hatte noch andere Fehler mit drinne... Danke! Das mit dem Print ist besser als Alert zur Kontrolle!!! Danke!

if ( sparam == "big_win_loss" )
   {
      Print(SymbolsTotal(true) + " Symbole gesamt!");
      
      // Alle Symbole durchlaufen
      for ( int k = 0 ; k < SymbolsTotal(true) ; k++ )
      {
         //Print(k + " " + SymbolName(k,true));
         // Symbol ist eine Aktie
         if ( StringFind(SymbolName(k,true),".",0) > 0 )
         {
            //Print(SymbolName(k,true) + " is ne Aktie");
            // bin nicht investiert
            if ( !PositionSelect(SymbolName(k,true)) )
            {
               //Print(SymbolName(k,true) + " nicht investiert");
            
               double vola = 0;
   
               MqlRates Daten[];
               ArraySetAsSeries(Daten,true);
               while( CopyRates(SymbolName(k,true),PERIOD_D1,0,3,Daten) < 0 )
               {
                  SeriesInfoInteger(SymbolName(k,true),PERIOD_D1,SERIES_SYNCHRONIZED);
               }
               
               double A = Daten[1].close;
               double B = Daten[2].close;
               
               if ( A > B )
               {
                  vola = NormalizeDouble(A - B,4);
               }
               else
               {
                  vola = NormalizeDouble(B - A,4);
               }
               
               Print(" Symbol = " + SymbolName(k,true) +
                     " close[1] = " + A + 
                     " close[2] = " + B + 
                     " vola = " + vola + 
                     " Aktie = " + (B * 0.02)); 
               
               if ( vola < NormalizeDouble(B * 0.02,4) )
               {
                  //Print(SymbolName(k,true) + " fliegt raus!");
                  SymbolSelect(SymbolName(k,true),false);
                  //Print("Jetzt " + SymbolsTotal(true) + " Symbole übrig!");
                  k--;
               }
               else
               {
                  Print(SymbolName(k,true) + " Mehr als 2%!");   
               }                  
            }
            else
            {
               //Print(SymbolName(k,true) + " bin investiert!"); 
            }
         }
         else
         {
            //Print(SymbolName(k,true) + " ist keine Aktie!"); 
         }
      } 
   }
 

also subtrahieren kann MQL5 :-)