Three EMA cross cBot
Three EMA cross cBot
06 Nov 2016, 18:46
Hello Guys!
Unfortunately, I am not a programmer but I would like to have a algo which does the following:
If 3 moving averages cross (fast and medium crosses slow from the bottom), then it opens a long position.
If 3 moving averages cross (fast and medium crosses slow from the top), then it opens a short position.
I wouldn't need anything just this.
Is there anyone who could help me?
Replies
leonardohurtado
22 Jan 2020, 18:41
RE:
lucian said:
Start with this code:
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class EMACross_RSI : Robot { [Parameter("Source")] public DataSeries SourceSeries { get; set; } [Parameter("Label", DefaultValue = "EMA")] public string label { get; set; } [Parameter("Slow Periods", DefaultValue = 30)] public int SlowPeriods { get; set; } [Parameter("Medium Periods", DefaultValue = 12)] public int MediumPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 5)] public int FastPeriods { get; set; } [Parameter("Stop Loss", DefaultValue = 10)] public int SL { get; set; } [Parameter("Take Profit", DefaultValue = 10)] public double TP { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private ExponentialMovingAverage slowMa; private ExponentialMovingAverage mediumMa; private ExponentialMovingAverage fastMa; protected override void OnStart() { fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods); mediumMa = Indicators.ExponentialMovingAverage(SourceSeries, MediumPeriods); slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods); } protected override void OnBar() { int index = MarketSeries.OpenTime.Count - 2; if ((fastMa.Result[index] > slowMa.Result[index]) && (mediumMa.Result[index] > slowMa.Result[index]) && (fastMa.Result[index - 1] < slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] < slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP); } else if ((fastMa.Result[index] < slowMa.Result[index]) && (mediumMa.Result[index] < slowMa.Result[index]) && (fastMa.Result[index - 1] > slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] > slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP); } } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }Also you can download 3xEMA Indicator
Hello Lucian,
Thanks a lot for this coding, I wanted to ask you if there is a way of making it so it only takes 1 position at a time? Meaning, it will close the current position when the opposite signal happens.
I am not a coder, so if you could help me that would be super kind and appreciated.
Warm regards, Leonardo.
@leonardohurtado
netmstnet
27 Jan 2020, 12:10
RE: RE:
leonardohurtado said:
lucian said:
Start with this code:
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class EMACross_RSI : Robot { [Parameter("Source")] public DataSeries SourceSeries { get; set; } [Parameter("Label", DefaultValue = "EMA")] public string label { get; set; } [Parameter("Slow Periods", DefaultValue = 30)] public int SlowPeriods { get; set; } [Parameter("Medium Periods", DefaultValue = 12)] public int MediumPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 5)] public int FastPeriods { get; set; } [Parameter("Stop Loss", DefaultValue = 10)] public int SL { get; set; } [Parameter("Take Profit", DefaultValue = 10)] public double TP { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private ExponentialMovingAverage slowMa; private ExponentialMovingAverage mediumMa; private ExponentialMovingAverage fastMa; protected override void OnStart() { fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods); mediumMa = Indicators.ExponentialMovingAverage(SourceSeries, MediumPeriods); slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods); } protected override void OnBar() { int index = MarketSeries.OpenTime.Count - 2; if ((fastMa.Result[index] > slowMa.Result[index]) && (mediumMa.Result[index] > slowMa.Result[index]) && (fastMa.Result[index - 1] < slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] < slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP); } else if ((fastMa.Result[index] < slowMa.Result[index]) && (mediumMa.Result[index] < slowMa.Result[index]) && (fastMa.Result[index - 1] > slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] > slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP); } } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }Also you can download 3xEMA Indicator
Hello Lucian,
Thanks a lot for this coding, I wanted to ask you if there is a way of making it so it only takes 1 position at a time? Meaning, it will close the current position when the opposite signal happens.
I am not a coder, so if you could help me that would be super kind and appreciated.
Warm regards, Leonardo.
Try this:
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class EMACross_RSI : Robot
{
[Parameter("Source")]
public DataSeries SourceSeries { get; set; }
[Parameter("Label", DefaultValue = "EMA")]
public string label { get; set; }
[Parameter("Slow Periods", DefaultValue = 30)]
public int SlowPeriods { get; set; }
[Parameter("Medium Periods", DefaultValue = 12)]
public int MediumPeriods { get; set; }
[Parameter("Fast Periods", DefaultValue = 5)]
public int FastPeriods { get; set; }
[Parameter("Stop Loss", DefaultValue = 10)]
public int SL { get; set; }
[Parameter("Take Profit", DefaultValue = 10)]
public double TP { get; set; }
[Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }
private ExponentialMovingAverage slowMa;
private ExponentialMovingAverage mediumMa;
private ExponentialMovingAverage fastMa;
protected override void OnStart()
{
fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods);
mediumMa = Indicators.ExponentialMovingAverage(SourceSeries, MediumPeriods);
slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods);
}
protected override void OnBar()
{
int index = MarketSeries.OpenTime.Count - 2;
var longPosition = Positions.Find(label, SymbolName, TradeType.Buy);
var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell);
if ((fastMa.Result[index] > slowMa.Result[index]) && (mediumMa.Result[index] > slowMa.Result[index]) && (fastMa.Result[index - 1] < slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] < slowMa.Result[index - 1]) && shortPosition == null)
{
if (longPosition != null)
ClosePosition(longPosition);
ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP);
}
else if ((fastMa.Result[index] < slowMa.Result[index]) && (mediumMa.Result[index] < slowMa.Result[index]) && (fastMa.Result[index - 1] > slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] > slowMa.Result[index - 1]) && longPosition == null)
{
if (shortPosition != null)
ClosePosition(shortPosition);
ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP);
}
}
private long VolumeInUnits
{
get { return Symbol.QuantityToVolume(Quantity); }
}
}
}
@netmstnet
leonardohurtado
27 Jan 2020, 22:32
RE: RE: RE:
netmstnet said:
leonardohurtado said:
lucian said:
Start with this code:
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class EMACross_RSI : Robot { [Parameter("Source")] public DataSeries SourceSeries { get; set; } [Parameter("Label", DefaultValue = "EMA")] public string label { get; set; } [Parameter("Slow Periods", DefaultValue = 30)] public int SlowPeriods { get; set; } [Parameter("Medium Periods", DefaultValue = 12)] public int MediumPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 5)] public int FastPeriods { get; set; } [Parameter("Stop Loss", DefaultValue = 10)] public int SL { get; set; } [Parameter("Take Profit", DefaultValue = 10)] public double TP { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private ExponentialMovingAverage slowMa; private ExponentialMovingAverage mediumMa; private ExponentialMovingAverage fastMa; protected override void OnStart() { fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods); mediumMa = Indicators.ExponentialMovingAverage(SourceSeries, MediumPeriods); slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods); } protected override void OnBar() { int index = MarketSeries.OpenTime.Count - 2; if ((fastMa.Result[index] > slowMa.Result[index]) && (mediumMa.Result[index] > slowMa.Result[index]) && (fastMa.Result[index - 1] < slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] < slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP); } else if ((fastMa.Result[index] < slowMa.Result[index]) && (mediumMa.Result[index] < slowMa.Result[index]) && (fastMa.Result[index - 1] > slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] > slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP); } } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }Also you can download 3xEMA Indicator
Hello Lucian,
Thanks a lot for this coding, I wanted to ask you if there is a way of making it so it only takes 1 position at a time? Meaning, it will close the current position when the opposite signal happens.
I am not a coder, so if you could help me that would be super kind and appreciated.
Warm regards, Leonardo.
Try this:
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class EMACross_RSI : Robot { [Parameter("Source")] public DataSeries SourceSeries { get; set; } [Parameter("Label", DefaultValue = "EMA")] public string label { get; set; } [Parameter("Slow Periods", DefaultValue = 30)] public int SlowPeriods { get; set; } [Parameter("Medium Periods", DefaultValue = 12)] public int MediumPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 5)] public int FastPeriods { get; set; } [Parameter("Stop Loss", DefaultValue = 10)] public int SL { get; set; } [Parameter("Take Profit", DefaultValue = 10)] public double TP { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private ExponentialMovingAverage slowMa; private ExponentialMovingAverage mediumMa; private ExponentialMovingAverage fastMa; protected override void OnStart() { fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods); mediumMa = Indicators.ExponentialMovingAverage(SourceSeries, MediumPeriods); slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods); } protected override void OnBar() { int index = MarketSeries.OpenTime.Count - 2; var longPosition = Positions.Find(label, SymbolName, TradeType.Buy); var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell); if ((fastMa.Result[index] > slowMa.Result[index]) && (mediumMa.Result[index] > slowMa.Result[index]) && (fastMa.Result[index - 1] < slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] < slowMa.Result[index - 1]) && shortPosition == null) { if (longPosition != null) ClosePosition(longPosition); ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP); } else if ((fastMa.Result[index] < slowMa.Result[index]) && (mediumMa.Result[index] < slowMa.Result[index]) && (fastMa.Result[index - 1] > slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] > slowMa.Result[index - 1]) && longPosition == null) { if (shortPosition != null) ClosePosition(shortPosition); ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP); } } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }
This is exactly what I was looking for, thank you so much!
Have a good one, cheers.
Leonardo.
@leonardohurtado
Emilio90
06 Dec 2020, 22:43
( Updated at: 07 Dec 2020, 01:45 )
RE: RE: RE: RE:
leonardohurtado said:
netmstnet said:
leonardohurtado said:
lucian said:
Start with this code:
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class EMACross_RSI : Robot { [Parameter("Source")] public DataSeries SourceSeries { get; set; } [Parameter("Label", DefaultValue = "EMA")] public string label { get; set; } [Parameter("Slow Periods", DefaultValue = 30)] public int SlowPeriods { get; set; } [Parameter("Medium Periods", DefaultValue = 12)] public int MediumPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 5)] public int FastPeriods { get; set; } [Parameter("Stop Loss", DefaultValue = 10)] public int SL { get; set; } [Parameter("Take Profit", DefaultValue = 10)] public double TP { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private ExponentialMovingAverage slowMa; private ExponentialMovingAverage mediumMa; private ExponentialMovingAverage fastMa; protected override void OnStart() { fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods); mediumMa = Indicators.ExponentialMovingAverage(SourceSeries, MediumPeriods); slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods); } protected override void OnBar() { int index = MarketSeries.OpenTime.Count - 2; if ((fastMa.Result[index] > slowMa.Result[index]) && (mediumMa.Result[index] > slowMa.Result[index]) && (fastMa.Result[index - 1] < slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] < slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP); } else if ((fastMa.Result[index] < slowMa.Result[index]) && (mediumMa.Result[index] < slowMa.Result[index]) && (fastMa.Result[index - 1] > slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] > slowMa.Result[index - 1])) { ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP); } } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }Also you can download 3xEMA Indicator
Hello Lucian,
Thanks a lot for this coding, I wanted to ask you if there is a way of making it so it only takes 1 position at a time? Meaning, it will close the current position when the opposite signal happens.
I am not a coder, so if you could help me that would be super kind and appreciated.
Warm regards, Leonardo.
Try this:
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class EMACross_RSI : Robot { [Parameter("Source")] public DataSeries SourceSeries { get; set; } [Parameter("Label", DefaultValue = "EMA")] public string label { get; set; } [Parameter("Slow Periods", DefaultValue = 30)] public int SlowPeriods { get; set; } [Parameter("Medium Periods", DefaultValue = 12)] public int MediumPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 5)] public int FastPeriods { get; set; } [Parameter("Stop Loss", DefaultValue = 10)] public int SL { get; set; } [Parameter("Take Profit", DefaultValue = 10)] public double TP { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } private ExponentialMovingAverage slowMa; private ExponentialMovingAverage mediumMa; private ExponentialMovingAverage fastMa; protected override void OnStart() { fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods); mediumMa = Indicators.ExponentialMovingAverage(SourceSeries, MediumPeriods); slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods); } protected override void OnBar() { int index = MarketSeries.OpenTime.Count - 2; var longPosition = Positions.Find(label, SymbolName, TradeType.Buy); var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell); if ((fastMa.Result[index] > slowMa.Result[index]) && (mediumMa.Result[index] > slowMa.Result[index]) && (fastMa.Result[index - 1] < slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] < slowMa.Result[index - 1]) && shortPosition == null) { if (longPosition != null) ClosePosition(longPosition); ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP); } else if ((fastMa.Result[index] < slowMa.Result[index]) && (mediumMa.Result[index] < slowMa.Result[index]) && (fastMa.Result[index - 1] > slowMa.Result[index - 1]) && (mediumMa.Result[index - 1] > slowMa.Result[index - 1]) && longPosition == null) { if (shortPosition != null) ClosePosition(shortPosition); ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP); } } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }
This is exactly what I was looking for, thank you so much!
Have a good one, cheers.
Leonardo.
is it possible add trailing stop and break even?
@Emilio90
firemyst
19 Dec 2020, 15:36
For the trailing stop, change the ExecuteMarketOrder lines to have the following:
ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP, null, true, null);
and
ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP, null, true, null);
@firemyst
vincenzo.dal.mare
23 Dec 2020, 12:38
RE:
firemyst said:
For the trailing stop, change the ExecuteMarketOrder lines to have the following:
ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, SL, TP, null, true, null);
and
ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, SL, TP, null, true, null);
Hello guys,
how can i enter the jurik moving average?
in the list of those available it does not appear even though I have downloaded it in my indicators.
can you give me a hand?
thank you all, you are fantastic.
@vincenzo.dal.mare
... Deleted by UFO ...