Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

GoSPvC

*_skilled
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von GoSPvC

  1. Jetzt aber: Mit futurePlot.Reset(barsAgo) kann einem Wert, der nicht mehr gezeichnet werden soll, Invalid gesetzt werden: Plot0.Set(SMA(period)[0]); for (int i = 0; i <= period; i++) { futurePlot.Set(i, SMA(period)[0]); } futurePlot.Reset(period + 1); Dadurch muß in der override Plot() nichtmehr auf >0 oder !=null getestet werden, sondern nur noch auf Valid: if (!futurePlot.IsValidPlot(idx)) { continue; } That's it !! Danke nochmal an Eddy... Hier jetzt nochmal der komplette (funktionierende) Code: #region Using declarations using System; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Xml.Serialization; using System.Collections; using System.Collections.Generic; using NinjaTrader.Cbi; using NinjaTrader.Data; using NinjaTrader.Gui.Chart; using NinjaTrader.Indicator; using NinjaTrader.Strategy; #endregion Using declarations namespace NinjaTrader.Indicator { public class CB_PlotToFuture : Indicator { #region Parameters and Variables // Parameters: private int period = 10; // Variables: private DataSeries futurePlot = null; #endregion Parameters and Variables protected override void Initialize() { Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Transparent), 1), PlotStyle.Line, "Plot0")); Plots[0].Pen.DashStyle = DashStyle.Solid; futurePlot = new DataSeries(this, MaximumBarsLookBack.Infinite); AutoScale = true; ScaleJustification = ScaleJustification.Right; Overlay = true; BarsRequired = period; PriceTypeSupported = false; PlotsConfigurable = false; CalculateOnBarClose = false; } protected override void OnBarUpdate() { #region First Bars in Chart if (Bars == null) { return; } //if (Data.BarsType.GetInstance(Bars.Period.Id).IsIntraday) { return; } //if (Bars.Period.Id == PeriodType.Day || Bars.Period.Id == PeriodType.Week || Bars.Period.Id == PeriodType.Month || Bars.Period.Id == PeriodType.Year) { return; } if (CurrentBar <= period) { return; } #endregion First Bars in Chart Plot0.Set(SMA(period)[0]); for (int i = 0; i <= period; i++) { futurePlot.Set(i, SMA(period)[0]); } futurePlot.Reset(period + 1); } #region Properties [browsable(false)] [XmlIgnore()] public DataSeries Plot0 { get { return Values[0]; } } [browsable(false)] [XmlIgnore] public DataSeries FuturePlot { get { return futurePlot; } } [Description("")] [GridCategory("Parameters")] [DisplayName("Parameter Nr. 0")] public int Period { get { return period; } set { period = Math.Max(1, value); } } [browsable(false)] public new int Displacement { get { return base.Displacement; } set { base.Displacement = 0; } } #endregion #region Override Plot() public override void Plot(Graphics graphics, Rectangle bounds, double min, double max) { // For advanced FillPolygon/brush plotting, see Imp_Ichimoku.cs //if ("check for no futurePlot") //{ // base.Plot(graphics, bounds, min, max); // We call base Plot() method to paint defined Plots // return; // if check for no futurePlot == true to avoid unnecessary calculations //} List<Point> points = new List<Point>(); int lastX = -1; double lastValue = -1; Pen pen = new Pen(Color.FromKnownColor(KnownColor.Red)); for (int idx = FirstBarIndexPainted - period; idx <= LastBarIndexPainted; idx++) { if (idx < 0 || idx >= BarsArray[0].Count || (!ChartControl.ShowBarsRequired && idx < BarsRequired)) { continue; } if (!futurePlot.IsValidPlot(idx)) { continue; } double value = futurePlot.Get(idx); int x = ChartControl.GetXByBarIdx(BarsArray[0], idx + period); if (lastX >= 0) { int y0 = ChartControl.GetYByValue(this, lastValue); int y1 = ChartControl.GetYByValue(this, value); if (points.Count == 0) // We have a start painting { points.Clear(); points.Add(new Point(lastX, y0)); points.Add(new Point(x, y1)); } else { int pos = points.Count; points.Insert(pos, new Point(x, y1)); } } // Save as previous Point lastX = x; lastValue = value; } if (points.Count > 0 && pen != null) { SmoothingMode oldSmoothingMode = graphics.SmoothingMode; graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.DrawLines(pen, points.ToArray()); graphics.SmoothingMode = oldSmoothingMode; points.Clear(); } pen.Dispose(); // Paint defined Plots base.Plot(graphics, bounds, min, max); } #endregion Override Plot() } } #region NinjaScript generated code namespace NinjaTrader.Indicator { public partial class Indicator : IndicatorBase { private CB_PlotToFuture[] cacheCB_PlotToFuture = null; // <-- Anpassen private static CB_PlotToFuture checkCB_PlotToFuture = new CB_PlotToFuture(); // <-- Anpassen public CB_PlotToFuture CB_PlotToFuture(int period) // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { return CB_PlotToFuture(Input, period); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public CB_PlotToFuture CB_PlotToFuture(Data.IDataSeries input, int period) // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { if (cacheCB_PlotToFuture != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_PlotToFuture.Length; idx++) // <-- Anpassen if (cacheCB_PlotToFuture[idx].Period == period /*&&*/ && cacheCB_PlotToFuture[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_PlotToFuture[idx]; // <-- Anpassen lock (checkCB_PlotToFuture) // <-- Anpassen { checkCB_PlotToFuture.Period = period; // <-- Anpassen period = checkCB_PlotToFuture.Period; // <-- Anpassen // Alle Parameter; keine lokalen Variablen if (cacheCB_PlotToFuture != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_PlotToFuture.Length; idx++) // <-- Anpassen if (cacheCB_PlotToFuture[idx].Period == period /*&&*/ && cacheCB_PlotToFuture[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_PlotToFuture[idx]; // <-- Anpassen CB_PlotToFuture indicator = new CB_PlotToFuture(); // <-- Anpassen indicator.BarsRequired = BarsRequired; indicator.CalculateOnBarClose = CalculateOnBarClose; #if NT7 indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256; indicator.MaximumBarsLookBack = MaximumBarsLookBack; #endif indicator.Input = input; indicator.Period = period; // <-- Anpassen // Alle Parameter; keine lokalen Variablen Indicators.Add(indicator); indicator.SetUp(); CB_PlotToFuture[] tmp = new CB_PlotToFuture[cacheCB_PlotToFuture == null ? 1 : cacheCB_PlotToFuture.Length + 1]; // <-- Anpassen if (cacheCB_PlotToFuture != null) // <-- Anpassen cacheCB_PlotToFuture.CopyTo(tmp, 0); // <-- Anpassen tmp[tmp.Length - 1] = indicator; cacheCB_PlotToFuture = tmp; // <-- Anpassen return indicator; } } } } namespace NinjaTrader.MarketAnalyzer { public partial class Column : ColumnBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_PlotToFuture CB_PlotToFuture(int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_PlotToFuture(Input, period); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public Indicator.CB_PlotToFuture CB_PlotToFuture(Data.IDataSeries input, int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_PlotToFuture(input, period); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } namespace NinjaTrader.Strategy { public partial class Strategy : StrategyBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_PlotToFuture CB_PlotToFuture(int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_PlotToFuture(Input, period); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } public Indicator.CB_PlotToFuture CB_PlotToFuture(Data.IDataSeries input, int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { if (InInitialize && input == null) throw new ArgumentException("You only can access an indicator with the default input/bar series from within the 'Initialize()' method"); return _indicator.CB_PlotToFuture(input, period);// <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } #endregion NinjaScript generated code
  2. Das heißt, durch setzen einer convertierten null wird der Wert nicht Invalid, sondern nur einfach 0. Da muss ich mir also nochmal was anderes überlegen, Danke Eddy
  3. Ich hab's gefunden: Folgende Zeilen unten in der override Plot()-Methode entscheidet: bool futurePlotHasValue = futurePlot.IsValidPlot(idx) && futurePlot.Get(idx) > 0; if (!futurePlotHasValue) { continue; } Hier werden nur gesetzte und >0 Werte zum plotten freigegeben. Nicht zu zeichnende Werte werden aber jetzt mit Convert.ToDouble(null) beschrieben. Also sollte obige Zeile einfach mit: bool futurePlotHasValue = futurePlot.IsValidPlot(idx) && futurePlot.Get(idx) != Convert.ToDouble(null); if (!futurePlotHasValue) { continue; } ersetzt werden, dann geht's auch mit negativen Werten. Eine Frage an jemanden, der sich auskennt: Ist eine 0 mit Datentyp double GLEICH einer null, die ToDouble convertiert ist??
  4. Nach etwas herumtesten mit dem Code habe ich noch ein paar Bugs gefunden: futurePlot.Set(period - 1, Convert.ToDouble(null)); bringt nicht das von mir gewünschte Ergebnis. Eigentlich soll diese DataSeries nur in der ChartZukunft gezeichnet werden. Doch setzt man den Plot0 transparent, dann sieht man, dass der futurePlot "unter" dem Plot0 gezeichnet wird. Folgendes schafft hier Abhilfe: Plot0.Set(SMA(period)[0]); for (int i = 0; i <= period + 1; i++) { double value = i < period + 1 ? SMA(period)[0] : Convert.ToDouble(null); futurePlot.Set(i, value); } Als zweites habe ich die Beispieldaten des SMA() durch welche vom Momentum() ausgetauscht. Dabei ist mir aufgefallen, dass der futurePlot mit negativen Werten Probleme macht. Sobald ich (oder jemand anders??) eine Lösung hat, stell ich sie hier rein.
  5. Folgende Lösung habe ich wieder mangels Möglichkeiten von NT finden müssen. Und zwar war es bei TS Terminal möglich, einfach per negativem Displacement DrawLine() in die Zukunft zeichnen zu lassen. DrawLine[-5](...) zeichnete somit 5 Bars in die Zukunft des Charts NT erlaubt leider kein negatives "barsAgo", sondern es muß umständlich umgangen werden; aber es geht. Auf BigMikeTrading[Punkt]com habe ich einen Ichimoku gefunden, der die Cloud in der Zukunft zeichnet. Hieraus habe ich das simple Plotten einer Linie in die ChartZukunft extrahiert. Ich bitte um Kommentare/Verbesserungen usw., falls nötig. Hier der Beispielcode: // Originalfile Ichimoku.cs - Developed by Tarantino - Found at bigmiketrading.com #region Using declarations using System; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Xml.Serialization; using System.Collections; using System.Collections.Generic; using NinjaTrader.Cbi; using NinjaTrader.Data; using NinjaTrader.Gui.Chart; using NinjaTrader.Indicator; using NinjaTrader.Strategy; #endregion Using declarations namespace NinjaTrader.Indicator { public class CB_PlotToFuture : Indicator { #region Parameters and Variables // Parameters: private int period = 10; // Variables: private DataSeries futurePlot = null; #endregion Parameters and Variables protected override void Initialize() { Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Orange), 1), PlotStyle.Line, "Plot0")); Plots[0].Pen.DashStyle = DashStyle.Solid; futurePlot = new DataSeries(this, MaximumBarsLookBack.Infinite); AutoScale = true; ScaleJustification = ScaleJustification.Right; Overlay = true; BarsRequired = period; PriceTypeSupported = false; PlotsConfigurable = false; CalculateOnBarClose = false; } protected override void OnBarUpdate() { #region First Bars in Chart if (Bars == null) { return; } //if (Data.BarsType.GetInstance(Bars.Period.Id).IsIntraday) { return; } //if (Bars.Period.Id == PeriodType.Day || Bars.Period.Id == PeriodType.Week || Bars.Period.Id == PeriodType.Month || Bars.Period.Id == PeriodType.Year) { return; } if (CurrentBar <= period) { return; } #endregion First Bars in Chart Plot0.Set(SMA(period)[0]); for (int i = 0; i <= period; i++) { futurePlot.Set(i, SMA(period)[0]); } futurePlot.Set(period - 1, Convert.ToDouble(null)); } #region Properties [browsable(false)] [XmlIgnore()] public DataSeries Plot0 { get { return Values[0]; } } [browsable(false)] [XmlIgnore] public DataSeries FuturePlot { get { return futurePlot; } } [Description("")] [GridCategory("Parameters")] [DisplayName("Parameter Nr. 0")] public int Period { get { return period; } set { period = Math.Max(1, value); } } [browsable(false)] public new int Displacement { get { return base.Displacement; } set { base.Displacement = 0; } } #endregion #region Override Plot() public override void Plot(Graphics graphics, Rectangle bounds, double min, double max) { //if ("check for no futurePlot") //{ // base.Plot(graphics, bounds, min, max); // We call base Plot() method to paint defined Plots // return; // if check for no futurePlot == true to avoid unnecessary calculations //} List<Point> points = new List<Point>(); int lastX = -1; double lastValue = -1; Pen pen = new Pen(Color.FromKnownColor(KnownColor.Red)); for (int idx = FirstBarIndexPainted - period; idx <= LastBarIndexPainted; idx++) { if (idx < 0 || idx >= BarsArray[0].Count || (!ChartControl.ShowBarsRequired && idx < BarsRequired)) { continue; } bool futurePlotHasValue = futurePlot.IsValidPlot(idx) && futurePlot.Get(idx) > 0; if (!futurePlotHasValue) { continue; } double value = futurePlot.Get(idx); int x = ChartControl.GetXByBarIdx(BarsArray[0], idx + period); if (lastX >= 0) { int y0 = ChartControl.GetYByValue(this, lastValue); int y1 = ChartControl.GetYByValue(this, value); if (points.Count == 0) // We have a start painting { points.Clear(); points.Add(new Point(lastX, y0)); points.Add(new Point(x, y1)); } else { int pos = points.Count; points.Insert(pos, new Point(x, y1)); } } // Save as previous Point lastX = x; lastValue = value; } if (points.Count > 0 && pen != null) { SmoothingMode oldSmoothingMode = graphics.SmoothingMode; graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.DrawLines(pen, points.ToArray()); graphics.SmoothingMode = oldSmoothingMode; points.Clear(); } pen.Dispose(); // Paint defined Plots base.Plot(graphics, bounds, min, max); } #endregion Override Plot() } } #region NinjaScript generated code namespace NinjaTrader.Indicator { public partial class Indicator : IndicatorBase { private CB_PlotToFuture[] cacheCB_PlotToFuture = null; // <-- Anpassen private static CB_PlotToFuture checkCB_PlotToFuture = new CB_PlotToFuture(); // <-- Anpassen public CB_PlotToFuture CB_PlotToFuture(int period) // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { return CB_PlotToFuture(Input, period); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public CB_PlotToFuture CB_PlotToFuture(Data.IDataSeries input, int period) // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { if (cacheCB_PlotToFuture != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_PlotToFuture.Length; idx++) // <-- Anpassen if (cacheCB_PlotToFuture[idx].Period == period /*&&*/ && cacheCB_PlotToFuture[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_PlotToFuture[idx]; // <-- Anpassen lock (checkCB_PlotToFuture) // <-- Anpassen { checkCB_PlotToFuture.Period = period; // <-- Anpassen period = checkCB_PlotToFuture.Period; // <-- Anpassen // Alle Parameter; keine lokalen Variablen if (cacheCB_PlotToFuture != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_PlotToFuture.Length; idx++) // <-- Anpassen if (cacheCB_PlotToFuture[idx].Period == period /*&&*/ && cacheCB_PlotToFuture[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_PlotToFuture[idx]; // <-- Anpassen CB_PlotToFuture indicator = new CB_PlotToFuture(); // <-- Anpassen indicator.BarsRequired = BarsRequired; indicator.CalculateOnBarClose = CalculateOnBarClose; #if NT7 indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256; indicator.MaximumBarsLookBack = MaximumBarsLookBack; #endif indicator.Input = input; indicator.Period = period; // <-- Anpassen // Alle Parameter; keine lokalen Variablen Indicators.Add(indicator); indicator.SetUp(); CB_PlotToFuture[] tmp = new CB_PlotToFuture[cacheCB_PlotToFuture == null ? 1 : cacheCB_PlotToFuture.Length + 1]; // <-- Anpassen if (cacheCB_PlotToFuture != null) // <-- Anpassen cacheCB_PlotToFuture.CopyTo(tmp, 0); // <-- Anpassen tmp[tmp.Length - 1] = indicator; cacheCB_PlotToFuture = tmp; // <-- Anpassen return indicator; } } } } namespace NinjaTrader.MarketAnalyzer { public partial class Column : ColumnBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_PlotToFuture CB_PlotToFuture(int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_PlotToFuture(Input, period); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public Indicator.CB_PlotToFuture CB_PlotToFuture(Data.IDataSeries input, int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_PlotToFuture(input, period); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } namespace NinjaTrader.Strategy { public partial class Strategy : StrategyBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_PlotToFuture CB_PlotToFuture(int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_PlotToFuture(Input, period); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } public Indicator.CB_PlotToFuture CB_PlotToFuture(Data.IDataSeries input, int period) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { if (InInitialize && input == null) throw new ArgumentException("You only can access an indicator with the default input/bar series from within the 'Initialize()' method"); return _indicator.CB_PlotToFuture(input, period);// <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } #endregion NinjaScript generated code
  6. Vor einiger Zeit bin ich von TradeSignalOnline Terminal auf NinjaTrader umgestiegen und da ich das Programmieren von Handelssystemen (bzw. Programmieren allgemein) nicht gelernt habe, sondern auf diesem Gebiet autodidaktisch unterwegs bin, werde ich von C# jetzt natürlich fast erschlagen im Vergleich zu Equilla. Daher bitte ich um Nachsicht, sollte ich Pippifax-Lösungen, die ich irgendwie gefunden habe, hier als großen Durchbruch präsentieren . C# Newbies (so wie ich) können sich hier Ideen holen und ich bitte die Checker darum: Sollte es bessere/kürzere/elegantere Wege geben, verbessert mich ruhig!!! Ich vermisse natürlich einige Möglichkeiten bzw. Tools, die bei TST selbstverständlich waren. Das Anzeigen von Plots in Strategien ist so ein Fall und damit fange ich gleich mal an: In NT kann eine Strategie keine Plots zeichnen; DrawDot() oder Ähnliches schafft hier mMn. nur unzureichend Abhilfe. Im NT-SupportForum wird dafür Abhilfe angeboten: Per Indikator StrategyPlot. Hier der Code: #region Using declarations using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.ComponentModel; using System.Xml.Serialization; using NinjaTrader.Cbi; using NinjaTrader.Data; using NinjaTrader.Gui.Chart; #endregion namespace NinjaTrader.Indicator { public class StrategyPlot : Indicator { #region Variables // Parameters: private int id = 0; // Default setting for Id #endregion protected override void Initialize() { // New Plot (Default): Add(new Plot(Color.Orange, PlotStyle.Line, Convert.ToString(id))); CalculateOnBarClose = false; Overlay = false; PriceTypeSupported = false; } protected override void OnBarUpdate() { // Do Nothing } #region Properties [browsable(false)] [XmlIgnore()] public DataSeries Plot { get { return Values[0]; } } [Description("")] [Category("Parameters")] public int Id { get { return id; } set { id = Math.Max(0, value); } } #endregion } } #region NinjaScript generated code namespace NinjaTrader.Indicator { public partial class Indicator : IndicatorBase { private StrategyPlot[] cacheStrategyPlot = null; private static StrategyPlot checkStrategyPlot = new StrategyPlot(); public StrategyPlot StrategyPlot(int id) { return StrategyPlot(Input, id); } public StrategyPlot StrategyPlot(Data.IDataSeries input, int id) { if (cacheStrategyPlot != null) for (int idx = 0; idx < cacheStrategyPlot.Length; idx++) if (cacheStrategyPlot[idx].Id == id && cacheStrategyPlot[idx].EqualsInput(input)) return cacheStrategyPlot[idx]; lock (checkStrategyPlot) { checkStrategyPlot.Id = id; id = checkStrategyPlot.Id; if (cacheStrategyPlot != null) for (int idx = 0; idx < cacheStrategyPlot.Length; idx++) if (cacheStrategyPlot[idx].Id == id && cacheStrategyPlot[idx].EqualsInput(input)) return cacheStrategyPlot[idx]; StrategyPlot indicator = new StrategyPlot(); indicator.BarsRequired = BarsRequired; indicator.CalculateOnBarClose = CalculateOnBarClose; #if NT7 indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256; indicator.MaximumBarsLookBack = MaximumBarsLookBack; #endif indicator.Input = input; indicator.Id = id; Indicators.Add(indicator); indicator.SetUp(); StrategyPlot[] tmp = new StrategyPlot[cacheStrategyPlot == null ? 1 : cacheStrategyPlot.Length + 1]; if (cacheStrategyPlot != null) cacheStrategyPlot.CopyTo(tmp, 0); tmp[tmp.Length - 1] = indicator; cacheStrategyPlot = tmp; return indicator; } } } } namespace NinjaTrader.MarketAnalyzer { public partial class Column : ColumnBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.StrategyPlot StrategyPlot(int id) { return _indicator.StrategyPlot(Input, id); } public Indicator.StrategyPlot StrategyPlot(Data.IDataSeries input, int id) { return _indicator.StrategyPlot(input, id); } } } namespace NinjaTrader.Strategy { public partial class Strategy : StrategyBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.StrategyPlot StrategyPlot(int id) { return _indicator.StrategyPlot(Input, id); } public Indicator.StrategyPlot StrategyPlot(Data.IDataSeries input, int id) { if (InInitialize && input == null) throw new ArgumentException("You only can access an indicator with the default input/bar series from within the 'Initialize()' method"); return _indicator.StrategyPlot(input, id); } } } #endregion Ist dieser Indikator vorhanden, kann man durch ihn aus einer Strategie heraus plotten: #region Using declarations using System; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Xml.Serialization; using NinjaTrader.Cbi; using NinjaTrader.Data; using NinjaTrader.Indicator; using NinjaTrader.Strategy; #endregion namespace NinjaTrader.Strategy { public class SampleStrategyPlot : Strategy { #region Variables #endregion protected override void Initialize() { CalculateOnBarClose = false; // Create a multi-time frame strategy Add(PeriodType.Minute, 3); /* Add our blank placeholder indicators. The parameter we pass in is used to distinguish the two indicators from each other. */ Add(StrategyPlot(0)); Add(StrategyPlot(1)); // Set the color for the indicator plots StrategyPlot(0).Plots[0].Pen.Color = Color.Blue; StrategyPlot(1).Plots[0].Pen.Color = Color.YellowGreen; // Set the panel which the plots will be placed on. 1 = price panel, 2 = panel under the price panel, etc. StrategyPlot(0).PanelUI = 1; StrategyPlot(1).PanelUI = 1; } protected override void OnBarUpdate() { /* Set the values of our indicators. One of them is set to the High of the primary bar series while the other is set to the High of the secondary bar series. This effectively creates a multi-time frame plot. */ StrategyPlot(0).Value.Set(High[0]); StrategyPlot(1).Value.Set(Highs[1][0]); } #region Properties #endregion } }
  7. Super Erklärung !! Jetzt hab ich den Sinn dieses Ninja generated code einiger maßen kapiert. Ich werde dein Posting aber morgen nochmal in Begleitung meines C#-Buches durchgehen, um die restlichen Klarheiten zu beseitigen :-D Das mit der GridCategory ist nicht ganz korrekt; Ninja erkennt Parameter einfach daran, daß sie public [type] [name] { get..; set...; } sind. Wenn man nämlich das GridCategory wegläßt/auskommentiert, dann kann man den Indikator weiterhin über z.b. _FiboRT(0, 100, False) von ausserhalb berechnen, aber bei den IndikatorEigenschaften (also, wenn man ihn einfach auf einen Chart lädt) werden diese Parameter nicht mehr angezeigt. Nützlich war das z.B. bei eben diesem selbstgebauten _FiboRT-Indikator, der einerseits auf einen Chart angewendet automatisch die Fibos des Vortages anzeigen soll, andererseits aber über z.B. eine Strategie aufgerufen eine über die Parameter definierbare Spanne berechnen kann.
  8. OK, verstehe... Das bedeutet also, daß diese Parameter im NT-generierten Bereich drin sein sollten/müssen, um den Zugriff von ausserhalb zu ermöglichen?? Wenn man mit VS codet und NinjaEditor nur zum compilen benutzt, sollte man also deswegen ein Auge drauf haben, ob da (im NT-generierten Code) auch alles richtig drinsteht. Weil, wie gesagt, wenn ich einem Indikator weitere Parameter dazucode, werden die dem NT-gen. Bereich nicht hinzugefügt. Danke, WOGO !! Jetzt weiß ich nen ganzen Schwung mehr, als heute Morgen :-D
  9. Hi, Ich hab das gerade mal versucht. Vorab noch kurz: Ich kenne mich mit NinjaTrader noch nicht wirklich gut aus. Und auch NinjaScript/C# lerne ich erst seit ein paar Monaten. Sprich, ich bin blutiger Ninja-Anfänger und hoffe auf Nachsicht, sollte ich jetzt hier totalen Blödsinn schreiben. Du hast recht, wenn man mit dem NinjaEditor (NE) compiliert und vorher den NinjaScript generated code löscht, dann erstellt der NE diesen neu mit geändertem, passendem Klassennamen. Selbst hinzugefügte Parameter/Inputs werden aber bei diesem Vorgehen nicht vom NE zum "NS generated code" hinzugefügt. Ehrlich gesagt bin ich mir auch garnicht sicher, was es bedeutet, wenn die da mit drin sind oder nicht !?! (evtl. kann das kurz jemand hier schildern...) Meine Beobachtung war: Ich hab einen Indikator ohne Input Parameter, einem mit einem Input Parameter und einen mit vier Input Parametern von NinjaTrader generieren lassen, und mir dann die Unterschiede im "NS generated code" angeschaut. So sieht man, daß dieser Codeabschnitt fast gleich ist, eben bis auf die Klassennamen und die Parameter (eben alles, was ich oben dort reinkommentiert habe). Wenn man jetzt einen Input Parameter einfach per Code hinzufügt, dann ändert aber der NE diesen Abschnitt im "NS generated code" NICHT; daher mein manuelles Vorgehen. Was es bringt, oder welche Fehlverhalten dieser Codeabschnitt jetzt genau macht, kann ich nicht sagen; dafür bin ich zu grün. Aber, wenn's der NinjaEditor beim generieren so macht, will ich auch die weiteren hinzugefügten Input Parametern dort im Abschnitt stehen haben. Falls mich jemand verstanden hat, soll er "Hier, Ich" schreiben :-D ... aber ich konnte mich nicht verständlicher ausdrücken.
  10. Hi, und cool, daß ihr hier ne deutschsprachige NinjaScript-Ecke aufgemacht habt. Ich nutze auch VS2010, um die Scripte "komfortabel" zu editieren. Ein paar Dinge noch: 1. Ich hab mir ein "NTCompileScript" erstellt, das im NinjaEditor immer in nem kleinen Fenster oben im Eck offen ist, um zu compilieren (damit ich nicht aus versehen ein im VS geöffnetes Script compiliere). Sieht so aus: #region Using declarations using System; #endregion namespace NinjaTrader.Indicator { public class CB_NTCompileScript : Indicator { protected override void Initialize() { // Do nothing } protected override void OnBarUpdate() { // Do nothing } } } #region NinjaScript generated code namespace NinjaTrader.Indicator { public partial class Indicator : IndicatorBase { private CB_NTCompileScript[] cacheCB_NTCompileScript = null; // <-- Anpassen private static CB_NTCompileScript checkCB_NTCompileScript = new CB_NTCompileScript(); // <-- Anpassen public CB_NTCompileScript CB_NTCompileScript() // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { return CB_NTCompileScript(Input); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public CB_NTCompileScript CB_NTCompileScript(Data.IDataSeries input) // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { if (cacheCB_NTCompileScript != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_NTCompileScript.Length; idx++) // <-- Anpassen if (cacheCB_NTCompileScript[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_NTCompileScript[idx]; // <-- Anpassen lock (checkCB_NTCompileScript) // <-- Anpassen { if (cacheCB_NTCompileScript != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_NTCompileScript.Length; idx++) // <-- Anpassen if (cacheCB_NTCompileScript[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_NTCompileScript[idx]; // <-- Anpassen CB_NTCompileScript indicator = new CB_NTCompileScript(); // <-- Anpassen indicator.BarsRequired = BarsRequired; indicator.CalculateOnBarClose = CalculateOnBarClose; #if NT7 indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256; indicator.MaximumBarsLookBack = MaximumBarsLookBack; #endif indicator.Input = input; Indicators.Add(indicator); indicator.SetUp(); CB_NTCompileScript[] tmp = new CB_NTCompileScript[cacheCB_NTCompileScript == null ? 1 : cacheCB_NTCompileScript.Length + 1]; // <-- Anpassen if (cacheCB_NTCompileScript != null) // <-- Anpassen cacheCB_NTCompileScript.CopyTo(tmp, 0); // <-- Anpassen tmp[tmp.Length - 1] = indicator; cacheCB_NTCompileScript = tmp; // <-- Anpassen return indicator; } } } } namespace NinjaTrader.MarketAnalyzer { public partial class Column : ColumnBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_NTCompileScript CB_NTCompileScript() // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_NTCompileScript(Input); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public Indicator.CB_NTCompileScript CB_NTCompileScript(Data.IDataSeries input) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_NTCompileScript(input); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } namespace NinjaTrader.Strategy { public partial class Strategy : StrategyBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_NTCompileScript CB_NTCompileScript() // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_NTCompileScript(Input); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } public Indicator.CB_NTCompileScript CB_NTCompileScript(Data.IDataSeries input) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { if (InInitialize && input == null) throw new ArgumentException("You only can access an indicator with the default input/bar series from within the 'Initialize()' method"); return _indicator.CB_NTCompileScript(input);// <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } #endregion Hier sieht man auch gleich den zweiten Punkt, den ich anmerken will: VS kümmert sich nicht um den Code, den der NinjaEditor einfügt, und der "unter KEINEN Umständen" :-D geändert werden darf. Benutzt man VS, muß man den Code nämlich definitiv ändern, und zwar, wenn man entweder den Namen der Klasse ändert, oder weitere Parameter hinzufügt. Hier noch einmal der Code, den man nicht ändern darf, aber evtl. ändern muß :-D (alles im Code reinkommentiert): #region NinjaScript generated code namespace NinjaTrader.Indicator { public partial class Indicator : IndicatorBase { private CB_DefaultTemplate[] cacheCB_DefaultTemplate = null; // <-- Anpassen private static CB_DefaultTemplate checkCB_DefaultTemplate = new CB_DefaultTemplate(); // <-- Anpassen public CB_DefaultTemplate CB_DefaultTemplate(int parameter0) // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { return CB_DefaultTemplate(Input, parameter0); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public CB_DefaultTemplate CB_DefaultTemplate(Data.IDataSeries input, int parameter0) // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen { if (cacheCB_DefaultTemplate != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_DefaultTemplate.Length; idx++) // <-- Anpassen if (cacheCB_DefaultTemplate[idx].Parameter0 == parameter0 /*&&*/ && cacheCB_DefaultTemplate[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_DefaultTemplate[idx]; // <-- Anpassen lock (checkCB_DefaultTemplate) // <-- Anpassen { checkCB_DefaultTemplate.Parameter0 = parameter0; // <-- Anpassen parameter0 = checkCB_DefaultTemplate.Parameter0; // <-- Anpassen // Alle Parameter; keine lokalen Variablen if (cacheCB_DefaultTemplate != null) // <-- Anpassen for (int idx = 0; idx < cacheCB_DefaultTemplate.Length; idx++) // <-- Anpassen if (cacheCB_DefaultTemplate[idx].Parameter0 == parameter0 /*&&*/ && cacheCB_DefaultTemplate[idx].EqualsInput(input)) // <-- Anpassen - alle Parameter; &&-getrennt; keine lokalen Variablen return cacheCB_DefaultTemplate[idx]; // <-- Anpassen CB_DefaultTemplate indicator = new CB_DefaultTemplate(); // <-- Anpassen indicator.BarsRequired = BarsRequired; indicator.CalculateOnBarClose = CalculateOnBarClose; #if NT7 indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256; indicator.MaximumBarsLookBack = MaximumBarsLookBack; #endif indicator.Input = input; indicator.Parameter0 = parameter0; // <-- Anpassen // Alle Parameter; keine lokalen Variablen Indicators.Add(indicator); indicator.SetUp(); CB_DefaultTemplate[] tmp = new CB_DefaultTemplate[cacheCB_DefaultTemplate == null ? 1 : cacheCB_DefaultTemplate.Length + 1]; // <-- Anpassen if (cacheCB_DefaultTemplate != null) // <-- Anpassen cacheCB_DefaultTemplate.CopyTo(tmp, 0); // <-- Anpassen tmp[tmp.Length - 1] = indicator; cacheCB_DefaultTemplate = tmp; // <-- Anpassen return indicator; } } } } namespace NinjaTrader.MarketAnalyzer { public partial class Column : ColumnBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_DefaultTemplate CB_DefaultTemplate(int parameter0) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_DefaultTemplate(Input, parameter0); // <-- Anpassen - alle Parameter; kommagetrennt; keine lokalen Variablen } public Indicator.CB_DefaultTemplate CB_DefaultTemplate(Data.IDataSeries input, int parameter0) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_DefaultTemplate(input, parameter0); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } namespace NinjaTrader.Strategy { public partial class Strategy : StrategyBase { [Gui.Design.WizardCondition("Indicator")] public Indicator.CB_DefaultTemplate CB_DefaultTemplate(int parameter0) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { return _indicator.CB_DefaultTemplate(Input, parameter0); // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } public Indicator.CB_DefaultTemplate CB_DefaultTemplate(Data.IDataSeries input, int parameter0) // <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen { if (InInitialize && input == null) throw new ArgumentException("You only can access an indicator with the default input/bar series from within the 'Initialize()' method"); return _indicator.CB_DefaultTemplate(input, parameter0);// <-- Anpassen - alle Parameter; kopmmagetrennt; keine lokalen Variablen } } } #endregion So klappt's bei mir (bisher) einwandfrei...
  11. GoSPvC antwortete auf Rumpel's Thema in Archiv
    Ich beobachte das ganze Projekt "Kursalarm" bzw. früher einfach nur "die TradeMatrix" (gemeint ist die Systematik, nicht der User) schon seit der Entstehung und muß deswegen hier einmal Stellung beziehen. Zur Geschichte "Ich und die Projektionen": Ich bin seit 2005 Mitleser des Threads auf TSo, als das ganze noch in den Kinderschuhen steckte. TM hat damals täglich in wirklich vielen und zeitnahen Posts die Projektionen der Level kombiniert getradet. Leider haben das die meisten Leser (inkl. mir) nicht wirklich verstanden und es kamen immer wieder Diskussionen auf bzw. TM wurde immer wieder hinterfragt. Dadurch fanden dann die ersten Skype-Konferenzen statt, wodurch das ganze den Mitlesern nähergebracht werden sollte. Zwei Dinge muß ich anmerken: Erstens war das damals lediglich der Versuch, durch Sprache die Trades annähernd realtime vorzubringen und mit mehr Information zu versehen, und zweitens: Ich war damals nichtmal annähernd ein Trader; ich konnte damals quasi nichts. Die Skypes waren damals kostenlos, täglich und arteten auf bis zu 14 Stunden aus. Und das über (ich glaube) Monate hinweg. Und schon damals war TM mehr daran gelegen, daß wir das Traden lernen und nicht nur die Signale nachtraden. Es ist ganz natürlich, daß so ein Aufwand irgendwann nichtmehr umsonst angeboten werden kann. Ab Ende 2007 wechselten wir also von Skype auf TeamSpeak und von kostenlos auf bezahlen. Ich glaube etwas mehr als 100,- € pro Monat. Inhalt der Casts war aber keineswegs nur das vorlesen der Projektionen, sondern einerseits eine andauernde Einschätzung des Marktes und andererseits wie man diese Einschätzung am besten umzusetzen hat. Dazu gehören die Essentials wie: Was muß passieren um eine P. wirklich auch zu handeln, ist das CRV günstig oder nicht, warum und wo den SL, wann Teilgewinne, wiso ein vorzeitiger Exit oder eben wiso die Position weiterlaufen lassen. Jeder Trade wurde haarklein erklärt. In dieser Zeit habe ich erst verstanden, was Traden wirklich ist. Leider wurde dieses Angebot von den meisten Usern nicht angenommen, da der Mehrwert nicht erkannt wurde. Viele wollten einfach nur "Wann und Wo rein - wo wieder raus". Und genau das wollte TM eben gerade nicht. Er wollte uns selbständiges Traden beibringen. Am Ende hat sich das ganze dann nichtmehr rentiert, da zu wenig User da waren. ... Und so sind die beiden jetzt bei der aktuellen Version gelandet. Jetzt bekommen wir "nur noch" die Projektionen in Textform. Diese sind nicht als alleinstehndes System zu sehen sondern dienen als Ergänzung zum eigenen Handelsansatz. Das heist: Man kann einen Ansatz, der auf Kursmarken oder Indikatorenwerte usw. (alles was auf der y-Achse zu finden ist) mit einer Zeitkomponente ergänzen. Da ich seit jahren damit arbeite, kann ich das mit gutem Gewissen sagen: Die Pfeile und Häkchen sind nicht "nur so" oder nachträglich eingemalt, sondern sind diejenigen synchronen Projektionen, die tagsüber realtime angezeigt werden. Ich möchte ausdrücklich noch darauf hinweisen, daß ich mit kursalarm.de weder verwandt, noch verschwägert bin Ich bin nur schon seit wirklich langer Zeit dabei und glaube, daß ich eine objektive Meinung davon habe. Und, meine Motivation, das alles hier zu schreiben ist nicht die Werbung dafür; ich will aber sagen: Die Projektionen haben ihre Berechtigung und funktionieren (sie sind aber natürlich nicht 100%ig).
  12. GoSPvC antwortete auf Henrik's Thema in Chit Chat
    Wollte nur mal sehen, ob SoundCloud auch geht: http://soundcloud.com/torstenkanzler/b-day-set-at-tresor-17-09-2010 Jetzt ist aber wieder Schluß mit Elektro!!
  13. GoSPvC antwortete auf Henrik's Thema in Chit Chat
    Die Richtung gefällt mir schon, aber wenn das schon alles ist: Weit weniger als ich Ich bin noch weiter im Randbereich der Elektronischen Musik vertreten... und habe fast keine Hoffnung, daß euch das gefallen könnte http://www.youtube.com/watch?v=d4MkbqCkleY
  14. GoSPvC antwortete auf ronner's Thema in Notruf
    Ja, der scant auf einer tiefen Ebene; jedes Paket. Das ist quasi der TickChart deines Netzwerkverkehrs... EDIT: Es gibt natürlich noch tausende andere Scanner: heise.de aber die kenne ich alle nicht
  15. GoSPvC antwortete auf ronner's Thema in Notruf
    Es gibt unter Windows soviele sog. Dienste und Update-Checker und sonstwas; da sollte der Zähler eigentlich nie stehenbleiben. Mit wireShark kannst du dir den Netzwerkverkehr deiner Netzwerkkarte anzeigen lassen. Ist sehr interessant.
  16. GoSPvC antwortete auf Vola's Thema in Notruf
    Wenn du ein PDF erstellen willst, das auch ein bissl was hermacht, dann mußt du die gesammelten Texte doch eh nochmal umschreiben und in deinen eigenen Worten neu wiedergeben, um den gewissen roten Faden zu bekommen, auf den speziell Du hinweisen willst. Und damit stammt der Text ja dann direkt von dir. Ausser, du schreibst über eine Methode oder über speziellen Inhalt, von dem die Trader wissen, wer's erfunden hat. Dann solltest du mMn. die Quelle nennen. Nichts ist schlimmer als wenn man sich mit fremden Federn schmückt und es kommt raus. Das selbe kannst du mit den Charts machen: Erstelle die doch einfach neu, mit deiner eigenen Software und in einheitlichem Stil und Größe. Dann bist du schonmal den alten Ersteller los. Wie's allerdings mit den Chart-Software-Rights ausschaut, weiß ich nicht. Aber immerhin ist jeder Chart, in dem du auch nur eine Trendlinie selbst eingezeichnet hast, doch schon dein "Werk".
  17. @Rumpel und ronner: Ihr habt beide recht; wir sprechen hier ja NICHT darüber, daß jede Software Werbe-finanziert ist oder keine. Je nach Zielgruppe ist es sogar sinvoll, daß es die verschiedenen Angebote gibt. Manche Trader (so wie ich z.B.) würden niemals was Werbefinanziertes nutzen wollen; andere haben die Motivation und gewinnen 10.000,- €/Monat wollen trotzdem nichts für Software und Feed ausgeben. Was ich sagen will: So unterschiedlich (gerade) Traderpsychen sind, so unterschiedlich müssen auch die Angebote sein.
  18. Am besten finde ich die TV-Sendungen in denen die neusten/lustigsten Werbungen vorgestellt werden und trotzdem alle 10 Minuten durch Werbung unterbrochen wird; Geheiligt sei die T-Home-Box, da kannst vorspulen
  19. GoSPvC antwortete auf Vola's Thema in Miscellaneous
    Bei Interesse an EasyLanguage: Wenn du bei TSo einen kostenfreien Account hast, kannst du dort (zumindest mit verzögerten Nicht-IntraDay-Daten) kostenlos mit dem OnlineTool Equilla coden. Equilla ist (geschätzt) 95% EasyLanguage.
  20. Habe "Vielleicht" geantwortet; mit dem Hang zu "Nein", da mich das Angebot für sich genommen natürlich nicht stören würde, ich aber für mich selbst würde lieber zahlen, als auch nur ein Pixel Werbung auf dem Schirm zu haben.
  21. GoSPvC antwortete auf Vola's Thema in MQL Experts
    Ich bin nicht wirklich fit mit MT daher die Frage: Im Code werden im deinit() ein paar Objekte deleted: int deinit() { ObjectsDeleteAll(0,OBJ_RECTANGLE); ObjectsDeleteAll(0,OBJ_TRENDBYANGLE); ObjectsDeleteAll(0,OBJ_TEXT); ObjDel(); Comment(""); return(0); } Aber wird deinit() beim Umschalten zwischen Charts überhaupt durchlaufen ??
  22. Hab mich noch nicht mit ePost usw. beschäftigt, aber rein vom Aufwand her: Sollte die ePost-Technik die gleiche Sicherheit bieten können, wie ein Brief per Postkasten, würde ich den Dienst bei Bedarf schon nutzen, da ich mir ja dann den Weg zur Post sparen kann bei an sonsten gleicher Leistung und gleichen Kosten. "Normale" E-Mails damit zu verschicken ist natürlich Schwachsinn. @conglom-o: Faxe landen wohl heutzutage auch zum allergrößten Teil nicht mehr in Papierform beim Empfänger...
  23. GoSPvC antwortete auf FinGeR's Thema in Psychologie
    Ich wollt's grad schreiben: Ein Bissl html und php + mysql und schon hast du ein Tagebuch nach eigenem Geschmack und mit eigener Fuktionalität genau nach den eigenen Wünschen; und ein Layout ähnlich wie eine Excel-Tabelle sollte wirklich nicht sehr aufwendig sein.
  24. Ich lese den Begriff "Price Action" in letzter Zeit öfter und denke mir jedesmal, was das genau sein soll. Google spukt alles mögliche dazu aus; aber kannst du in ein paar Sätzen deine Def. dazu posten...
  25. Die Hotkey-Steuerung machst du nicht direkt über den EA, sondern als eigenes Script. Dieses Script startest du über einen im Terminal festzulegenden HotKey. Das Script führt deine Order aus und beendet sich naturgemäß sofort wieder. Den Rest (das Verwalten der neuen Order) übernimmt dann der EA.

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.