Probleme mit Werten aus ICustom

Einloggen oder registrieren, um einen Kommentar zu schreiben
amando
937
amando  

Hallo,


ich versteh die Funktion ja nicht, einmal geht sie, dann wieder nicht. Die initialisierung eines Indikators funktioniert nur zeitweise bei mir

ich verwende folgenden code im globalen 

double TMAweek[];   // Wochenbasis
double TMAweekUp[];   // Wochenbasis
double TMAweekLo[];   // Wochenbasis
int   TMAHandleweek=0;// Wochenbasis

in der onInit

TMAHandleweek=iCustom(_Symbol,PERIOD_W1,TMA_Name,TMA_Periode,TMA_Price,TMA_ATR_Periode,TMA_ATR_Multiplier,false);


und dann in der onTick

   CopyBuffer(TMAHandleweek,0,0,5,TMAweek);   ArraySetAsSeries(TMAweekUp,true);
   CopyBuffer(TMAHandleweek,2,0,5,TMAweekUp);   ArraySetAsSeries(TMAweekUp,true);
   CopyBuffer(TMAHandleweek,3,0,5,TMAweekLo);   ArraySetAsSeries(TMAweekLo,true);


wenn ich dann versuche 

Print(NormalizeDouble(TMA15m[0],5)," ", NormalizeDouble(TMA15mUp[0],5), " ", NormalizeDouble(TMA15mLo[0],5));

bekomme ich lauter 0 Werte,


ich hab auch schon die Buffer und die Array in die OnInit kopiert und da war keine Auswirkung.

Hab auch schon das Handle in die OnTick, genausowenig auswirkung.


interessanterweise, es funktioniert immer tageweise, dann wieder ein paar tage nicht


ist das bei euch auch so?


amando

Carl Schreiber
Moderator
7281
Carl Schreiber  
  1. NormalizeDouble() braucht niemand! Double-Zahlen sind eh 'ganz lang' - siehe die immer wiederkehrenden Fragen zur Gleichheit zwei 'Doubletten'. Nimm in Print() stattdessen DoubleToString() oder mit #define:
    #define d2s(q) DoubleToString(q,_Digits)
    
    
    Dann werden die Zeilen nicht so lang!
  2. Versuch doch einmal die erst ArraySetAsSeries(..) und dann die Wertezuweisung über CopyBuffer(..) zu machen - allerdings habe ich damit (noch) keine Erfahrung!

amando
937
amando  

kannst Du mir den Punkt 2 nochmal genauer erklären, den versteh ich nicht ganz,

das Normalize double das braucht wirklich niemand, hatte es nur zur schnelleren darstellung in der Print drin

Otto Pauser
982
Otto Pauser  
amando:

kannst Du mir den Punkt 2 nochmal genauer erklären, den versteh ich nicht ganz,

ArraySetAsSeries(...) gehört in die OnInit(). Es braucht nur einmal ausgeführt werden.
Im Debugger siehst du Symbole hinter der Definition, die Auskunft über die Art der Indizierung liefern. I-Indikatorbuffer S-Series.

Handles von iCustom gehören überprüft!

if(TMAHandleweek==INVALID_HANDLE)
   {
      Alert("*ERROR* creating .... handle");
      return(INIT_FAILED);
   }


Das Ergebnis von CopyBuffer gehört überprüft!

#define TO_COPY 5

   if(CopyBuffer(TMAHandleweek,0,0,TO_COPY,TMAweek  )!=TO_COPY) return;         // auf den nächsten tick warten
   if(CopyBuffer(TMAHandleweek,2,0,TO_COPY,TMAweekUp)!=TO_COPY) return;         // falls die Indikatoren noch nicht bereit sind
   if(CopyBuffer(TMAHandleweek,3,0,TO_COPY,TMAweekLo)!=TO_COPY) return;         // ist ja alles Ereignisgesteuert


Weiters sehe ich nichts zu Verbessern.

PS: CopyBuffer arbeitet immer richtig siehe F1. Der Zeitpunkt von ArraySetAsSeries() ist erst beim Zugriff auf das Array relevant.

amando
937
amando  

der CopyBuffer muss aber in der OnTick stehen @Otto, sehe ich das so richtig?


amando

Carl Schreiber
Moderator
7281
Carl Schreiber  

Stell den Kursor im Editor auf CopyBuffer und drück F1 und dann orientiere Dich an dem Beispiel - da gibt es keine humoristischen Übersetzungen ;)

Dort steht CopyBuffer in OnCalculate(..){..} dem Indik.-Pendant zu OnTick() - also ja!

Otto Pauser
982
Otto Pauser  
amando:

der CopyBuffer muss aber in der OnTick stehen @Otto, sehe ich das so richtig?

amando

Ja klar, CopyBuffer gehört in die OnTick() weil sich ja bei jedem Tick was ändert. (bzw in die OnCalculate())
Einloggen oder registrieren, um einen Kommentar zu schreiben