Einloggen Suche | Aktive Themen
Sortierung in Listen von Listen Optionen
chuck
Geschrieben: Thursday, April 26, 2012 10:13:41 AM

Gruppen: Kunde

Beiträge: 167

market maker
An das Marketmaker Team,

aus einer Berechnung erhalte ich eine Liste von Listen mit Zahlen, die ich sortieren möchte bevor sie ausgebe.

Ein Beispiel für diese Liste ist folgende:

Code:
$L:=(1.list[3]).append[5.list[7]; 3.list[2]; 5.list[5]; 4.list[3]; 5.list[2]; 6.list[3]];


Die Listen mit den Zahlen sollen nach dem 1. Element absteigend und nach dem 2. Element aufsteigend sortiert werden.

Zitat:
Sortierte Liste:

[6;3]
[5;2]
[5;5]
[5;7]
[4;3]
[3;2]
[1;3]


Bitte teilen Sie mir mitteilen, wie eine solche doppelte Sortierung mit der Funktion

Liste.Sort[Vergleichsfunktion;Selektorfunktion]→Liste

zu realisieren ist.

Mit freundlichen Grüßen
Marcus Lieck
Geschrieben: Thursday, April 26, 2012 10:24:09 AM

Gruppen: Mitarbeiter

Beiträge: 470

Tai-Pan RealtimeTai-Pan End-of-Daymarket makerbis. Realtime-Terminal
Hallo chuck,

Ihre Anfrage wurde an die Entwicklung weitergegeben.
Sobald wir eine Rückmeldung erhalten werden wir Sie informieren.

Mit freundlichen Grüßen
Marcus Lieck

Leiter Produktsupport | Lenz+Partner GmbH | vwd group
Phone: +49 231 9153-500 | Fax: +49 231 9153-599
hotline@lp-software.de | www.LP-software.de | www.vwd.com
chuck
Geschrieben: Thursday, April 26, 2012 10:39:01 AM

Gruppen: Kunde

Beiträge: 167

market maker
Hallo Herr Lieck,

Sorry die Formel zur Erzeugung dieser Testliste war falsch. So wie ich sie oben geschrieben habe gibt es nur eine Liste mit Zahlen.

Die Formel für die Testliste vom Typ:"List(List(Zahl))" muss folgendermaßen lauten:

Code:
$L:=(1.list[3]).list[5.list[7];
                     3.list[2];
                     5.list[5];
                     4.list[3];
                     5.list[2];
                     6.list[3]];


Ich bitte dieses Versehen zu entschuldigen.

Mit freundlichen Grüßen
Marcus Lieck
Geschrieben: Thursday, April 26, 2012 12:03:13 PM

Gruppen: Mitarbeiter

Beiträge: 470

Tai-Pan RealtimeTai-Pan End-of-Daymarket makerbis. Realtime-Terminal
Hallo chuck,

der Market Maker Entwicklung reichen die bisherigen Informationen zu Ihrer Anfrage nicht aus, da es für Ihre Anfrage keine pauschale Antwort gibt.
Wir bräuchten bitte mehr Input; z.B. Was ist das für eine Liste? Was werten Sie genau aus?

Mit freundlichen Grüßen
Marcus Lieck



Leiter Produktsupport | Lenz+Partner GmbH | vwd group
Phone: +49 231 9153-500 | Fax: +49 231 9153-599
hotline@lp-software.de | www.LP-software.de | www.vwd.com
chuck
Geschrieben: Thursday, April 26, 2012 1:46:41 PM

Gruppen: Kunde

Beiträge: 167

market maker
Hallo Herr Lieck,

ich denke zwar dass nur die Struktur der Liste für die Lösung meiner Frage notwendig ist, aber ich werde Ihre Fragen trotzdem beantworten.

Ich arbeite z. Zt. an einem Programm, das über die Kurse der letzten x-Monate die Kursbänder sucht, in denen sich die Kurse in diesem Zeitraum am häufigsten aufhielten, um diese dann graphisch als Linien im Chart darzustellen. Diese Preis-Levels können genauso wie die noch offenen Gaps, Hinweise auf mögliche Widerstands- bzw. Unterstützungszonen sein.

Die erste Zahl in der Liste ist die Anzahl der Kurse bzw. das Kursvolumen, das in einem Kursband aufgetreten ist. Die Zweite Zahl ist der Mittelwert des dazugehörigen Kursbandes.

Da in market maker keine Price-Level Profile in einem Kurschart darstellbar sind, will ich die Darstellung über die Funktion Linesmulti machen. Da mit Linesmulti nur bis zu 10 Linien im Chart auf einmal darstellbar sind, möchte ich natürlich nur die Werte als Linien im Chart darstellen, die im Element 1 den höchsten Wert haben (größte Anzahl der Kurse im Band bzw. höchstes Kursvolumen) und wenn es mehrere Bänder mit dem gleichen Wert in Element 1 gibt, in absteigender Reihenfolge die Bänder anzeigen, die am nächsten am aktuellen Kurs sind.

