SmartQuant Discussion

Automated Quantitative Strategy Development, SmartQuant Product Discussion and Technical Support Forums
It is currently Mon Sep 23, 2019 2:43 pm

All times are UTC + 3 hours




Post new topic Reply to topic  [ 3 posts ] 
Author Message
 Post subject: Breakout
PostPosted: Mon Jan 16, 2006 5:28 pm 
Offline

Joined: Tue Aug 05, 2003 3:43 pm
Posts: 6816
Code:
public class Breakout_ATS : ATSComponent
{
   BarSeries series;

   int length = 30;

   double stopOCALevel  = 0.98;
   double limitOCALevel = 1.05;

   int OCACount = 0;

   ATSStop  stop;
   double   stopLevel = 0.05;
   StopType stopType  = StopType.Trailing;
   StopMode stopMode  = StopMode.Percent;

   bool entryEnabled    = true;
   bool ocaExitEnabled  = true;
   bool timeExitEnabled = false;
   bool stopExitEnabled = false;

   SingleOrder marketOrder, limitOrder, stopOrder;

   int barCount;
   int barsToExit = 10;

   double qty = 100;

   public Breakout_ATS() : base()
   {

   }

   [Category("Parameters")]
   public int Length
   {
      get { return length; }
      set { length = value; }
   }

   [Category("OCA")]
   public double StopOCALevel
   {
      get { return stopOCALevel; }
      set { stopOCALevel = value; }      
   }

   [Category("OCA")]
   public double LimitOCALevel
   {
      get { return limitOCALevel; }
      set { limitOCALevel = value; }      
   }

   [Category("Exit")]
   public bool OCAExitEnabled
   {
      get { return ocaExitEnabled; }
      set { ocaExitEnabled = value; }      
   }

   [Category("Exit")]
   public bool TimeExitEnabled
   {
      get { return timeExitEnabled; }
      set { timeExitEnabled = value; }      
   }

   [Category("Exit")]
   public bool StopExitEnabled
   {
      get { return stopExitEnabled; }
      set { stopExitEnabled = value; }      
   }

   [Category("Exit")]
   public int BarsToExit
   {
      get { return barsToExit; }
      set { barsToExit = value; }      
   }

   [Category("Stop")]
   public double StopLevel
   {
      get { return stopLevel; }
      set { stopLevel = value; }      
   }

   [Category("Stop")]
   public StopType StopType
   {
      get { return stopType; }
      set { stopType = value; }      
   }

   [Category("Stop")]
   public StopMode StopMode
   {
      get { return stopMode; }
      set { stopMode = value; }      
   }

   [Category("Money")]
   public double Qty
   {
      get { return qty; }
      set { qty = value; }      
   }

   public override void Init()
   {
      series = new BarSeries();
   }

   public override void OnBar(Bar bar)
   {
      if (entryEnabled)
      {
         if (series.Count > length)
            if (bar.High > series.HighestHigh(length))
            {
               marketOrder = MarketOrder(Instrument, Side.Buy, qty);
               marketOrder.Text = "Entry";
               marketOrder.Send();

               if (ocaExitEnabled)
               {
                  limitOrder = LimitOrder(Instrument, Side.Sell, qty, limitOCALevel * bar.Close);
                  limitOrder.OCAGroup = "OCA " + Instrument.Symbol + " " + OCACount;
                  limitOrder.Text     = "Limit OCA " + OCACount;

                  stopOrder = StopOrder(Instrument, Side.Sell, qty, stopOCALevel * bar.Close);
                  stopOrder.OCAGroup = "OCA " + Instrument.Symbol + " " + OCACount;
                  stopOrder.Text     = "Limit OCA " + OCACount;

                  limitOrder.Send();
                  stopOrder .Send();

                  OCACount++;
               }

               entryEnabled = false;

               barCount = 0;
            }
      }
      else
      {
         barCount++;

         if (timeExitEnabled && barCount > barsToExit)
         {
            marketOrder = MarketOrder(Instrument, Side.Sell, qty);
            marketOrder.Text = "Time Exit";
            marketOrder.Send();
            
            entryEnabled = true;
         }

      }

      series.Add(bar);
   }

   public override void OnPositionOpened()
   {
      if (stopExitEnabled)
         stop = SetStop(stopLevel, stopType, stopMode);
   }

   public override void OnPositionClosed()
   {
      // cancel OCA

      if (ocaExitEnabled && !(limitOrder.IsFilled || limitOrder.IsCancelled))
         limitOrder.Cancel();

      // can entry again now

      entryEnabled = true;
   }

   public override void OnStopExecuted(ATSStop stop)
   {
      marketOrder = MarketOrder(Instrument, Side.Sell, qty);
      marketOrder.Text = "Stop Exit";
      marketOrder.Send();
   }
}


Top
 Profile  
 
 Post subject:
PostPosted: Wed May 30, 2007 2:54 pm 
Offline

Joined: Sun May 20, 2007 9:09 am
Posts: 351
Can someone modify this code to do the following:

Image


Top
 Profile  
 
 Post subject: Re: Breakout
