Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Vektoren erkennen / Bitmap analysieren - Vorschläge gesucht


Michael Farlaub - So 19.06.05 16:58
Titel: Vektoren erkennen / Bitmap analysieren - Vorschläge gesucht
grüß Euch!


Ich habe Grafiken in der Charts dargestellt sind. Mein Ziel ist es Kanäle zu erkenne an die ein Vekor (Linie) angelegt werden soll.

Am besten hier mal mein gezeichnetes Beispiel:

Chart:

user defined image

Hier die Vektoren:

user defined image

Die Charts sehen mehr oder weniger alle ähnlich aus. Es gibt Auf und Abwärts-kanäle.

Ich werde das Bild mit scanline nach Farbenerkennung abscannen, so dass zu jedem Pixel die Farbe habe.

Ich bin jedoch leider auf noch keine brauchbare Strategie gekommen wie ich die Vektoren an ihr Stelle bekomme.

Über Vorschläge würde ich mich freuen.

Grüße

Michael


alzaimar - So 19.06.05 20:59

Normalerweise nimmt man die zugrundeliegenden numerischen Werte und dann die gute alte Analysis, um die Charttendenzen einzuzeichen. Wenn Dir nichts anderes, als Bitmaps zur Verfügung stehen, wird es natürlich schwieriger...

Du erstellst eine Liste aller unteren Enden der gelben Linien, und eine Liste der oberen Enden der gelben Linien (jeweils XY-Paare). Dann benutzt Du Mathematik (Analysis).


delfiphan - So 19.06.05 21:12

Darf man fragen, was das für Daten sind? (Interpretation der gelben Punkte und Interpretation der zu bestimmenden Linien)


alzaimar - So 19.06.05 21:18

[einmisch]
Sieht nach Aktienkursen aus :
Gelb: Tageskurse mit niedrigstem/höchstem Kurs
Lila Punkte: 30 day moving average
Rot/Pink : 200 day moving average
[/einmisch]


delfiphan - So 19.06.05 21:22

Ach so, dann würd ich auch mal so ein 30 day moving average machen. Anhand der lila Punkte sieht man ja relativ gut, ob's nach oben oder unten geht. Einfach die Richtungswechselstellen merken und die mit Linien verbinden.


alzaimar - So 19.06.05 21:29

Sollte Michael mal erklären. Mit dieser Charttechnik soll man irgendwie Tendenze erkennen, aber einfach die Umkehrpunkte verbinden reicht wohl nicht. Schau Dir mal die lokalen Minima/Maxima an. Da wird dann dieser Punkt mit dem kleinsten/grössten Minima/Maxima der foglenden Tage verbunden: solange der Kurs wieder steigt, wird das lokale Minimum (Wendepunkt des Kurses) mit dem kleinsten Tagesminimum während der steigenden Kurse verbunden und umgekehrt.
Der Schnittpunkt mit den anderen Linien soll dann den richtigen Einstiegspunkt für die Bestellung von Frischfisch sein oder so. Keine Ahnung. :lol:

Wie gesagt: Sollte Michael mal erklären....


Phantom1 - So 19.06.05 21:40

Naja, so genau hab ich das auch alles nicht verstanden, aber ich hab mal was auf die schnelle geproggt (Ist vieleicht ein Anfang).

man braucht nur ein TImage mit der Bitmap und ein TButton:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
type
  TIntArray = array of Integer;
  TRichtung = (rStart, rUp, rDown);

procedure ColorSearch(src: TBitmap; var Buffer: TIntArray; r,g,b: Byte);
var
  x, y: Integer;
  p: PRGBTriple;
  pos: Word;
begin
  src.PixelFormat:=pf24bit;
  SetLength(Buffer, src.Width);
  for x:=0 to src.Width-1 do begin
    pos:=0;
    for y:=0 to src.Height-1 do begin
      p:=src.ScanLine[y];
      Inc(p, x);
      if (p.rgbtRed=r) and (p.rgbtGreen=g) and (p.rgbtBlue=b) then begin
        Inc(Buffer[x]);
        Inc(pos, y);
      end;
    end;
    if Buffer[x]>1 then begin
      Buffer[x]:=pos div Buffer[x];
    end else
      Buffer[x]:=-1;
  end;
