EOD System

      RE: EOD System

      Alles schön und gut. Aber das Wetter ist bei euch auch nicht besser als in D ;)
      If you don't bet, you can't win.
      If you lose all your chips, you can't bet.


      - Larry Hite -

      --------------------

      The Trend is your only Friend :D

      - einer, der Bescheid weiß -

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RS8“ ()

      RE: EOD System

      Ja, ich lebe in der deutschsprachigen Gemeinschaft Belgiens. Sind ein ganz nettes Völkchen die Belgier. Trotz hohem Ausländeranteil (überwiegend Deutsche) gibt es so gut wie keine Ausländerfeindlichkeit.

      Spekulationsgewinne sind für Privatanleger steuerfrei. :)

      RE: EOD System

      Hallo Stadinski,
      ja ich stell den thread auch ein, ist ja keine daran wirklich interessiert.

      Mal ne ganz andere Frage, wie siehts eigentlich steuertechnisch bei Dir aus.

      Ich meine damit, mein Problem ist schon lange nicht mehr die Performance oder ob ich vom Trading auch leben kann, sondern meine Abgaben.

      Diese Jahr will ich auch endlich mal 'Nägel mit Köpfen machen'. D.h. Spätestes bis zum Jahresende muß ich hier aus Deutschland raus. Dachte an die Slowakei, hast Du da irgendwelche Erfahrungen, oder kennst Du Trader die in Niedrigsteuerländer ausgeflaggt haben, oder dabei sind dieses zu tun.

      Always good trades for you.

      mcbinn

      RE: EOD System

      Hi mcbinn,

      danke für den Code, aber laß man gut sein, ich bin einer der das nicht versteht. Ich gebe es wirklich zu, ich könnte es mir nun ausdrucken und studieren, aber das würde viel zu viel Zeit kosten. Glückwunsch zu dem code, was immer da auch hintersteckt. Ich bin davon überzeugt es geht auch einfacher :D aber das ist nur meine Meinung.

      ich wünsche dir viel Glück mit dem code und hoffe es gibt auch Real gute Ergebnisse. Die Erfahrung mußte ich leider auch schon machen, optiermiert sieht alles prächtig aus, doch nach einem Monat real Trades, kannst du es oft vergessen. Ich hatte schon ein programm, das richtig gute Ergebnisse erzielte, doch dann ist es über ein Jahr gegen mich gelaufen. Danach habe ich es begraben...nein ich schaue es mir heute nicht mehr an, es ist definitiv im Mülleimer gelandet, oder im Datenmüll auf meiner Festplatte..*lach

      viel Glück

      lg Stadinski

      RE: EOD System

      Da ich mit den Bid Kursen von CMC-Markets backteste, ergibt sich natürlich das Problem mit den Ask Kursen d.h dem Spread. Nicht alle Käufe konnten ausgeführt werden, da der Ask Kurs ja stets um den Spread höher als der Bid Kurs ist. Man kann das aber ziemlich realitätsnah simulieren, das könnte in etwa so gehen.

      Hier die Routine, die die Spreadkurse 'global' dem Programm zu Verfügung stellt.

      ////////////////////////////////////////////////////////////////////////////////
      function GetSpread( Symbol: String): float;
      begin
      var Spread: float;

      // Spread for Symbol
      Spread := 1;
      if Symbol = 'DUTCH25' then Spread := 0.5
      else if Symbol = 'EUROSTOX' then Spread := 3
      else if Symbol = 'FRENCH40' then Spread := 4
      else if Symbol = 'GERMAN30' then Spread := 2
      else if Symbol = 'ITALIAN30' then Spread := 50
      else if Symbol = 'SPANISH35' then Spread := 6
      else if Symbol = 'SPX500' then Spread := 0.5
      else if Symbol = 'SWISS30' then Spread := 6
      else if Symbol = 'UK100' then Spread := 2
      else if Symbol = 'NDAQ100' then Spread := 3
      else if Symbol = 'AUSSIE200' then Spread := 2
      else if Symbol = 'USRUSS2000' then Spread := 0.3
      else if Symbol = 'US30' then Spread := 4
      else if Symbol = 'HONGKONG33' then Spread := 7
      else if Symbol = 'JAPAN225' then Spread := 7
      else if Symbol = 'MDAX' then Spread := 12;
      Result := Spread;
      end;
      ////////////////////////////////////////////////////////////////////////////////

      Man muß das nicht 'fest verdratet' machen, geht auch über eine Datenquelle, mach aber das Backtesting langsamer.


      Hier das modifizierte Script mit Spread.

      ////////////////////////////////////////////////////////////////////////////////
      .....

      {$I 'abi_TR'}
      {$I 'abi_CFD_Helpers'}
      var Bar, p: integer;
      var canTrade: boolean;
      var SellLimit1, SellLimit2, SellLimit3: float;
      var BuyLimit1, BuyLimit2, Spread: float;
      var Symbol_1, s_1: string;
      var MCTOpen: integer;
      var canLong, canShort, stayAside: boolean;
      var abi_TRPane, abi_TR1: integer;

      abi_TR1 := abi_TRSeries(10);

      WatchListSelect('CMC_W');
      Symbol_1 := GetSymbol + '_M_T';

      try
      AllowSymbolSearch('CMCMCT');
      MCTOpen := GetExternalSeries(Symbol_1, #Open);
      except
      ShowMessage('There are problems, with the external series!');
      exit;
      end;

      // Crossrates and Spread for Symbol
      SetGlobalCrossrates(GetSymbol);
      Spread := GetSpread(GetSymbol);

      ////////////////////////////////////////////////////////////////////////////////
      for Bar := 10 to BarCount - 2 do
      begin

      // Check Trend
      try
      if @MCTOpen[Bar] = 0 then
      begin
      canLong:= false;
      canShort:= false;
      stayAside := true;
      end
      else if @MCTOpen[Bar] = 1 then
      begin
      canLong:= true;
      canShort:= false;
      stayAside := false;
      end
      else if @MCTOpen[Bar] = 2 then
      begin
      canLong:= false;
      canShort:= true;
      stayAside := false;
      end;
      except
      ShowMessage('Cannot process the trend check!');
      exit;
      end;

      if canLong then SetBackgroundColor(Bar, #GreenBkg);
      if canShort then SetBackgroundColor(Bar, #RedBkg);

      if ActivePositionCount > 0 then
      begin
      for p := 0 to PositionCount - 1 do
      begin
      if PositionActive(p) then
      begin
      SellLimit1 := PositionEntryPrice(p) + #OptVar3/100 * @abi_TR1[Bar];
      SellLimit2 := PositionEntryPrice(p) + #OptVar4/100 * @abi_TR1[Bar];
      SellLimit3 := PositionEntryPrice(p) + #OptVar5/100 * @abi_TR1[Bar];

      // Exit long
      if (PositionSignalName(p) = 'Market') then
      begin
      if stayAside or canShort then SellAtMarket(Bar+1, p, 'Trend over') else
      SellAtLimit(Bar+1, SellLimit1, p, 'Limit1: ' + IntToStr(Round(SellLimit1)));
      end;

      // Exit long
      if (PositionSignalName(p) = 'Limit1') then
      begin
      if stayAside or canShort then SellAtMarket(Bar+1, p, 'Trend over') else
      SellAtLimit(Bar+1, SellLimit2, p, 'Limit2: ' + IntToStr(Round(SellLimit2)));
      end;

      // Exit long
      if (PositionSignalName(p) = 'Limit2') then
      begin
      if stayAside or canShort then SellAtMarket(Bar+1, p, 'Trend over') else
      SellAtLimit(Bar+1, SellLimit3, p, 'Limit3: ' + IntToStr(Round(SellLimit3)));
      end;

      end;
      end;
      end;


      // Entries mi Spread
      if canLong then
      begin
      BuyLimit1 := PriceHigh(Bar) - #OptVar1/100 * @abi_TR1[Bar];
      BuyLimit2 := PriceHigh(Bar) - #OptVar2/100 * @abi_TR1[Bar];
      if (@MCTOpen[Bar-3] = 0) or (@MCTOpen[Bar-2] = 0) or (@MCTOpen[Bar-1] = 0) then
      begin
      BuyAtMarket(Bar+1, 'Market');
      if ((BuyLimit1 <= PriceHigh(Bar+1) + Spread) and (BuyLimit1 >= PriceLow(Bar+1) + Spread)) then
      BuyAtLimit(Bar+1, BuyLimit1, 'Limit1');
      end
      else
      begin
      if ((BuyLimit2 <= PriceHigh(Bar+1) + Spread) and (BuyLimit2 >= PriceLow(Bar+1) + Spread)) then
      BuyAtLimit(Bar+1, BuyLimit2, 'Limit2');
      end;
      end;

      end;
      ////////////////////////////////////////////////////////////////////////////////
      HideVolume;
      EnableTradeNotes(true, false, true);
      abi_TRPane := CreatePane(50, true, true);
      PlotSeriesLabel(abi_TR1, abi_TRPane, #Blue, #Thin, 'abi_TR1=abi_TR(' + IntToStr(10) + ')');

      // Calculate the days in trade including weekends for the 'Finanzierungskosten'
      var InBar, OutBar, DaysInTrade: integer;
      var DaysInTrades: float;

      DaysInTrade := 0;
      if PositionCount > 0 then
      begin
      for p := 0 to PositionCount - 1 do
      begin
      InBar := PositionEntryBar(p);
      if PositionActive(p) then
      OutBar := BarCount - 1
      else
      OutBar := PositionExitBar(p);

      DaysInTrade := DaysInTrade + DaysBetween(InBar, OutBar) + 1;
      end;
      end;

      if PositionCount > 0 then DaysInTrades := DaysInTrade / PositionCount;
      Print('DaysInTrades: ' + FloatToStr(DaysInTrades));

      Interessanter Weise, werden wie erwartet einige Trades so herrausgefiltert, die in Wirklichkeit nicht ausgeführt worden wären, die Quote liegt bei allen Underlyings die ich getestet habe bei 10%, (d.h. 10% weniger Trades zu dem Script aus dem gestrigen Post)

      So long

      mcbinn

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mcbinn“ ()

      RE: EOD System

      Original von mcbinn
      Zuerst mal eine Frage zu folgendem Broker gcitrading.com/, kennt die jemand, Erfahrungen etc. sitzen in Belize, d.h. Steinbrück freie Zone! Werden auch im 'CFD Broker Vergleich' erwähnt. Interessant für mich da keine FiKo auf Indices.


      Wurde immer wieder mal, z.T. auch schon ausführlich hier im Forum z.B. im CFD-Brokervergleich diskutiert. Oder besser noch die Suchfunktion, z.B. candletalk.de/search.php?searchid=87568
      Wenn mich meine Erinnerung nicht täuscht, hat eric ein Mini-Account dort.

      Ciao
      ktrade

      RE: EOD System

      @ Stadinski
      Danke, ja den schönen Sonntag wünsche ich Dir auch, ein gutes Händchen bei Deinen Trades natürlich auch. Natürlich werden so ziemlich alle die ein wenig programmieren können den Quellcode auch verstehen, was ich meinte ist das Zusammenspiel der einzelnen Komponenten, MM, RK, etc. aber jeder kann ja für sich probieren ob er das System an seine Software adaptieren kann. Ich werde alle scripts bis auf meine Parameter Einstellungen hier in den nächsten Tagen posten. Aber wie gesagt, wer keine Portfolio Simulation durchführen kann wird den Handelsansatz nicht nutzen können. Ich hoffe aber auch auf konstruktive Kritik so das ich auch neue Ideen für eine nächstes HS entwickeln kann.

      Wir werden ja sehen wie es sich entwickelt.

      Zuerst mal eine Frage zu folgendem Broker gcitrading.com/, kennt die jemand, Erfahrungen etc. sitzen in Belize, d.h. Steinbrück freie Zone! Werden auch im 'CFD Broker Vergleich' erwähnt. Interessant für mich da keine FiKo auf Indices.

      Ich stelle zuerst mal ein Paar Scripts vor und erkläre deren Funktion.

      1) Wir brauchen eine Prozedur die uns die verschiedenen Wechselkurse in allen Scripts zur Verfügung stellt. Zusätzlich brauchen wir um 'Realitäts nahe' Backtest durchführen zu können eine Prozedur die uns die verschiedenen Spreads bereit stellt. Könnte z.B. wie in Script 'abi_CFD_Helpers' realisiert werden.

      2) Finanzierungskosten sind nicht zu vernachlässigen (siehe post weiter unten), also müssen wir diese auch berechnen können. Parameter sind der Zinssatz und die Haltedauer der Position in Kalendertagen, nicht in Bars! Dazu gibt es zwei Möglichkeiten a) die gemittelte Haltedauer (Performance ist grundsätzlich schlechter) und die b) die exakte Haltedauer (ist aber etwas aufwendiger).

      zu a) Könnte sowas sein
      ////////////////////////////////////////////////////////////////////////////
      // Calculate the days in trade including weekends for the 'Finanzierungskosten'
      var InBar, OutBar, DaysInTrade: integer;
      var DaysInTrades: float;

      DaysInTrade := 0;
      if PositionCount > 0 then
      begin
      for p := 0 to PositionCount - 1 do
      begin
      InBar := PositionEntryBar(p);
      if PositionActive(p) then
      OutBar := BarCount - 1
      else
      OutBar := PositionExitBar(p);

      DaysInTrade := DaysInTrade + DaysBetween(InBar, OutBar) + 1;
      end;
      end;

      if PositionCount > 0 then DaysInTrades := DaysInTrade / PositionCount;
      Print('DaysInTrades: ' + FloatToStr(DaysInTrades));
      ////////////////////////////////////////////////////////////////////////////

      zu b) folgender Code Abschnitt
      ////////////////////////////////////////////////////////////////////////////
      ....
      // Exit long
      if (PositionSignalName(p) = 'Market') then
      begin
      if stayAside or canShort then
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(daysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtMarket(Bar+1, p, 'Trend over: ' + IntToStr(daysInTrade));
      end
      else
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(daysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtLimit(Bar+1, SellLimit1, p, 'Limit1: ' + IntToStr(daysInTrade));
      end;
      end;

      ....
      ////////////////////////////////////////////////////////////////////////////
      sieht man aber später besser im kompletten Script.

      3) Als nächstes brauchen wir eine Funktion die uns die Finanzierungskosten auch für jeden einzelnen Trade berechnet und vom Trade Ergebnis abzieht. In WL geht das über ein Commission Script z.B. so:

      ////////////////////////////////////////////////////////////////////////////
      // commission for CMC Markets (Finanzierungskosten pro Tag)
      const pctRate = 0.08; // 8%
      var Symbol: string;
      var crossRate: float;
      var daysInTrade: integer;

      symbol := CMSymbol;
      crossRate := GetGlobal(symbol + '_CR');
      daysInTrade := GetGlobal(Symbol + '_DIT');

      if CMDataSource = 'CMC' then
      begin
      if CMEntry then CMResult := 0 else CMResult := ((CMPrice * CMShares * pctRate / 360) / crossRate) * daysInTrade;
      end
      else CMResult := 0;
      ////////////////////////////////////////////////////////////////////////////

      hier werden die FiKos auf den Verkaufspreis berechnet geht aber auch auf den Kaufpreis sieht dann so aus:

      if CMEntry then CMResult := ((CMPrice * CMShares * pctRate / 360) / crossRate) * daysInTrade else CMResult := 0;

      4) Jetzt brauchen wir noch eine Routine die uns die Positionsgröße bestimmt. Geht in WL über ein SimuScript, könnte sowas sein, aber es gibt 1001 Möglichkeit das zu gestalten, z.B. Average True Range bestimmt die Positionsgröße, Gewinne der offenen Positionen (siehe auch 'Traders Magazin' => Detlef Wormstall - find ich gut ;) ) , man kann so ziemlich alle Money Management Strategien über SimuScripts realisieren, wen es interessiert sollte sich mal dort umsehen wealth-lab.com/ (Möchte hier aber keine Werbung für WL machen, gibt bestimmt auch andere Software die das kann).

      Das Script sieht z.B. so aus:
      ////////////////////////////////////////////////////////////////////////////
      const MF = 0.01; // Margin in Pct, CMC 1%
      const maxOpenPositionPerSymbol = 1; // Max 1 open position per symbol in fact its possiple that 2 positions are active
      var fEquity, fBasis, crossRate, pctRisk: float;
      var FinalSize, p, count: integer;
      var symbol: string;

      pctRisk := 0.02; // Risk 2 percent for each trade
      fEquity := Equity(BarCount - 1);
      fBasis := PositionBasisPrice(#Current);
      symbol := PositionSymbol(#Current);

      crossRate := GetGlobal(symbol + '_CR');

      if symbol = 'AUSSIE200' then
      begin
      end
      else if symbol = 'EUROSTOX' then
      begin
      end
      else if symbol = 'MDAX' then
      begin
      end
      else if symbol = 'SPX500' then
      begin
      end
      else if symbol = 'USRUSS2000' then
      begin
      end
      else if symbol = 'SUGAR' then
      begin
      pctRisk := 0.001;
      end
      else if symbol = 'GOLD' then
      begin
      pctRisk := 0.01;
      end
      else if symbol = 'UK100' then
      begin
      end
      else if symbol = 'EUROBUND' then
      begin
      end
      else if symbol = 'JAPAN225' then
      begin
      end;

      count := 0;

      for p := 0 to PositionCount - 1 do
      begin
      if PositionSymbol(p) = symbol then
      begin
      if PositionActive(p) then Inc(count);
      if count >= maxOpenPositionPerSymbol then
      begin
      SetPositionSizeShares(0);
      exit;
      end;
      end;
      end;

      FinalSize:= Trunc((fEquity * pctRisk * crossRate) / (fBasis * MF));
      SetPositionSizeShares(FinalSize);
      ////////////////////////////////////////////////////////////////////////////

      5) Jetzt brauchen wir noch eine Wertetabelle für die verschiedenen Kontrakt Spezifikationen (Punktwert, Crossrate, Margin, etc.), geht leider nicht über ein Script, muß man 'fest verdrahtet in WL eingeben', großer Nachteil an WL das die Margin als absoluter Wert eingegebn werden muß, und nicht als Prozentsatz vom Kurswert. D.h. wer in einer Simulation die aktuellen Werte einträgt hätte weit aus mehr verdient, da die Margin in der Vergangenheit geringer gewesen wäre (tiefere Kurse). Siehe Bild.

      6) At long last, z.B. ein Script welches Market und Limit Entries vereinigt (Ich nutze dieses für jedes 2. neu eröffnete Depot, läßt sich nur schwer tilgen), nur Market Entries ist weitaus aggressiver (no risk no fun).
      z.B. sowas: Die #OptVar# Parametr gebe ich hier nicht Preis aber mit den angegebenen läßt sich schon gut Leben, kann jeder für sich selber austesten ;)

      ////////////////////////////////////////////////////////////////////////////
      {#OptVar1 z.B. 30;10;60;10}
      {#OptVar2 z.B 50;10;60;10}
      {#OptVar3 z.B. 100;50;100;10}
      {#OptVar4 z.B. 80;50;100;10}
      {#OptVar5 z.B. 60;50;100;10}

      {$I 'abi_TR'}
      {$I 'abi_CFD_Helpers'}
      var Bar, p: integer;
      var canTrade: boolean;
      var SellLimit1, SellLimit2, SellLimit3: float;
      var BuyLimit1, BuyLimit2: float;
      var Symbol_1, Symbol_2, s_1: string;
      var MCTOpen: integer;
      var canLong, canShort, stayAside: boolean;
      var abi_TRPane, abi_TR1: integer;
      var InBar, OutBar, daysInTrade: integer;

      abi_TR1 := abi_TRSeries(10);

      WatchListSelect('CMC_W');
      Symbol_1 := GetSymbol + '_M_T';

      try
      AllowSymbolSearch('CMCMCT');
      MCTOpen := GetExternalSeries(Symbol_1, #Open);
      except
      ShowMessage('There are problems, with the external series!');
      exit;
      end;

      // Crossrates for Symbol
      SetGlobalCrossrates(GetSymbol);

      ////////////////////////////////////////////////////////////////////////////////
      for Bar := 10 to BarCount - 2 do
      begin

      // Check Trend
      try
      if @MCTOpen[Bar] = 0 then
      begin
      canLong:= false;
      canShort:= false;
      stayAside := true;
      end
      else if @MCTOpen[Bar] = 1 then
      begin
      canLong:= true;
      canShort:= false;
      stayAside := false;
      end
      else if @MCTOpen[Bar] = 2 then
      begin
      canLong:= false;
      canShort:= true;
      stayAside := false;
      end;
      except
      ShowMessage('Cannot process the trend check!');
      exit;
      end;

      if canLong then SetBackgroundColor(Bar, #GreenBkg);
      if canShort then SetBackgroundColor(Bar, #RedBkg);

      if ActivePositionCount > 0 then
      begin
      for p := 0 to PositionCount - 1 do
      begin
      if PositionActive(p) then
      begin

      Symbol_2 := GetSymbol;
      SellLimit1 := PositionEntryPrice(p) + #OptVar3/100 * @abi_TR1[Bar];
      SellLimit2 := PositionEntryPrice(p) + #OptVar4/100 * @abi_TR1[Bar];
      SellLimit3 := PositionEntryPrice(p) + #OptVar5/100 * @abi_TR1[Bar];

      // Exit long
      if (PositionSignalName(p) = 'Market') then
      begin
      if stayAside or canShort then
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(daysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtMarket(Bar+1, p, 'Trend over: ' + IntToStr(daysInTrade));
      end
      else
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(daysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtLimit(Bar+1, SellLimit1, p, 'Limit1: ' + IntToStr(daysInTrade));
      end;
      end;

      // Exit long
      if (PositionSignalName(p) = 'Limit1') then
      begin
      if stayAside or canShort then
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(daysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtMarket(Bar+1, p, 'Trend over: ' + IntToStr(daysInTrade));
      end
      else
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(daysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtLimit(Bar+1, SellLimit2, p, 'Limit2: '+ IntToStr(daysInTrade));
      end;
      end;

      // Exit long
      if (PositionSignalName(p) = 'Limit2') then
      begin
      if stayAside or canShort then
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(DaysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtMarket(Bar+1, p, 'Trend over: ' + IntToStr(daysInTrade));
      end
      else
      begin
      InBar := PositionEntryBar(p);
      OutBar := Bar + 1;
      daysInTrade := DaysBetween(InBar, OutBar);
      AnnotateBar(IntToStr(DaysInTrade), OutBar, false, #Black, 8);
      SetGlobal(Symbol_2 + '_DIT', daysInTrade);
      SellAtLimit(Bar+1, SellLimit3, p, 'Limit3: ' + IntToStr(daysInTrade));
      end;
      end;

      end;
      end;
      end;

      // Entries
      if canLong then
      begin
      BuyLimit1 := PriceHigh(Bar) - #OptVar1/100 * @abi_TR1[Bar];
      BuyLimit2 := PriceHigh(Bar) - #OptVar2/100 * @abi_TR1[Bar];
      if (@MCTOpen[Bar-3] = 0) or (@MCTOpen[Bar-2] = 0) or (@MCTOpen[Bar-1] = 0) then
      begin
      BuyAtMarket(Bar+1, 'Market');
      BuyAtLimit(Bar+1, BuyLimit1, 'Limit1');
      end
      else
      begin
      BuyAtLimit(Bar+1, BuyLimit2, 'Limit2');
      end;
      end;

      var dinTrade: integer;
      dinTrade := GetGlobal(GetSymbol + 'dit');
      AnnotateBar(IntToStr(dinTrade), Bar+1, true, #Red, 8);

      end;
      ////////////////////////////////////////////////////////////////////////////////
      HideVolume;
      EnableTradeNotes(false, false, true);
      abi_TRPane := CreatePane(50, true, true);
      PlotSeriesLabel(abi_TR1, abi_TRPane, #Blue, #Thin, 'abi_TR1=abi_TR(' + IntToStr(10) + ')');

      // Calculate the days in trade including weekends for the 'Finanzierungskosten'
      var InBar, OutBar, DaysInTrade: integer;
      var DaysInTrades: float;

      DaysInTrade := 0;
      if PositionCount > 0 then
      begin
      for p := 0 to PositionCount - 1 do
      begin
      InBar := PositionEntryBar(p);
      if PositionActive(p) then
      OutBar := BarCount - 1
      else
      OutBar := PositionExitBar(p);

      DaysInTrade := DaysInTrade + DaysBetween(InBar, OutBar) + 1;
      end;
      end;

      if PositionCount > 0 then DaysInTrades := DaysInTrade / PositionCount;
      Print('DaysInTrades: ' + FloatToStr(DaysInTrades));
      ////////////////////////////////////////////////////////////////////////////////

      Jetzt fehlt nur noch ein Datensatz der dem System sagt wann es Long gehen darf, ich habe das über eine externe Datenquelle gelöst die ich über ein Excelsheet füttere. Das ist aber ein Thema für meinen nächsten Post hier.

      Gute trades

      mcbinn
      Bilder
      • FuturesSymbols.jpg

        168,53 kB, 936×763, 824 mal angesehen

      RE: EOD System

      @ mcbinn

      das ist natürlich deine Entscheidung, ob du es hier postest oder nicht. Ich gehe davon aus, das viele hier den Quellcode verstehen würden, ohne es jeden erklären zu müssen. Ich weiß das man ein Unterkonto eröffnen kann bei CMC Deutschland, ob man unendlich viele eröffnen kann, weiß ich nicht. Sollte es nicht so sein, könntest du ja mehrere Accounts bei verschiedenen CFD Brokern eröffnen, dann hättest du das Problem gelöst.

      schönen Sonntag und viel Glück bei deinen Trades.

      lg Stadinski

      RE: EOD System

      @ Stadinski

      Hallo, dieses System (HS) ist fertig und wird von mir nicht mehr geändert oder weiterentwickelt, arbeite zur Zeit an was neuem. Wenn Du es testen möchtest solltest Du WL 3 installiert haben.

      Wenn Du das nicht hast, sieht es schlecht aus;-), denn ich weiß nicht was andere Programme in Bezug auf Portfoliosimulation und Multisystem testing so alles können.

      Ich mache kein Geheimnis aus dem HS, könnte auch den Quellcode hier posten, habe aber nicht die Zeit die Implementation und die damit alle auftretenden Probleme jedem zu erklären.

      Der Clou an der ganzen Sache ist der, das die gute Performance einzig und allein aus der Anwendung des HS auf ein diversifiziertes Portfolio mit einem vernüftigen Money Management (MM) und Risiko Kontrollansatz herrühren.

      Kurz gefaßt, mein übergeordneter Ansatz ist folgender: Laufend (alle drei Monate) 'eröffne' ich ein neues CFD Portfolio/Konto zu 3000€. (Praktisch habe ich aber nur ein Konto bei CMC-Markets, behandle aber jede neue Einlage als ein neues unabhängiges 'virtuelles Konto' VK). Sollte eines dieser VKs von mir getilgt werden, so entspräche das einem Verlust von ca 1.5 % meines 'Spielgeldes'. Das Geld für jedes neue VK generiere ich über ein Fond HS (ca 16% p.a die letzten 10 Jahre, bei max. Drawdown von 5%).

      Für jedes VK ist durch mein MM sichergestellt das es mindestens drei Monate 'überleben' kann. Habe diesen für mich konservativen Ansatz gewählt, weil er mich so ziemlich emotionslos traden läßt, und mein Fond HS doch schon 'langweilig' geworden ist ;)

      PS: Will mich mal erkundigen ob es möglich ist 'wirkliche' unabhängige Unterkonten bie CMC-Markets in DE zu führen, würde die Ist- und Sollkontrolle sowie Steuererklärung für mich vereinfachen. Weißt Du etwas darüber?

      So long

      mcbinn

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mcbinn“ ()

      RE: EOD System


      In den nächsten Tagen folgen dann alle weiteren Merkmale des Systems.

      So long


      Hallo mcbinn,

      was macht die Programmierung? Schon weiter gekommen, mich würde das System mal interessieren, damit man es mal selbst auf seinem Rechner nachvollziehen kann. Bin darauf gespannt.

      lg Stadinski

      RE: EOD System

      @mcbinn

      Der letzte Post ist einem zufälligen Entry nur ähnlich, willkürlichen Entry kann ich mit der MC Software nicht testen.


      Das hätte mich sehr erstaunt! :) Ich kenne es auch nur so, das man einen gewissen Algorithmus in Bezug auf das historische Trade Ergebniß testen kann. MCS egal wie man es einstellt ist zwar ein Ansatz für Zufälligkeit aber richtet sich linear zu sehr an den historischen Ergebnissen aus!

      Meine Ansätze waren das Entrys zufällig gewählt wurden und das MM/RM sowie die Enter/Exit Basis konstant blieb.

      At Market oder At Close beste Performance (klar jedes Signal wird ausgefürt) aber auch schlechtere Risiko Kennzahlen. Ich habe mich für eine Mischung aus at Market und at Limit für dieses System entschieden, ausgewogne Risiko Kennzahlen.


      Frage: Wie kann man @Market mit EOD Daten exakt testen oder wurden bei der Simulation Iday-Daten verwendet?Meiner Ansicht ist bei EOD Daten nur Open (Delay1),@ Close Delay1 oder Limit_Level in der aktuellen Periode ohne große Verzerrung der Ergebnisse backtestbar! Bei @close ohne Delay könnte man erhebliche Probleme mit der Slippage bekommen und somit das Ergebnis verzerren. Das wirkt sich auf R-Kennzahlen und somit auf das gesamte RM aus. 20€ für den FESX werden bei @close ohne Delay nicht immer ausreichen da mit grösseren Abweichungen zum System zu rechnen ist!
      MfG

      RE: EOD System

      @U_2:

      Original von U_2
      Hast Du das MM/RM Paket schon einmal in einem (Entry) Zufallsgenerator getestet oder war die angesprochene Simulation bereits das Ergebnis zufälliger Entrys oder war das eher Richtung Monte Carlo Simulation?


      Der letzte Post ist einem zufälligen Entry nur ähnlich, willkürlichen Entry kann ich mit der MC Software nicht testen. Hatte das aber mal über ein Script in WL gemacht (Zufallsgenerator wählt zwischen Entry at Close, at Market, at Limit) das Ergebnis ist das:

      At Market oder At Close beste Performance (klar jedes Signal wird ausgefürt) aber auch schlechtere Risiko Kennzahlen. Ich habe mich für eine Mischung aus at Market und at Limit für dieses System entschieden, ausgewogne Risiko Kennzahlen.

      Man kann sich dabei auch leicht zu Tode testen.

      So jetzt bin ich aber weg bye

      RE: EOD System

      @U_2:
      Sehe ich auch so, bei mir spielt der Enty für 'dieses System' (Betonung) eigentlich gar keine Rolle mehr, sehe Dir mal die Charts vom EUSTOX50 (früherer Post) an. D.h ich hatte nur ganz wenige Long Signale (Wechsel von weiß auf grün oder rot auf grün), für die anderen Underlying ist es ganz ähnlich. Der Handelsansatz für dieses System ist rein statistischer Natur.

      Hier mal eine Simulation in der die Trades willkürlich ausgewählt werden (Trade scramble), leider kann ich hier nicht alles was man mit MC so alles machen kann posten, der Aufwand wäre dann doch zu groß.

      Ich nutze die MC Software nur um die Grenzwerte Best- u. Worst-Case zu bestimmen und achte auf eine 'saubere' Verteilung der Glockenkurve.

      MC Simulationen ist ein ganzes Thema für sich.

      So ich bin jetzt mal weg, schönes Wetter draußen.
      Bilder
      • DrawDownDistribution.jpg

        171,79 kB, 1.000×652, 922 mal angesehen

      RE: EOD System

      @mcbinn

      Bei MCS-Ergebnissen bin ich skeptisch da das Ergebnis so gut oder negativ ausfällt wie die historischen Ergebniss auf die sie aufbaut!Zufalls- Zeitreihen wären meiner Meinung aussagekräftiger und eine gute Ergänzung aber ich habe leider keine Möglichkeit diese historisch zu speichern und als Statistik aufzubereiten.Manuell ist der Aufwand zu groß! Wenn eine hohe Anzahl der zufällig simulierten Ergebnisse mit konstanten MM/RM positiv ist, könnte man mit wachsender Wahrscheinlichkeit davon ausgehen, das man real kaum Geld verliert!Allerdings muss der Aufbau der Basis exakt stimmen und dazu gehören leider auch Bid-Ask.Bei EOD-Strategien hat man gewiss einen tolierbaren Spielraum!
      MfG

      RE: EOD System

      Hallo mcbinn,

      danke für die Grafiken,sehr interessant!Grundsätzlich befürworte ich deinen Ansatz bin aber in letzter Zeit dazu übergegangen, das Entry mit ähnlich stark wie das Risk Management zu bewerten.Mein Entry baut sehr wenig auf Indikatoren, Sequenzen und was es da sonst nach alles gibt auf sondern orientiert sich am Volume,u.a. Bid-Ask und der Handelsstärke auf den einzelnen Underlying-Step-Levels. Insofern verwende ich ebenfalls kaum Indikatoren.Daher ist mein Ansatz für Entry ziemlich geradlinig!Auch MM/RM sind anders strukturiert da Komprimierung,Haltedauer und Frequenz sich sehr zu deiner unterscheiden.Es wird interessant, wie sich diese Satrategie entwickelt!Hast Du das MM/RM Paket schon einmal in einem (Entry) Zufallsgenerator getestet oder war die angesprochene Simulation bereits das Ergebnis zufälliger Entrys oder war das eher Richtung Monte Carlo Simulation?

      PS: Die Beiträge haben sich überschnitten,sehe gerade die neuen Grafiken!
      MfG

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „U_2“ ()

      RE: EOD System

      @ U_2: Wenns Dich interessiert, hier mal eine Monte Carlo Simulation (Equity scramble 2000 runs) mit Best- u. WorstCase bezogen auf den Drawdown.

      Best = 32 %
      Worst = 86 %

      So long
      Bilder
      • BestCase.jpg

        148,81 kB, 1.200×522, 844 mal angesehen
      • WorstCase.jpg

        149,32 kB, 1.000×455, 867 mal angesehen