Topics
Replies
tradermatrix
19 Jan 2021, 14:46
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.FullAccess)]
public class FollowtrendcBot : Robot
{
[Parameter(DefaultValue = 1000)]
public double Volume { get; set; }
[Parameter("Stop Loss", DefaultValue = 50)]
public double StopLoss { get; set; }
[Parameter("Take Profit", DefaultValue = 60)]
public double TakeProfit { get; set; }
[Parameter("MA Type", Group = "Moving Average")]
public MovingAverageType MAType { get; set; }
[Parameter("Source", Group = "Moving Average")]
public DataSeries SourceSeries { get; set; }
[Parameter("Slow Periods", Group = "Moving Average", DefaultValue = 10)]
public int SlowPeriods { get; set; }
[Parameter("Fast Periods", Group = "Moving Average", DefaultValue = 5)]
public int FastPeriods { get; set; }
[Parameter("Source", Group = "RSI")]
public DataSeries Source { get; set; }
[Parameter("Periods", Group = "RSI", DefaultValue = 14)]
public int Periods { get; set; }
[Parameter("MACD LongCycle", DefaultValue = 26, MinValue = 1)]
public int LongCycle { get; set; }
[Parameter("MACD ShortCycle", DefaultValue = 12, MinValue = 1)]
public int ShortCycle { get; set; }
[Parameter("MACD Period", DefaultValue = 9, MinValue = 1)]
public int MACDPeriod { get; set; }
private MovingAverage slowMa;
private MovingAverage fastMa;
private MacdCrossOver _MACD;
private RelativeStrengthIndex rsi;
private const string label = "Follow trend cBot";
protected override void OnStart()
{
fastMa = Indicators.MovingAverage(SourceSeries, FastPeriods, MAType);
slowMa = Indicators.MovingAverage(SourceSeries, SlowPeriods, MAType);
rsi = Indicators.RelativeStrengthIndex(Source, Periods);
_MACD = Indicators.MacdCrossOver(LongCycle, ShortCycle, MACDPeriod);
}
protected override void OnTick()
{
var currentSlowMa = slowMa.Result.Last(0);
var currentFastMa = fastMa.Result.Last(0);
var cBotPositions = Positions.FindAll(label);
if (cBotPositions.Length >= 1)
return;
if (rsi.Result.LastValue > 50 && currentFastMa > currentSlowMa && _MACD.MACD.Last(1) > _MACD.Signal.Last(1))
{
ExecuteMarketOrder(TradeType.Buy, Symbol, Volume, label, StopLoss, TakeProfit);
}
else if (rsi.Result.LastValue < 50 && currentFastMa < currentSlowMa && _MACD.MACD.Last(1) < _MACD.Signal.Last(1))
{
ExecuteMarketOrder(TradeType.Sell, Symbol, Volume, label, StopLoss, TakeProfit);
}
}
}
}
@tradermatrix
tradermatrix
10 Nov 2020, 18:48
RE:
PanagiotisCharalampous said:
Hi tradermatrix,
Here you go
SL = Math.Round(ATR.Result.LastValue * ATRfactor / Symbol.PipSize, 1);
Best Regards,
Panagiotis
Thank you for you precious help
It works...
cordially
@tradermatrix
tradermatrix
10 Nov 2020, 14:38
RE:
PanagiotisCharalampous said:
Hi tradermatrix,
You should round the stop loss value to one decimal place before using it.
Best Regards,
Panagiotis
Thank you for your prompt response.
do you have sample code to help me.
I have already tried several methods to round off but without success.
cordially
@tradermatrix
tradermatrix
20 Jul 2020, 17:43
RE:
Thank you for your precious help, I will experiment your method and look for a solution to adapt it to my needs.
Best Regards,
@tradermatrix
tradermatrix
20 Jul 2020, 16:08
RE:
PanagiotisCharalampous said:
Hi tradermatrix,
I do not see why you cannot implement different checks with a single timer event, one for every strategy. It needs some coding but its achievable.
Best Regards,
Panagiotis
Thank you for your reply.
so I am making a mistake.
Do you have a sample code to share?
@tradermatrix
tradermatrix
20 Jul 2020, 15:11
RE:
PanagiotisCharalampous said:
Hi tradermatrix,
At the moment you can only have one instance of the Timer. You will need to implement your logic with this limitation in mind.
Best Regards,
Panagiotis
Hi Panagiotis
Thank you for your reply.
It is a shame because for example I have a robot with 14 different strategies and I am therefore obliged to keep the same deadlines for all instances.
I even think that if the timer is open on a robot, it also intervenes on another robot in operation.
The "OnTimer ()" timer should be associated with the label, this would create several instances of different timers ...otherwise the method "System.Threading.Thread.Sleep (60000 * _Interval1);" is very easy to use and works on as many desired instances but is still not compatible with backtesting or optimization.
cordially
@tradermatrix
tradermatrix
07 Feb 2020, 15:59
yes for me too, no change ..
trust the team that will solve the problem
@tradermatrix
tradermatrix
21 Jul 2019, 15:43
I have this code updated with the new references....
like that i think it's ok
good luck
using System; using cAlgo.API; using cAlgo.API.Indicators; namespace cAlgo.Robots { [Robot()] public class TreeBarsTraDerMaTriX : Robot { [Parameter("3 BARS TraDerMaTriX n°", DefaultValue = "3")] public string InstanceName { get; set; } [Parameter("Volume", DefaultValue = 10000)] public double volume { get; set; } [Parameter("SL", DefaultValue = 270)] public int SL { get; set; } [Parameter("TP", DefaultValue = 280)] public int TP { get; set; } [Parameter("Use Trail", DefaultValue = true)] public bool UseTrail { get; set; } [Parameter("Trigger (pips)", DefaultValue = 15)] public int TrailingStopTrigger { get; set; } [Parameter("Trailing (pips)", DefaultValue = 6)] public int TrailingStopStep { get; set; } protected override void OnStart() { } protected override void OnTick() { TRAIL(); } protected override void OnBar() { play(); } private void play() { int bars = MarketSeries.Close.Count - 1; int[] b_or_m = new int[3]; Print("{0},{1},{2},{3},{4}", MarketSeries.High[bars - 1], MarketSeries.High[bars - 2], MarketSeries.High[bars - 3], MarketSeries.Close.Count, MarketSeries.High[1]); if (MarketSeries.Close[bars - 1] > MarketSeries.Open[bars - 1]) b_or_m[0] = 1; else b_or_m[0] = 2; if (MarketSeries.Close[bars - 2] > MarketSeries.Open[bars - 2]) b_or_m[1] = 1; else b_or_m[1] = 2; if (MarketSeries.Close[bars - 3] > MarketSeries.Open[bars - 3]) b_or_m[2] = 1; else b_or_m[2] = 2; Print("{0},{1},{2}", b_or_m[0], b_or_m[1], b_or_m[2]); var cBotPositions = Positions.FindAll(InstanceName); if (cBotPositions.Length >= 1) return; if ((b_or_m[0] == 1) && (b_or_m[1] == 1) && (b_or_m[2] == 1)) { ExecuteMarketOrder(TradeType.Buy, SymbolName, volume, InstanceName, SL, TP); } else if ((b_or_m[0] == 2) && (b_or_m[1] == 2) && (b_or_m[2] == 2)) { ExecuteMarketOrder(TradeType.Sell, SymbolName, volume, InstanceName, SL, TP); } } protected override void OnError(Error error) { Print("Errot={0}", error.Code); } protected override void OnStop() { Print("Robot 3BARS by TraDerMaTriX stopped by user"); } private void TRAIL() { if (UseTrail) { var sellPositions = Positions.FindAll(InstanceName, SymbolName, TradeType.Sell); foreach (Position position in sellPositions) { double distance = position.EntryPrice - Symbol.Ask; if (distance < TrailingStopTrigger * Symbol.PipSize) continue; double newStopLossPrice = Symbol.Ask + TrailingStopStep * Symbol.PipSize; if (position.StopLoss == null || newStopLossPrice < position.StopLoss) { ModifyPosition(position, newStopLossPrice, position.TakeProfit); } } var buyPositions = Positions.FindAll(InstanceName, SymbolName, TradeType.Buy); foreach (Position position in buyPositions) { double distance = Symbol.Bid - position.EntryPrice; if (distance < TrailingStopTrigger * Symbol.PipSize) continue; double newStopLossPrice = Symbol.Bid - TrailingStopStep * Symbol.PipSize; if (position.StopLoss == null || newStopLossPrice > position.StopLoss) { ModifyPosition(position, newStopLossPrice, position.TakeProfit); } } } } } }
@tradermatrix
tradermatrix
02 Apr 2019, 12:20
yes it's a bug ..
I hulled all your bot piece by piece but finally I did not find any error ..
so i figured that the optimization flaw came up when the cBot gets data in the form of deadlines other than the one on which it runs.
I modified your code a little and I realized to the optimization that when my setting "Time Frame" is identical to the one on which it is executed there is no more problem ...
that's why it worked previously because I optimized on 5m ....
thanks to you I just noticed that some of my robots do not have the right settings ... because I trusted optimization.
hope that this problem will be settled soon
cordially
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.RussianStandardTime, AccessRights = AccessRights.FullAccess)] public class VolatilityBreakout4 : Robot { [Parameter("Source")] public DataSeries Source { get; set; } [Parameter("Time Frame", DefaultValue = "Minute5")] public TimeFrame timeframe { get; set; } [Parameter("Risk", MaxValue = 10, MinValue = 0.5, DefaultValue = 1)] public double Risk { get; set; } [Parameter("Squeeze bars number", MaxValue = 180, MinValue = 5, Step = 1, DefaultValue = 20)] public int SqueezeBarsNumber { get; set; } [Parameter("Squeeze in pips", MaxValue = 300, MinValue = 1, Step = 1, DefaultValue = 20)] public int Squeeze { get; set; } [Parameter("TP multiple", MaxValue = 8, MinValue = 1, Step = 0.1, DefaultValue = 2)] public double TpMultiple { get; set; } [Parameter("Close on Profit %", Step = 0.1, DefaultValue = 4.0)] public double CloseOnProfit { get; set; } [Parameter("Close Trade Hour", DefaultValue = 23)] public int CloseTradesHour { get; set; } [Parameter("Close Trade Minute", DefaultValue = 30)] public int CloseTradesMinute { get; set; } [Parameter("Open Trade Hour", DefaultValue = 2)] public int OpenTradesHour { get; set; } private string instance; private MarketSeries series; private double range, high, low, volume, barsRange, SL, TP, minVolume, risk, longPrice; private double shortPrice, closeOnProfit; private int pipDigits, n; private DateTime squeezeFirstBarTime, squeezeLastBarTime; protected override void OnStart() { instance = ToString() + ", " + Symbol.Code + ", " + TimeFrame + ", " + Account.BrokerName + ", " + Account.Number; range = Squeeze * Symbol.PipSize; series = MarketData.GetSeries(timeframe); minVolume = Symbol.VolumeInUnitsMin; risk = Risk * 0.01; closeOnProfit = CloseOnProfit * 0.01; pipDigits = Symbol.Digits - (int)Math.Log10(1 / Symbol.PipSize); Positions.Opened += Positions_Opened; Positions.Closed += PositionsOnClosed; squeezeFirstBarTime = CandleOpenTime(2 + SqueezeBarsNumber); squeezeLastBarTime = CandleOpenTime(2); } protected override void OnBar() { var position = Positions.Find(instance); var spread = Symbol.Spread / Symbol.PipSize; if (position == null) { if (spread > 2) { return; } if ((CandleOpenTime(0).Hour >= CloseTradesHour && CandleOpenTime(0).Minute >= CloseTradesMinute) || CandleOpenTime(0).Hour < OpenTradesHour) { return; } squeezeFirstBarTime = CandleOpenTime(1 + SqueezeBarsNumber); squeezeLastBarTime = CandleOpenTime(1); high = CandleHigh(1); low = CandleLow(1); barsRange = CandleClose(1) > (1) ? MarketSeries.Close.Last(1) - MarketSeries.Open.Last(1) : MarketSeries.Open.Last(1) - MarketSeries.Close.Last(1); for (int i = 0; i < SqueezeBarsNumber; i++) { high = CandleHigh(i + 1) > high ? CandleHigh(i + 1) : high; low = CandleLow(i + 1) < low ? CandleLow(i + 1) : low; barsRange = high - low; } //Chart.RemoveAllObjects(); //Chart.DrawTrendLine("sHigh", squeezeFirstBarTime, high, squeezeLastBarTime, high, Color.Aqua, 1, LineStyle.Solid); //Chart.DrawTrendLine("sLow", squeezeFirstBarTime, low, squeezeLastBarTime, low, Color.Red, 1, LineStyle.Solid); //double barRangePips = Math.Round(barsRange / Symbol.PipSize, 1); //string text = "Squeeze = " + Squeeze + " , barRange = " + barRangePips; //Chart.DrawStaticText("Current range", text, VerticalAlignment.Bottom, HorizontalAlignment.Right, Color.Aquamarine); n = 0; foreach (var order in PendingOrders) { if (order.Label == instance) { n = n + 1; } } if (n == 0) { if (high - low < range) { { longPrice = high; shortPrice = low; SL = (high - low) / Symbol.PipSize + 1; volume = Math.Floor(((Account.Equity * risk) / SL) / Symbol.PipValue / minVolume) * minVolume; SL = Math.Round(SL, pipDigits, MidpointRounding.AwayFromZero); TP = SL * TpMultiple; PlaceStopOrder(TradeType.Buy, Symbol, volume, longPrice, instance, null, TP); PlaceStopOrder(TradeType.Sell, Symbol, volume, shortPrice, instance, null, TP); //Chart.DrawHorizontalLine(longPrice.ToString(), longPrice - SL * Symbol.PipSize, Color.Crimson, 1, LineStyle.DotsRare); //Chart.DrawHorizontalLine(shortPrice.ToString(), shortPrice + SL * Symbol.PipSize, Color.Crimson, 1, LineStyle.DotsRare); } } } } if (position != null) { if (spread > 2) { return; } if (position.TradeType == TradeType.Buy) { if (CandleClose(1) < position.EntryPrice - SL * Symbol.PipSize) { ClosePosition(position); //Chart.RemoveAllObjects(); } } if (position.TradeType == TradeType.Sell) { if (CandleClose(1) > position.EntryPrice + SL * Symbol.PipSize) { ClosePosition(position); //Chart.RemoveAllObjects(); } } } } protected override void OnTick() { if (Account.UnrealizedNetProfit > Account.Balance * closeOnProfit) foreach (var position in Positions) { ClosePositionAsync(position); } } private void Positions_Opened(PositionOpenedEventArgs args) { var position = args.Position; if (position.Label == instance) { foreach (var order in PendingOrders) { if (order.Label == instance) CancelPendingOrder(order); } if (position.TradeType == TradeType.Buy) { //Chart.RemoveObject(shortPrice.ToString()); } if (position.TradeType == TradeType.Sell) { //Chart.RemoveObject(longPrice.ToString()); } } } private void PositionsOnClosed(PositionClosedEventArgs args) { var position = args.Position; if (args.Reason == PositionCloseReason.TakeProfit) { // } } #region Candles Processing #region Candle Type private bool CandleTypeBullish(int k) { if (series.Open.Last(k) > series.Close.Last(k)) { return false; } return true; } #endregion #region Candle Range(int k) private double CandleRange(int k) { return series.High.Last(k) - series.Low.Last(k); } #endregion #region Candle body bottom private double CandleBodyBottom(int k) { return (series.Open.Last(k) < series.Close.Last(k)) ? series.Open.Last(k) : series.Close.Last(k); } #endregion #region Candle body Top private double CandleBodyTop(int k) { return (series.Open.Last(k) > series.Close.Last(k)) ? series.Open.Last(k) : series.Close.Last(k); } #endregion #region Candle high private double CandleHigh(int k) { return series.High.Last(k); } #endregion #region Candle low private double CandleLow(int k) { return series.Low.Last(k); } #endregion #region Candle body private double CandleBody(int k) { return Math.Abs((series.Open.Last(k) - series.Close.Last(k))); } #endregion #region Candle Close private double CandleClose(int k) { if (CandleTypeBullish(k)) { return CandleBodyTop(k); } return CandleBodyBottom(k); } #endregion #region Candle Open private double CandleOpen(int k) { if (CandleTypeBullish(k)) { return CandleBodyBottom(k); } return CandleBodyTop(k); } #endregion #region Candle Sinus private double CandleSinus(int k) { return Math.Abs((series.Open.Last(k) - series.Close.Last(k))) / CandleRange(k) * (series.Close.Last(k) > series.Open.Last(k) ? 1 : -1); } #endregion #region Trend Angle private double TrendAngle(int CandlesInTrend) { double absBody = 0; double bodiesRange = 0; for (int i = 0; i <= CandlesInTrend; i++) { if (CandleTypeBullish(i)) { bodiesRange = bodiesRange + CandleBody(i); } if (!CandleTypeBullish(i)) { bodiesRange = bodiesRange - CandleBody(i); } absBody = absBody + CandleBody(i); } var trendSinus = bodiesRange / absBody; return Math.Asin(trendSinus) * 180 / Math.PI; } #endregion #region Candle OpenTime private DateTime CandleOpenTime(int k) { return series.OpenTime.Last(k); } #endregion #region No k Candles on the left High private bool NoLeftCandlesHigh(int k) { for (int i = 1; i < k; i++) { if (CandleHigh(1) > CandleLow(1 + i) && CandleHigh(1) < CandleHigh(1 + i)) { return false; } if (CandleHigh(1) < CandleLow(1 + i) || CandleHigh(1) > CandleHigh(1 + i)) { continue; } } return true; } #endregion #region No k Candles on the left Low private bool NoLeftCandlesLow(int k) { for (int i = 1; i < k; i++) { if (CandleLow(1) < CandleHigh(1 + i) && CandleLow(1) > CandleLow(1 + i)) { return false; } if (CandleLow(1) < CandleHigh(1 + i) || CandleLow(1) > CandleLow(1 + i)) { continue; } } return true; } #endregion #endregion } }
@tradermatrix
tradermatrix
31 Mar 2019, 11:57
Hello
I downloaded the last code you tested ... and at home it works in bar mode and tick mode .. no difference between backesting and optimization
I think the cause is an update ..
I downloaded last upgrade to a newer version of .Net framework.
can be a try ...
https://dotnet.microsoft.com/download/dotnet-framework/net472
@tradermatrix
tradermatrix
30 Mar 2019, 15:52
Hi
I think the problem is here;
SL = Math.Round(SL, pipDigits, MidpointRounding.AwayFromZero);
I just replaced ("MidpointRounding.AwayFromZero") with 0 and it works
SL = Math.Round(SL, pipDigits, 0);
TP = SL * TpMultiple;
PlaceStopOrder(TradeType.Buy, Symbol, volume, longPrice, instance, SL, TP);
PlaceStopOrder(TradeType.Sell, Symbol, volume, shortPrice, instance, SL, TP);
cordially
@tradermatrix
tradermatrix
06 Mar 2019, 12:30
thank you Mr. Panagiotis
thanks to you everything works fine.
@tradermatrix
tradermatrix
18 Nov 2018, 18:15
salut
il devrait mieux fonctionner ainsi...
attention il faut tenir compte de utc heure d hivers / heures d ete ...
par exemple en france si tu regles stoptime a 18 H le robot coupera ta commande a 19 H ...regarde le backtesting
@+
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 BotUSNDAQ100m1 : Robot { private DateTime _startTime; private DateTime _stopTime; [Parameter("Start Hour", DefaultValue = 10.0)] public double StartTime { get; set; } [Parameter("Stop Hour", DefaultValue = 18.0)] public double StopTime { get; set; } [Parameter()] public DataSeries Prix { get; set; } [Parameter(DefaultValue = 32)] public int Period { get; set; } private ExponentialMovingAverage Ema; [Parameter(DefaultValue = 39)] public int Period2 { get; set; } private ExponentialMovingAverage Ema2; [Parameter(DefaultValue = 50)] public int Period3 { get; set; } private ExponentialMovingAverage Ema3; [Parameter(DefaultValue = 75)] public int Period4 { get; set; } private ExponentialMovingAverage Ema4; [Parameter(DefaultValue = 100)] public int Period5 { get; set; } private ExponentialMovingAverage Ema5; [Parameter("Stop Loss (pips)", DefaultValue = 20, MinValue = 1)] public int StopLossInPips { get; set; } [Parameter("Take Profit (pips)", DefaultValue = 60, MinValue = 1)] public int TakeProfitInPips { get; set; } public double Quantity; private const string Label = ""; private MacdCrossOver MyMacd; //====================== Pivot ==================================// private int GetStartDayIndex(int index) { var startDayIndex = index; while (startDayIndex > 0 && MarketSeries.OpenTime[startDayIndex].Date == MarketSeries.OpenTime[index].Date) startDayIndex--; return ++startDayIndex; } private double GetHigh(int fromIndex, int toIndex) { var result = MarketSeries.High[fromIndex]; for (var i = fromIndex; i <= toIndex; i++) result = Math.Max(result, MarketSeries.High[i]); return result; } private double GetLow(int fromIndex, int toIndex) { var result = MarketSeries.Low[fromIndex]; for (var i = fromIndex; i <= toIndex; i++) result = Math.Min(result, MarketSeries.Low[i]); return result; } //====================== Calculs des paramètres =================// protected override void OnStart() { _startTime = Server.Time.Date.AddHours(StartTime); _stopTime = Server.Time.Date.AddHours(StopTime); if (Account.Equity <= 1500) Quantity = 10000; if ((Account.Equity > 1500) && (Account.Equity <= 3000)) Quantity = 20000; if ((Account.Equity > 3000) && (Account.Equity <= 4500)) Quantity = 30000; if ((Account.Equity > 4500) && (Account.Equity <= 6000)) Quantity = 40000; if ((Account.Equity > 6000) && (Account.Equity <= 7500)) Quantity = 50000; if ((Account.Equity > 7500) && (Account.Equity <= 9000)) Quantity = 60000; if ((Account.Equity > 9000) && (Account.Equity <= 10500)) Quantity = 70000; if ((Account.Equity > 10500) && (Account.Equity <= 12000)) Quantity = 80000; if ((Account.Equity > 12000) && (Account.Equity <= 13500)) Quantity = 90000; if ((Account.Equity > 13500) && (Account.Equity <= 15000)) Quantity = 100000; if ((Account.Equity > 15000) && (Account.Equity <= 16500)) Quantity = 110000; if ((Account.Equity > 16500) && (Account.Equity <= 18000)) Quantity = 120000; if ((Account.Equity > 18000) && (Account.Equity <= 19500)) Quantity = 130000; if ((Account.Equity > 19500) && (Account.Equity <= 21000)) Quantity = 140000; if ((Account.Equity > 21000) && (Account.Equity <= 22500)) Quantity = 150000; if ((Account.Equity > 22500) && (Account.Equity <= 24000)) Quantity = 160000; if ((Account.Equity > 24000) && (Account.Equity <= 25500)) Quantity = 170000; if ((Account.Equity > 25500) && (Account.Equity <= 27000)) Quantity = 180000; if ((Account.Equity > 27000) && (Account.Equity <= 30000)) Quantity = 190000; if (Account.Equity > 30000) Quantity = 200000; Ema = Indicators.ExponentialMovingAverage(MarketSeries.Close, Period); Ema2 = Indicators.ExponentialMovingAverage(MarketSeries.Close, Period2); Ema3 = Indicators.ExponentialMovingAverage(MarketSeries.Close, Period3); Ema4 = Indicators.ExponentialMovingAverage(MarketSeries.Close, Period4); Ema5 = Indicators.ExponentialMovingAverage(MarketSeries.Close, Period5); MyMacd = Indicators.MacdCrossOver(5, 11, 3); } protected override void OnTick() { var currentHours = Server.Time.TimeOfDay.TotalHours; bool tradeTime = StartTime < StopTime ? currentHours > StartTime && currentHours < StopTime : currentHours < StopTime || currentHours > StartTime; if (currentHours >= StopTime) { Close(TradeType.Sell); Close(TradeType.Buy); } } protected override void OnBar() { //========================= Horaire de trading =========================// var currentHours = Server.Time.TimeOfDay.TotalHours; bool tradeTime = StartTime < StopTime ? currentHours > StartTime && currentHours < StopTime : currentHours < StopTime || currentHours > StartTime; if (!tradeTime) return; if (Positions.Count != 0) return; //========================= Moyennes mobiles =========================// var currentprix = MarketSeries.Close.Last(0); var currentema = Ema.Result.Last(0); var currentema2 = Ema2.Result.Last(0); var currentema3 = Ema3.Result.Last(0); var currentema4 = Ema4.Result.Last(0); var currentema5 = Ema5.Result.Last(0); //========================= Macd =========================// var signal = MyMacd.Signal[0]; var macd = MyMacd.MACD[0]; //===================== pivot =====================================// if (TimeFrame == TimeFrame.Daily) return; var todayStartIndex = GetStartDayIndex(0); if (todayStartIndex == 0) return; var yesterdayStartIndex = GetStartDayIndex(todayStartIndex - 1); var yHigh = GetHigh(yesterdayStartIndex, todayStartIndex - 1); var yLow = GetLow(yesterdayStartIndex, todayStartIndex - 1); var yClose = MarketSeries.Close[todayStartIndex - 1]; var yHigh2 = GetHigh(yesterdayStartIndex - 1, todayStartIndex - 2); var yLow2 = GetLow(yesterdayStartIndex - 1, todayStartIndex - 2); var yClose2 = MarketSeries.Close[todayStartIndex - 2]; var pivot = (yHigh + yLow + yClose) / 3; var pivot2 = (yHigh2 + yLow2 + yClose2) / 3; var s1 = (pivot * 2) - yHigh; var ms1 = ((s1 - pivot) / 2 + pivot); var r1 = (pivot * 2) - yLow; var mr1 = ((r1 - pivot) / 2 + pivot); //====================== Trade Type =================================// var longPosition = Positions.Find(Label, Symbol, TradeType.Buy); var shortPosition = Positions.Find(Label, Symbol, TradeType.Sell); //======================= Condition d'achat ===========================================// if ((currentprix < currentema) && (currentprix > currentema2) && (currentema2 > currentema3) && (currentema3 > currentema4) && (currentema4 > currentema5) && (longPosition == null) && (shortPosition == null) && (MyMacd.Signal.HasCrossedAbove(MyMacd.MACD, 0))) { ExecuteMarketOrder(TradeType.Buy, Symbol, Quantity, Label, StopLossInPips, TakeProfitInPips); } //======================= Condition de vente ===========================================// if ((currentprix > currentema) && (currentprix < currentema2) && (currentema2 < currentema3) && (currentema3 < currentema4) && (currentema4 < currentema5) && (shortPosition == null) && (longPosition == null) && (MyMacd.Signal.HasCrossedBelow(MyMacd.MACD, 0))) { ExecuteMarketOrder(TradeType.Sell, Symbol, Quantity, Label, StopLossInPips, TakeProfitInPips); } } private void Close(TradeType tradeType) { foreach (var position in Positions.FindAll(Label, Symbol, tradeType)) ClosePosition(position); } } }
@tradermatrix
tradermatrix
16 Nov 2018, 20:08
effectively...the robot is built for a first random order ... then it stays in the same direction ... and it leads to disaster if you are in the wrong direction for a long time.
test this one ... it is completely random.
Warning ... you will never do the same backtesting
cordially
// ------------------------------------------------------------------------------------------------- // // This code is a cAlgo API sample. // // This cBot is intended to be used as a sample and does not guarantee any particular outcome or // profit of any kind. Use it at your own risk // // The "Sample Martingale cBot" creates a random Sell or Buy order. If the Stop loss is hit, a new // order of the same type (Buy / Sell) is created with double the Initial Volume amount. The cBot will // continue to double the volume amount for all orders created until one of them hits the take Profit. // After a Take Profit is hit, a new random Buy or Sell order is created with the Initial Volume amount. // // ------------------------------------------------------------------------------------------------- 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 SampleMartingalecBot : Robot { [Parameter("Initial Volume", DefaultValue = 10000, MinValue = 0)] public int InitialVolume { get; set; } [Parameter("Stop Loss", DefaultValue = 20)] public int StopLoss { get; set; } [Parameter("Take Profit", DefaultValue = 20)] public int TakeProfit { get; set; } private Random random = new Random(); protected override void OnStart() { Positions.Closed += OnPositionsClosed; ExecuteOrder(InitialVolume, GetRandomTradeType()); } private void ExecuteOrder(long volume, TradeType tradeType) { var result = ExecuteMarketOrder(tradeType, Symbol, volume, "Martingale", StopLoss, TakeProfit); if (result.Error == ErrorCode.NoMoney) Stop(); } private void OnPositionsClosed(PositionClosedEventArgs args) { Print("Closed"); var position = args.Position; if (position.Label != "Martingale" || position.SymbolCode != Symbol.Code) return; if (position.GrossProfit > 0) { ExecuteOrder(InitialVolume, GetRandomTradeType()); } else { ExecuteOrder((int)position.Volume * 2, GetRandomTradeType()); // } } private TradeType GetRandomTradeType() { return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell; } } }
@tradermatrix
tradermatrix
12 Jul 2018, 22:00
RE:
ceakuk said:
I have created an amazing cbot and I would like to share it here without showing the source codes.
How can I do it?
can the source code of cbot.algo be read?
I want others to use my bot without giving the source code.
Thanks in advance
Hello
there are probably several solutions.
you can distribute the algo file ...
left on the dashboard select "show in folder"
you can copy and paste the file and send it to the mailbox of the person who asks you.
he can use your cBot without seeing the code.
you can send it to me without any problem
cordially
@tradermatrix
tradermatrix
04 Jul 2018, 12:06
Thank you for your answers
I specify that [Parameter ("Break time (hour)" does not stop the robot. The cbot continues to work until he hits SL and TP or net earnings ... etc .... Then he will not be able to place new orders until the opening of the markets the following week.
UTC = User Time Offset
that I change bottom right of the platform ... UTC + 2 in summer ... UTC + 1 in winter (France)
http://help.spotware.com/user-time-offset
my code works very well but I have to manually adjust to my time zone "UTC" (left on my cBot) so that "StopTime" is adapted to the place where I work.
it is not a problem except for the backtesting over several years because I have to choose between summer time UTC + 2 and UTC + 1 winters
that's why I'm looking for a code that automatically adapts to the time zone.
I miss something or it's not possible.
thank you for everything
example with UTC Friday 8 June
[Parameter("Current Time UTC", DefaultValue = 2)]
public double UTC { get; set; }
[Parameter("Break time (hour)", DefaultValue = 16, MinValue = 0, MaxValue = 23)]
public int StopTime { get; set; }
var currentHours = Server.Time.TimeOfDay.Hours + UTC;
08/06/2018 08:27 EURUSD € 1k Vendre 1,17766 1,17608 08/06/2018 10:22 1,27 1028,97 08/06/2018 08:37 EURUSD € 1k Acheter 1,17843 1,17603 08/06/2018 10:22 -2,13 1026,84 08/06/2018 09:39 EURUSD € 3k Vendre 1,17691 1,17608 08/06/2018 10:22 1,85 1028,69 08/06/2018 10:21 EURUSD € 4k Vendre 1,17619 1,17608 08/06/2018 10:22 0,02 1028,71 08/06/2018 10:22 EURUSD € 1k Acheter 1,17608 1,17694 08/06/2018 11:20 0,66 1029,37 08/06/2018 10:43 EURUSD € 2k Acheter 1,17679 1,17694 08/06/2018 11:20 0,08 1029,45 08/06/2018 11:20 EURUSD € 1k Vendre 1,17694 1,17609 08/06/2018 12:02 0,65 1030,1 08/06/2018 12:02 EURUSD € 1k Acheter 1,17609 1,1728 08/06/2018 13:13 -2,9 1027,2 08/06/2018 12:05 EURUSD € 1k Vendre 1,1748 1,17285 08/06/2018 13:13 1,59 1028,79 08/06/2018 12:58 EURUSD € 3k Vendre 1,1738 1,17285 08/06/2018 13:13 2,16 1030,95 08/06/2018 13:11 EURUSD € 4k Vendre 1,17309 1,17285 08/06/2018 13:13 0,46 1031,41 08/06/2018 13:13 EURUSD € 1k Vendre 1,1728 1,17534 08/06/2018 14:03 -2,25 1029,16 08/06/2018 13:20 EURUSD € 1k Acheter 1,17366 1,17529 08/06/2018 14:03 1,31 1030,47 08/06/2018 13:42 EURUSD € 3k Acheter 1,17439 1,17529 08/06/2018 14:03 2,03 1032,5 08/06/2018 13:51 EURUSD € 4k Acheter 1,17512 1,17529 08/06/2018 14:03 0,22 1032,72 10/06/2018 23:05 EURUSD € 1k Acheter 1,17742 1,17816 11/06/2018 01:41 0,55 1033,27
example code without UTC
the bot continues to place orders after 2 pm until 4 pm
2 hours of +
421 08/06/2018 12:59 EURUSD € 1k Vendre 1,1735 1,17568 08/06/2018 14:27 -1,95 1163,87 421 08/06/2018 13:11 EURUSD € 2k Vendre 1,17309 1,17568 08/06/2018 14:27 -4,61 1159,26 421 08/06/2018 13:26 EURUSD € 1k Acheter 1,174 1,17563 08/06/2018 14:27 1,31 1160,57 421 08/06/2018 13:42 EURUSD € 4k Acheter 1,17439 1,17563 08/06/2018 14:27 3,88 1164,45 421 08/06/2018 13:44 EURUSD € 5k Acheter 1,17484 1,17563 08/06/2018 14:27 2,94 1167,39 421 08/06/2018 14:03 EURUSD € 6k Acheter 1,17534 1,17563 08/06/2018 14:27 0,95 1168,34 421 08/06/2018 14:27 EURUSD € 1k Acheter 1,17568 1,17379 08/06/2018 14:43 -1,7 1166,64 421 08/06/2018 14:32 EURUSD € 1k Vendre 1,17521 1,17384 08/06/2018 14:43 1,09 1167,73 421 08/06/2018 14:35 EURUSD € 3k Vendre 1,17474 1,17384 08/06/2018 14:43 2,03 1169,76 421 08/06/2018 14:40 EURUSD € 4k Vendre 1,17431 1,17384 08/06/2018 14:43 1,25 1171,01 421 08/06/2018 14:43 EURUSD € 1k Acheter 1,17384 1,17479 08/06/2018 15:00 0,73 1171,74 421 08/06/2018 14:45 EURUSD € 2k Acheter 1,17429 1,17479 08/06/2018 15:00 0,68 1172,42 421 08/06/2018 14:57 EURUSD € 3k Acheter 1,17461 1,17479 08/06/2018 15:00 0,18 1172,6 421 08/06/2018 15:00 EURUSD € 1k Acheter 1,17484 1,17605 08/06/2018 15:14 0,96 1173,56 421 08/06/2018 15:02 EURUSD € 1k Vendre 1,17443 1,1761 08/06/2018 15:14 -1,51 1172,05 421 08/06/2018 15:11 EURUSD € 3k Acheter 1,17516 1,17605 08/06/2018 15:14 2 1174,05 421 08/06/2018 15:12 EURUSD € 4k Acheter 1,17549 1,17605 08/06/2018 15:14 1,56 1175,61 421 08/06/2018 15:14 EURUSD € 1k Acheter 1,1761 1,17731 08/06/2018 16:34 0,96 1176,57 421 08/06/2018 15:18 EURUSD € 1k Vendre 1,17574 1,17736 08/06/2018 16:34 -1,47 1175,1 421 08/06/2018 15:21 EURUSD € 3k Acheter 1,17648 1,17731 08/06/2018 16:34 1,85 1176,95 421 08/06/2018 15:30 EURUSD € 4k Acheter 1,17688 1,17731 08/06/2018 16:34 1,11 1178,06 421 11/06/2018 01:41 EURUSD € 3k Acheter 1,17821 1,17896 11/06/2018 02:43 1,65 1179,21
@tradermatrix
tradermatrix
22 Apr 2018, 01:10
you have to program one command at a time
can be like that;
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("Slow Periods", DefaultValue = 30)] public int SlowPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 14)] public int FastPeriods { get; set; } [Parameter("Quantity (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] public double Quantity { get; set; } [Parameter("Stop Loss (pips)", DefaultValue = 20, MinValue = 0)] public int StopLossInPips { get; set; } [Parameter("Take Profit (pips)", DefaultValue = 60, MinValue = 0)] public int TakeProfitInPips { get; set; } private ExponentialMovingAverage slowMa; private ExponentialMovingAverage fastMa; private const string label = "EMA"; private Position longPosition; private Position shortPosition; protected override void OnStart() { fastMa = Indicators.ExponentialMovingAverage(SourceSeries, FastPeriods); slowMa = Indicators.ExponentialMovingAverage(SourceSeries, SlowPeriods); } protected override void OnBar() { var cBotPositions = Positions.FindAll(label); longPosition = Positions.Find(label, Symbol, TradeType.Buy); shortPosition = Positions.Find(label, Symbol, TradeType.Sell); if (cBotPositions.Length >= 1) return; if (slowMa.Result.Last(1) < fastMa.Result.Last(1) && longPosition == null) { ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInUnits, label, StopLossInPips, TakeProfitInPips); } else if (slowMa.Result.Last(1) > fastMa.Result.Last(1) && shortPosition == null) { ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInUnits, label, StopLossInPips, TakeProfitInPips); } } private long VolumeInUnits { get { return Symbol.QuantityToVolume(Quantity); } } } }
@tradermatrix
tradermatrix
09 Apr 2018, 16:33
RE:
ceakuk said:
ExecuteMarketOrder(TradeType.Buy, Symbol, 5000, "myLabel", 10, 10, XXXX, "this is a comment");Hi,
Im interested in adding label and comment without this Markert range pips which I have no idea what it is and how to set it.
How can I avoid using Markert range pips or what should I set it to if I dont need it?
Thanks
Kevin
Bonjour
j utilise cette methode
ExecuteMarketOrder(TradeType.Buy, Symbol, 5000, "myLabel", 10, 10, null, "this is a comment");
@tradermatrix
tradermatrix
23 Mar 2018, 14:42
thanks Panagiotis
actually it causes a failure.
So, bypassing the problem, I moved Indicator.MovingAverage from "OnStart" to "OnTick ()".
I found that the orders are exactly the same as the previous method (at the millisecond)
I do not find breakdowns on several years of backtesting
cordially
protected override void OnTick() { play(); } private void play() { var cBotPositions = Positions.FindAll("MoVinG"); if (cBotPositions.Length >= 1) return; if (_movingAverage.Result.IsRising()) { ExecuteMarketOrder(TradeType.Buy, Symbol, Volume, "MoVinG", SL, TP); } else if (_movingAverage.Result.IsFalling()) { ExecuteMarketOrder(TradeType.Sell, Symbol, Volume, "MoVinG", SL, TP); } }
22/09/2017 16:41:03.248 | Executing Market Order to Sell 1000 EURUSD (SL: 10, TP: 12) 22/09/2017 16:41:03.248 | → Executing Market Order to Sell 1000 EURUSD (SL: 10, TP: 12) SUCCEEDED, Position PID507 22/09/2017 20:59:56.251 | Closed 22/09/2017 20:59:56.251 | Crashed in Positions.Closed with NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet. 22/09/2017 20:59:56.251 | closed 22/09/2017 20:59:56.251 | Losing Trade 22/09/2017 20:59:56.456 | Executing Market Order to Buy 2000 EURUSD (SL: 10, TP: 12) 22/09/2017 20:59:56.456 | → Executing Market Order to Buy 2000 EURUSD (SL: 10, TP: 12)
@tradermatrix
tradermatrix
19 Jan 2021, 21:30
RE: RE:
yet it works for me. can be replaced;
var cBotPositions = Positions.FindAll(label);
if (cBotPositions.Length >= 1)
return;
by:
var position = Positions.Find(label);
if (position == null)
@tradermatrix