fxtradersystems's avatar
fxtradersystems
Developing and publishing code at https://fxtradersystems.com
fxtradersystems's avatar

Info

Username:fxtradersystems
Name:fxtradersystems
Member since: 10 Sep 2020

About

A team of graduates and programmers out of Oxford Uni.

Signature

Developing and publishing code at https://fxtradersystems.com

Last Algorithm Comments

@Renko Range:  10 Dec 2020, 14:31


Changelog 1: - Added the options to draw wicks - Added the option to cut wicks at the top / bottom of the candle depending on whether it was an up / down bar

@DrawPriceMove:  11 Oct 2020, 00:36


@lookformoneyy got in contact, and asked for a change. Have updated to more closely resemble the photos they sent. Will continue to update till @lookformoneyy is happy. (Have not implemented up / down color changes yet)

Last Forum Posts

@How to Remove Plots of Lines a Number of Bars Back:  12 Oct 2020, 18:21


Jobauma said:

I want "[ Index - 55 ]" of an MA to be removed, so there are only 55 MA plots ( all the time ), from the last bar to 55 bars back. :)

Hi Jobauma,

We built that for you here: https://ctrader.com/algos/indicators/show/2432

If you need any dev work done, then we are available at development@fxtradersystems.com

Or you can get us at our website: fxtradersystems.com

Cheers,

Sam

@different tf:  12 Oct 2020, 18:03


luca.tocchi said:

hi I would like that to whatever tf the bot works, the zig zag prints the monthly tf values

how can I do?

thanks 

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Botdellasvolta : Robot
    {
        [Parameter("Source")]
        public DataSeries Source { get; set; }

        [Parameter("Stop Loss", Group = "Protection", DefaultValue = 0)]
        public int StopLoss { get; set; }

        [Parameter("Take Profit", Group = "Protection", DefaultValue = 5)]
        public int TakeProfit { get; set; }

        [Parameter(DefaultValue = 12)]
        public int Depth { get; set; }

        [Parameter(DefaultValue = 5)]
        public int Deviation { get; set; }

        [Parameter(DefaultValue = 3)]
        public int BackStep { get; set; }

        [Output("ZigZag", Color = Colors.OrangeRed)]
        public IndicatorDataSeries Result { get; set; }

        private ZigZag zigzag;

        protected override void OnStart()
        {
            MarketSeries data = MarketData.GetSeries(TimeFrame.Monthly);
            zigzag = Indicators.GetIndicator<ZigZag>(Depth, Deviation, BackStep);
        }

        double GetZigZagValue(DataSeries dataSeries, int indexFromEnd)
        {
            for (var i = MarketSeries.Close.Count - 1; i >= 0; i--)
            {
                if (!double.IsNaN(zigzag.Result[i]))
                {
                    if (indexFromEnd == 0)
                        return zigzag.Result[i];
                    indexFromEnd--;
                }
            }
            return double.NaN;
        }

        protected override void OnTick()
        {
            var lastValue = GetZigZagValue(zigzag.Result, 0);
            var previousValue = GetZigZagValue(zigzag.Result, 1);

            Print(lastValue);
            Print(previousValue);
        }
    }
}

This may be a little overcomplicated, but you could modify the ZigZag indicator to take a timeframe parameter as input.

You can then create your own custom bars by using: customBars = MarketData.GetBars(Timeframe);

In OnCalculate() you can then find the corresponding index of the current bar with the custom timeframe bar using:
int customIndex = customBars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);

You can then have:

Result[index] = function(customIndex);

You have to be careful though if the function relies on the Result (ie. if you're using a moving average of the Result for another output), as it starts to generate an incorrect series.

Let us know if you need any further help or development work done @ fxtradersystems.com/support/ :)

Sam

fxtradersystems.com

@Shading inbetween indicator lines:  12 Oct 2020, 17:33


meiko.allmis said:

JS15 said:

Shading inbetween indicator lines. eg. having a shaded area between the top and bottom Bollinger Band or 2 moving averages.
Thanks

Would be happy to have this feature

This is possible by adding the [Cloud()] attribute before the [Indicator()] attribute.

I've built the request here: https://ctrader.com/algos/indicators/show/2431

If you need any dev work done in the future, we're happy to help.

