Announcement

Collapse

Looking for a User App or Add-On built by the NinjaTrader community?

Visit NinjaTrader EcoSystem and our free User App Share!

Have a question for the NinjaScript developer community? Open a new thread in our NinjaScript File Sharing Discussion Forum!
See more
See less

Partner 728x90

Collapse

BreakEven Stop

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    BreakEven Stop

    Hi,

    I am Developing an Strategy and I am stuck with the BE. The initial Profit and StopLoss Setup works fine but the StopLoss I am trying it enters at BE to play after 15 ticks movement does not work. I mimic as my best knowledge the Samples I found here.
    (FYI: The Strategy is still only for Short Entries).

    Any idea?
    Thanks!

    Code:
    #region Using declarations
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Xml.Serialization;
    using NinjaTrader.Cbi;
    using NinjaTrader.Gui;
    using NinjaTrader.Gui.Chart;
    using NinjaTrader.Gui.SuperDom;
    using NinjaTrader.Gui.Tools;
    using NinjaTrader.Data;
    using NinjaTrader.NinjaScript;
    using NinjaTrader.Core.FloatingPoint;
    using NinjaTrader.NinjaScript.Indicators;
    using NinjaTrader.NinjaScript.DrawingTools;
    #endregion
    
    //This namespace holds Strategies in this folder and is required. Do not change it. 
    namespace NinjaTrader.NinjaScript.Strategies
    {
    	public class Keltner3BarsStopBE : Strategy
    	{
    		private double MyExitPrice;
    		private double MyStopPrice;
    		private double MyEntryPrice;
    
    
    		private KeltnerChannel KeltnerChannel1;
    
    		protected override void OnStateChange()
    		{
    			if (State == State.SetDefaults)
    			{
    				Description									= @"Enter the description for your new custom Strategy here.";
    				Name										= "Keltner3BarsStopBE";
    				Calculate									= Calculate.OnBarClose;
    				EntriesPerDirection							= 1;
    				EntryHandling								= EntryHandling.AllEntries;
    				IsExitOnSessionCloseStrategy				= true;
    				ExitOnSessionCloseSeconds					= 30;
    				IsFillLimitOnTouch							= false;
    				MaximumBarsLookBack							= MaximumBarsLookBack.TwoHundredFiftySix;
    				OrderFillResolution							= OrderFillResolution.Standard;
    				Slippage									= 0;
    				StartBehavior								= StartBehavior.WaitUntilFlat;
    				TimeInForce									= TimeInForce.Gtc;
    				TraceOrders									= true;
    				RealtimeErrorHandling						= RealtimeErrorHandling.StopCancelClose;
    				StopTargetHandling							= StopTargetHandling.PerEntryExecution;
    				BarsRequiredToTrade							= 1;
    				// Disable this property for performance gains in Strategy Analyzer optimizations
    				// See the Help Guide for additional information
    				IsInstantiatedOnEachOptimizationIteration	= true;
    				KeltnerRatio					= 2.5;
    				KeltnerPeriod					= 20;
    				
    			}
    			if (State == State.Configure)
    		     {
    				SetStopLoss(CalculationMode.Ticks, MyStopPrice);
    
    		     }
    			else if (State == State.DataLoaded)
    			{				
    				KeltnerChannel1= KeltnerChannel(Close, KeltnerRatio, Convert.ToInt32(KeltnerPeriod));
    				KeltnerChannel1.Plots[0].Brush = Brushes.DarkGray;
    				KeltnerChannel1.Plots[1].Brush = Brushes.Red;
    				KeltnerChannel1.Plots[2].Brush = Brushes.ForestGreen;
    				AddChartIndicator(KeltnerChannel1);
    			}
    		}
    
    		protected override void OnBarUpdate()
    		{
    
    			
    			if (BarsInProgress != 0) 
    				return;
    
    			if (CurrentBars[0] < 110)
    			return;
    			
    				int LastCloseBelowUpper = MRO(() => Close[0] < KeltnerChannel1.Upper[0],1, 100);
    				int LastBarDown = MRO(() => Close[0] < Open[0], 2, 100);
    				int LastTouchMiddle = MRO(() => Low[0] < KeltnerChannel1.Midline[0], 1, 100);
    				int PreviousLastCloseAboveUpper = MRO(() => Close[LastCloseBelowUpper] > KeltnerChannel1.Upper[LastCloseBelowUpper],1, 90);
    				// int NBarsDown = LRO(() => Close[0] > KeltnerChannel1.Upper[0],1, LastTouchMiddle);
    			
    			 // Set 1
    			if (
    				//First Bar Down Bigger thn 3 Ticks (Works)
    				(Close[0] < (Close[1] + (-3 * TickSize)))
    				//At Least 3 Bars Above Keltner Channel (Works)
    				&& (LastCloseBelowUpper > 3)
    				//Second to Last Pullback (Last one is the Entry)  is 2 Bars after Keltner Brake or Before (only 1 pullback permited)
    				&& (LastBarDown > (LastCloseBelowUpper - 3))
    				//Last Touch LM is Before Previous Touch Upper
    				&& (LastTouchMiddle < PreviousLastCloseAboveUpper)
    				)
    			if ((Times[0][0].TimeOfDay >= new TimeSpan(8, 00, 0))
    				 && (Times[0][0].TimeOfDay < new TimeSpan(13, 00, 0)))
    
    
    
    			{
    				//Conditions
    			if (Position.MarketPosition == MarketPosition.Flat)
    			{
    				//This Should Place the Entry 1 tick below (Works)
    				MyEntryPrice = (Close[0] + (-1 * TickSize));
    				//This should plsce the Stop @ the Highest High of 7 bars ago.
    				MyStopPrice = High[HighestBar(High, 7)];
    				//This should place the Target @ 2xStop Distance from the Entry Level.
    				MyExitPrice = (3 * MyEntryPrice) - ( 2 * MyStopPrice);
    				//Stop and Target
    				SetStopLoss(@"MyEntry", CalculationMode.Price, MyStopPrice, false);
    				SetProfitTarget(@"MyEntry", CalculationMode.Price, MyExitPrice);
    			}
    			// If a short position is open, allow for stop loss modification to breakeven
    			else if (Position.MarketPosition == MarketPosition.Short)
    			{
    				// Once the price is greater than entry price+15 ticks, set stop loss to breakeven
    				if (Close[0] < Position.AveragePrice - 15 * TickSize)
    				{
    					SetStopLoss(CalculationMode.Price, Position.AveragePrice);
    				}
    			}
    				//Entry
    				EnterShortLimit(Convert.ToInt32(DefaultQuantity), MyEntryPrice , "MyEntry");
    			}
    			
    		}
    
    		#region Properties
    		[NinjaScriptProperty]
    		[Range(1, double.MaxValue)]
    		[Display(Name="KeltnerRatio", Order=1, GroupName="Parameters")]
    		public double KeltnerRatio
    		{ get; set; }
    
    		[NinjaScriptProperty]
    		[Range(1, int.MaxValue)]
    		[Display(Name="KeltnerPeriod", Order=2, GroupName="Parameters")]
    		public int KeltnerPeriod
    		{ get; set; }
    		#endregion
    
    	}

    #2
    Hello Gorion,

    Thanks for opening the thread.

    Just to confirm, the issue involves the stop not moving to BE?

    We have a working example that demonstrates how this can be done here: https://ninjatrader.com/support/foru...ead.php?t=3222

    It looks like you have incorporated some of this example, but the actions of this auto breakeven are within other logical conditions. It will be necessary to use debug prints to observe the values used to drive the logic in the NinjaScript Output window. It would be advised to print out what is used to evaluate your conditions outside of those conditions. This way you can see how those conditions are evaluated, why they are becoming true or false, and how you may adjust your code further.

    Additional publicly available tips on debugging can be found below:

    Debugging: http://ninjatrader.com/support/forum...ead.php?t=3418

    I may also suggest using the sample above while you are developing so you can compare your implementation. It may also be beneficial to start from that sample, and then add your custom entry logic before customizing the stop logic further.

    Please let us know if we may be of further assistance.
    Last edited by NinjaTrader_Jim; 04-03-2018, 07:24 AM.
    JimNinjaTrader Customer Service

    Comment


      #3
      Hi Jim,

      I am improving in better practices for debugging. After solving the Stop you help me out in other post I am still not able to make the Break Even Stop work.

      I used the Output window to check how the Sample Strategy works and this is what I found:

      This is what the Sample Output Dialog Showed in a Break Even Stop Move;

      3/29/2018 2:50:00 AM Strategy 'Sample Price Modification/130253862': Entered internal SubmitOrderManaged() method at 3/29/2018 2:50:00 AM: BarsInProgress=0 Action=Buy OrderType=Market Quantity=1 LimitPrice=0 StopPrice=0 SignalName='' FromEntrySignal=''

      3/29/2018 6:30:00 AM Strategy 'Sample Price Modification/130253862': Amended stop order orderId='NT-01087-792' account='Sim101' name='Stop loss' orderState=Working instrument='6E 06-18' orderAction=Sell orderType='Stop Market' limitPrice=0 stopPrice=1.236 quantity=1 tif=Gtc oco='NT-00688-792' filled=0 averageFillPrice=0 onBehalfOf='' id=-1 time='2018-03-29 02:50:00' gtd='2099-12-01' statementDate='2018-04-04'

      3/29/2018 9:55:00 AM Strategy 'Sample Price Modification/130253862: Cancelled pending exit order, since associated position is closed, orderId='NT-01088-792' account='Sim101' name='Profit target' orderState=Working instrument='6E 06-18' orderAction=Sell orderType='Limit' limitPrice=1.242 stopPrice=0 quantity=1 tif=Gtc oco='NT-00688-792' filled=0 averageFillPrice=0 onBehalfOf='' id=-1 time='2018-03-29 02:50:00' gtd='2099-12-01' statementDate='2018-04-04'
      3/29/2018 9:55:00 AM Strategy 'Sample Price Modification/130253862': Cancelled OCO paired order: BarsInProgress=0, orderId='NT-01088-792' account='Sim101' name='Profit target' orderState=Cancelled instrument='6E 06-18' orderAction=Sell orderType='Limit' limitPrice=1.242 stopPrice=0 quantity=1 tif=Gtc oco='NT-00688-792' filled=0 averageFillPrice=0 onBehalfOf='' id=-1 time='2018-03-29 02:50:00' gtd='2099-12-01' statementDate='2018-04-04'



      3/29/2018 2:05:00 AM Strategy 'Sample Price Modification/130253862': Entered internal SubmitOrderManaged() method at 3/29/2018 2:05:00 AM: BarsInProgress=0 Action=Buy OrderType=Market Quantity=1 LimitPrice=0 StopPrice=0 SignalName='' FromEntrySignal=''
      3/29/2018 2:10:00 AM Strategy 'Sample Price Modification/130253862': Entered internal SubmitOrderManaged() method at 3/29/2018 2:10:00 AM: BarsInProgress=0 Action=Buy OrderType=Market Quantity=1 LimitPrice=0 StopPrice=0 SignalName='' FromEntrySignal=''
      3/29/2018 2:10:00 AM Strategy 'Sample Price Modification/130253862': Ignored SubmitOrderManaged() method at 3/29/2018 2:10:00 AM: BarsInProgress=0 Action=Buy OrderType=Market Quantity=1 LimitPrice=0 StopPrice=0 SignalName='Buy' FromEntrySignal='' Reason='Exceeded entry signals limit based on EntryHandling and EntriesPerDirection properties'
      3/29/2018 2:40:00 AM Strategy 'Sample Price Modification/130253862: Cancelled pending exit order, since associated position is closed, orderId='NT-01085-792' account='Sim101' name='Profit target' orderState=Working instrument='6E 06-18' orderAction=Sell orderType='Limit' limitPrice=1.24265 stopPrice=0 quantity=1 tif=Gtc oco='NT-00686-792' filled=0 averageFillPrice=0 onBehalfOf='' id=-1 time='2018-03-29 02:05:00' gtd='2099-12-01' statementDate='2018-04-04'
      3/29/2018 2:40:00 AM Strategy 'Sample Price Modification/130253862': Cancelled OCO paired order: BarsInProgress=0, orderId='NT-01085-792' account='Sim101' name='Profit target' orderState=Cancelled instrument='6E 06-18' orderAction=Sell orderType='Limit' limitPrice=1.24265 stopPrice=0 quantity=1 tif=Gtc oco='NT-00686-792' filled=0 averageFillPrice=0 onBehalfOf='' id=-1 time='2018-03-29 02:05:00' gtd='2099-12-01' statementDate='2018-04-04'
      This is what my strategy Output Dialog Showed in an hypothetical Break Even Entry;

      017 9:45:00 AM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SetStopTarget() method: Type=Stop FromEntrySignal='' Mode=Ticks Value=1.15585 IsSimulatedStop=False IsMarketIfTouched=False
      7/17/2017 9:45:00 AM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SubmitOrderManaged() method at 7/17/2017 9:45:00 AM: BarsInProgress=0 Action=SellShort OrderType=Limit Quantity=1 LimitPrice=1.17390 StopPrice=0 SignalName='MyEntry' FromEntrySignal=''
      7/17/2017 9:45:00 AM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SetStopTarget() method: Type=Stop FromEntrySignal='MyEntry' Mode=Price Value=1.1749 IsSimulatedStop=False IsMarketIfTouched=False
      7/17/2017 9:45:00 AM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SetStopTarget() method: Type=Target FromEntrySignal='MyEntry' Mode=Price Value=1.1719 IsSimulatedStop=False IsMarketIfTouched=False
      7/17/2017 10:25:00 AM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SetStopTarget() method: Type=Stop FromEntrySignal='' Mode=Price Value=1.17385 IsSimulatedStop=False IsMarketIfTouched=False

      7/17/2017 11:00:00 AM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SetStopTarget() method: Type=Stop FromEntrySignal='' Mode=Price Value=1.17385 IsSimulatedStop=False IsMarketIfTouched=False
      7/17/2017 1:00:00 PM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SubmitOrderManaged() method at 7/17/2017 1:00:00 PM: BarsInProgress=0 Action=BuyToCover OrderType=Market Quantity=1 LimitPrice=0 StopPrice=0 SignalName='' FromEntrySignal=''
      7/17/2017 1:00:00 PM Strategy 'Keltner3BarsDebug3/130253861: Cancelled pending exit order, since associated position is closed, orderId='NT-00064-797' account='Sim101' name='Profit target' orderState=Working instrument='6E 06-18' orderAction=BuyToCover orderType='Limit' limitPrice=1.1719 stopPrice=0 quantity=1 tif=Gtc oco='NT-00038-797' filled=0 averageFillPrice=0 onBehalfOf='' id=-1 time='2017-07-17 09:45:00' gtd='2099-12-01' statementDate='2018-04-04'
      7/17/2017 1:00:00 PM Strategy 'Keltner3BarsDebug3/130253861: Cancelled pending exit order, since associated position is closed, orderId='NT-00063-797' account='Sim101' name='Stop loss' orderState=Working instrument='6E 06-18' orderAction=BuyToCover orderType='Stop Market' limitPrice=0 stopPrice=1.1749 quantity=1 tif=Gtc oco='NT-00038-797' filled=0 averageFillPrice=0 onBehalfOf='' id=-1 time='2017-07-17 09:45:00' gtd='2099-12-01' statementDate='2018-04-04'
      7/17/2017 1:05:00 PM Strategy 'Keltner3BarsDebug3/130253861': Entered internal SetStopTarget() method: Type=Stop FromEntrySignal='' Mode=Ticks Value=1.1749 IsSimulatedStop=False IsMarketIfTouched=False
      As far I can notice, the part of the "Amended Order" that comes to play in the Sample (in Bold) does not play in my Strategy, I am not sure if I am writing some parts in the wrong places or what.

      Thanks in advance for any help.

      Comment


        #4
        Here is the code BTW.

        Code:
        namespace NinjaTrader.NinjaScript.Strategies.Keltner1
        {
        	public class Keltner3BarsDebug3 : Strategy
        	{
        		private double MyExitPrice;
        		private double MyStopPrice;
        		private double MyEntryPrice;
        
        
        		private KeltnerChannel KeltnerChannel1;
        
        		protected override void OnStateChange()
        		{
        			if (State == State.SetDefaults)
        			{
        				Description									= @"Enter the description for your new custom Strategy here.";
        				Name										= "Keltner3BarsDebug3";
        				Calculate									= Calculate.OnBarClose;
        				EntriesPerDirection							= 1;
        				EntryHandling								= EntryHandling.AllEntries;
        				IsExitOnSessionCloseStrategy				= true;
        				ExitOnSessionCloseSeconds					= 30;
        				IsFillLimitOnTouch							= false;
        				MaximumBarsLookBack							= MaximumBarsLookBack.TwoHundredFiftySix;
        				OrderFillResolution							= OrderFillResolution.Standard;
        				Slippage									= 0;
        				StartBehavior								= StartBehavior.WaitUntilFlat;
        				TimeInForce									= TimeInForce.Gtc;
        				TraceOrders									= true;
        				RealtimeErrorHandling						= RealtimeErrorHandling.StopCancelClose;
        				StopTargetHandling							= StopTargetHandling.PerEntryExecution;
        				BarsRequiredToTrade							= 20;
        				// Disable this property for performance gains in Strategy Analyzer optimizations
        				// See the Help Guide for additional information
        				IsInstantiatedOnEachOptimizationIteration	= true;
        				KeltnerRatio					= 2.5;
        				KeltnerPeriod					= 20;
        			}
        			
        			else if (State == State.DataLoaded)
        			{				
        				KeltnerChannel1				= KeltnerChannel(Close, KeltnerRatio, Convert.ToInt32(KeltnerPeriod));
        				KeltnerChannel1.Plots[0].Brush = Brushes.DarkGray;
        				KeltnerChannel1.Plots[1].Brush = Brushes.Red;
        				KeltnerChannel1.Plots[2].Brush = Brushes.ForestGreen;
        				AddChartIndicator(KeltnerChannel1);
        			}
        			
        			if (State == State.Configure)
        		     {
        		        /* There are several ways you can use SetStopLoss and SetProfitTarget. You can have them set to a currency value
        				or some sort of calculation mode. Calculation modes available are by percent, price, and ticks. SetStopLoss and
        				SetProfitTarget will submit real working orders unless you decide to simulate the orders. */
        				SetStopLoss(CalculationMode.Ticks, MyStopPrice);
        				SetProfitTarget(CalculationMode.Ticks, MyExitPrice);
        		     }
        			
        			
        		}
        
        		protected override void OnBarUpdate()
        		{
        
        			
        			if (BarsInProgress != 0) 
        				return;
        
        			if (CurrentBars[0] < 110)
        			return;
        			
        			// Resets the stop loss to the original value when all positions are closed
        			if (Position.MarketPosition == MarketPosition.Flat)
        			{
        				SetStopLoss(CalculationMode.Ticks, MyStopPrice);
        			}
        			
        			// If a long position is open, allow for stop loss modification to breakeven
        			else if (Position.MarketPosition == MarketPosition.Short)
        			{
        				// Once the price is greater than entry price+50 ticks, set stop loss to breakeven
        				if (Close[0] < Position.AveragePrice - (15 * TickSize))
        				{
        					SetStopLoss(CalculationMode.Price, Position.AveragePrice- (1 * TickSize));
        				}
        			}
        				
        				// Last Bar Touches Mid Line  (Works)
        				int TouchMidLineBar = MRO(() => Low[0] < KeltnerChannel1.Midline[0],1, 100);
        				// Since Last Bar Touches Mid Line, First Bar Crosses Upper Channel
        				int LastCloseAboveUpper = LRO(() => Close[0] > KeltnerChannel1.Upper[0],1, TouchMidLineBar);
        				// Bar Crosses Upper Channel (Works)
        				int LastCloseBelowUpper = MRO(() => Close[1] < KeltnerChannel1.Upper[1],1, 100);
        				// BarsUp since Bar Crosses Upper Channel
        				int NBarsUp = CountIf(() => Close[0] > Close [1],LastCloseBelowUpper);
        				// Last Bar Down Before Signal (Works)
        				int LastBarDown = MRO(() => Close[1] < Open[1], 2, 100);
        				// Last Bar Not Breaking Previous Pivot (Works)
        				int LastHighCloseNotBroken = MRO(() => Close[1]<Close[2] && Close[0] < Close[2],1,100);
        
        				
        
        				
        			 // Set 1
        			if (
        				//First Bar Down Bigger thn 3 Ticks (Works)
        				(Close[0] < (Open[0] + (-1 * TickSize)))
        				//At Least 3 Bars Up Above Keltner Channel (Works)
        				&& (NBarsUp >= 3)
        				//Second to Last Pullback (Last one is the Entry)  is 2 Bars or Before Crosing Bar (only 1 pullback permited) (Works)
        				&& (LastBarDown > LastCloseBelowUpper)
        				// Last Pivot Not Boroken is Before Crossing Bar (Pullback Permited is Beaten) (Works)
        				&& LastHighCloseNotBroken +1 > LastCloseBelowUpper
        				// First Bar Crosses Upper Channel Touches After Touuch Mid Line is the same or after position of Bar Crosses Upper Channel (Works)
        				&& LastCloseAboveUpper <= LastCloseBelowUpper
        
        				)
        			if ((Times[0][0].TimeOfDay >= new TimeSpan(8, 00, 0))
        				 && (Times[0][0].TimeOfDay < new TimeSpan(13, 00, 0)))
        
        							
        			
        			{
        				//Conditions
        
        				//This Should Place the Entry 1 tick below (Works)
        				MyEntryPrice = (Close[0] + (-1 * TickSize));
        				//This should plsce the Stop @ the Highest High of 4 bars ago.
        				MyStopPrice = High[HighestBar(High, 7)];
        				//This should place the Target @ 2xStop Distance from the Entry Level.
        				MyExitPrice = (3 * MyEntryPrice) - ( 2 * MyStopPrice);
        				//Entry
        				EnterShortLimit(Convert.ToInt32(DefaultQuantity), MyEntryPrice , "MyEntry");
        				//Stop and Target
        				SetStopLoss(@"MyEntry", CalculationMode.Price, MyStopPrice, false);
        				SetProfitTarget(@"MyEntry", CalculationMode.Price, MyExitPrice);
        			}
        					if (Times[0][0].TimeOfDay == new TimeSpan(13, 0, 0))
        			{
        				ExitShort(Convert.ToInt32(DefaultQuantity), "", "");
        			}	
        		}

        Comment


          #5
          Hello Gorion,

          I have received your note.

          My recommendation would be to start with the provided example for the basis of your works and then to add in your custom entry logic, and then finally to customize the exit behavior. This way you can start with a working implementation and once you have a your logic added and working, you can compare what you are doing differently than the working example.

          Another suggestion would be to reduce your code to its most simplest terms to focus on the stop behaviors.

          One item I noticed is that you are using the same variable MyStopPrice for SetStopLoss with CalculationMode.Ticks and CalculationMode.Price. This can cause issues where your stop loss will be submitted to the other side of the market and receive a rejection.

          I also recommend to maintain consistent formatting throughout your script so it is easier to identify which blocks of code are tied to different conditions. This makes it easier to understand and follow the code while debugging.

          I have attached a demonstration showing how you can reduce your code to focus on the issue.

          Demo: https://www.screencast.com/t/pYTxwDfdSaTu

          You will want to take debugging steps similar to this demonstration to better analyze your code. We do not offer services to create modify or debug code for our clients in the support department. This is because we are a small team and cannot take on the task of providing such services for all of our clients. If you are interested in those services, we can have a representative of our EcoSystem provide information on NinjaScript Consultants who would be happy to debug this script or write any script for you at your request.

          Please let us know if this is the case.
          JimNinjaTrader Customer Service

          Comment

          Latest Posts

          Collapse

          Topics Statistics Last Post
          Started by Waxavi, Today, 02:10 AM
          0 responses
          3 views
          0 likes
          Last Post Waxavi
          by Waxavi
           
          Started by TradeForge, Today, 02:09 AM
          0 responses
          7 views
          0 likes
          Last Post TradeForge  
          Started by Waxavi, Today, 02:00 AM
          0 responses
          2 views
          0 likes
          Last Post Waxavi
          by Waxavi
           
          Started by elirion, Today, 01:36 AM
          0 responses
          4 views
          0 likes
          Last Post elirion
          by elirion
           
          Started by gentlebenthebear, Today, 01:30 AM
          0 responses
          4 views
          0 likes
          Last Post gentlebenthebear  
          Working...
          X