Ich suche dafür eine allgemeine Lösung für die Sortierung in Listen, die auch bei mehr als 2 Sortierkriterien noch funktioniert.

Im Voraus besten Dank für Ihre Bemühungen

Mit freundlichen Grüßen
Marcus Lieck
Geschrieben: Wednesday, May 2, 2012 5:17:38 PM

Gruppen: Mitarbeiter

Beiträge: 470

Tai-Pan RealtimeTai-Pan End-of-Daymarket makerbis. Realtime-Terminal
Hallo Chuck,

folgende Rückmeldung habe ich von den Kollegen des Reporting-/Formelteams
erhalten:
Grundsätzlich sind alle Funktionen in unserem System „herkömmliche“ Funktionen. „Nicht herkömmliche“ Funktionen sind z.B. Makros, die auch vom Anwender selbst erstellt werden können.
Folgender Ausschnitt aus der Hilfe beschreibt die Verhaltensweise schon recht gut.
Jede herkömmliche Funktion, wie z. B. WP oder Name, hat eine doppelte Auswertungssemantik (und Typisierung):
Eine "herkömmliche" Funktion kann auf das Objekt angewendet werden, für das sie vorgesehen ist. Die Formel Wertpapier.Name liefert z. B als Ergebnisobjekt den Namen des Wertpapiers.
Wird eine solche "herkömmliche" Funktion auf eine Liste angewendet, z. B. Liste(Wertpapier).Name, erhält die Funktion eine Listen­extension. Die Funktion #Name wird dann auf alle Elemente der Liste angewendet. Die so erhaltenen Ergebnisse werden wieder in einer Liste zusammengestellt. Sind die einzelnen Ergebnisse selbst auch listenwertig, werden diese Listen aneinandergefügt (s. Beispiele).

Um das Beschriebene noch etwas genauer zu formulieren:
Es kommt darauf an, in welchem Kontext die Funktionen WP und Name aufgerufen werden. Wird die Funktion WP zum Beispiel auf einem Wertpapierobjekt aufgerufen, dann wird dieses Wertpapierobjekt als einzelnes Objekt zurückgegeben. Wird die Funktion aber wie beschrieben auf einem Ordner aufgerufen, dann bekommt man eine Liste von Wertpapierobjekten als Ergebnis zurückgegeben. Der Anwender muss dabei die Listenextension nicht selbst setzen, dies geschieht automatisch durch das Programm.
Gleiches gilt für die Funktion Name. Wird von der Funktion WP ein einzelnes Wertpapierobjekt zurückgegeben, dann wird die Funktion Name auf dieses Objekt angewendet und liefert den Wertpapiernamen zurück. Kommt aber eine Liste von Wertpapierobjekten, dann wird die Funktion Name automatisch auf jedes einzelne Element angewendet und die Ergebnisse in einer Liste zurückgegeben.

Ich hoffe das hilft weiter.
Mit freundlichen Grüßen
Marcus Lieck



Leiter Produktsupport | Lenz+Partner GmbH | vwd group
Phone: +49 231 9153-500 | Fax: +49 231 9153-599
hotline@lp-software.de | www.LP-software.de | www.vwd.com
chuck
Geschrieben: Wednesday, May 2, 2012 7:57:20 PM

Gruppen: Kunde

Beiträge: 167

market maker
Hallo Herr Lieck,

Ihre Antwort passt nicht auf das Thema des Threads "Sortierung in Listen von Listen", sondern sie bezieht sich wohl auf ein Thema "Listenextension", das aber hier im Forum nicht angesprochen wurde.

Da diese Antwort die Leser mehr verwirrt als Klarheit schafft, schlage ich vor, sie hier zu entfernen.

Ich denke Sie werden mir hier noch die angefragte allgemeine Lösung für die Sortierung in Listen, die auch bei mehr als 2 Sortierkriterien noch funktioniert, einstellen.

Mit freundlichen Grüßen.
Marcus Lieck
Geschrieben: Thursday, May 3, 2012 9:14:02 AM

Gruppen: Mitarbeiter

Beiträge: 470

Tai-Pan RealtimeTai-Pan End-of-Daymarket makerbis. Realtime-Terminal
Hallo Chuck,

mein vorheriger Beitrag bezog sich auf eine Emailanfrage Ihrerseits.
Ich habe den Beitrag daher entfernt.

Anbei die Antwort zu dieser Anfrage von der Programmierung:

Grundsätzlich ist es mit MM-Talk Formeln nicht möglich, eine Liste nach zwei oder mehr Kriterien zu sortieren. In dem vom Kunden genannten Beispiel kann man die beiden Kriterien mathematisch so kombinieren, das ein einzelnes Kriterium dabei herauskommt, nach dem man die Liste sortieren kann. Die Formel sähe wie folgt aus:

