Replies

bjornvandekerkhof
14 Jun 2019, 15:04 ( Updated at: 21 Dec 2023, 09:21 )

RE:

Hello Panagiotis,

The platform is: Pepperstone cTrader

Parameters from the cBot: 

 

Best regards, Bjorn.


@bjornvandekerkhof

bjornvandekerkhof
14 Jun 2019, 14:48

RE:

Panagiotis Charalampous said:

Hi Bjorn,

Can you post the complete cBot code?

Best Regards,

Panagiotis

 

Hello Panagiotis,

It's the same code from yesterday I am working with which I am testing over several platforms, they work on all just that one gives the error.

Best regards, Bjorn.

Code:


using System;
using System.Linq;
using System.Text;
using cAlgo.API;
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DayTradeG1 : Robot
    {
        [Parameter("News Hour", DefaultValue = 14, MinValue = 0, MaxValue = 23)]
        public int NewsHour { get; set; }
        [Parameter("News Minute", DefaultValue = 30, MinValue = 0, MaxValue = 59)]
        public int NewsMinute { get; set; }
        [Parameter("Pips away", DefaultValue = 10)]
        public int PipsAway { get; set; }
        [Parameter("Take Profit", DefaultValue = 50)]
        public int TakeProfit { get; set; }
        [Parameter("Stop Loss", DefaultValue = 10)]
        public int StopLoss { get; set; }
        [Parameter("Volume", DefaultValue = 100000, MinValue = 10)]
        public int Volume { get; set; }
        [Parameter("Seconds Before", DefaultValue = 10, MinValue = 1)]
        public int SecondsBefore { get; set; }
        [Parameter("Seconds Timeout", DefaultValue = 10, MinValue = 1)]
        public int SecondsTimeout { get; set; }
        [Parameter("One Cancels Other")]
        public bool Oco { get; set; }
        [Parameter("ShowTimeLeftNews", DefaultValue = false)]
        public bool ShowTimeLeftToNews { get; set; }
        [Parameter("ShowTimeLeftPlaceOrders", DefaultValue = true)]
        public bool ShowTimeLeftToPlaceOrders { get; set; }
        [Parameter("Label", DefaultValue = "Label")]
        public string Label { get; set; }
        private bool _ordersCreated;
        private DateTime _triggerTimeInServerTimeZone;

        protected override void OnStart()
        {
            Positions.Opened += OnPositionOpened;
            Timer.Start(1);
            var triggerTimeInLocalTimeZone = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, NewsHour, NewsMinute, 0);
            if (triggerTimeInLocalTimeZone < DateTime.Now)
                triggerTimeInLocalTimeZone = triggerTimeInLocalTimeZone.AddDays(1);
            _triggerTimeInServerTimeZone = TimeZoneInfo.ConvertTime(triggerTimeInLocalTimeZone, TimeZoneInfo.Local, TimeZone);
        }
        protected override void OnTimer()
        {
            var remainingTime = _triggerTimeInServerTimeZone - Server.Time;
            DrawRemainingTime(remainingTime);
            if (!_ordersCreated)
            {
                var sellOrderTargetPrice = Symbol.Bid - PipsAway * Symbol.PipSize;
                ChartObjects.DrawHorizontalLine("sell target", sellOrderTargetPrice, Colors.Red, 1, LineStyle.DotsVeryRare);
                var buyOrderTargetPrice = Symbol.Ask + PipsAway * Symbol.PipSize;
                ChartObjects.DrawHorizontalLine("buy target", buyOrderTargetPrice, Colors.Blue, 1, LineStyle.DotsVeryRare);
                if (Server.Time <= _triggerTimeInServerTimeZone && (_triggerTimeInServerTimeZone - Server.Time).TotalSeconds <= SecondsBefore)
                {
                    _ordersCreated = true;
                    var expirationTime = _triggerTimeInServerTimeZone.AddSeconds(SecondsTimeout);
                    PlaceStopOrder(TradeType.Sell, Symbol, Volume, sellOrderTargetPrice, Label, StopLoss, TakeProfit, expirationTime);
                    PlaceStopOrder(TradeType.Buy, Symbol, Volume, buyOrderTargetPrice, Label, StopLoss, TakeProfit, expirationTime);
                    ChartObjects.RemoveObject("sell target");
                    ChartObjects.RemoveObject("buy target");
                }
            }
            if (_ordersCreated && !PendingOrders.Any(o => o.Label == Label))
            {
                Print("Orders expired");
                Stop();
            }
        }
        private void DrawRemainingTime(TimeSpan remainingTimeToNews)
        {
            if (ShowTimeLeftToNews)
            {
                if (remainingTimeToNews > TimeSpan.Zero)
                {
                    ChartObjects.DrawText("countdown1", "Time left to news: " + FormatTime(remainingTimeToNews), StaticPosition.TopLeft);
                }
                else
                {
                    ChartObjects.RemoveObject("countdown1");
                }
            }
            if (ShowTimeLeftToPlaceOrders)
            {
                var remainingTimeToOrders = remainingTimeToNews - TimeSpan.FromSeconds(SecondsBefore);
                if (remainingTimeToOrders > TimeSpan.Zero)
                {
                    ChartObjects.DrawText("countdown2", "Time left to place orders: " + FormatTime(remainingTimeToOrders), StaticPosition.TopRight);
                }
                else
                {
                    ChartObjects.RemoveObject("countdown2");
                }
            }
        }
        private static StringBuilder FormatTime(TimeSpan remainingTime)
        {
            var remainingTimeStr = new StringBuilder();
            if (remainingTime.TotalHours >= 1)
                remainingTimeStr.Append((int)remainingTime.TotalHours + "h ");
            if (remainingTime.TotalMinutes >= 1)
                remainingTimeStr.Append(remainingTime.Minutes + "m ");
            if (remainingTime.TotalSeconds > 0)
                remainingTimeStr.Append(remainingTime.Seconds + "s");
            return remainingTimeStr;
        }
        private void OnPositionOpened(PositionOpenedEventArgs args)
        {
            var position = args.Position;
            if (position.Label == Label && position.SymbolCode == Symbol.Code)
            {
                if (Oco)
                {
                    foreach (var order in PendingOrders)
                    {
                        if (order.Label == Label && order.SymbolCode == Symbol.Code)
                        {
                            CancelPendingOrderAsync(order);
                        }
                    }
                }
                Stop();
            }
        }
    }
}

 