PostPosted: Thu Mar 24, 2011 5:29 am 
Offline

Joined: Mon Sep 08, 2008 2:20 am
Posts: 40
Location: Toronto, Ontario, Canada
Here's an alternative:

Code:
using OpenQuant.API;
using OpenQuant.API.Indicators;
using System;
using System.Drawing;

public class MyStrategy : Strategy
{
   BarSeries series;
   
   int OCACount = 0;

   StopType stopType  = StopType.Trailing;
   StopMode stopMode  = StopMode.Absolute;  //Absolute  //Percent

   bool ocaExitEnabled  = true;
   bool timeExitEnabled = true;
   bool stopExitEnabled = true;

   Order marketOrder;
   Order limitOrder;
   Order stopOrder;

   double qty = 1;
   int barCount = 0;

   [OptimizationParameter (10, 30, 5)]
   [Parameter("Length")]
   int Length = 10; //25
   
   [OptimizationParameter (1, 5, 1)]
   [Parameter ("StopOCALevel")]
   double StopOCALevel = 4.00;
   
   [OptimizationParameter (0.25, 1.00, 0.25)]
   [Parameter ("LimitOCALevel")]
   double LimitOCALevel = 0.50; //0.75
   
   [OptimizationParameter (5, 30,5)]
   [Parameter("BarsToExit")]
   int BarsExit = 25;
   
   [Parameter ("OCAExitEnabled")]
   bool OCAExitEnabled;
   
   [Parameter ("TimeExitEnabled")]
   bool TimeExitEnabled;
   
   [Parameter("StopExitEnabled")]
   bool StopExitEnabled;

   [Parameter("StopLevel")]
   double StopLevel;
   
   [Parameter("StopType")]
   StopType StopType;
   
   [Parameter("StopMode")]
   StopMode StopMode;
   
   [Parameter("Qty")]
   double Qty;
   
      
   public override void OnStrategyStart()
   {      
         series = new BarSeries();
   }

   

   public override void OnBar(Bar bar)
   {
      if(DurationWithinWorkingHours(bar.DateTime))
      {

         if(!HasPosition)
         {
            if (series.Count > Length)
               if (bar.High > series.HighestHigh(Length))
               {
                  marketOrder = MarketOrder(Instrument, OrderSide.Buy, qty);
                  marketOrder.Text = "Entry";
                  marketOrder.Send();

                  if (ocaExitEnabled)
                  {
                     limitOrder = LimitOrder(Instrument, OrderSide.Sell, qty, bar.Close + LimitOCALevel );
                     limitOrder.OCAGroup = "OCA " + Instrument.Symbol + " " + OCACount;
                     limitOrder.Text     = "Limit OCA " + OCACount;

                     stopOrder = StopOrder(Instrument, OrderSide.Sell, qty, bar.Close - StopOCALevel);
                     stopOrder.OCAGroup = "OCA " + Instrument.Symbol + " " + OCACount;
                     stopOrder.Text     = "Limit OCA " + OCACount;

                     limitOrder.Send();
                     stopOrder.Send();

                     OCACount++;
                  }
                  barCount = 0;
               }
         }
         else
         {
            barCount++;

            if (timeExitEnabled && barCount > BarsExit)
            {
               if(stopOrder!=null)
                  stopOrder.Cancel();
            
               if(limitOrder!=null)
                  limitOrder.Cancel();
               
               marketOrder = MarketOrder(Instrument, OrderSide.Sell, qty);
               marketOrder.Text = "Time Exit";
               marketOrder.Send();
            }

         }
         
      
      }
      else   //Exit for the End of Day
      {
         if(HasPosition)
         {
            // cancel OCA
            if (ocaExitEnabled && !(limitOrder.IsFilled || limitOrder.IsCancelled))
               limitOrder.Cancel();

         }
      }
      /*else   //Exit for the End of Day
      {
         if(stopOrder!=null)
            stopOrder.Cancel();
            
         if(marketOrder!=null)
            marketOrder.Cancel();
            
         if(limitOrder!=null)
            limitOrder.Cancel();
         
         //Sell(Qty, "Exit (End of Day)");   
         
         if(HasPosition)
         {
            Sell(Qty, "Exit (End of Day)");      
         }
      }*/
      series.Add(bar);
      
   }

   public override void OnPositionOpened()
   {
      if (stopExitEnabled)
         SetStop(StopLevel, stopType, stopMode);
   }

   public override void OnPositionClosed()
   {
      // cancel OCA
      if (ocaExitEnabled && !(limitOrder.IsFilled || limitOrder.IsCancelled))
         limitOrder.Cancel();
   }

   public bool DurationWithinWorkingHours(DateTime currentTime)
   {
      DateTime current = new DateTime(1999,1,1,currentTime.Hour,currentTime.Minute,currentTime.Second);
      DateTime start = new DateTime(1999,1,1,9,00,00);
      DateTime end = new DateTime(1999,1,1,16,00,00);
      if (current.TimeOfDay > start.TimeOfDay && current.TimeOfDay < end.TimeOfDay)
      {
         return true;
      }
      return false;
       
   }
   
}


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 3 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group