Contactable via both: fxtradersystems.com/support/ and via email at development@fxtradersystems.com

Cheers,

Sam

@cbot help hoping for a good samaritain:  10 Oct 2020, 22:39


linton.nkambule said:

I'd like some code to create a bot that does some simple things:

1. opens positions based on the previous candles direction at the open of the new candle. ( would be nice to have an option to invert the position)

2. Adds a stop loss of a certain percentage which can be passed 100% of the previous candles high or low.

3. sets a take profit of the same number of pips as the stop loss. 

We saw the request, and built something for you now:

https://ctrader.com/algos/cbots/show/2424

Was a nice bit of coding to round off our Saturday.

If you fancy anything else built, you can fire us a message at development@fxtradersystems.com, or get in contact at: fxtradersystems.com/support/

@Looking for indicators.:  10 Oct 2020, 22:13


lookformoneyy said:

HI traders

I am looking for an indicator to draw the movement of the price after the closing and opening of candles.

I showing this for example:

this is not Zigzag . How is for cTrader somethink indicator ?

I will be grateful for pointing such an indicator on the ctrader :)

No worries, we heard your request, and just whipped up this for you:

https://ctrader.com/algos/indicators/show/2423

Let us know how you find it :)

If you want any further development work done, then you can email us at development@fxtradersystems.com or get in contact via fxtradersystems.com/support/

@Calculate Break Even:  10 Oct 2020, 19:25


firemyst said:

I believe your calculations are incorrect.

For starters, you're using BID price everywhere. On Long/buy positions, you get the ASK price, not the BID price.

In your calculation, your value could be negative as a result. For instance, assume ASK is 5, BID is 4, with a 1 pip spread. Thus your entry would be 5 (because the ASK could have been 5), so 4 - (5 + 1) = -2. For a long/buy position, the break even should be above the ASK price (obviously) and not below the BID price.

Second, your calculation (position.EntryPrice + Symbol.Spread) is adding a price value plus pips. You need to add price value plus the equivalent value in pips, so it should be:

(position.EntryPrice + (Symbol.Spread * Symbol.PipSize))

Hope that helps :-)

Hi @firemyst,

You were right, particularly with the ASK / BID relationship - this also means (we believe) that we don't need to include it in the distance calculation, as we can actually just get the current ASK/BID.

We've tested the following code in backtest on AUDJPY m30, both buy and sell positions, with lot sizes of 0.01, 1, and 10, and with spreads of 1 pip and 30 pips. It seems to work as intended, though for some trades falls 0.4-0.8 pips short of break even (resulting in a loss of £4 on a 10 lot trade). You could modify it to put an additional buffer of one pip if desired.

The only thing it hasn't come up against is commission and swaps in testing, but I believe these are both in the NetProfit figure (?) so it should still hold true.

Let us know if you find any more errors and we'd be happy to correct :)

private double CalculateBE(Position position)
        {
            // Breakeven is the entry price, plus proportional costs.
            double costFraction = (position.GrossProfit - position.NetProfit) / position.GrossProfit;

            double priceDistance;
            double bePriceLevel;

            if (position.TradeType == TradeType.Sell)
            {
                // Get the ask price, as you're trying to buy back
                priceDistance = Math.Abs(Ask - position.EntryPrice);
                bePriceLevel = position.EntryPrice - priceDistance * costFraction;
            }
            else
            {
                // Get the bid price as you're trying to sell back
                priceDistance = Math.Abs(Bid - position.EntryPrice);
                bePriceLevel = position.EntryPrice + priceDistance * costFraction;
            }

            return bePriceLevel;
        }

Made by fxtradersystems.com

@indicator with extern data:  09 Oct 2020, 15:06


fxtradersystems said:

Hi all,

Seems like a more efficient way to store information would be to initalise and load a key-value pair dictionary Dictionary<DateTime, double> such that you could search for the appropriate datetime amongst the keys, and return the double value for that index.

As we're using daily data, you could possibly get away with finding the date using:

DateTime currentDate = Bars.OpenTimes[index] - in the Calculate() method.

I am unsure as to whether this yet introduces a look-ahead bias (ie. it returns data from later that day, whereas it should return data from the day before); and it almost certainly won't be able to handle data not on a daily TF.