@bjornvandekerkhof

bjornvandekerkhof
14 Jun 2019, 14:46

RE:

Panagiotis Charalampous said:

Hi Bjiorn,

You can try copying the settings file from the source computer. You can find it in C:\Users\User\AppData\Roaming\broker cTrader\Settings. Paste it in the same destination at the target computer. 

Best Regards,

Panagiotis

Hello Panagiotis,

 

Thank you for replying.

I tryed that but it only erased all the instances from the platform where I need to get everything migrated too.

I also tryed to transfer that user file but didn't help either.

You think there may be another way?

 

Best regards, Bjorn.


@bjornvandekerkhof

bjornvandekerkhof
13 Jun 2019, 14:56

RE:

Panagiotis Charalampous said:

Hi Bjorn,

Here it is

using System;
using System.Linq;
using System.Text;
using cAlgo.API;
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DayTradeG1 : Robot
    {
        [Parameter("News Hour", DefaultValue = 14, MinValue = 0, MaxValue = 23)]
        public int NewsHour { get; set; }
        [Parameter("News Minute", DefaultValue = 30, MinValue = 0, MaxValue = 59)]
        public int NewsMinute { get; set; }
        [Parameter("Pips away", DefaultValue = 10)]
        public int PipsAway { get; set; }
        [Parameter("Take Profit", DefaultValue = 50)]
        public int TakeProfit { get; set; }
        [Parameter("Stop Loss", DefaultValue = 10)]
        public int StopLoss { get; set; }
        [Parameter("Volume", DefaultValue = 100000, MinValue = 10)]
        public int Volume { get; set; }
        [Parameter("Seconds Before", DefaultValue = 10, MinValue = 1)]
        public int SecondsBefore { get; set; }
        [Parameter("Seconds Timeout", DefaultValue = 10, MinValue = 1)]
        public int SecondsTimeout { get; set; }
        [Parameter("One Cancels Other")]
        public bool Oco { get; set; }
        [Parameter("ShowTimeLeftNews", DefaultValue = false)]
        public bool ShowTimeLeftToNews { get; set; }
        [Parameter("ShowTimeLeftPlaceOrders", DefaultValue = true)]
        public bool ShowTimeLeftToPlaceOrders { get; set; }
        [Parameter("Label", DefaultValue = "Label")]
        public string Label { get; set; }
        private bool _ordersCreated;
        private DateTime _triggerTimeInServerTimeZone;

        protected override void OnStart()
        {
            Positions.Opened += OnPositionOpened;
            Timer.Start(1);
            var triggerTimeInLocalTimeZone = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, NewsHour, NewsMinute, 0);
            if (triggerTimeInLocalTimeZone < DateTime.Now)
                triggerTimeInLocalTimeZone = triggerTimeInLocalTimeZone.AddDays(1);
            _triggerTimeInServerTimeZone = TimeZoneInfo.ConvertTime(triggerTimeInLocalTimeZone, TimeZoneInfo.Local, TimeZone);
        }
        protected override void OnTimer()
        {
            var remainingTime = _triggerTimeInServerTimeZone - Server.Time;
            DrawRemainingTime(remainingTime);
            if (!_ordersCreated)
            {
                var sellOrderTargetPrice = Symbol.Bid - PipsAway * Symbol.PipSize;
                ChartObjects.DrawHorizontalLine("sell target", sellOrderTargetPrice, Colors.Red, 1, LineStyle.DotsVeryRare);
                var buyOrderTargetPrice = Symbol.Ask + PipsAway * Symbol.PipSize;
                ChartObjects.DrawHorizontalLine("buy target", buyOrderTargetPrice, Colors.Blue, 1, LineStyle.DotsVeryRare);
                if (Server.Time <= _triggerTimeInServerTimeZone && (_triggerTimeInServerTimeZone - Server.Time).TotalSeconds <= SecondsBefore)
                {
                    _ordersCreated = true;
                    var expirationTime = _triggerTimeInServerTimeZone.AddSeconds(SecondsTimeout);
                    PlaceStopOrder(TradeType.Sell, Symbol, Volume, sellOrderTargetPrice, Label, StopLoss, TakeProfit, expirationTime);
                    PlaceStopOrder(TradeType.Buy, Symbol, Volume, buyOrderTargetPrice, Label, StopLoss, TakeProfit, expirationTime);
                    ChartObjects.RemoveObject("sell target");
                    ChartObjects.RemoveObject("buy target");
                }
            }
            if (_ordersCreated && !PendingOrders.Any(o => o.Label == Label))
            {
                Print("Orders expired");
                Stop();
            }
        }
        private void DrawRemainingTime(TimeSpan remainingTimeToNews)
        {
            if (ShowTimeLeftToNews)
            {
                if (remainingTimeToNews > TimeSpan.Zero)
                {
                    ChartObjects.DrawText("countdown1", "Time left to news: " + FormatTime(remainingTimeToNews), StaticPosition.TopLeft);
                }
                else
                {
                    ChartObjects.RemoveObject("countdown1");
                }
            }
            if (ShowTimeLeftToPlaceOrders)
            {
                var remainingTimeToOrders = remainingTimeToNews - TimeSpan.FromSeconds(SecondsBefore);
                if (remainingTimeToOrders > TimeSpan.Zero)
                {
                    ChartObjects.DrawText("countdown2", "Time left to place orders: " + FormatTime(remainingTimeToOrders), StaticPosition.TopRight);
                }
                else
                {
                    ChartObjects.RemoveObject("countdown2");
                }
            }
        }
        private static StringBuilder FormatTime(TimeSpan remainingTime)
        {
            var remainingTimeStr = new StringBuilder();
            if (remainingTime.TotalHours >= 1)
                remainingTimeStr.Append((int)remainingTime.TotalHours + "h ");
            if (remainingTime.TotalMinutes >= 1)
                remainingTimeStr.Append(remainingTime.Minutes + "m ");
            if (remainingTime.TotalSeconds > 0)
                remainingTimeStr.Append(remainingTime.Seconds + "s");
            return remainingTimeStr;
        }
        private void OnPositionOpened(PositionOpenedEventArgs args)
        {
            var position = args.Position;
            if (position.Label == Label && position.SymbolCode == Symbol.Code)
            {
                if (Oco)
                {
                    foreach (var order in PendingOrders)
                    {
                        if (order.Label == Label && order.SymbolCode == Symbol.Code)
                        {
                            CancelPendingOrderAsync(order);
                        }
                    }
                }
                Stop();
            }
        }
    }
}