$L := List(1.list[3]; 5.list[10]; 3.list[2]; 5.list[5]; 4.list[3]; 5.list[2]; 6.list[0]);

$L2max := $L.Sort[#Greater; #[](Nth[1])].Nth[0].Nth[1] + 1;

Map(#[](
MakeCollection
.Add["Sortnumber"; Nth[0] * $L2max + Nth[1]]
);$L.Sort[#Less; #[](Nth[0] * $L2max + Nth[1])])

Es wird in der 2. Liste nach der maximalen Zahl gesucht und auf diese noch eine 1 addiert, um Überschneidungen im Randbereich zu vermeiden. Für das kombinierte Suchkriterium wird die Zahl aus der ersten Spalte mit der maximalen Zahl + 1 aus der 2. Spalte multipliziert und zu diesem Ergebnis noch die Zahl aus der 2. Spalte addiert.
Diese Lösung funktioniert nur in dem vom Kunden beschriebenen Sonderfall und wird wahrscheinlich nicht auf sein eigentliches Problem anwendbar sein.

Mit freundlichen Grüßen

Marcus Lieck



Leiter Produktsupport | Lenz+Partner GmbH | vwd group
Phone: +49 231 9153-500 | Fax: +49 231 9153-599
hotline@lp-software.de | www.LP-software.de | www.vwd.com
chuck
Geschrieben: Friday, May 4, 2012 1:33:16 PM

Gruppen: Kunde

Beiträge: 167

market maker
Hallo Herr Lieck,

vielen Dank für die hier präsentierte Lösung. Die Programmierung/ Entwicklung hat recht , dass diese Lösung nicht allgemein anwendbar ist und funktionierte auch nicht mit meinen realen Daten aus der Berechnung.

In einem anderen Punkt hat die Programmierung/ Entwicklung jedoch unrecht.

Zitat:
Grundsätzlich ist es mit MM-Talk Formeln nicht möglich, eine Liste nach zwei oder mehr Kriterien zu sortieren.


Ich habe weiter geforscht und habe mich an ein Prinzip erinnert, das in der Informatik insbesondere bei der rekursiven Programmierung zum schnellen Sortieren von Listen/Arrays benutzt wird.

Es heißt Teile und herrsche (Informatik)

Dieses Prinzip wird beim Quicksort angewendet. Ich habe es etwas auf mein Problem abgewandelt, um eine Liste mit Listen nach 2 Kriterien mit MM-Talk Mitteln zu sortieren. Im Folgenden hier die Lösung, die sie gerne zur Information an die Programmierung/ Entwicklung weiterleiten können .

Code:
{ -------------------------------------------------------------------
   Erzeugen von 2 Listen mit Listen, die jeweils 2 Elemente haben.
   Liste T0
  -------------------------------------------------------------------}
$T0:=(1.list[3]).list[5.list[7];3.list[2];
                     5.list[5];0.list[5];
                     4.list[3];
                     0.list[2];
                     6.list[3]];
                     
$T1:=("test".list[3]).list["asdf".list[7];
                     "test1".list[5];
                     "test".list[2];
                     "5test1".list[5];
                     "test".list[5];
                     "ölgl2zguzz".list[5];
                     "asdf".list[3];
                     "ölgl1zguzz1".list[2];
                     "ölgl1zguzz".list[3]];

{ --------------------------------------------------------------------
  Die Variable Auswahl ist vom Typ Auflistung,
  mit den Werten Zahlen und Buchstaben.
  Dient nur zum Umschalten welche Liste sortiert werden soll
  --------------------------------------------------------------------}
$L:=If($Auswahl="Zahlen";$T0;$T1);



{ --------------------------------------------------------------------
     Hier der allgemeine Algorithmus zum Sortieren einer Liste
     mit Listen nach 2 Sortierkriterien
  --------------------------------------------------------------------}
$L1:=#[](nth[0]).map[$L].removeduplicates
        .sort[#less];

$L2:=#[]($W:=object;
         $L.DeleteIfNot[#equal;#[](nth[0]=$W)]
           .sort[#greater;#[](nth[1])])
        .map[$L1]
        .concatenate;



{ -------------------------------------------------------------------
  Anzeigen der sortierten Liste elementweise in einem Chart.
  -------------------------------------------------------------------}
$T:=$L2max.nth[$Liste].nth[$Element];
if($T.is["String"];$T.error;$T.makez[1])




Mit freundlichen Grüßen
und ein schönes Wochenende
Benutzer die diese Diskussion aktuell lesen
Guest

Powered by Yet Another Forum.net version 1.9.1.8 (NET v4.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.

Durch die Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zum Datenschutz finden Sie hier