Untitled

 avatar
unknown
csharp
19 days ago
7.8 kB
1
Indexable
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, TimeZone = TimeZones.EasternStandardTime)]
    public class Troller2Sides : Robot
    {
        [Parameter("RR",DefaultValue = 4)]
        public double RR { get; set; }

        [Parameter("Stoploss", DefaultValue = 70)]
        public double StopLoss { get; set; }

        [Parameter("Lots", DefaultValue = 10)]
        public double Lots { get; set; }

        [Parameter("Min FVG", DefaultValue = 60)]
        public double MinFVG { get; set; }

        [Parameter("x Pending ? bars", DefaultValue = 10)]
        public double xPendingBars { get; set; }



        private Dictionary<string, int> barsSinceOrderCreation = new Dictionary<string, int>();
        private double _FvgHigh = Double.MinValue, _FvgLow = Double.MaxValue;
        private bool _isBorn1stFVG = false;

        protected override void OnStart()
        {

        }

        protected override void OnBar()
        {
            // Nếu 1:00 ... --> bot bị break close trước thì bias là buy
            // Đợi nến break close top thì entry
            taskCancelPendingOrders();
            Chart.DrawStaticText(
                "dashboard_minix",
                "FVG pips " + convertToPips(_FvgHigh - _FvgLow) + "\n" +
                "Time " + Bars.OpenTimes.Last(1).Hour + ":" + Bars.OpenTimes.Last(1).Minute  + "\n" +
                "_isBorn1stFVG " + _isBorn1stFVG + "\n"
                ,
                VerticalAlignment.Bottom,
                HorizontalAlignment.Left,
                API.Color.GreenYellow
            );

            update1stFVG();

            if( !_isBorn1stFVG )
            {
                return;
            }

            if(Bars.OpenTimes.Last(1).Hour == 11 && Bars.OpenTimes.Last(1).Minute == 31)
            {
                // reset
                _isBorn1stFVG = false;
                return;
            }

            if(Bars.OpenTimes.Last(1).Hour < 10 || Bars.OpenTimes.Last(1).Hour > 11)
            {
                return;
            }

            if(countExecutingPositions() + countPendingOrders() >= 1)
            {
                return;
            }

            if(isBullish(1) && Bars.ClosePrices.Last(1) > _FvgHigh && Bars.LowPrices.Last(1) < _FvgHigh)
            {
                // Buy Limit 
                PlaceLimitOrder(
                    TradeType.Buy,
                    SymbolName,
                    Symbol.QuantityToVolumeInUnits(10),
                    _FvgHigh,
                    "order-buy-" + Bars.Count,
                    150,
                    150 * this.RR
                );

                PlaceLimitOrder(
                    TradeType.Buy,
                    SymbolName,
                    Symbol.QuantityToVolumeInUnits(10),
                    _FvgHigh,
                    "order-buy-" + Bars.Count,
                    150,
                    150
                );
            }

            if (isBearish(1) && Bars.ClosePrices.Last(1) < _FvgLow && Bars.HighPrices.Last(1) > _FvgLow)
            {
                // Buy Limit 
                PlaceLimitOrder(
                    TradeType.Sell,
                    SymbolName,
                    Symbol.QuantityToVolumeInUnits(10),
                    _FvgLow,
                    "order-sell-" + Bars.Count,
                    150,
                    150 * this.RR
                );

                PlaceLimitOrder(
                    TradeType.Sell,
                    SymbolName,
                    Symbol.QuantityToVolumeInUnits(10),
                    _FvgLow,
                    "order-sell-" + Bars.Count,
                    150,
                    150
                );
            }
        }

        private void update1stFVG() {
            // On bot --- before 9.30
            if (!_isBorn1stFVG && Bars.OpenTimes.Last(1).Hour == 9 && Bars.OpenTimes.Last(1).Minute < 59 && Bars.OpenTimes.Last(1).Minute > 30) { 
                // FVG Buy
                if(Bars.LowPrices.Last(1) > Bars.HighPrices.Last(3))
                {
                    _FvgHigh = Bars.LowPrices.Last(1);
                    _FvgLow = Bars.HighPrices.Last(3);

                    if(isBullish(1) && isBullish(2) && (Bars.OpenPrices.Last(1) > Bars.ClosePrices.Last(2)))
                    {
                        _FvgHigh = Bars.OpenPrices.Last(1);
                    }

                    if (isBullish(2) && isBullish(3) && (Bars.ClosePrices.Last(3) < Bars.OpenPrices.Last(2)))
                    {
                        _FvgLow = Bars.ClosePrices.Last(3);
                    }
                }

                // FVG Sell

                if (Bars.HighPrices.Last(1) < Bars.LowPrices.Last(3))
                {
                    _FvgHigh = Bars.LowPrices.Last(3);
                    _FvgLow = Bars.HighPrices.Last(1);

                    if (isBearish(1) && isBearish(2) && (Bars.OpenPrices.Last(1) < Bars.ClosePrices.Last(2)))
                    {
                        _FvgLow = Bars.OpenPrices.Last(1);
                    }

                    if (isBearish(2) && isBearish(3) && (Bars.ClosePrices.Last(3) > Bars.OpenPrices.Last(2)))
                    {
                        _FvgHigh = Bars.ClosePrices.Last(3);
                    }
                }
                
                Chart.DrawHorizontalLine("FVG-top", _FvgHigh, Color.DarkRed);
                Chart.DrawHorizontalLine("FVG-bottom", _FvgLow, Color.DarkRed);
                _isBorn1stFVG = true;
            }
        
        }


        private bool isBullish(int index) {
            return Bars.OpenPrices.Last(index) < Bars.ClosePrices.Last(index);
        }

        private bool isBearish(int index)
        {
            return Bars.OpenPrices.Last(index) > Bars.ClosePrices.Last(index);
        }

        private void closeAllPositions()
        {
            Print("** closeAllPositions");
            foreach (var pos in Positions.Where(pos => pos.SymbolName == Symbol.Name))
            {
                ClosePositionAsync(pos);
            }
        }

        private int countExecutingPositions()
        {
            return Positions.Count(position =>
            (position.TradeType == TradeType.Buy || position.TradeType == TradeType.Sell)
            && Symbol.Name == position.SymbolName);
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }

        private double convertToPips(double priceDif)
        {
            return Math.Round(Math.Abs(priceDif / Symbol.PipSize), 1);
        }

        private int countPendingOrders()
        {
            return PendingOrders.Count(pod => Symbol.Name == pod.SymbolName);
        }

        private void taskCancelPendingOrders()
        {
            foreach (var label in barsSinceOrderCreation.Keys.ToList())
            {

                if (!barsSinceOrderCreation.ContainsKey(label)) continue;

                barsSinceOrderCreation[label]++;

                if (barsSinceOrderCreation[label] >= this.xPendingBars)
                {
                    PendingOrder pod = PendingOrders.FirstOrDefault(order => order.Label == label && order.SymbolName == Symbol.Name, null);
                    if (pod != null)
                    {
                        pod.Cancel();
                    }
                }
            }
        }
    }
}
Editor is loading...
Leave a Comment