Загрузка

cBot "Defender" для защиты открытых позиций на FOREX

cBot "Defender" для защиты открытых позиций на FOREX

cBot "Defender" для защиты открытых позиций на FOREX

Простой и удобный утилитный торговый робот (cbot) для платформы cTrader, который помогает с защитой открытых позиций на FOREX.

Имеет несколько понятных параметров своей рабочей конфигурации для уточнения логики защиты. Робот задумывался с простой целью: помочь трейдеру автоматически защищать открытые позиции, тем более если трейдер не может контролировать процесс на запущенном терминале.

Язык программирования C# (си-шарп).

using System;
using System.Linq;
using System.Collections.Generic;
using System.IO;
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 Defender : Robot
    {
        [Parameter("Main Time Frame", DefaultValue = "Minute45", Group = "GENERAL")]
        public TimeFrame MainTimeframe { get; set; }

        [Parameter("Defend Positions on Start", DefaultValue = true, Group = "GENERAL")]
        public bool DefendPositionsOnStart { get; set; }

        [Parameter("Sound File Name", DefaultValue = "Ring08.wav", Group = "GENERAL")]
        public string SoundFileName { get; set; }

        [Parameter("Parabolic SAR Min AF", DefaultValue = 0.03, Step = 0.005, Group = "INDICATORS")]
        public double ParabolicMinAf { get; set; }

        [Parameter("Parabolic SAR Max AF", DefaultValue = 0.2, Step = 0.005, Group = "INDICATORS")]
        public double ParabolicMaxAf { get; set; }

        [Parameter("Trail only profitable trades", DefaultValue = false, Group = "TUNING")]
        public bool TrailOnlyProfitableTrades { get; set; }

        private ParabolicSAR _mainTimeframeParabolicSar;
        private int _mainTimeframeLastIndex = 0;
        private List<Position> _positions = new List<Position>();

        protected override void OnStart()
        {
            // get all positions on current symbol
            var counter = 0;
            foreach (var position in Positions)
            {
                if (position.SymbolName == Symbol.Name)
                {
                    _positions.Add(position);
                    ++counter;
                }
            }
            Print("THERE IS(ARE) {0} POSITION(S) ON SYMBOL {1}", counter, Symbol.Name);

            // settings up indicators & other things
            _mainTimeframeParabolicSar = Indicators.ParabolicSAR(MarketData.GetSeries(MainTimeframe), ParabolicMinAf, ParabolicMaxAf);
            _mainTimeframeLastIndex = MarketData.GetSeries(MainTimeframe).Close.Count - 1;
            Print("Last index for Parabolic SAR: " + _mainTimeframeLastIndex);

            // try to defend positions on start if needed
            if (DefendPositionsOnStart)
            {
                foreach (var position in _positions)
                {
                    TrailPositionByParabolicSar(position);
                }
            }
        }

        protected override void OnBar()
        {

        }

        protected override void OnTick()
        {
            var newMainTimeframeLastIndex = MarketData.GetSeries(MainTimeframe).Close.Count - 1;
            if (newMainTimeframeLastIndex > _mainTimeframeLastIndex)
            {
                Print("Got new index for Parabolic SAR: " + _mainTimeframeLastIndex);
                _mainTimeframeLastIndex = newMainTimeframeLastIndex;
                foreach (var position in _positions)
                {
                    TrailPositionByParabolicSar(position);
                }
            }
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }

        private void TrailPositionByParabolicSar(Position position)
        {
            double newStopLoss = _mainTimeframeParabolicSar.Result.LastValue;

            if (position.TradeType == TradeType.Buy)
            {
                if (newStopLoss > Bid)
                    return;
                if (newStopLoss - position.StopLoss < Symbol.TickSize)
                    return;
            }

            if (position.TradeType == TradeType.Sell)
            {
                if (newStopLoss < Bid)
                    return;
                if (position.StopLoss - newStopLoss < Symbol.TickSize)
                    return;
            }

            if (TrailOnlyProfitableTrades && position.Pips <= 0)
                return;

            TradeResult result = ModifyPosition(position, newStopLoss, position.TakeProfit);
            if (result.IsSuccessful)
            {
                Print("POSITION " + position.Id + " HAS CHANGED. CURRENT S/L = " + position.StopLoss);
                PlaySound();
            }
        }

        public void PlaySound()
        {
            var windowsFolder = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
            Notifications.PlaySound(Path.Combine(windowsFolder, "Media", SoundFileName));
        }
    }
}

    

Все Комментарии

Оставьте Комментарий