If you need assistance in changing your cBots, you can always reach out to a Consultant.

Best Regards,

Panagiotis

Hi Panagiotis,

 

Thank you very much, I am going to try that out.

and thank you for the Consulting advice too.

 

Best regards, Bjorn.


@bjornvandekerkhof

bjornvandekerkhof
13 Jun 2019, 14:45

RE:

Panagiotis Charalampous said:

Hi Bjorn,

You set a label to each order but is constant

private const string Label = "News Straddler v1";

Your code filters out orders based on symbol and label

                    foreach (var order in PendingOrders)
                    {
                        if (order.Label == Label && order.SymbolCode == Symbol.Code)
                        {
                            CancelPendingOrderAsync(order);
                        }
                    }

You should make Label a parameter and set a different one for each instance so that each instance operates only on its orders.

Best Regards,

Panagiotis

 

Hi Panagiotis,

 

I see, like I sayd I am completely newbie with this language.

Would I be able to use something from this code to add in my code to make it happen then?

I am trying to puzzle it out and put it together since I have minimum experience and that's with Python this is not the easiest.

 

Best regards, Bjorn.

 


using System.Collections.Generic;
using System.Linq;
using cAlgo.API;
 
namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class GroupsSample : Robot
    {
        public enum State
        {
            Gaining,
            BreakingEven,
            Loosing
        }
 
        public class Order
        {
            public Position Position { get; set; }
            public State State { get; set; }
        }
 
        private static List<Order> _orders;
 
        protected override void OnStart()
        {
            // creates new list if doesn't exist
            if (_orders == null)
            {
                _orders = new List<Order>();
            }
 
            // subscribes to Positions.Closed event
            Positions.Closed += OnPositionClosed;
        }
 
        /// <summary>
        /// Method called on position closed
        /// </summary>
        private static void OnPositionClosed(PositionClosedEventArgs obj)
        {
            // finds matching order
            var matchingOrder = _orders.FirstOrDefault(x => x.Position == obj.Position);
 
            // if found
            if (matchingOrder != null)
            {
                // removes order from our list
                _orders.Remove(matchingOrder);
            }
        }
 
        /// <summary>
        /// Method called on each new bar
        /// </summary>
        protected override void OnBar()
        {
            // executes market order and calls back OnPositionOpened method when filled
            ExecuteMarketOrderAsync(MarketSeries.Open.Count % 2 == 0 ? TradeType.Buy : TradeType.Sell, Symbol, 1000, OnPositionOpened);
 
            // counts how many positions have certain state
            var gaining = _orders.Count(x => x.State == State.Gaining);
            var breakingEven = _orders.Count(x => x.State == State.BreakingEven);
            var loosing = _orders.Count(x => x.State == State.Loosing);
 
            // prints number of positions that are gaining, breaking even, loosing
            Print("Gaining = {0}, BreakingEven = {1}, Loosing = {2}", gaining, breakingEven, loosing);
        }
 
        /// <summary>
        /// Method called when position opened
        /// </summary>
        private void OnPositionOpened(TradeResult result)
        {
            // prints error and skips rest of the iteration if result wasn't successful
            if (!result.IsSuccessful)
            {
                Print(result.Error);
                return;
            }
 
            // adds new order into our list
            _orders.Add(new Order { Position = result.Position });
        }
 
        /// <summary>
        /// Method called on each price change
        /// </summary>
        protected override void OnTick()
        {
            // loops through all orders in our list and sets their state
            foreach (var order in _orders)
            {
                if (order.Position.NetProfit > 0)
                {
                    order.State = State.Gaining;
                }
                else if (order.Position.NetProfit < 0)
                {
                    order.State = State.Loosing;
                }
                else
                {
                    order.State = State.BreakingEven;
                }
            }
        }
    }
}

 


@bjornvandekerkhof

bjornvandekerkhof
13 Jun 2019, 14:21

RE:

Panagiotis Charalampous said:

Hi bjornvandekerkhof,

Thanks for posting in our forum. You should try setting a different label for each instance's orders.

Best Regards,

Panagiotis

 

Hello Panagiotis Charalampous,

 

Could you give an example please, I'm new to cTrader and this coding. 

I found one thread on this: https://ctrader.com/forum/cbot-support/11619   but I don't think that is the same issue.

Would be much appriciated.

Best regards, Bjorn.


@bjornvandekerkhof