end;

procedure DrawVektor(src: TBitmap; var Buffer: TIntArray; Color: TColor; Precise: Byte);
var
  x, x1, y: Integer;
  richtung: TRichtung;
begin
  src.Canvas.Pen.Color:=Color;
  y:=0; x1:=0;
  richtung:=rStart;
  for x:=0 to High(Buffer) do
    if Buffer[x]<>-1 then begin
      Case Richtung of
        rStart: begin
                  if Buffer[x]<y then Richtung:=rUp else Richtung:=rDown;
                  src.Canvas.MoveTo(x, Buffer[x]);
                end;
        rUp   : if (Buffer[x]>y) and (Buffer[x]-y>Precise) then begin
                  src.Canvas.LineTo(x1, y);
                  Richtung:=rDown;
                end;
        rDown : if (Buffer[x]<y) and (y-Buffer[x]>Precise) then begin
                  src.Canvas.LineTo(x1, y);
                  Richtung:=rUp;
                end;
      end;
      y:=Buffer[x];
      x1:=x;
    end;
  src.Canvas.LineTo(x1, y);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Buffer: TIntArray;
begin
  ColorSearch(Image1.Picture.Bitmap, Buffer, 255,204,2);
  DrawVektor(Image1.Picture.Bitmap, Buffer, clWhite, 6);
  Image1.Repaint;
end;


So siehts dann aus:
user defined image

EDIT: Code verbessert

mfg
Phantom1

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Michael Farlaub - So 19.06.05 22:34

grüß euch!

genau, es ist ein aktienkurs und es geht um charttechnik.
wenn der kurs eine kanal verlässt (bricht), ist das ein zeichen für einen richtungswechesel. (ist einer von vielen chartindikatoren)

Zitat:
Ach so, dann würd ich auch mal so ein 30 day moving average machen


moving average ist auch ein trendindikator, aber was anders als trendkanäle.


@Phantom1

man du bist ja echt ein genie! das ist schon so gut wie das was ich brauche.
wie lange hast du dafür gebraucht?
RESPEKT! und vielen dank!


grüße


michael


Phantom1 - So 19.06.05 22:46

@Michael Farlaub: so schwer fand ich das eigentlich nicht, hab dafür nur etwa 1 stunde gebraucht (hatte grade lust und zeit :wink: ). Naja wie auch immer du kannst den code ja na nach deinen wünschen anpassen, falls du fragen zum Code hast, bitte dann über PN.


Michael Farlaub - So 19.06.05 23:09


Quelltext
1:
2:
3:
4:
Sollte Michael mal erklären. Mit dieser Charttechnik soll man irgendwie Tendenze erkennen, aber einfach die Umkehrpunkte verbinden reicht wohl nicht. Schau Dir mal die lokalen Minima/Maxima an. Da wird dann dieser Punkt mit dem kleinsten/grössten Minima/Maxima der foglenden Tage verbunden: solange der Kurs wieder steigt, wird das lokale Minimum (Wendepunkt des Kurses) mit dem kleinsten Tagesminimum während der steigenden Kurse verbunden und umgekehrt. 
Der Schnittpunkt mit den anderen Linien soll dann den richtigen Einstiegspunkt für die Bestellung von Frischfisch sein oder so. Keine Ahnung.  

Wie gesagt: Sollte Michael mal erklären....


Bei der Charttechnik kombiniert man verschiedene indikatoren(SAR, MACD, RSI, Slow Stochastik, Fibonacci Zahlen, Trendkanäle) die dann, wenn quasi alle kauf = true sind, gekauft werden

dann kann man schon ziemlich gute performance erziehlen. bin dabei solch ein automatisches tradingsystem zu entwickeln.

der ganze börsenkram bzw die menschliche psychologie kann man alles mit mathematik beschreiben. so kann man einen aktienverlauf ausreichend vorhersehen. zumindest den trend.

user defined image


grüße

michael


Michael Farlaub - So 19.06.05 23:15
Titel: :
_____________