I whipped up some code for the idea here. Let me know if it works / any errors (particularly on the look-ahead bias), and I can update.

Warning: currently has to be stored exactly in the csv format: date;double (newline). @xabbu, if you are happy to send the CSV, I can tailor this for you.

using System;
using System.IO;
using System.Collections.Generic;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System.Globalization;

namespace cAlgo
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class DailyCustomIndi : Indicator
    {
        [Parameter("Path to CSV:")]
        public string Path { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }


        // Set up a dictionary to hold the dates and values
        Dictionary<DateTime, double> keyValuePairs = new Dictionary<DateTime, double>();
        int count;

        protected override void Initialize()
        {
            keyValuePairs = new Dictionary<DateTime, double>();
            count = 0;
            Print("keyValuePairs initialised");

            using (var reader = new StreamReader(Path))
            {
                Print("Streamer initialised");
                while (!reader.EndOfStream)
                {
                    // Use the reader to read in the lines
                    var line = reader.ReadLine();
                    var values = line.Split(';');

                    // Split out dates and values, and then convert them to datetime and double
                    string stringDate = values[0];
                    string stringIndi = values[1];

                    if (count != 0)
                    {
                        DateTime date = Convert.ToDateTime(stringDate, CultureInfo.InvariantCulture);
                        DateTime shortDate = CompactDate(date);
                        double doubleIndi = Double.Parse(stringIndi);

                        Print(shortDate.ToString() + ":" + doubleIndi.ToString());

                        // Add to dictionary
                        keyValuePairs.Add(shortDate, doubleIndi);
                    }
                    else
                    {
                        count = 1;
                    }

                }
                Print("Streamer finished");

            }
        }

        public override void Calculate(int index)
        {
            // Get the datetime of the current bar (at Index)
            DateTime indexDateTime = Bars.OpenTimes[index];
            DateTime shortIndexDate = CompactDate(indexDateTime);
            double indexResult;

            // Find the appropriate dateTime in the dictionary and then add to result:
            bool findSuccessful = keyValuePairs.TryGetValue(shortIndexDate, out indexResult);
            Print(shortIndexDate.ToString() + ": " + findSuccessful);

            if (findSuccessful)
            {
                Result[index] = indexResult;
            }
            else
            {
                Result[index] = double.NaN;
            }

        }

        public DateTime CompactDate(DateTime longDate)
        {
            DateTime shortDate = new DateTime(longDate.Year, longDate.Month, longDate.Day);
            return shortDate;
        }
    }
}

Hi all,

I updated this^ comment, so that this code now works.

> Changed access permissions to full so that it can access the csv (you can also use FileSystem).
> Added a function to cut down the DateTimes so that the Bars.OpenTimes and dictionary keys were in the same format.
> Added a count = 0 to avoid reading the csv titles as input data (hacky I know, but works).

To be clear: ^that comment now gives output from the csv snippet xabbu sent me.

Hope this is useful!

Cheers,

Sam (fxtradersystems.com)

@indicator with extern data:  09 Oct 2020, 13:09


Hi all,

Seems like a more efficient way to store information would be to initalise and load a key-value pair dictionary Dictionary<DateTime, double> such that you could search for the appropriate datetime amongst the keys, and return the double value for that index.

As we're using daily data, you could possibly get away with finding the date using:

DateTime currentDate = Bars.OpenTimes[index] - in the Calculate() method.

I am unsure as to whether this yet introduces a look-ahead bias (ie. it returns data from later that day, whereas it should return data from the day before); and it almost certainly won't be able to handle data not on a daily TF.

I whipped up some code for the idea here. Let me know if it works / any errors (particularly on the look-ahead bias), and I can update.

Warning: currently has to be stored exactly in the csv format: date;double (newline). @xabbu, if you are happy to send the CSV, I can tailor this for you.

using System;
using System.IO;
using System.Collections.Generic;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System.Globalization;

