SmartQuant Discussion

Automated Quantitative Strategy Development, SmartQuant Product Discussion and Technical Support Forums
It is currently Mon Sep 24, 2018 3:22 am

All times are UTC + 3 hours




Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: ChannelsFibo indicator
PostPosted: Wed Jul 01, 2009 6:17 pm 
Offline

Joined: Thu Sep 20, 2007 6:43 pm
Posts: 122
Location: Poland
Hi :)

ChannelsFibo indicator:

Code:
using System;
using System.Drawing;

using OpenQuant.API;
using OpenQuant.API.Indicators;
using OpenQuant.API.Plugins;

namespace ChannelsFibo
{
   public class ChannelsFibo : UserIndicator
   {
      private SMA sma;
      private int smaPeriod;
      
      public SMA Sma
      {
         get { return sma; }
         set { sma = value; }
      }
      
      public int SmaPeriod
      {
         get { return smaPeriod; }
         set { smaPeriod = value; }
      }
      
      public ChannelsFibo(BarSeries input, SMA sma, int smaPeriod) : base(input)
      {
         Name = "ChannelsFibo";
         this.sma = sma;
         this.smaPeriod = smaPeriod;
      }
      
      public override double Calculate(int index)
      {               
         double channelsFibo = 0;
         
         if (index > smaPeriod + smaPeriod + 1)
         {   
            for (int i = 0; i < smaPeriod; i++)
            {
               channelsFibo += sma.Ago(i);
            }
            channelsFibo /= smaPeriod;
            
            return channelsFibo;
         }
         else
         {
            return double.NaN;
         }
      }
   }
   
   public class ChannelsFibo1 : UserIndicator
   {
      private SMA sma;
      private int smaPeriod;
      
      public SMA Sma
      {
         get { return sma; }
         set { sma = value; }
      }
      
      public int SmaPeriod
      {
         get { return smaPeriod; }
         set { smaPeriod = value; }
      }
      
      public ChannelsFibo1(BarSeries input, SMA sma, int smaPeriod) : base(input)
      {
         Name = "ChannelsFibo1";
         this.sma = sma;
         this.smaPeriod = smaPeriod;
      }
      
      public override double Calculate(int index)
      {         
         double ma = 0;         
         double top = 0;
         double bottom = 0;
         double min = 0;
         double max = 0;
         double inc1 = 0;
         double channelsFibo1 = 0;
         
         if (index > smaPeriod + smaPeriod + 1)
         {   
            for (int i = 1; i <= smaPeriod; i++)
            {
               ma = sma.Ago(i);            
            
               top += (Input[index - i, BarData.High] - ma) / i;                              
               if (top > max)
               {
                  max = top;
               }               

               bottom += (Input[index - i, BarData.Low] - ma) / i;
               if (bottom < min)
               {
                  min = bottom;
               }
            }
            
            inc1 = (max - min) * 0.118;

            for (int i = 0; i < smaPeriod; i ++)
            {
               channelsFibo1 += sma.Ago(i) + inc1;
            }
            channelsFibo1 /= smaPeriod;
         
            return channelsFibo1;
         }
         else
         {
            return double.NaN;
         }
      }
   }

   public class ChannelsFibo2 : UserIndicator
   {
      private SMA sma;
      private int smaPeriod;
      
      public SMA Sma
      {
         get { return sma; }
         set { sma = value; }
      }
      
      public int SmaPeriod
      {
         get { return smaPeriod; }
         set { smaPeriod = value; }
      }
      
      public ChannelsFibo2(BarSeries input, SMA sma, int smaPeriod) : base(input)
      {
         Name = "ChannelsFibo2";
         this.sma = sma;
         this.smaPeriod = smaPeriod;
      }
      
      public override double Calculate(int index)
      {         
         double ma = 0;         
         double top = 0;
         double bottom = 0;
         double min = 0;
         double max = 0;
         double inc2 = 0;
         double channelsFibo2 = 0;
         
         if (index > smaPeriod + smaPeriod + 1)
         {   
            for (int i = 1; i <= smaPeriod; i++)
            {
               ma = sma.Ago(i);            
            
               top += (Input[index - i, BarData.High] - ma) / i;                              
               if (top > max)
               {
                  max = top;
               }               

               bottom += (Input[index - i, BarData.Low] - ma) / i;
               if (bottom < min)
               {
                  min = bottom;
               }
            }
            
            inc2 = (max - min) * 0.264;

            for (int i = 0; i < smaPeriod; i ++)
            {
               channelsFibo2 += sma.Ago(i) + inc2;
            }
            channelsFibo2 /= smaPeriod;
         
            return channelsFibo2;
         }
         else
         {
            return double.NaN;
         }
      }
   }
   
