Description
My bot
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
[Robot(AccessRights = AccessRights.FullAccess, AddIndicators = true)]
public class gSecEGEFAlgo : Robot
{
[Parameter("Start Time [XX:XX]", DefaultValue = "10:00", Group = "Times")]
public string StartTime { get; set; }
[Parameter("End Time [XX:XX]", DefaultValue = "10:00", Group = "Times")]
public string EndTime { get; set; }
[Parameter("Risk Type", DefaultValue = RiskType.FixedLot, Group = "Trade Settings")]
public RiskType RiskStrategy { get; set; }
[Parameter("Volume for fixed lot", DefaultValue = 1, Group = "Trade Settings")]
public double Volume { get; set; }
[Parameter("% Risk", DefaultValue = 1, Group = "Trade Settings")]
public double PercentRisk { get; set; }
[Parameter("Take Profit Method", DefaultValue = TakeProfitType.RiskReward, Group = "Trade Settings")]
public TakeProfitType TakeProfitStrategy { get; set; }
[Parameter("Risk Reward Ratio", DefaultValue = 1, Group = "Trade Settings")]
public double RiskReward { get; set; }
[Parameter("Take Profit Pips", DefaultValue = 10, Group = "Trade Settings")]
public double TakeProfitPips { get; set; }
[Parameter("Stop Loss Method", DefaultValue = StopLossType.EntryCandle, Group = "Trade Settings")]
public StopLossType StopLossStrategy { get; set; }
[Parameter("Stop Loss Pips", DefaultValue = 10, Group = "Trade Settings")]
public double StopLossPips { get; set; }
[Parameter("Use 4h Confluence", DefaultValue = true, Group = "Trade Settings")]
public bool FourHourSafety { get; set; }
[Parameter("Obfuscation Method", DefaultValue = GSec.PolyMorphicObf, Group = "GruppeSec Corporate Security")]
public GSec GruppeSec { get; set; }
[Parameter("Anti Tamper Method", DefaultValue = GSec1.HashCompare, Group = "GruppeSec Corporate Security")]
public GSec1 GruppeSec1 { get; set; }
[Parameter("R-Override (FCS1000)", DefaultValue = 00000000, Group = "GruppeSec Corporate Security")]
public int Override { get; set; }
public enum GSec
{
PolyMorphicObf
}
public enum GSec1
{
HashCompare
}
public enum GSec2
{
HashCompare
}
public enum RiskType
{
FixedLot,
PercentageRisk
}
public enum TakeProfitType
{
Pips,
RiskReward
}
public enum StopLossType
{
Pips,
EntryCandle
}
private Bars fifteenMinBars;
private Bars fourHourBars;
private List<Bar> fourHourBullBars = new();
private List<Bar> fourHourBearBars = new();
private List<Bar> bullEngBars = new List<Bar>();
private List<Bar> bearEngBars = new List<Bar>();
private Dictionary<Bar, Bar> bullComboBars = new();
private Dictionary<Bar, Bar> bearComboBars = new();
private List<Bar> invalidatedBars = new();
private TimeOnly _startTime = new();
private TimeOnly _endTime = new();
protected override void OnStart()
{
fifteenMinBars = MarketData.GetBars(TimeFrame.Minute15, Symbol.Name);
fourHourBars = MarketData.GetBars(TimeFrame.Hour4, Symbol.Name);
_startTime = ConvertToTime(StartTime);
_endTime = ConvertToTime(EndTime);
}
protected override void OnTick()
{
if (IsTradingTime())
{
EnterBuys(bullComboBars);
EnterSells(bearComboBars);
}
}
protected override void OnStop()
{
// Handle cBot stop here
}
protected override void OnBar()
{
Chart.RemoveAllObjects();
bullEngBars.Clear();
bearEngBars.Clear();
bullComboBars.Clear();
bearComboBars.Clear();
fourHourBearBars.Clear();
fourHourBullBars.Clear();
FourHourBulls(fourHourBars);
FourHourBears(fourHourBars);
BullishEngulfings(fifteenMinBars);
BearishEngulfings(fifteenMinBars);
BullishEngWithEngFailFinder(bullEngBars, fifteenMinBars);
BearishEngWithEngFailFinder(bearEngBars, fifteenMinBars);
DrawBullEngs(bullComboBars);
DrawBearEngs(bearComboBars);
}
#region Times
private TimeOnly ConvertToTime(string timeString)
{
try
{
TimeOnly time = TimeOnly.ParseExact(timeString, "HH:mm");
return time;
}
catch (Exception ex)
{
Print($"Error: {ex.Message} Please enter a valid time.");
Stop();
return TimeOnly.MinValue;
}
}
private bool IsTradingTime()
{
var serverTime = TimeOnly.FromDateTime( Server.Time );
if ( serverTime >= _startTime && serverTime < _endTime)
{
return true;
}
return false;
}
#endregion
#region Risk
private double CalculateStopLoss(Bar bar)
{
if (StopLossStrategy == StopLossType.EntryCandle)
{
var priceDiff = Math.Abs(bar.High - bar.Low);
return priceDiff / Symbol.PipValue;
}
else
return StopLossPips;
}
private double CalculateTP(Bar bullBar, double stopLossPips)
{
if (TakeProfitStrategy == TakeProfitType.RiskReward)
{
return stopLossPips * RiskReward;
}
else
return TakeProfitPips;
}
private double CalculateVolume(double stopLossPips)
{
if (RiskStrategy == RiskType.PercentageRisk)
{
var bruh = Symbol.VolumeForFixedRisk((PercentRisk * Account.Balance) / 100, stopLossPips);
return bruh;
}
else
{
return Symbol.QuantityToVolumeInUnits(Volume);
}
}
private void OpenPosition(Bar bar, TradeType tradeType)
{
var stopLoss = CalculateStopLoss(bar);
var takeProfit = CalculateTP(bar, stopLoss);
var volume = CalculateVolume(stopLoss);
ExecuteMarketOrder(tradeType, Symbol.Name, volume, "Squidward", stopLoss, takeProfit);
invalidatedBars.Add(bar);
}
#endregion
//===============================================================================================================
#region Bullish engulfings
public bool IsBear(Bars bars, int barIndex) => (bars.ClosePrices[barIndex] < bars.OpenPrices[barIndex]);//check if current candle is bearish
public bool IsNextCandleBull(Bars bars, int barIndex) => (bars.ClosePrices[barIndex + 1] > bars.OpenPrices[barIndex + 1]);//takes the set of bars to go through, with the index, checking if the candle after is a bull
public bool IsBullishEngulfing(Bars bars, int barIndex, int forLoopIndex)//IsBear + IsNextCandleBull + IsBullishEngulfing(which takes 2 or more candles to engulf)forloopindex is barindex + 2
{
for (int i = forLoopIndex; i < bars.Count - 1; i++)
{
if (IsBear(bars, i))
return false;
if (bars.ClosePrices[i] > bars.HighPrices[barIndex])//SHOULD BE IIIIIIIIIIIIIIIIIII in the if condition
return true;
}
return false;
}
public bool BullishEngChecks(Bars bars, int i, int forLoopIndex) => (IsBear(bars, i) && IsNextCandleBull(bars, i) && IsBullishEngulfing(bars, i, forLoopIndex));//IsBear + IsNextCandleBull + IsBullishEngulfing
public bool DoesBullishEngulfingFail(Bars bars, int barIndex, int forLoopIndex)//Check if any given bullish engulfing fails
{
for (int i = forLoopIndex; i < bars.Count - 1; i++)
{
if (bars.ClosePrices[i] < bars.LowPrices[barIndex])
{
return true;
}
}
return false;
}
private void BullishEngulfings(Bars bars)
{
var count = 0;
for(int i = bars.Count - 1; i > 0; i--)
{
if(BullishEngChecks(bars, i, i + 1) && !DoesBullishEngulfingFail(bars, i, i + 1) && count < 50)
{
bullEngBars.Add(bars[i]);
}
count++;
}
}
private void DrawBullEngs(Dictionary<Bar, Bar> bullComboBars)
{
var engBars = bullComboBars.Keys.ToList();
foreach (Bar bar in engBars)
{
Chart.DrawRectangle($"BullEngBar {bar.OpenTime}", bar.OpenTime, bar.Low, Server.Time, bar.High, Color.Green);
}
var bearBars = bullComboBars.Values.ToList();
foreach (Bar bar in bearBars)
{
Chart.DrawRectangle($"BearEngBar {bar.OpenTime}", bar.OpenTime, bar.Low, Server.Time, bar.High, Color.Red);
}
}
#endregion
#region Bullish Combo Finder
private void BullishEngWithEngFailFinder(List<Bar> engBars, Bars bars)
{
foreach (Bar bar in engBars)
{
var index = fifteenMinBars.OpenTimes.GetIndexByExactTime(bar.OpenTime);
for (int i = index - 1; i > 0; i--)
{
if (BullishEngChecks(bars, i, i + 1))
break;
else if (BearishEngChecks(bars, i, i + 1) && DoesBearishEngulfingFail(bars, i, i + 1) && IsBullLowerThanBear(bar, bars[i]))
{
if (FourHourSafety)
{
if(IsBuySafe(i, index))
bullComboBars.Add(bar, bars[i]);
break;
}
bullComboBars.Add(bar, bars[i]);
break;
}
}
}
}
private bool IsBullLowerThanBear(Bar bullBar, Bar bearBar) => bullBar.Low < bearBar.Low;
#endregion
#region Buy entry
private void EnterBuys(Dictionary<Bar, Bar> bullComboBars)
{
var ask = Symbol.Ask;
Bar mostRecentCombo = new();
if (bullComboBars.Any())
mostRecentCombo = bullComboBars.Keys.First();
if (ask == mostRecentCombo.High && !invalidatedBars.Contains(mostRecentCombo))
{
OpenPosition(mostRecentCombo, TradeType.Buy);
}
}
#endregion
//========================================================================================
#region Bearish engulfings
public bool IsBull(Bars bars, int barIndex) => (bars.ClosePrices[barIndex] > bars.OpenPrices[barIndex]);//check if current candle is bearish
public bool IsNextCandleBear(Bars bars, int barIndex) => (bars.ClosePrices[barIndex + 1] < bars.OpenPrices[barIndex + 1]);//Checks if next candle after this bull is bearish
public bool IsBearishEngulfing(Bars bars, int barIndex, int forLoopIndex)//IsBear + IsNextCandleBull + IsBullishEngulfing(which takes 2 or more candles to engulf)
{
for (int i = forLoopIndex; i < bars.Count - 1; i++)
{
if (IsBull(bars, i))
return false;
if (bars.ClosePrices[i] < bars.LowPrices[barIndex])//SHOULD BE IIIIIIIIIIIIIIIIIII in the if condition
return true;
}
return false;
}
public bool BearishEngChecks(Bars bars, int i, int forLoopIndex) => (IsBull(bars, i) && IsNextCandleBear(bars, i) && IsBearishEngulfing(bars, i, forLoopIndex));
public bool DoesBearishEngulfingFail(Bars bars, int barIndex, int forLoopIndex)
{
for (int i = forLoopIndex; i < bars.Count - 1; i++)
{
if (bars.ClosePrices[i] > bars.HighPrices[barIndex])
{
return true;
}
}
return false;
} //Check if any given bullish engulfing fails
private void BearishEngulfings(Bars bars)
{
var count = 0;
for (int i = bars.Count - 1; i > 0; i--)
{
if (BearishEngChecks(bars, i, i + 1) && !DoesBearishEngulfingFail(bars, i, i + 1) && count < 50)
{
bearEngBars.Add(bars[i]);
}
count++;
}
}
private void DrawBearEngs(Dictionary<Bar, Bar> bearComboBars)
{
var engBars = bearComboBars.Keys.ToList();
foreach (Bar bar in engBars)
{
Chart.DrawRectangle($"BearEngBar {bar.OpenTime}", bar.OpenTime, bar.Low, Server.Time, bar.High, Color.Red);
}
var bearBars = bearComboBars.Values.ToList();
foreach (Bar bar in bearBars)
{
Chart.DrawRectangle($"BullEngBar {bar.OpenTime}", bar.OpenTime, bar.Low, Server.Time, bar.High, Color.Green);
}
}
#endregion
#region Bearish Combo
private void BearishEngWithEngFailFinder(List<Bar> engBars, Bars bars)
{
foreach (Bar bar in engBars)
{
var index = fifteenMinBars.OpenTimes.GetIndexByExactTime(bar.OpenTime);
for (int i = index - 1; i > 0; i--)
{
if (BearishEngChecks(bars, i, i + 1))
break;
else if (BullishEngChecks(bars, i, i + 1) && DoesBullishEngulfingFail(bars, i, i + 1) && IsBearHigherThanBull(bar, bars[i]))
{
if (FourHourSafety)
{
if (IsSellSafe(i, index))
bearComboBars.Add(bar, bars[i]);
break;
}
bearComboBars.Add(bar, bars[i]);
break;
}
}
}
}
private bool IsBearHigherThanBull(Bar bearBar, Bar bullBar) => bearBar.High > bullBar.High;
#endregion
#region Sell entry
private void EnterSells(Dictionary<Bar, Bar> bearComboBars)
{
var bid = Symbol.Bid;
Bar mostRecentCombo = new();
if (bearComboBars.Any())
mostRecentCombo = bearComboBars.Keys.First();
if (bid == mostRecentCombo.Low && !invalidatedBars.Contains(mostRecentCombo))
{
OpenPosition(mostRecentCombo, TradeType.Sell);
}
}
#endregion
//==========================================================================================
private void FourHourBears(Bars bars)
{
var count = 0;
for (int i = bars.Count - 1; i > 0; i--)
{
if (BearishEngChecks(bars, i, i + 1) && !DoesBearishEngulfingFail(bars, i, i + 1) && count < 50)
{
fourHourBearBars.Add(bars[i]);
}
count++;
}
}
private bool IsSellSafe(int startIndex, int endIndex)
{
for (int i = startIndex; i <= endIndex; i++)
{
var bar = fifteenMinBars[i];
foreach(Bar fourHourBar in fourHourBearBars)
{
if (bar.High >= fourHourBar.Low)
{
Chart.DrawRectangle("bruh", fourHourBar.OpenTime, fourHourBar.Low, Server.Time, fourHourBar.High, Color.Purple);
return true;
}
}
}
return false;
}
private void FourHourBulls(Bars bars)
{
var count = 0;
for (int i = bars.Count - 1; i > 0; i--)
{
if (BullishEngChecks(bars, i, i + 1) && !DoesBullishEngulfingFail(bars, i, i + 1) && count < 50)
{
fourHourBullBars.Add(bars[i]);
}
count++;
}
}
private bool IsBuySafe(int startIndex, int endIndex)
{
for (int i = startIndex; i <= endIndex; i++)
{
var bar = fifteenMinBars[i];
foreach (Bar fourHourBar in fourHourBullBars)
{
if (bar.Low <= fourHourBar.High)
{
Chart.DrawRectangle("bruh", fourHourBar.OpenTime, fourHourBar.Low, Server.Time, fourHourBar.High, Color.Blue);
return true;
}
}
}
return false;
}
}
}
KA
kayirunicholas
Joined on 13.07.2024
- Distribution: Free
- Language: C#
- Trading platform: cTrader Automate
- File name: gSec EGEF Algo_withSourceCode.algo.txt
- Rating: 0
- Installs: 429
- Modified: 13/07/2024 05:54
Warning! Running cBots downloaded from this section may lead to financial losses. Use them at your own risk.
Note that publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section, please use the Copyright Infringement Notification form to submit a claim.
Comments
Log in to add a comment.
No comments found.