namespace cAlgo
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class DailyCustomIndi : Indicator
    {
        [Parameter("Path to CSV:")]
        public string Path { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }


        // Set up a dictionary to hold the dates and values
        Dictionary<DateTime, double> keyValuePairs = new Dictionary<DateTime, double>();
        int count;

        protected override void Initialize()
        {
            keyValuePairs = new Dictionary<DateTime, double>();
            count = 0;
            Print("keyValuePairs initialised");

            using (var reader = new StreamReader(Path))
            {
                Print("Streamer initialised");
                while (!reader.EndOfStream)
                {
                    // Use the reader to read in the lines
                    var line = reader.ReadLine();
                    var values = line.Split(';');

                    // Split out dates and values, and then convert them to datetime and double
                    string stringDate = values[0];
                    string stringIndi = values[1];

                    if (count != 0)
                    {
                        DateTime date = Convert.ToDateTime(stringDate, CultureInfo.InvariantCulture);
                        DateTime shortDate = CompactDate(date);
                        double doubleIndi = Double.Parse(stringIndi);

                        Print(shortDate.ToString() + ":" + doubleIndi.ToString());

                        // Add to dictionary
                        keyValuePairs.Add(shortDate, doubleIndi);
                    }
                    else
                    {
                        count = 1;
                    }

                }
                Print("Streamer finished");

            }
        }

        public override void Calculate(int index)
        {
            // Get the datetime of the current bar (at Index)
            DateTime indexDateTime = Bars.OpenTimes[index];
            DateTime shortIndexDate = CompactDate(indexDateTime);
            double indexResult;

            // Find the appropriate dateTime in the dictionary and then add to result:
            bool findSuccessful = keyValuePairs.TryGetValue(shortIndexDate, out indexResult);
            Print(shortIndexDate.ToString() + ": " + findSuccessful);

            if (findSuccessful)
            {
                Result[index] = indexResult;
            }
            else
            {
                Result[index] = double.NaN;
            }

        }

        public DateTime CompactDate(DateTime longDate)
        {
            DateTime shortDate = new DateTime(longDate.Year, longDate.Month, longDate.Day);
            return shortDate;
        }
    }
}

@Calculate Break Even:  06 Oct 2020, 13:46


jeex said:

Cerunnos, that's why i called in some help.

Somehow my math brain becomes blind for simple calculations. I'm completely lost. Maybe a short vacation will help.

double totalCosts = Symbol.Spread + (((position.GrossProfit - position.NetProfit) / position.Volume / Symbol.PipValue)*2);

The way I thought about it, was that the costs were fixed for the trade (now NetProfit includes both way commisions), but the profit fluctuated. You could therefore calculate the fixed cost as a proportionate distance of the Bid from the entry price.

My calculations look like:

// Calculate the distance of the trade, less the spread.
double distance = Bid - (position.EntryPrice + Symbol.Spread);
// Figure out how much the costs of the trade are versus the Gross profit.
double cost_fraction = (position.GrossProfit - position.NetProfit) / position.GrossProfit;
// The gross profit is spread out over the entire distance of the trade from the entry price
// therefore add this fraction of the distance on to the entry price.
double breakEven = position.EntryPrice + cost_fraction * distance;