   public class ChannelsFibo3 : UserIndicator
   {
      private SMA sma;
      private int smaPeriod;
      
      public SMA Sma
      {
         get { return sma; }
         set { sma = value; }
      }
      
      public int SmaPeriod
      {
         get { return smaPeriod; }
         set { smaPeriod = value; }
      }
      
      public ChannelsFibo3(BarSeries input, SMA sma, int smaPeriod) : base(input)
      {
         Name = "ChannelsFibo3";
         this.sma = sma;
         this.smaPeriod = smaPeriod;
      }
      
      public override double Calculate(int index)
      {         
         double ma = 0;         
         double top = 0;
         double bottom = 0;
         double min = 0;
         double max = 0;
         double inc3 = 0;
         double channelsFibo3 = 0;
         
         if (index > smaPeriod + smaPeriod + 1)
         {   
            for (int i = 1; i <= smaPeriod; i++)
            {
               ma = sma.Ago(i);            
            
               top += (Input[index - i, BarData.High] - ma) / i;                              
               if (top > max)
               {
                  max = top;
               }               

               bottom += (Input[index - i, BarData.Low] - ma) / i;
               if (bottom < min)
               {
                  min = bottom;
               }
            }
            
            inc3 = (max - min) * 0.5;

            for (int i = 0; i < smaPeriod; i ++)
            {
               channelsFibo3 += sma.Ago(i) + inc3;
            }
            channelsFibo3 /= smaPeriod;
         
            return channelsFibo3;
         }
         else
         {
            return double.NaN;
         }
      }
   }   
   
   public class ChannelsFibo4 : UserIndicator
   {
      private SMA sma;
      private int smaPeriod;
      
      public SMA Sma
      {
         get { return sma; }
         set { sma = value; }
      }
      
      public int SmaPeriod
      {
         get { return smaPeriod; }
         set { smaPeriod = value; }
      }
      
      public ChannelsFibo4(BarSeries input, SMA sma, int smaPeriod) : base(input)
      {
         Name = "ChannelsFibo4";
         this.sma = sma;
         this.smaPeriod = smaPeriod;
      }
      
      public override double Calculate(int index)
      {         
         double ma = 0;         
         double top = 0;
         double bottom = 0;
         double min = 0;
         double max = 0;
         double inc1 = 0;
         double channelsFibo4 = 0;
         
         if (index > smaPeriod + smaPeriod + 1)
         {   
            for (int i = 1; i <= smaPeriod; i++)
            {
               ma = sma.Ago(i);            
            
               top += (Input[index - i, BarData.High] - ma) / i;                              
               if (top > max)
               {
                  max = top;
               }               

               bottom += (Input[index - i, BarData.Low] - ma) / i;
               if (bottom < min)
               {
                  min = bottom;
               }
            }
            
            inc1 = (max - min) * 0.118;

            for (int i = 0; i < smaPeriod; i ++)
            {
               channelsFibo4 += sma.Ago(i) - inc1;
            }
            channelsFibo4 /= smaPeriod;
         
            return channelsFibo4;
         }
         else
         {
            return double.NaN;
         }
      }
   }   

   public class ChannelsFibo5 : UserIndicator
   {
      private SMA sma;
      private int smaPeriod;
      
      public SMA Sma
      {
         get { return sma; }
         set { sma = value; }
      }
      
      public int SmaPeriod
      {
         get { return smaPeriod; }
         set { smaPeriod = value; }
      }
      
      public ChannelsFibo5(BarSeries input, SMA sma, int smaPeriod) : base(input)
      {
         Name = "ChannelsFibo5";
         this.sma = sma;
         this.smaPeriod = smaPeriod;
      }
      