// Equivalently for a sell position:
double distance = (position.EntryPrice - Symbol.Spread) - Bid;
double cost_fraction = (position.GrossProfit - position.NetProfit) / position.GrossProfit;
double breakEven = position.EntryPrice - cost_fraction * distance;
Notification Publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section you may use the Copyright Infringement Notification form to submit a claim.
paid  04 Jan 2021
Telegram Alerts for Indicators works with any data series or indicator values, to inform you of an indicator cross via Telegram, email or on-screen pop-up. Compatible with any data series, such as RSI, MACD and even custom built indicators. Initially only 10 licenses are being released at:  fxtradersystems.com/product/telegram-alerts-for-indicators/   1st: Attach the indicator to an on-chart indicator, and select your preferred settings   2nd: Wait for an on-screen pop-up, email or Telegram    
free  16 Dec 2020
The original aim was to use this as a stoploss that rapidly closes the gap on price if there was a potential reversal. The Waddah Attah Adaptive MA (WAMA) uses the explosion values from the Waddah Attah as an adaptive parameter that allows us to filter the price series using the smoothing of moving averages.   To see the projects (indicators, cBots and data science analysis) we're currently working on, you can join our Telegram chat here: t.me/quantFXAlgos We also have a slight ask from people who download: we're currently looking to get renko shadows / wicks / range / tails introduced as a feature in cTrader. You can help them be introduced by voting in the cTrader suggestions forum for this post: https://ctrader.com/forum/suggestions/29955 Cheers all     Shown here are: WAMA in uncut Cyan. 2-Period EMA in Dashed Cyan 30-Period EMA in Dashed Purple Parameters: Fast MA Period: The period of the Fast MA that the ROC MA will follow Slow MA Period: The period of the Slow MA that the ROC MA will follow MA Type: The type of fast and slow MA to follow. MA To Follow: When alpha is large (in this case, when absolute momentum is large) this will be the MA that the ROC MA will follow closest. MACD Long Cycle, MACD Short Cycle: The two traditional MACD parameters that are used to determine the WA Explosion. WA Scale Type: Max, or Odds. Max scales alpha (the adaptive parameter) into the [0,1] range by using the input from ROC Max (below). Odds scales alpha using alpha = alpha / (alpha + 1). WA Max: The Maximum WA Explosion you expect in the period, any values large than this are scaled so that alpha = 1. WA-MA Balance Type: Alpha, InvAlpha, Manual. This controls the smoothing between new values and previous values. For manual, see below. If Alpha is selected, then when alpha is large new results will be favoured more heavily. If InvAlpha is selected, then when Alpha is large, the previous value is weighted more heavily (a smoother MA). WA-MA Balance: If Manual is selected for the balance type, then this is the smoothing between the new result and old result. Values close to 1 favour the new result and give a less-smooth MA.    
CSV Data Writer
  0
  0
  404
free  16 Dec 2020
Currently this is how we perform backtesting and analysis of renko and range strategies in cTrader. We use this indicator to download the data prior to analysis in Python: To see the projects (indicators, cBots and data science analysis) we're currently working on, you can join our Telegram chat here: t.me/quantFXAlgos We also have a slight ask from people who download: we're currently looking to get renko shadows / wicks / range / tails introduced as a feature in cTrader. You can help them be introduced by voting in the cTrader suggestions forum for this post: https://ctrader.com/forum/suggestions/29955 Cheers all     This Indi Does require FullAccess rights, but only so it can save a csv file of the data. Output: A comma delimited csv file with Open Time, OHLC Data, and data of up to 3 indicator series for all the loaded bars on the chart (or loaded to the input date). The indicator will automatically save the file to desktop. Inputs: Filename: The name that you wish the CSV file to have (eg. "EURGBP_Renko10"). Make sure this doesn't include punctuation like fullstops and commas that Windows won't allow in file names. Start Writing: A boolean parameter just in case you accidentally click okay before you were ready to. False will prevent a csv from being saved allowing you to go back in and edit parameters. Load To: The date that you wish to have data going back to in the format dd/mm/yyy eg. 01/01/2020 will save the maximum of: bars alread loaded, or bars back to 01/01/2020. Source (1,2,3): These are the Source Series and the Names that you want them to have in the CSV. Make sure not to include commas in the source names else they'll be scattered over the columns (as it's a comma delimited csv).
ROC Adaptive MA
  0
  0
  480
free  14 Dec 2020
At FXTS, we've been working on a selection of adaptive moving averages over the last week to be released in succession. These can be used for crossovers, or for trailing stoplosses in cBots (or preferred use). We've also set up a new Telegram group for support of our indicators and robots, and where we aim to discuss quantative strategies for a large range of assets: t.me/quantFXAlgos   Shown here are: ROC-12 Adaptive MA in Lime 2-Period EMA in Cyan 30-Period EMA in Purple   Idea: Alpha (the adaptive parameter) is calculated from the Absolute value of Price ROC, as this is a measure of current momentum. The ROC MA is then a weighted average of the fast MA, the slowMA and it's previous result (depending on the parameters options below).   Parameters: Fast MA Period: The period of the Fast MA that the ROC MA will follow Slow MA Period: The period of the Slow MA that the ROC MA will follow MA Type: The type of fast and slow MA to follow. MA To Follow: When alpha is large (in this case, when absolute momentum is large) this will be the MA that the ROC MA will follow closest. ROC Period: The period to calculate the Price ROC over. ROC Scale Type: Max, or Odds. Max scales alpha into the [0,1] range by using the input from ROC Max (below). Odds scales alpha using alpha = alpha / (alpha + 1). ROC Max: The Maximum ROC you expect in the period, any values large than this are scaled so that alpha = 1. ROC-MA Balance Type: Alpha, InvAlpha, Manual. This controls the smoothing between new values and previous values. For manual, see below. If Alpha is selected, then when alpha is large new results will be favoured more heavily. If InvAlpha is selected, then when Alpha is large, the previous value is weighted more heavily (a smoother MA). ROC-MA Balance: If Manual is selected for the balance type, then this is the smoothing between the new result and old result. Values close to 1 favour the new result and give a less-smooth MA. Any questions, then you can comment below, or join the new Telegram group: t.me/quantFXAlgos
Renko Range
  1
  0
  722
free  10 Dec 2020
  The Renko Range indicator fetches the high-low watermarks of each renko bar. It's calculated using the values of the M1 bars between the open and close times of the renko bar, and so you will see odd results on volatile pairs who complete renko bars in under 1 minute. The "Load to date" parameter is in the form DD/MM/YYYY and allows you to load more M1 bars to extend how far back the high-low dots load without scrolling backwards along your chart. The "Draw as wicks?" option means that the indicator will fill in the gaps with chart trend lines like proper wicks. The "Cut odd points?" option automatically sets the (high / low) of a completed (up / down) renko bar as the (top / bottom) of the bar respectively.   Any requests for indicators, you can email: development@fxtradersystems.com Or can reach out via Telegram at: https://t.me/samwhitefx  
Day of Week Separator
  0
  0
  690
free  24 Nov 2020
  A simple indicator (built on request) that separates out the days of the week on timeframes below the daily chart. At FXTS we can do dev work on request, just get in contact via: fxtradersystems.com/support/  
Pivot Channels
  0
  0
  902
free  19 Nov 2020
This is the building block indicator for this: MTF Pivot Channels Indicator | Algorithmic Forex Trading | cTrader...  It will help you view the pivot lines (support, resistance, pivot, high, low) from a higher time frame on your chart. Find us at https://fxtradersystems.com
MTF Pivot Channels
  0
  0
  583
free  19 Nov 2020
This requires the Pivot Channels indicator. This allows you to plot the three support / resistance lines, as well as the pivot, and the high-low of a previous period on a lower time frame. For example, we've shown here the pivot lines and high-low from the daily chart on the H1 chart, and also the pivot lines from the H4 chart on the H1 chart. Find us at: fxtradersystems.com
free  12 Oct 2020
  Responding to forum request: https://ctrader.com/forum/indicator-support/24951 This shows only a certain number of bars of the moving average. Let us know if you find any bugs. If you need some dev work, you can contact us via development@fxtradersystems.com or via fxtradersystems.com/support/
Bollinger Band Cloud
  1
  0
  879
free  12 Oct 2020
  Responding to a forum requst on adding clouds to Bollinger Bands: https://ctrader.com/forum/suggestions/20979 If people want any development work done, you can get in contact with us at: development@fxtradersystems.com Or via the website at: fxtradersystems.com/support/
DrawPriceMove V4
  1
  0
  584
free  12 Oct 2020
  V4 is in blue - same as V3 (green) but: Flips trend direction if the bar is either an inner or outer bar to previous. Then checks the trend direction using the relationship of the current and previous high prices. Once again, let us know if there are any bugs. Find us at: fxtradersystems.com/development/
DrawPriceMove V3
  0
  0
  447
free  12 Oct 2020
  Went straight to version three. Same idea as ZigZag, but adjusts based upon high-low relationships of previous bars. If the bar is an inner bar - change trend direction. If the bar is an outer bar - go in direction of first breakout (whether that was above the previous high, or below the previous low). Else, the direction changes depending on whether the current high price exceeds or falls short of the previous bar's high. Let us know if there are any bugs. Find us at: fxtradersystems.com/services/
free  10 Oct 2020
  Developed this through a forum request. Currently limited functionality as it was a quick turn around, will only work on the daily timeframe. Takes as input a CSV file with Dates and numbers (two colums with one row of titles), and the delimiter type (here we are displaying EVZ Daily data). Depending on how people find it, we would be happy to expand its capabilities. Future pipeline could include: Functionality for more timeframes Full on EVZ pipeline for those NNFX traders out there.   Just let us know if you find any bugs, and we ccan update the source code :) You can support the team at: fxtradersystems.com/products/donate/ Or submit development requests at: fxtradersystems.com/support/ Equally, you can email: development@fxtradersystems.com