      public override double Calculate(int index)
      {         
         double ma = 0;         
         double top = 0;
         double bottom = 0;
         double min = 0;
         double max = 0;
         double inc2 = 0;
         double channelsFibo5 = 0;
         
         if (index > smaPeriod + smaPeriod + 1)
         {   
            for (int i = 1; i <= smaPeriod; i++)
            {
               ma = sma.Ago(i);            
            
               top += (Input[index - i, BarData.High] - ma) / i;                              
               if (top > max)
               {
                  max = top;
               }               

               bottom += (Input[index - i, BarData.Low] - ma) / i;
               if (bottom < min)
               {
                  min = bottom;
               }
            }
            
            inc2 = (max - min) * 0.264;

            for (int i = 0; i < smaPeriod; i ++)
            {
               channelsFibo5 += sma.Ago(i) - inc2;
            }
            channelsFibo5 /= smaPeriod;
         
            return channelsFibo5;
         }
         else
         {
            return double.NaN;
         }
      }
   }
   
   public class ChannelsFibo6 : UserIndicator
   {
      private SMA sma;
      private int smaPeriod;
      
      public SMA Sma
      {
         get { return sma; }
         set { sma = value; }
      }
      
      public int SmaPeriod
      {
         get { return smaPeriod; }
         set { smaPeriod = value; }
      }
      
      public ChannelsFibo6(BarSeries input, SMA sma, int smaPeriod) : base(input)
      {
         Name = "ChannelsFibo6";
         this.sma = sma;
         this.smaPeriod = smaPeriod;
      }
      
      public override double Calculate(int index)
      {         
         double ma = 0;         
         double top = 0;
         double bottom = 0;
         double min = 0;
         double max = 0;
         double inc3 = 0;
         double channelsFibo6 = 0;
         
         if (index > smaPeriod + smaPeriod + 1)
         {   
            for (int i = 1; i <= smaPeriod; i++)
            {
               ma = sma.Ago(i);            
            
               top += (Input[index - i, BarData.High] - ma) / i;                              
               if (top > max)
               {
                  max = top;
               }               

               bottom += (Input[index - i, BarData.Low] - ma) / i;
               if (bottom < min)
               {
                  min = bottom;
               }
            }
            
            inc3 = (max - min) * 0.5;

            for (int i = 0; i < smaPeriod; i ++)
            {
               channelsFibo6 += sma.Ago(i) - inc3;
            }
            channelsFibo6 /= smaPeriod;
         
            return channelsFibo6;
         }
         else
         {
            return double.NaN;
         }
      }
   }   
   
   public class MyStrategy : Strategy
   {
      [Parameter("Chanel period", "ChannelsFibo")]
      int SMAPeriod = 55;
      
      public override void OnStrategyStart()
      {      
         SMA sma = new SMA(Bars, SMAPeriod);

         ChannelsFibo channelsFibo = new ChannelsFibo(Bars, sma, SMAPeriod);
         channelsFibo.Color = Color.White;
         Draw(channelsFibo, 0);
            
         ChannelsFibo1 channelsFibo1 = new ChannelsFibo1(Bars, sma, SMAPeriod);
         channelsFibo1.Color = Color.Aqua;
         Draw(channelsFibo1, 0);
   
         ChannelsFibo2 channelsFibo2 = new ChannelsFibo2(Bars, sma, SMAPeriod);
         channelsFibo2.Color = Color.Blue;
         Draw(channelsFibo2, 0);
      
         ChannelsFibo3 channelsFibo3 = new ChannelsFibo3(Bars, sma, SMAPeriod);
         channelsFibo3.Color = Color.BlueViolet;
         Draw(channelsFibo3, 0);      

         ChannelsFibo4 channelsFibo4 = new ChannelsFibo4(Bars, sma, SMAPeriod);
         channelsFibo4.Color = Color.Tomato;
         Draw(channelsFibo4, 0);
         
         ChannelsFibo5 channelsFibo5 = new ChannelsFibo5(Bars, sma, SMAPeriod);
         channelsFibo5.Color = Color.Red;
         Draw(channelsFibo5, 0);   

         ChannelsFibo6 channelsFibo6 = new ChannelsFibo6(Bars, sma, SMAPeriod);
         channelsFibo6.Color = Color.IndianRed;
         Draw(channelsFibo6, 0);            
      }

      public override void OnBar(Bar bar)
      {
      }
   }
}


Regards
MaRCHeW


Attachments:
ChanelsFibo.png
ChanelsFibo.png [ 21.41 KiB | Viewed 3027 times ]

_________________
"Your worst day with OpenQuant is better than your best day with most of the other stuff."
Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 2 guests


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