DrawPriceMove
  1
  0
  388
free  11 Oct 2020
@lookformoneyy just asked for this one on the forum (https://ctrader.com/forum/indicator-support/24945) so we did a quick bit of work. Any development projects people want doing, you can email development@fxtradersystems.com, or get in contact at: fxtradersystems.com/support/
free  10 Oct 2020
Comes with source code. This is a custom building block for handling signals generated by an Oscillator. Similarly to IndiCrossover it takes DataSeries as inputs (one for the Oscillator series, one for a high band and one for a low band). For instance, on EURUSD Daily, we have used it to manage close price breakouts from the Bollinger Bands in red. We have also used it on the Williams %R using -20 and -80 levels generated using the LevelSeries building block. Outputs: Signal: 1 on the bar where the Oscillator crosses above or below one of the two levels (high or low), 0 otherwise. SignalEnv: 1 if the Oscillator is above the high-band, -1 if below the low-band, 0 otherwise. DaysSinceLastSignal: The number of bars since the Signal was last 1.
free  10 Oct 2020
  Comes with source code. An indicator that monitors two input DataSeries for a crossover. Designed to be used as a building block in other indicators and cBots. Inputs: Bullish Series: The bullish dataseries source Bearish Series: The bearish dataseries source Outputs: Signal: Will be 1 if the bullish and bearish series have crossed within the last bar, zero otherwise. SignalEnv: 1 if the bullish series is above the bearish, -1 if the bearish is above the bullish. DaysSinceLastSignal: The number of bars since the last crossover of the series. Can be used (for example) in a moving average crossover: setting 5-day MA as the bullish series, and 10-day MA as the bearish series. When the 5-day crosses the 10-day the “Signal” output gives a value of 1 (0 otherwise), and resets the “Days Since Last Signal” attribute to zero. The SignalEnv is +1 for bullish (ie the 5-day is above the 10-day), and -1 for bearish (5-day is below the 10-day). A simple MA-crossover strategy would be to trade in the direction of the SignalEnv every time Signal is 1.
free  10 Oct 2020
  Comes with source code. The IndiFilter can be used to remove false signals from price movements, zero-cross indicators, or other dataseries. There are four modes of filtering available: Keep a running total of changes, and once the total reaches a threshold – add it all on / take it off. Keep a running total, and add on / take off once one individual change clears the threshold. As in 1, but the threshold is dynamic, based off the standard deviation of the input series. As in 2, but with a dynamic threshold.   Inputs: Source: Input series for filtering. SD Period: The period used for calculating the standard deviation of the input series SD Type: The moving average type to calculate the standard deviation. SD Method: Yes – Threshold is based on the standard deviation; No – threshold is set by operator, and is static Threshold / SD Value: The threshold value that the IndiFilter will ignore under (depending on mode). If SD Method is no, then the threshold represents raw units of the input series (eg. number of pips). If SD Method is yes, then the threshold is the number of standard deviations the series must exceed. Mode: The type of filtering to be applied (see above).   Outputs: Result: The result of the price filtering.
Warning! Executing cBots downloaded from this section may result in loss of funds. Use them at your own risk.
paid  04 Jan 2021
This cBot allows you to annotate your charts with boxes, trend lines and key levels (horizontal lines), each with their own individual comments – so that when the price touches one you get notified right away via Telegram. Initially only 5 licenses are being released at:  fxtradersystems.com/product/tl-kl-box-telegram-alerts/     1st: Activate the cBot     2nd: Draw and comment your setup   3rd: Let it run, and get notified when price touches the trend line, key level or box  
free  10 Oct 2020
Saw @linton.nkambule just wanted something nice and simple. This cBot: - Trades either against, or with, the previous candle. - Has a set SL and TP equidistant from the entry price based upon a percentage of the previous bar's range. If people want any more requests built, fire us an email at development@fxtradersystems.com, or get in contact at: fxtradersystems.com/support/