From a674fcd708213c2f6fdd1cc25abb04c61b1e5aad Mon Sep 17 00:00:00 2001 From: maidh91 Date: Sun, 9 Oct 2022 05:34:08 +0000 Subject: [PATCH] sample --- Sample Advanced Take Profit.algo | Bin 9381 -> 9992 bytes .../Sample Advanced Take Profit.sln | 19 +- .../Sample Advanced Take Profit.cs | 385 ++++---- .../Sample Advanced Take Profit.csproj | 65 +- Sample Break Even.algo | Bin 4693 -> 7130 bytes Sample Break Even/Sample Break Even.sln | 19 +- .../Sample Break Even/Sample Break Even.cs | 223 +++-- .../Sample Break Even.csproj | 67 +- Sample Breakout cBot.algo | Bin 4693 -> 7062 bytes Sample Breakout cBot/Sample Breakout cBot.sln | 21 +- .../Sample Breakout cBot.cs | 193 ++-- .../Sample Breakout cBot.csproj | 65 +- Sample Close Profitable Positions cBot.algo | Bin 2349 -> 4974 bytes ...Sample Close Profitable Positions cBot.sln | 21 +- .../Sample Close Profitable Positions cBot.cs | 11 +- ...ple Close Profitable Positions cBot.csproj | 65 +- .../Sample Hotkey Trading.sln | 19 +- .../Sample Hotkey Trading.cs | 8 +- .../Sample Hotkey Trading.csproj | 67 +- Sample Lines Trader.algo | Bin 9381 -> 12990 bytes Sample Lines Trader/Sample Lines Trader.sln | 45 +- .../Sample Lines Trader.cs | 884 +++++++++--------- .../Sample Lines Trader.csproj | 69 +- Sample Martingale cBot.algo | Bin 4693 -> 6423 bytes .../Sample Martingale cBot.sln | 21 +- .../Sample Martingale cBot.cs | 158 ++-- .../Sample Martingale cBot.csproj | 65 +- Sample RSI cBot.algo | Bin 4693 -> 5999 bytes Sample RSI cBot/Sample RSI cBot.sln | 21 +- .../Sample RSI cBot/Sample RSI cBot.cs | 150 ++- .../Sample RSI cBot/Sample RSI cBot.csproj | 65 +- Sample SAR Trailing Stop.algo | Bin 4693 -> 6457 bytes .../Sample SAR Trailing Stop.sln | 21 +- .../Sample SAR Trailing Stop.cs | 166 ++-- .../Sample SAR Trailing Stop.csproj | 65 +- Sample Trading Panel.algo | Bin 16389 -> 10543 bytes Sample Trading Panel/Sample Trading Panel.sln | 19 +- .../Sample Trading Panel.cs | 2 +- .../Sample Trading Panel.csproj | 69 +- Sample Trend cBot.algo | Bin 4693 -> 6418 bytes Sample Trend cBot/Sample Trend cBot.sln | 21 +- .../Sample Trend cBot/Sample Trend cBot.cs | 166 ++-- .../Sample Trend cBot.csproj | 65 +- Sample cBot Reference SMA.algo | Bin 4693 -> 7490 bytes .../Sample cBot Reference SMA.sln | 24 +- .../Sample cBot Reference SMA.cs | 81 +- .../Sample cBot Reference SMA.csproj | 76 +- 47 files changed, 1460 insertions(+), 2041 deletions(-) diff --git a/Sample Advanced Take Profit.algo b/Sample Advanced Take Profit.algo index deb4d894494a899bf6a4c2c427782a98c23c0809..b43626eb60995ed5b2a7b3a3abad4c28e526d1af 100644 GIT binary patch literal 9992 zcmV+jC->N4Y-eu*00083ABzY80000001D(+U2obj6n&qx|6uXD5XBCkmHNPFJE5&B z8jOcddoal@vubSQ*j-W8|GwBwnh#h(8cdy*2S|L6?R(C>M{yqBzCoxlSg{$Xgh|mj zK@IE&e$en-WXhJ1Xu4e400{_gV%#MCY0x{t!AZO2cRKBUyG5=u`~|0r#A3h5xzrw- zNTVVciHMsR;tX`9*n$blKhq^x>?B>E0~*A4R74P?DZK?WR`Q1FJPoQApf6N9;ipu$ zc9H{AiJ7de)6k4O-bXl7@9=OWhru@7>Jm! ztE6&HmQtCKn=<(!mCo?Oa9%_#pM0Tcz!%crW4S?+z;a&CV5_Vi%IbaUitPs;8XB&R zf>QxTE6P1IHgnFRkFcJ~TM(x8-1M)OOa7>bq9*mbsD;%Jb@D7i1IXV zh*;KZRo0*24!A4h_hN9yVvw6qCZLWSa%tlF;F#K`(J9-aJt{5YP-k#MQ~oo`jbk(( zofV9#>)6sbb+uw*QAa7c0;QizFqR3^Db-P21J=7G2ciw6>$p0sQ9vHOJxNt-v7OX= zDLGKFgH_Re_*~FAhh6Npqbkfw&57_{^e&mmsWq|R?RPu<5QnW^hlIG@J%1Mlz3P6K z^gf@k7k;9_T0QWw_mZyI+UI3i&t&Q)*k9E#TP3?1W)pHiJqd1gTfMN;`n`nDknUF1 zc4-#u(rhF&EI{oq+Dvkj4!$hgR?r^`_ZNIdj^Z=&Px*`-+-Ky#J|nNrXXNlcBS-KV zc`ZH*kK(iNKYyQv2liR`>U59%7Pmh?Jhimt}GtlX&cW!hR zeu}!4()-6>00030{{sM)uWn^c4gdfE000m&Zsp3sS8H^dnNUV+xNs%EDU5EjMLq11 zepAFxdZ|TSy#syPX2%Z!w*pl25#yhCib$Q3P^29ZfH+HOw?-HWmt=e zO@5_|#Ic0PjtS|sjdFhYEG6+Be|h~aNi8dY8yHwl-d3(y)n;>@OgHeMoW}3c24srfQGUQ68y^-++RH|N)zjyE{VjI_=;S)v^l8A_lesA z$Zf8-4X+f-HZp7STh~o*VE)#36%!y!y4Q>|%t1clDCfXK&JRuPew~ zJ*D~_l4Q!xvLaJvaaDgcVP3Qt$fFX3%wUDcq+Z5xnZzs;q}ZT`A;L-BOyz@fSY3@l znT|zr&v!KDew0mD9qNE&pJ1J&j-S|2@4^HzBG5g$N+*fZ+sn^WJ((uKPzWsxN(MeQ zkCLs*kzVp79&VS?s=`_+6M|f(0w3%IsFiSpSaM?#^4RCsn7$fwLg3JI-E7GfB4KDl z8B=VS=*;C5>A7&^UZgnc(nEbayr%yVj6)Z+{{uqi_7rZ#q_@jb`>Gm&c*MVEVYO7X z7*8(9I&hv7ytffC{C$<^qARLqb}@q=Fp|`lkhJ9_aWZ-@{+I6XjN^gx+$d%r32`sD zc~M`}gw+hObuv^o@)DPPtq?C^&t;}O&$^6NWQWvoD{Q~BeRvK^X8xLJ@$H1j@lzI5 zb$_7S(ugGG@=Iy18>;G1)$=2hRdXCl;rCoE3Oq4#_x~c`X$;$h7T^Txd%v!dqTKGifP%il#CS zABjURF${I85G87NmL=`KZXL3z0ncZ38lQslS6E&i{Zb(I7%YuSvw;!V5UfKTUe%q{ z*4j~PuQ1B#0bRrt&XOGd`)wE`_z-L;Q+5VWwdLJT;zGG!!OFh+qn6Dg#1`FmlKfQ$ zNreSfm+Xm`H2VLxh9t*s<7R^CwDDy9pvYQcO72>KaoP4YMJb} z4}&)mTVCmRz!^msajx_v*06&yt$whsYBbtv;{RJ?)54rec%TafNZ9+WU(iCjZ^Cjy z0YV94Dja4+_>hu4g=XEYql+l?`|Xc|p6S

}O`sK*O|&lDhYscvB4U#z>w@CRTGU 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 level.IsEnabled); - foreach (var level in enabledLevels) - { - if (level.Volume < _symbolInfo.VolumeInUnitsMin) - PrintErrorAndStop("Volume for " + _symbolInfo.Name + " cannot be less than " + _symbolInfo.VolumeInUnitsMin); - if (level.Volume > _symbolInfo.VolumeInUnitsMax) - PrintErrorAndStop("Volume for " + _symbolInfo.Name + " cannot be greater than " + _symbolInfo.VolumeInUnitsMax); - if (level.Volume % _symbolInfo.VolumeInUnitsMin != 0) - PrintErrorAndStop("Volume " + level.Volume + " is invalid"); - } - } - - private void ValidateReachedLevels(Position position) - { - var reachedLevel = _levels.FirstOrDefault(l => l.Pips <= position.Pips); - if (reachedLevel != null) - PrintErrorAndStop("Level " + reachedLevel.Name + " is already reached. The amount of Pips must be more than the amount of Pips that the Position is already gaining"); - } - - private void MakeSureAnyLevelEnabled() - { - if (_levels.All(level => !level.IsEnabled)) - PrintErrorAndStop("You have to enable at least one \"Take Profit\" in cBot Parameters"); - } - - private void ValidateTotalVolume(Position position) - { - var totalVolume = _levels.Where(level => level.IsEnabled).Sum(level => level.Volume); - - if (totalVolume > position.VolumeInUnits) - PrintErrorAndStop("The sum of all Take Profit respective volumes cannot be larger than the Position's volume"); - } - - private TakeProfitLevel[] GetTakeProfitLevels() - { - return new[] - { - new TakeProfitLevel("Take Profit 1", TakeProfit1Enabled, TakeProfit1Pips, TakeProfit1Volume), - new TakeProfitLevel("Take Profit 2", TakeProfit2Enabled, TakeProfit2Pips, TakeProfit2Volume), - new TakeProfitLevel("Take Profit 3", TakeProfit3Enabled, TakeProfit3Pips, TakeProfit3Volume) - }; - } - - private Position FindPositionOrStop() - { - var position = Positions.FirstOrDefault(p => "PID" + p.Id == PositionId || p.Id.ToString() == PositionId); - if (position == null) - PrintErrorAndStop("Position with Id = " + PositionId + " doesn't exist"); - - return position; - } - - private void PrintErrorAndStop(string errorMessage) - { - Print(errorMessage); - Stop(); - - throw new Exception(errorMessage); - } - - protected override void OnTick() - { - var position = FindPositionOrStop(); - var reachedLevels = _levels.Where(level => level.IsEnabled && !level.IsTriggered && level.Pips <= position.Pips); - - foreach (var reachedLevel in reachedLevels) - { - reachedLevel.MarkAsTriggered(); - - Print("Level \"" + reachedLevel.Name + "\" is reached. Level.Pips: " + reachedLevel.Pips + ", Position.Pips: " + position.Pips + ", Position.Id: " + position.Id); - var volumeToClose = Math.Min(reachedLevel.Volume, position.VolumeInUnits); - ClosePosition(position, volumeToClose); - - if (!LastResult.IsSuccessful) - Print("Cannot close position, Id: " + position.Id + ", Error: " + LastResult.Error); - - var remainingLevels = _levels.Where(level => level.IsEnabled && !level.IsTriggered); - if (!remainingLevels.Any()) - { - Print("All levels were reached. cBot is stopping..."); - Stop(); - return; - } - } - } - } - - internal class TakeProfitLevel - { - public string Name { get; private set; } - - public bool IsEnabled { get; private set; } - - public double Pips { get; private set; } - - public int Volume { get; private set; } - - public bool IsTriggered { get; private set; } - - public TakeProfitLevel(string name, bool isEnabled, double pips, int volume) - { - Name = name; - IsEnabled = isEnabled; - Pips = pips; - Volume = volume; - } - - public void MarkAsTriggered() - { - IsTriggered = true; - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using System; +using System.Linq; +using cAlgo.API; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleAdvancedTakeProfit : Robot + { + private const string DefaultPositionIdParameterValue = "PID"; + + [Parameter("Position Id", Group = "Position", DefaultValue = DefaultPositionIdParameterValue)] + public string PositionId { get; set; } + + [Parameter("Enabled", Group = "Take Profit 1", DefaultValue = false)] + public bool TakeProfit1Enabled { get; set; } + + [Parameter("Pips", Group = "Take Profit 1", DefaultValue = 10)] + public double TakeProfit1Pips { get; set; } + + [Parameter("Volume", Group = "Take Profit 1", DefaultValue = 1000)] + public int TakeProfit1Volume { get; set; } + + [Parameter("Enabled", Group = "Take Profit 2", DefaultValue = false)] + public bool TakeProfit2Enabled { get; set; } + + [Parameter("Pips", Group = "Take Profit 2", DefaultValue = 20)] + public double TakeProfit2Pips { get; set; } + + [Parameter("Volume", Group = "Take Profit 2", DefaultValue = 2000)] + public int TakeProfit2Volume { get; set; } + + [Parameter("Enabled", Group = "Take Profit 3", DefaultValue = false)] + public bool TakeProfit3Enabled { get; set; } + + [Parameter("Pips", Group = "Take Profit 3", DefaultValue = 10)] + public double TakeProfit3Pips { get; set; } + + [Parameter("Volume", Group = "Take Profit 3", DefaultValue = 3000)] + public int TakeProfit3Volume { get; set; } + + private TakeProfitLevel[] _levels; + + private SymbolInfo _symbolInfo; + + protected override void OnStart() + { + if (PositionId == DefaultPositionIdParameterValue) + PrintErrorAndStop("You have to specify \"Position Id\" in cBot Parameters"); + + var position = FindPositionOrStop(); + _symbolInfo = Symbols.GetSymbolInfo(position.SymbolName); + _levels = GetTakeProfitLevels(); + + ValidateLevels(position); + } + + private void ValidateLevels(Position position) + { + MakeSureAnyLevelEnabled(); + ValidateTotalVolume(position); + ValidateReachedLevels(position); + ValidateVolumes(); + } + + private void ValidateVolumes() + { + var enabledLevels = _levels.Where(level => level.IsEnabled); + foreach (var level in enabledLevels) + { + if (level.Volume < _symbolInfo.VolumeInUnitsMin) + PrintErrorAndStop("Volume for " + _symbolInfo.Name + " cannot be less than " + _symbolInfo.VolumeInUnitsMin); + if (level.Volume > _symbolInfo.VolumeInUnitsMax) + PrintErrorAndStop("Volume for " + _symbolInfo.Name + " cannot be greater than " + _symbolInfo.VolumeInUnitsMax); + if (level.Volume % _symbolInfo.VolumeInUnitsMin != 0) + PrintErrorAndStop("Volume " + level.Volume + " is invalid"); + } + } + + private void ValidateReachedLevels(Position position) + { + var reachedLevel = _levels.FirstOrDefault(l => l.Pips <= position.Pips); + if (reachedLevel != null) + PrintErrorAndStop("Level " + reachedLevel.Name + " is already reached. The amount of Pips must be more than the amount of Pips that the Position is already gaining"); + } + + private void MakeSureAnyLevelEnabled() + { + if (_levels.All(level => !level.IsEnabled)) + PrintErrorAndStop("You have to enable at least one \"Take Profit\" in cBot Parameters"); + } + + private void ValidateTotalVolume(Position position) + { + var totalVolume = _levels.Where(level => level.IsEnabled).Sum(level => level.Volume); + + if (totalVolume > position.VolumeInUnits) + PrintErrorAndStop("The sum of all Take Profit respective volumes cannot be larger than the Position's volume"); + } + + private TakeProfitLevel[] GetTakeProfitLevels() + { + return new[] + { + new TakeProfitLevel("Take Profit 1", TakeProfit1Enabled, TakeProfit1Pips, TakeProfit1Volume), + new TakeProfitLevel("Take Profit 2", TakeProfit2Enabled, TakeProfit2Pips, TakeProfit2Volume), + new TakeProfitLevel("Take Profit 3", TakeProfit3Enabled, TakeProfit3Pips, TakeProfit3Volume) + }; + } + + private Position FindPositionOrStop() + { + var position = Positions.FirstOrDefault(p => "PID" + p.Id == PositionId || p.Id.ToString() == PositionId); + if (position == null) + PrintErrorAndStop("Position with Id = " + PositionId + " doesn't exist"); + + return position; + } + + private void PrintErrorAndStop(string errorMessage) + { + Print(errorMessage); + Stop(); + + throw new Exception(errorMessage); + } + + protected override void OnTick() + { + var position = FindPositionOrStop(); + var reachedLevels = _levels.Where(level => level.IsEnabled && !level.IsTriggered && level.Pips <= position.Pips); + + foreach (var reachedLevel in reachedLevels) + { + reachedLevel.MarkAsTriggered(); + + Print("Level \"" + reachedLevel.Name + "\" is reached. Level.Pips: " + reachedLevel.Pips + ", Position.Pips: " + position.Pips + ", Position.Id: " + position.Id); + var volumeToClose = Math.Min(reachedLevel.Volume, position.VolumeInUnits); + ClosePosition(position, volumeToClose); + + if (!LastResult.IsSuccessful) + Print("Cannot close position, Id: " + position.Id + ", Error: " + LastResult.Error); + + var remainingLevels = _levels.Where(level => level.IsEnabled && !level.IsTriggered); + if (!remainingLevels.Any()) + { + Print("All levels were reached. cBot is stopping..."); + Stop(); + return; + } + } + } + } + + internal class TakeProfitLevel + { + public TakeProfitLevel(string name, bool isEnabled, double pips, int volume) + { + Name = name; + IsEnabled = isEnabled; + Pips = pips; + Volume = volume; + } + + public string Name { get; private set; } + + public bool IsEnabled { get; private set; } + + public double Pips { get; private set; } + + public int Volume { get; private set; } + + public bool IsTriggered { get; private set; } + + public void MarkAsTriggered() + { + IsTriggered = true; + } + } +} diff --git a/Sample Advanced Take Profit/Sample Advanced Take Profit/Sample Advanced Take Profit.csproj b/Sample Advanced Take Profit/Sample Advanced Take Profit/Sample Advanced Take Profit.csproj index 62daf8b..4d61a27 100644 --- a/Sample Advanced Take Profit/Sample Advanced Take Profit/Sample Advanced Take Profit.csproj +++ b/Sample Advanced Take Profit/Sample Advanced Take Profit/Sample Advanced Take Profit.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {EEDB1B00-B586-41DC-B004-EB7AC1762CED} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample Advanced Take Profit - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample Break Even.algo b/Sample Break Even.algo index 7d7ba73dabe7cac08ac09f97ff23ce2ae978d205..81ad7a246c8102cfe8ccc58bdfe2c0a91d640ca8 100644 GIT binary patch literal 7130 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 QS4Y>JJC)yt2x`b&PvIEG&Hw-a literal 4693 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 "PID" + p.Id == PositionId || p.Id.ToString() == PositionId); - if (position == null) - PrintErrorAndStop("Position with Id = " + PositionId + " doesn't exist"); - - return position; - } - - protected override void OnTick() - { - BreakEvenIfNeeded(); - } - - private void BreakEvenIfNeeded() - { - var position = FindPositionOrStop(); - - if (position.Pips < TriggerPips) - return; - - var desiredNetProfitInDepositAsset = AddPips * _symbolInfo.PipValue * position.VolumeInUnits; - var desiredGrossProfitInDepositAsset = desiredNetProfitInDepositAsset - position.Commissions * 2 - position.Swap; - var quoteToDepositRate = _symbolInfo.PipValue / _symbolInfo.PipSize; - var priceDifference = desiredGrossProfitInDepositAsset / (position.VolumeInUnits * quoteToDepositRate); - - var priceAdjustment = GetPriceAdjustmentByTradeType(position.TradeType, priceDifference); - var breakEvenLevel = position.EntryPrice + priceAdjustment; - var roundedBreakEvenLevel = RoundPrice(breakEvenLevel, position.TradeType); - - ModifyPosition(position, roundedBreakEvenLevel, position.TakeProfit); - - Print("Stop loss for position PID" + position.Id + " has been moved to break even."); - Print("Stopping cBot.."); - Stop(); - } - - private double RoundPrice(double price, TradeType tradeType) - { - var multiplier = Math.Pow(10, _symbolInfo.Digits); - - if (tradeType == TradeType.Buy) - return Math.Ceiling(price * multiplier) / multiplier; - - return Math.Floor(price * multiplier) / multiplier; - } - - private static double GetPriceAdjustmentByTradeType(TradeType tradeType, double priceDifference) - { - if (tradeType == TradeType.Buy) - return priceDifference; - - return -priceDifference; - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using System; +using System.Linq; +using cAlgo.API; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleBreakEven : Robot + { + private SymbolInfo _symbolInfo; + private const string DefaultPositionIdParameterValue = "PID"; + + [Parameter("Position Id", DefaultValue = DefaultPositionIdParameterValue)] + public string PositionId { get; set; } + + [Parameter("Add Pips", DefaultValue = 0.0, MinValue = 0.0)] + public double AddPips { get; set; } + + [Parameter("Trigger Pips", DefaultValue = 10, MinValue = 1)] + public double TriggerPips { get; set; } + + protected override void OnStart() + { + if (PositionId == DefaultPositionIdParameterValue) + PrintErrorAndStop("You have to specify \"Position Id\" in cBot Parameters"); + + if (TriggerPips < AddPips + 2) + PrintErrorAndStop("\"Trigger Pips\" must be greater or equal to \"Add Pips\" + 2"); + + var position = FindPositionOrStop(); + _symbolInfo = Symbols.GetSymbolInfo(position.SymbolName); + + BreakEvenIfNeeded(); + } + + private void PrintErrorAndStop(string errorMessage) + { + Print(errorMessage); + Stop(); + + throw new Exception(errorMessage); + } + + private Position FindPositionOrStop() + { + var position = Positions.FirstOrDefault(p => "PID" + p.Id == PositionId || p.Id.ToString() == PositionId); + if (position == null) + PrintErrorAndStop("Position with Id = " + PositionId + " doesn't exist"); + + return position; + } + + protected override void OnTick() + { + BreakEvenIfNeeded(); + } + + private void BreakEvenIfNeeded() + { + var position = FindPositionOrStop(); + + if (position.Pips < TriggerPips) + return; + + var desiredNetProfitInDepositAsset = AddPips * _symbolInfo.PipValue * position.VolumeInUnits; + var desiredGrossProfitInDepositAsset = desiredNetProfitInDepositAsset - position.Commissions * 2 - position.Swap; + var quoteToDepositRate = _symbolInfo.PipValue / _symbolInfo.PipSize; + var priceDifference = desiredGrossProfitInDepositAsset / (position.VolumeInUnits * quoteToDepositRate); + + var priceAdjustment = GetPriceAdjustmentByTradeType(position.TradeType, priceDifference); + var breakEvenLevel = position.EntryPrice + priceAdjustment; + var roundedBreakEvenLevel = RoundPrice(breakEvenLevel, position.TradeType); + + ModifyPosition(position, roundedBreakEvenLevel, position.TakeProfit); + + Print("Stop loss for position PID" + position.Id + " has been moved to break even."); + Print("Stopping cBot.."); + Stop(); + } + + private double RoundPrice(double price, TradeType tradeType) + { + var multiplier = Math.Pow(10, _symbolInfo.Digits); + + if (tradeType == TradeType.Buy) + return Math.Ceiling(price * multiplier) / multiplier; + + return Math.Floor(price * multiplier) / multiplier; + } + + private static double GetPriceAdjustmentByTradeType(TradeType tradeType, double priceDifference) + { + if (tradeType == TradeType.Buy) + return priceDifference; + + return -priceDifference; + } + } +} diff --git a/Sample Break Even/Sample Break Even/Sample Break Even.csproj b/Sample Break Even/Sample Break Even/Sample Break Even.csproj index 669fd20..d17d418 100644 --- a/Sample Break Even/Sample Break Even/Sample Break Even.csproj +++ b/Sample Break Even/Sample Break Even/Sample Break Even.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {4480D0DB-676E-4C4E-B170-1485840E801F} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample Break Even - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - - \ No newline at end of file + + + net6.0 + + + + + + diff --git a/Sample Breakout cBot.algo b/Sample Breakout cBot.algo index 49eb31c766f6f2d8a672af41470c135a76617a72..098f82f9d3c945e87ff00e8706831e7d2d6f829f 100644 GIT binary patch literal 7062 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 diff --git a/Sample Breakout cBot/Sample Breakout cBot.sln b/Sample Breakout cBot/Sample Breakout cBot.sln index 8c853d2..d42073f 100644 --- a/Sample Breakout cBot/Sample Breakout cBot.sln +++ b/Sample Breakout cBot/Sample Breakout cBot.sln @@ -1,7 +1,9 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample Breakout cBot", "Sample Breakout cBot\Sample Breakout cBot.csproj", "{BE7B6AFD-192E-4144-A91B-177D01F1E891}" + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample Breakout cBot", "Sample Breakout cBot\Sample Breakout cBot.csproj", "{CBC7BE7A-81B2-4F14-8B69-B712DD5F759A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,12 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BE7B6AFD-192E-4144-A91B-177D01F1E891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BE7B6AFD-192E-4144-A91B-177D01F1E891}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BE7B6AFD-192E-4144-A91B-177D01F1E891}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BE7B6AFD-192E-4144-A91B-177D01F1E891}.Release|Any CPU.Build.0 = Release|Any CPU + {CBC7BE7A-81B2-4F14-8B69-B712DD5F759A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBC7BE7A-81B2-4F14-8B69-B712DD5F759A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBC7BE7A-81B2-4F14-8B69-B712DD5F759A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBC7BE7A-81B2-4F14-8B69-B712DD5F759A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C9DB86CA-C93D-40B4-B21C-D4B265B95299} + EndGlobalSection EndGlobal diff --git a/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.cs b/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.cs index 39cac7e..60cc053 100644 --- a/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.cs +++ b/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.cs @@ -1,100 +1,93 @@ -// ------------------------------------------------------------------------------------------------- -// -// This code is a cTrader Automate API example. -// -// 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. -// -// All changes to this file might be lost on the next application update. -// If you are going to modify this file please make a copy using the "Duplicate" command. -// -// The "Sample Breakout cBot" will check the difference in pips between the Upper Bollinger Band and the Lower Bollinger Band -// and compare it against the "Band Height" parameter specified by the user. If the height is lower than the number of pips -// specified, the market is considered to be consolidating, and the first candlestick to cross the upper or lower band will -// generate a buy or sell signal. The user can specify the number of periods that the market should be consolidating in the -// "Consolidation Periods" parameter. The position is closed by a Stop Loss or Take Profit. -// -// ------------------------------------------------------------------------------------------------- -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 SampleBreakoutcBot : Robot - { - - [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] - public double Quantity { get; set; } - - [Parameter("Stop Loss (pips)", Group = "Protection", DefaultValue = 20, MinValue = 1)] - public int StopLossInPips { get; set; } - - [Parameter("Take Profit (pips)", Group = "Protection", DefaultValue = 40, MinValue = 1)] - public int TakeProfitInPips { get; set; } - - [Parameter("Source", Group = "Bollinger Bands")] - public DataSeries Source { get; set; } - - [Parameter("Band Height (pips)", Group = "Bollinger Bands", DefaultValue = 40.0, MinValue = 0)] - public double BandHeightPips { get; set; } - - [Parameter("Bollinger Bands Deviations", Group = "Bollinger Bands", DefaultValue = 2)] - public double Deviations { get; set; } - - [Parameter("Bollinger Bands Periods", Group = "Bollinger Bands", DefaultValue = 20)] - public int Periods { get; set; } - - [Parameter("Bollinger Bands MA Type", Group = "Bollinger Bands")] - public MovingAverageType MAType { get; set; } - - [Parameter("Consolidation Periods", Group = "Bollinger Bands", DefaultValue = 2)] - public int ConsolidationPeriods { get; set; } - - BollingerBands bollingerBands; - string label = "Sample Breakout cBot"; - int consolidation; - - protected override void OnStart() - { - bollingerBands = Indicators.BollingerBands(Source, Periods, Deviations, MAType); - } - - protected override void OnBar() - { - - var top = bollingerBands.Top.Last(1); - var bottom = bollingerBands.Bottom.Last(1); - - if (top - bottom <= BandHeightPips * Symbol.PipSize) - { - consolidation = consolidation + 1; - } - else - { - consolidation = 0; - } - - if (consolidation >= ConsolidationPeriods) - { - var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity); - if (Ask > top) - { - ExecuteMarketOrder(TradeType.Buy, SymbolName, volumeInUnits, label, StopLossInPips, TakeProfitInPips); - - consolidation = 0; - } - else if (Bid < bottom) - { - ExecuteMarketOrder(TradeType.Sell, SymbolName, volumeInUnits, label, StopLossInPips, TakeProfitInPips); - - consolidation = 0; - } - } - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// The "Sample Breakout cBot" will check the difference in pips between the Upper Bollinger Band and the Lower Bollinger Band +// and compare it against the "Band Height" parameter specified by the user. If the height is lower than the number of pips +// specified, the market is considered to be consolidating, and the first candlestick to cross the upper or lower band will +// generate a buy or sell signal. The user can specify the number of periods that the market should be consolidating in the +// "Consolidation Periods" parameter. The position is closed by a Stop Loss or Take Profit. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleBreakoutcBot : Robot + { + [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] + public double Quantity { get; set; } + + [Parameter("Stop Loss (pips)", Group = "Protection", DefaultValue = 20, MinValue = 1)] + public int StopLossInPips { get; set; } + + [Parameter("Take Profit (pips)", Group = "Protection", DefaultValue = 40, MinValue = 1)] + public int TakeProfitInPips { get; set; } + + [Parameter("Source", Group = "Bollinger Bands")] + public DataSeries Source { get; set; } + + [Parameter("Band Height (pips)", Group = "Bollinger Bands", DefaultValue = 40.0, MinValue = 0)] + public double BandHeightPips { get; set; } + + [Parameter("Bollinger Bands Deviations", Group = "Bollinger Bands", DefaultValue = 2)] + public double Deviations { get; set; } + + [Parameter("Bollinger Bands Periods", Group = "Bollinger Bands", DefaultValue = 20)] + public int Periods { get; set; } + + [Parameter("Bollinger Bands MA Type", Group = "Bollinger Bands")] + public MovingAverageType MAType { get; set; } + + [Parameter("Consolidation Periods", Group = "Bollinger Bands", DefaultValue = 2)] + public int ConsolidationPeriods { get; set; } + + BollingerBands bollingerBands; + string label = "Sample Breakout cBot"; + int consolidation; + + protected override void OnStart() + { + bollingerBands = Indicators.BollingerBands(Source, Periods, Deviations, MAType); + } + + protected override void OnBar() + { + var top = bollingerBands.Top.Last(1); + var bottom = bollingerBands.Bottom.Last(1); + + if (top - bottom <= BandHeightPips * Symbol.PipSize) + { + consolidation = consolidation + 1; + } + else + { + consolidation = 0; + } + + if (consolidation >= ConsolidationPeriods) + { + var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity); + if (Ask > top) + { + ExecuteMarketOrder(TradeType.Buy, SymbolName, volumeInUnits, label, StopLossInPips, TakeProfitInPips); + consolidation = 0; + } + else if (Bid < bottom) + { + ExecuteMarketOrder(TradeType.Sell, SymbolName, volumeInUnits, label, StopLossInPips, TakeProfitInPips); + consolidation = 0; + } + } + } + } +} diff --git a/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.csproj b/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.csproj index 4ae6513..6d836c9 100644 --- a/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.csproj +++ b/Sample Breakout cBot/Sample Breakout cBot/Sample Breakout cBot.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {BE7B6AFD-192E-4144-A91B-177D01F1E891} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample Breakout cBot - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample Close Profitable Positions cBot.algo b/Sample Close Profitable Positions cBot.algo index 27c0c572b8309ff7f3e133a72ad2237f7df67415..4fc8fc94a04d12d4317b68b159d92f8ebf60ab71 100644 GIT binary patch literal 4974 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 literal 2349 zcmV+|3DWjqY-eu)#a2nrvg|(obn!hR@-wW?bshV7d2I$8a?WYPkT*HbL(1nvk%(#= zrBxOBrhjV+@C{Mr#$Rs^J;hEF!UL2SB16cau1c@gk+>dHAsj56BmuH~Xk)>CF(1uBSLeBug128pK zFNcwutc1~`9F0$sSsgD`)_f$onldB$QHjrDr7O<&oh^MPy1&W%8XQLdpQ858KfW1ZI^(7ifM}XivR1 zMsu;bgIOPmw=+r+Sxm>>J|q7-mLhZzZ3^5hzu|~AyK?oJn1V-%G{fG95f0hU z#DWCL4o=L})Z2~hmkO0HBYN(HmIdNB%qB7yK5X?2g``;#%7e)*VwhjQLnpqe)!z7| z_)iuRXkGbo`kcCp2F5EmLRf+H3IP8YA9Z&XGee zw&az@!33#5C8Ti2*Cb6QqOQJ!3FQcZPjKvnR(ievO$l3L3O9m{KH)mIk5@Jvbw;@^ zDLn)MAF>Rdp6&f@m9u0KWJQHP)Y^mp(jnyv^-5Y&GxKXw@-uOf3=yg|Q?J$SA!L?2 zc~yr202ZASKE&?8dIXmO@O=oiqN|X?Q$GE!HEC-ox$QO_YRT`L2Gub{Sb9&aLRuaQ zNw;`kr>+X_fRnG&AVEj{x?+yl;ymVpLVTT?Ip9w$?A){i+Er(k-_JEB#qIVOTt4o( z^qGb4$&%%4KMUGM-cO*FB4!9dg@XlVPv3n?J$JoP<_^3F>z6^oxlr;XqRF7BXipBc zf5SrggRV?aKXP1O_eG*%cyOj*jxEUfGZRQtP}A@H!u(1KQmGa`qqx9D?zgsf*5f2W z#biN&<<+Fo9#EB=-;H|SF>CbEZHBVg@g9&*EMn{HL{JYfqtb7dL$Mst+`D3%l(NZpudah6kvxR->CE{WhSGUA|c z)wus1Ik30yl$U_NuFz>cm#^-OlbHii*_uR>6I*e;KrXDiz`@nx`ej|+CfD21F9T*p z1*bwt-g1{&W_Ukc*ydV%WLC%}*^_5c5@ z(^N;GNyg-LW{fh&2MbDZa8yI#X1fk#_x2vnIa$xopR!xU;ctV?ZX)?WmDFCdT~BHl zMFOJJyB``jD04)M_U6V!l1k{J)Zys$4Kfga+O)0Wbk{9%?3z{o+O}=T44j+l(TSEQ zZkoH5aMBP-ft5pM$q0_%r88qZmCY$_$WQvn)O?45XkUsUm!d?Uy1{X6BawNV^mdAn zropaT`?nJzqySxp1Z5teU2jtgUT2R?_dgg`L4y-Wnfku+-H#AcFi24_$Y&mu&;wFd z>I+bber>yTo?5MkD$YF%x%P?rc!<5S7j!NTL9k1Oy+zycHcjanQU4hl88a6BZq_X; z;*F}zm?UYog&%ro3eCsQ$s+#4t0rWH&| zA}Zv&z2n&`W2Imnf!&O>F8GOU64%Gj52&_p3O^F>tM##6y#LHz`m?qkCPc3WOTLOb zPn$a&)Ud4!EA+tdUIr#Dj}&2dv1q#Su*ikd@p0OByo1R3z-= z8B8XcGk_i-zEQV{H1j)cKYp%IWi(OfbZ)MjwvH4$h!=H5?FodhK?+&*V{!+?JMK5* z5?TDtR_u+zo$!785wfN1c>yi({*>$559pI`njANp_#9pdd)_F@ZT*q6hrAqUq6iFL z@4S7ealVMYDH>lfwsHY&1&mNXtQM^89A{r~r~%|Z5en8Yxm$N5iS?NWUNAR@P<9Yp zvIK?AUpbTP(QW3pZ=FF%CVcRe4s1AFTl7ck2=Z{-)@kXkZ2QOZtx3M_T`ou>n>CJAvf;oFwv7&hJjfy-@ig%9U85Fa`GtO7P zcOoR!bv_~j!NA|Q%u$sQv2GhFb?QYj0ALf;8mWr3;=1A8eWQ9vYC4U{m(~@>f1(q_ zvn@)D-0{>ED^BMZHY?Q;aJQ2U^U}XMU3{A=N=sCCmc;j~F!v&O0zDcMw z5FPF?mt-a{@(ip)AGrX@wl<=qT^^d|Wx|tf`uDbeO#|ju_(@;@j28RV9Pbbc1Bo(nIY36|3WmuX^ T16hR`J7tllDy?{A+GF 0) - { ClosePosition(position); - } - } } } } diff --git a/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot.csproj b/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot.csproj index 3f0968b..6d836c9 100644 --- a/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot.csproj +++ b/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot/Sample Close Profitable Positions cBot.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {ACE502CB-48F6-4AEB-BED6-D67CF88CD535} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample Close Profitable Positions cBot - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample Hotkey Trading/Sample Hotkey Trading.sln b/Sample Hotkey Trading/Sample Hotkey Trading.sln index 5410378..460d94d 100644 --- a/Sample Hotkey Trading/Sample Hotkey Trading.sln +++ b/Sample Hotkey Trading/Sample Hotkey Trading.sln @@ -1,7 +1,9 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample Hotkey Trading", "Sample Hotkey Trading\Sample Hotkey Trading.csproj", "{341B8A90-31A2-430A-A96C-2AAA77FD08D2}" +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample Hotkey Trading", "Sample Hotkey Trading\Sample Hotkey Trading.csproj", "{966AAC88-4F39-4452-804C-136504453714}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,12 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {341B8A90-31A2-430A-A96C-2AAA77FD08D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {341B8A90-31A2-430A-A96C-2AAA77FD08D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {341B8A90-31A2-430A-A96C-2AAA77FD08D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {341B8A90-31A2-430A-A96C-2AAA77FD08D2}.Release|Any CPU.Build.0 = Release|Any CPU + {966AAC88-4F39-4452-804C-136504453714}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {966AAC88-4F39-4452-804C-136504453714}.Debug|Any CPU.Build.0 = Debug|Any CPU + {966AAC88-4F39-4452-804C-136504453714}.Release|Any CPU.ActiveCfg = Release|Any CPU + {966AAC88-4F39-4452-804C-136504453714}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B86EDD01-5F23-4B24-AC49-4DB68577C8F3} + EndGlobalSection EndGlobal diff --git a/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.cs b/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.cs index 6b384a0..5b61f4e 100644 --- a/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.cs +++ b/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.cs @@ -1,18 +1,12 @@ using System; using System.Linq; -using System.Text; using cAlgo.API; -using cAlgo.API.Indicators; -using cAlgo.API.Internals; -using cAlgo.Indicators; -namespace cAlgo.Robots +namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class SampleHotkeyTrading : Robot { - - [Parameter("Buy", DefaultValue = "Ctrl + Up", Group = "Trading Hotkeys")] public string BuyKeys { get; set; } diff --git a/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.csproj b/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.csproj index 201004d..4d61a27 100644 --- a/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.csproj +++ b/Sample Hotkey Trading/Sample Hotkey Trading/Sample Hotkey Trading.csproj @@ -1,60 +1,9 @@ - - - - - 7.2 - Debug - AnyCPU - {341B8A90-31A2-430A-A96C-2AAA77FD08D2} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample Hotkey Trading - v4.0 - Client - 512 - True - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample Lines Trader.algo b/Sample Lines Trader.algo index ed8db9da7784a83529db10f44c99463f584e2413..ac3557c7231e0ff95942e8de4022d6f49e1c8ff8 100644 GIT binary patch literal 12990 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 AxBvhE literal 9381 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 F{{u^KHqih8 diff --git a/Sample Lines Trader/Sample Lines Trader.sln b/Sample Lines Trader/Sample Lines Trader.sln index ce401fb..80c0c42 100644 --- a/Sample Lines Trader/Sample Lines Trader.sln +++ b/Sample Lines Trader/Sample Lines Trader.sln @@ -1,20 +1,25 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample Lines Trader", "Sample Lines Trader\Sample Lines Trader.csproj", "{DAE09C82-8303-4DD7-862A-034A5AD4113A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DAE09C82-8303-4DD7-862A-034A5AD4113A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DAE09C82-8303-4DD7-862A-034A5AD4113A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DAE09C82-8303-4DD7-862A-034A5AD4113A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DAE09C82-8303-4DD7-862A-034A5AD4113A}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample Lines Trader", "Sample Lines Trader\Sample Lines Trader.csproj", "{78F7D164-DC8B-4E6A-9631-C9832E79753A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78F7D164-DC8B-4E6A-9631-C9832E79753A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78F7D164-DC8B-4E6A-9631-C9832E79753A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78F7D164-DC8B-4E6A-9631-C9832E79753A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78F7D164-DC8B-4E6A-9631-C9832E79753A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DFF08E67-47EC-41CF-A0BF-16609194FF89} + EndGlobalSection +EndGlobal diff --git a/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.cs b/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.cs index 93e4bf6..fadf80e 100644 --- a/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.cs +++ b/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.cs @@ -1,439 +1,445 @@ -// ------------------------------------------------------------------------------------------------- -// -// This code is a cTrader Automate API example. -// -// 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. -// -// All changes to this file might be lost on the next application update. -// If you are going to modify this file please make a copy using the "Duplicate" command. -// -// The "Sample Lines Trader cBot" allows traders to draw lines on chart which can be used a break out or retracement lines. -// If the price crosses a Breakout Line then an order towards the crossing direction is placed. -// If the price crosses a Retracement Line then an order towards the opposite direction of the crossing is placed -// -// ------------------------------------------------------------------------------------------------- - -using System; -using System.Collections.Generic; -using System.Linq; -using cAlgo.API; -using cAlgo.API.Internals; - -namespace cAlgo.Robots -{ - [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] - public class SampleLinesTrader : Robot - { - private const string HowToUseText = "How to use:\nCtrl + Left Mouse Button - Draw Breakout line\nShift + Left Mouse Button - Draw Retracement line"; - - private const string HowToUseObjectName = "LinesTraderText"; - - [Parameter("Volume", Group = "Volume", DefaultValue = 1000, MinValue = 0, Step = 1)] - public double Volume { get; set; } - - [Parameter("Stop Loss Pips", Group = "Protection", DefaultValue = 0.0, MinValue = 0.0, Step = 1)] - public double StopLossPips { get; set; } - - [Parameter("Take Profit Pips", Group = "Protection", DefaultValue = 0.0, MinValue = 0.0, Step = 1)] - public double TakeProfitPips { get; set; } - - [Parameter("Allow trading", Group = "Trading", DefaultValue = true)] - public bool IsTradingAllowed { get; set; } - - [Parameter("Allow email notifications", Group = "Email notifications", DefaultValue = false)] - public bool IsEmailAllowed { get; set; } - - [Parameter("Email address", Group = "Email notifications")] - public string EmailAddress { get; set; } - - [Parameter("Show How To Use", Group = "Settings", DefaultValue = true)] - public bool ShowHowToUse { get; set; } - - private SignalLineDrawManager DrawManager { get; set; } - private SignalLineRepository SignalLineRepository { get; set; } - - protected override void OnStart() - { - DrawManager = new SignalLineDrawManager(this); - SignalLineRepository = new SignalLineRepository(Chart); - - if (ShowHowToUse) - { - ShowHowToUseText(); - Chart.MouseDown += OnChartMouseDown; - } - } - - protected override void OnTick() - { - var lastBarIndex = MarketSeries.Close.Count - 1; - foreach (var signalLine in SignalLineRepository.GetLines()) - if (signalLine.CanExecute(Bid, lastBarIndex)) - { - signalLine.MarkAsExecuted(); - var message = string.Format("{0} Signal line {1}{2} was executed on {3}", Time, signalLine.TradeType, signalLine.SignalType, SymbolName); - Print(message); - - if (IsTradingAllowed) - { - ExecuteMarketOrder(signalLine.TradeType, SymbolName, Volume, "LinesTrader cBot", StopLossPips, TakeProfitPips); - } - if (IsEmailAllowed) - { - Notifications.SendEmail(EmailAddress, EmailAddress, "LinesTrader Alert", message); - } - } - } - - protected override void OnStop() - { - SignalLineRepository.Dispose(); - DrawManager.Dispose(); - } - - private void OnChartMouseDown(ChartMouseEventArgs args) - { - Chart.MouseDown -= OnChartMouseDown; - HideHowToUseText(); - } - - private void ShowHowToUseText() - { - Chart.DrawStaticText(HowToUseObjectName, HowToUseText, VerticalAlignment.Center, HorizontalAlignment.Center, Chart.ColorSettings.ForegroundColor); - } - - private void HideHowToUseText() - { - Chart.RemoveObject(HowToUseObjectName); - } - } - - public class SignalLineDrawManager : IDisposable - { - private readonly Algo _algo; - private readonly Chart _chart; - private ProtoSignalLine _currentProtoSignalLine; - private const string StatusTextName = "ProtoSignalLineStatus"; - - - - public SignalLineDrawManager(Algo algo) - { - _algo = algo; - _chart = algo.Chart; - _chart.DragStart += OnChartDragStart; - _chart.DragEnd += OnChartDragEnd; - _chart.Drag += OnChartDrag; - } - - private void OnChartDragStart(ChartDragEventArgs args) - { - if (args.ChartArea != args.Chart) - return; - - var signalType = GetSignalType(args); - if (signalType.HasValue) - { - _chart.IsScrollingEnabled = false; - _currentProtoSignalLine = new ProtoSignalLine(_algo, signalType, args.TimeValue, args.YValue); - UpdateStatus(); - } - else - { - _currentProtoSignalLine = null; - } - } - - private void OnChartDragEnd(ChartDragEventArgs args) - { - if (_currentProtoSignalLine != null) - { - _currentProtoSignalLine.Complete(args.TimeValue, args.YValue); - _currentProtoSignalLine = null; - - _chart.IsScrollingEnabled = true; - _chart.RemoveObject(StatusTextName); - } - } - - private void OnChartDrag(ChartDragEventArgs args) - { - if (_currentProtoSignalLine != null) - { - _currentProtoSignalLine.Update(args.TimeValue, args.YValue); - UpdateStatus(); - } - } - - private void UpdateStatus() - { - var text = string.Format("Creating {0} line", _currentProtoSignalLine.LineLabel); - _chart.DrawStaticText(StatusTextName, text, VerticalAlignment.Top, HorizontalAlignment.Left, _chart.ColorSettings.ForegroundColor); - } - - private SignalType? GetSignalType(ChartDragEventArgs args) - { - if (args.CtrlKey && !args.ShiftKey) - return SignalType.Breakout; - if (!args.CtrlKey && args.ShiftKey) - return SignalType.Retracement; - - return null; - } - - public void Dispose() - { - _chart.DragStart -= OnChartDragStart; - _chart.DragEnd -= OnChartDragEnd; - _chart.Drag -= OnChartDrag; - } - } - - public class SignalLineRepository : IDisposable - { - private readonly Chart _chart; - private readonly Dictionary _signalLines; - - public SignalLineRepository(Chart chart) - { - _chart = chart; - _signalLines = new Dictionary(); - - foreach (var chartTrendLine in chart.FindAllObjects()) - TryAddSignalLine(chartTrendLine); - - _chart.ObjectAdded += OnChartObjectAdded; - _chart.ObjectRemoved += OnChartObjectRemoved; - _chart.ObjectUpdated += OnChartObjectUpdated; - } - - public IEnumerable GetLines() - { - return _signalLines.Values; - } - - private void TryAddSignalLine(ChartObject chartObject) - { - var chartTrendLine = chartObject as ChartTrendLine; - if (chartTrendLine != null && IsSignalLine(chartTrendLine)) - _signalLines.Add(chartTrendLine.Name, CreateSignalLine(chartTrendLine)); - } - - private void TryRemoveSignalLine(ChartObject chartObject) - { - if (_signalLines.ContainsKey(chartObject.Name)) - _signalLines.Remove(chartObject.Name); - } - - private void OnChartObjectAdded(ChartObjectAddedEventArgs args) - { - if (args.Area != args.Chart) - return; - - TryAddSignalLine(args.ChartObject); - } - - private void OnChartObjectUpdated(ChartObjectUpdatedEventArgs args) - { - if (args.Area != args.Chart) - return; - - TryRemoveSignalLine(args.ChartObject); - TryAddSignalLine(args.ChartObject); - } - - private void OnChartObjectRemoved(ChartObjectRemovedEventArgs args) - { - if (args.Area != args.Chart) - return; - - TryRemoveSignalLine(args.ChartObject); - } - - private SignalLine CreateSignalLine(ChartTrendLine chartTrendLine) - { - var signalType = GetLineSignalType(chartTrendLine); - var tradeType = GetLineTradeType(chartTrendLine); - var signalLine = new SignalLine(chartTrendLine, signalType, tradeType); - return signalLine; - } - - private bool IsSignalLine(ChartTrendLine line) - { - return SignalLineLabels.AllLabels.Contains(line.Comment); - } - - private SignalType GetLineSignalType(ChartTrendLine line) - { - var comment = line.Comment; - if (comment == SignalLineLabels.BuyBreakoutLabel || comment == SignalLineLabels.SellBreakoutLabel) - return SignalType.Breakout; - if (comment == SignalLineLabels.BuyRetraceLabel || comment == SignalLineLabels.SellRetraceLabel) - return SignalType.Retracement; - throw new ArgumentException(); - } - - private TradeType GetLineTradeType(ChartTrendLine line) - { - var comment = line.Comment; - if (comment == SignalLineLabels.BuyBreakoutLabel || comment == SignalLineLabels.BuyRetraceLabel) - return TradeType.Buy; - if (comment == SignalLineLabels.SellBreakoutLabel || comment == SignalLineLabels.SellRetraceLabel) - return TradeType.Sell; - throw new ArgumentException(); - } - - public void Dispose() - { - _chart.ObjectAdded -= OnChartObjectAdded; - _chart.ObjectRemoved -= OnChartObjectRemoved; - _chart.ObjectUpdated -= OnChartObjectUpdated; - } - } - - public class ProtoSignalLine - { - - private static readonly Color BuyLineColor = Color.Green; - private static readonly Color SellLineColor = Color.Red; - - private readonly Chart _chart; - private readonly ChartTrendLine _line; - private readonly SignalType? _signalType; - private readonly Symbol _symbol; - - public ProtoSignalLine(Algo algo, SignalType? signalType, DateTime startTimeValue, double startYValue) - { - _chart = algo.Chart; - _signalType = signalType; - _symbol = algo.Symbol; - - _line = _chart.DrawTrendLine(string.Format("LinesTrader {0:N}", Guid.NewGuid()), startTimeValue, startYValue, startTimeValue, startYValue, LineColor); - - _line.ExtendToInfinity = true; - _line.Thickness = 2; - _line.IsInteractive = true; - } - - private bool IsPriceAboveLine - { - get { return _line != null && _symbol.Bid >= _line.CalculateY(_chart.MarketSeries.Close.Count - 1); } - } - - private TradeType LineTradeType - { - get { return _signalType == SignalType.Breakout ? (IsPriceAboveLine ? TradeType.Sell : TradeType.Buy) : (IsPriceAboveLine ? TradeType.Buy : TradeType.Sell); } - } - - private Color LineColor - { - get { return LineTradeType == TradeType.Buy ? BuyLineColor : SellLineColor; } - } - - public string LineLabel - { - get { return _signalType == SignalType.Breakout ? (LineTradeType == TradeType.Buy ? SignalLineLabels.BuyBreakoutLabel : SignalLineLabels.SellBreakoutLabel) : (LineTradeType == TradeType.Buy ? SignalLineLabels.BuyRetraceLabel : SignalLineLabels.SellRetraceLabel); } - } - - private bool CanComplete - { - get { return _line.Time1 != _line.Time2 || Math.Abs(_line.Y1 - _line.Y2) >= _symbol.PipValue; } - } - - public void Update(DateTime timeValue, double yValue) - { - _line.Time2 = timeValue; - _line.Y2 = yValue; - _line.Color = LineColor; - } - - public void Complete(DateTime timeValue, double yValue) - { - Update(timeValue, yValue); - - if (CanComplete) - { - _line.Comment = LineLabel; - _line.IsInteractive = true; - } - else - { - _chart.RemoveObject(_line.Name); - } - } - } - - public class SignalLine - { - public TradeType TradeType { get; private set; } - public SignalType SignalType { get; private set; } - - private readonly ChartTrendLine _chartTrendLine; - - - - public SignalLine(ChartTrendLine chartTrendLine, SignalType signalType, TradeType tradeType) - { - _chartTrendLine = chartTrendLine; - SignalType = signalType; - TradeType = tradeType; - } - - public void MarkAsExecuted() - { - _chartTrendLine.Thickness = 1; - _chartTrendLine.Color = Color.FromArgb(150, _chartTrendLine.Color); - } - - public bool CanExecute(double price, int barIndex) - { - if (_chartTrendLine.Thickness <= 1) - return false; - - var lineValue = _chartTrendLine.CalculateY(barIndex); - - switch (SignalType) - { - case SignalType.Breakout: - return CanExecuteForBreakout(price, lineValue); - case SignalType.Retracement: - return CanExecuteForRetrace(price, lineValue); - default: - throw new ArgumentOutOfRangeException(); - } - } - - private bool CanExecuteForBreakout(double price, double lineValue) - { - return TradeType == TradeType.Buy && price > lineValue || TradeType == TradeType.Sell && price < lineValue; - } - - private bool CanExecuteForRetrace(double price, double lineValue) - { - return TradeType == TradeType.Buy && price <= lineValue || TradeType == TradeType.Sell && price >= lineValue; - } - } - - public enum SignalType - { - Breakout, - Retracement - } - - public static class SignalLineLabels - { - public const string BuyBreakoutLabel = "BuyBreakout"; - public const string SellBreakoutLabel = "SellBreakout"; - public const string BuyRetraceLabel = "BuyRetracement"; - public const string SellRetraceLabel = "SellRetracement"; - - public static readonly string[] AllLabels = - { - BuyBreakoutLabel, - SellBreakoutLabel, - BuyRetraceLabel, - SellRetraceLabel - }; - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// The "Sample Lines Trader cBot" allows traders to draw lines on chart which can be used a break out or retracement lines. +// If the price crosses a Breakout Line then an order towards the crossing direction is placed. +// If the price crosses a Retracement Line then an order towards the opposite direction of the crossing is placed +// +// ------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; +using cAlgo.API; +using cAlgo.API.Internals; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleLinesTrader : Robot + { + private const string HowToUseText = "How to use:\nCtrl + Left Mouse Button - Draw Breakout line\nShift + Left Mouse Button - Draw Retracement line"; + + private const string HowToUseObjectName = "LinesTraderText"; + + [Parameter("Volume", Group = "Volume", DefaultValue = 1000, MinValue = 0, Step = 1)] + public double Volume { get; set; } + + [Parameter("Stop Loss Pips", Group = "Protection", DefaultValue = 0.0, MinValue = 0.0, Step = 1)] + public double StopLossPips { get; set; } + + [Parameter("Take Profit Pips", Group = "Protection", DefaultValue = 0.0, MinValue = 0.0, Step = 1)] + public double TakeProfitPips { get; set; } + + [Parameter("Allow trading", Group = "Trading", DefaultValue = true)] + public bool IsTradingAllowed { get; set; } + + [Parameter("Allow email notifications", Group = "Email notifications", DefaultValue = false)] + public bool IsEmailAllowed { get; set; } + + [Parameter("Email address", Group = "Email notifications")] + public string EmailAddress { get; set; } + + [Parameter("Show How To Use", Group = "Settings", DefaultValue = true)] + public bool ShowHowToUse { get; set; } + + private SignalLineDrawManager DrawManager { get; set; } + private SignalLineRepository SignalLineRepository { get; set; } + + protected override void OnStart() + { + DrawManager = new SignalLineDrawManager(this); + SignalLineRepository = new SignalLineRepository(Chart); + + if (ShowHowToUse) + { + ShowHowToUseText(); + Chart.MouseDown += OnChartMouseDown; + } + } + + protected override void OnTick() + { + var lastBarIndex = Bars.Count - 1; + + foreach (var signalLine in SignalLineRepository.GetLines()) + if (signalLine.CanExecute(Bid, lastBarIndex)) + { + signalLine.MarkAsExecuted(); + var message = string.Format("{0} Signal line {1}{2} was executed on {3}", Time, signalLine.TradeType, signalLine.SignalType, SymbolName); + Print(message); + + if (IsTradingAllowed) + ExecuteMarketOrder(signalLine.TradeType, SymbolName, Volume, "LinesTrader cBot", StopLossPips, TakeProfitPips); + + if (IsEmailAllowed) + Notifications.SendEmail(EmailAddress, EmailAddress, "LinesTrader Alert", message); + } + } + + protected override void OnStop() + { + SignalLineRepository.Dispose(); + DrawManager.Dispose(); + } + + private void OnChartMouseDown(ChartMouseEventArgs args) + { + Chart.MouseDown -= OnChartMouseDown; + HideHowToUseText(); + } + + private void ShowHowToUseText() + { + Chart.DrawStaticText(HowToUseObjectName, HowToUseText, VerticalAlignment.Center, HorizontalAlignment.Center, Chart.ColorSettings.ForegroundColor); + } + + private void HideHowToUseText() + { + Chart.RemoveObject(HowToUseObjectName); + } + } + + public class SignalLineDrawManager : IDisposable + { + private readonly Algo _algo; + private readonly Chart _chart; + private ProtoSignalLine _currentProtoSignalLine; + private const string StatusTextName = "ProtoSignalLineStatus"; + + public SignalLineDrawManager(Algo algo) + { + _algo = algo; + _chart = algo.Chart; + _chart.DragStart += OnChartDragStart; + _chart.DragEnd += OnChartDragEnd; + _chart.Drag += OnChartDrag; + } + + private void OnChartDragStart(ChartDragEventArgs args) + { + if (args.ChartArea != args.Chart) + return; + + var signalType = GetSignalType(args); + + if (signalType.HasValue) + { + _chart.IsScrollingEnabled = false; + _currentProtoSignalLine = new ProtoSignalLine(_algo, signalType, args.TimeValue, args.YValue); + UpdateStatus(); + } + else + { + _currentProtoSignalLine = null; + } + } + + private void OnChartDragEnd(ChartDragEventArgs args) + { + if (_currentProtoSignalLine != null) + { + _currentProtoSignalLine.Complete(args.TimeValue, args.YValue); + _currentProtoSignalLine = null; + + _chart.IsScrollingEnabled = true; + _chart.RemoveObject(StatusTextName); + } + } + + private void OnChartDrag(ChartDragEventArgs args) + { + if (_currentProtoSignalLine != null) + { + _currentProtoSignalLine.Update(args.TimeValue, args.YValue); + UpdateStatus(); + } + } + + private void UpdateStatus() + { + var text = string.Format("Creating {0} line", _currentProtoSignalLine.LineLabel); + _chart.DrawStaticText(StatusTextName, text, VerticalAlignment.Top, HorizontalAlignment.Left, _chart.ColorSettings.ForegroundColor); + } + + private SignalType? GetSignalType(ChartDragEventArgs args) + { + if (args.CtrlKey && !args.ShiftKey) + return SignalType.Breakout; + if (!args.CtrlKey && args.ShiftKey) + return SignalType.Retracement; + + return null; + } + + public void Dispose() + { + _chart.DragStart -= OnChartDragStart; + _chart.DragEnd -= OnChartDragEnd; + _chart.Drag -= OnChartDrag; + } + } + + public class SignalLineRepository : IDisposable + { + private readonly Chart _chart; + private readonly Dictionary _signalLines; + + public SignalLineRepository(Chart chart) + { + _chart = chart; + _signalLines = new Dictionary(); + + foreach (var chartTrendLine in chart.FindAllObjects()) + TryAddSignalLine(chartTrendLine); + + _chart.ObjectsAdded += OnChartObjectAdded; + _chart.ObjectsRemoved += OnChartObjectRemoved; + _chart.ObjectsUpdated += OnChartObjectUpdated; + } + + public IEnumerable GetLines() + { + return _signalLines.Values; + } + + private void TryAddSignalLine(ChartObject chartObject) + { + var chartTrendLine = chartObject as ChartTrendLine; + + if (chartTrendLine != null && IsSignalLine(chartTrendLine)) + _signalLines.Add(chartTrendLine.Name, CreateSignalLine(chartTrendLine)); + } + + private void TryRemoveSignalLine(ChartObject chartObject) + { + if (_signalLines.ContainsKey(chartObject.Name)) + _signalLines.Remove(chartObject.Name); + } + + private void OnChartObjectAdded(ChartObjectsAddedEventArgs args) + { + if (args.Area != args.Chart) + return; + + foreach (var chartObject in args.ChartObjects) + TryAddSignalLine(chartObject); + } + + private void OnChartObjectUpdated(ChartObjectsUpdatedEventArgs args) + { + if (args.Area != args.Chart) + return; + + foreach (var chartObject in args.ChartObjects) + { + TryRemoveSignalLine(chartObject); + TryAddSignalLine(chartObject); + } + } + + private void OnChartObjectRemoved(ChartObjectsRemovedEventArgs args) + { + if (args.Area != args.Chart) + return; + + foreach (var chartObject in args.ChartObjects) + TryRemoveSignalLine(chartObject); + } + + private SignalLine CreateSignalLine(ChartTrendLine chartTrendLine) + { + var signalType = GetLineSignalType(chartTrendLine); + var tradeType = GetLineTradeType(chartTrendLine); + var signalLine = new SignalLine(chartTrendLine, signalType, tradeType); + return signalLine; + } + + private bool IsSignalLine(ChartTrendLine line) + { + return SignalLineLabels.AllLabels.Contains(line.Comment); + } + + private SignalType GetLineSignalType(ChartTrendLine line) + { + var comment = line.Comment; + if (comment == SignalLineLabels.BuyBreakoutLabel || comment == SignalLineLabels.SellBreakoutLabel) + return SignalType.Breakout; + if (comment == SignalLineLabels.BuyRetraceLabel || comment == SignalLineLabels.SellRetraceLabel) + return SignalType.Retracement; + throw new ArgumentException(); + } + + private TradeType GetLineTradeType(ChartTrendLine line) + { + var comment = line.Comment; + + if (comment == SignalLineLabels.BuyBreakoutLabel || comment == SignalLineLabels.BuyRetraceLabel) + return TradeType.Buy; + + if (comment == SignalLineLabels.SellBreakoutLabel || comment == SignalLineLabels.SellRetraceLabel) + return TradeType.Sell; + + throw new ArgumentException(); + } + + public void Dispose() + { + _chart.ObjectsAdded -= OnChartObjectAdded; + _chart.ObjectsRemoved -= OnChartObjectRemoved; + _chart.ObjectsUpdated -= OnChartObjectUpdated; + } + } + + public class ProtoSignalLine + { + + private static readonly Color BuyLineColor = Color.Green; + private static readonly Color SellLineColor = Color.Red; + + private readonly Chart _chart; + private readonly ChartTrendLine _line; + private readonly SignalType? _signalType; + private readonly Symbol _symbol; + + public ProtoSignalLine(Algo algo, SignalType? signalType, DateTime startTimeValue, double startYValue) + { + _chart = algo.Chart; + _signalType = signalType; + _symbol = algo.Symbol; + + _line = _chart.DrawTrendLine(string.Format("LinesTrader {0:N}", Guid.NewGuid()), startTimeValue, startYValue, startTimeValue, startYValue, LineColor); + + _line.ExtendToInfinity = true; + _line.Thickness = 2; + _line.IsInteractive = true; + } + + private bool IsPriceAboveLine + { + get { return _line != null && _symbol.Bid >= _line.CalculateY(_chart.Bars.Count - 1); } + } + + private TradeType LineTradeType + { + get { return _signalType == SignalType.Breakout ? (IsPriceAboveLine ? TradeType.Sell : TradeType.Buy) : (IsPriceAboveLine ? TradeType.Buy : TradeType.Sell); } + } + + private Color LineColor + { + get { return LineTradeType == TradeType.Buy ? BuyLineColor : SellLineColor; } + } + + public string LineLabel + { + get { return _signalType == SignalType.Breakout ? (LineTradeType == TradeType.Buy ? SignalLineLabels.BuyBreakoutLabel : SignalLineLabels.SellBreakoutLabel) : (LineTradeType == TradeType.Buy ? SignalLineLabels.BuyRetraceLabel : SignalLineLabels.SellRetraceLabel); } + } + + private bool CanComplete + { + get { return _line.Time1 != _line.Time2 || Math.Abs(_line.Y1 - _line.Y2) >= _symbol.PipValue; } + } + + public void Update(DateTime timeValue, double yValue) + { + _line.Time2 = timeValue; + _line.Y2 = yValue; + _line.Color = LineColor; + } + + public void Complete(DateTime timeValue, double yValue) + { + Update(timeValue, yValue); + + if (CanComplete) + { + _line.Comment = LineLabel; + _line.IsInteractive = true; + } + else + { + _chart.RemoveObject(_line.Name); + } + } + } + + public class SignalLine + { + public TradeType TradeType { get; private set; } + public SignalType SignalType { get; private set; } + + private readonly ChartTrendLine _chartTrendLine; + + + + public SignalLine(ChartTrendLine chartTrendLine, SignalType signalType, TradeType tradeType) + { + _chartTrendLine = chartTrendLine; + SignalType = signalType; + TradeType = tradeType; + } + + public void MarkAsExecuted() + { + _chartTrendLine.Thickness = 1; + _chartTrendLine.Color = Color.FromArgb(150, _chartTrendLine.Color); + } + + public bool CanExecute(double price, int barIndex) + { + if (_chartTrendLine.Thickness <= 1) + return false; + + var lineValue = _chartTrendLine.CalculateY(barIndex); + + switch (SignalType) + { + case SignalType.Breakout: + return CanExecuteForBreakout(price, lineValue); + case SignalType.Retracement: + return CanExecuteForRetrace(price, lineValue); + default: + throw new ArgumentOutOfRangeException(); + } + } + + private bool CanExecuteForBreakout(double price, double lineValue) + { + return TradeType == TradeType.Buy && price > lineValue || TradeType == TradeType.Sell && price < lineValue; + } + + private bool CanExecuteForRetrace(double price, double lineValue) + { + return TradeType == TradeType.Buy && price <= lineValue || TradeType == TradeType.Sell && price >= lineValue; + } + } + + public enum SignalType + { + Breakout, + Retracement + } + + public static class SignalLineLabels + { + public const string BuyBreakoutLabel = "BuyBreakout"; + public const string SellBreakoutLabel = "SellBreakout"; + public const string BuyRetraceLabel = "BuyRetracement"; + public const string SellRetraceLabel = "SellRetracement"; + + public static readonly string[] AllLabels = + { + BuyBreakoutLabel, + SellBreakoutLabel, + BuyRetraceLabel, + SellRetraceLabel + }; + } +} diff --git a/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.csproj b/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.csproj index ccd2052..4d61a27 100644 --- a/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.csproj +++ b/Sample Lines Trader/Sample Lines Trader/Sample Lines Trader.csproj @@ -1,62 +1,9 @@ - - - - - 7.2 - Debug - AnyCPU - {DAE09C82-8303-4DD7-862A-034A5AD4113A} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo.Robots - Sample Lines Trader - v4.0 - Client - 512 - True - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - CS0108,CS0162,CS0109,CS0219,CS0169,CS0628 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - CS0108,CS0162,CS0109,CS0219,CS0169,CS0628 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample Martingale cBot.algo b/Sample Martingale cBot.algo index 40ee4f83640a8fc2af68fdf155d5c30755d6ff5b..3ca2de9d31b47dd03133e57501fcb5a66677b3ec 100644 GIT binary patch literal 6423 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 literal 4693 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 0) - { - ExecuteOrder(InitialQuantity, GetRandomTradeType()); - } - else - { - ExecuteOrder(position.Quantity * 2, position.TradeType); - } - } - - private TradeType GetRandomTradeType() - { - return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell; - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// 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 cAlgo.API; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleMartingalecBot : Robot + { + [Parameter("Initial Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] + public double InitialQuantity { get; set; } + + [Parameter("Stop Loss", Group = "Protection", DefaultValue = 40)] + public int StopLoss { get; set; } + + [Parameter("Take Profit", Group = "Protection", DefaultValue = 40)] + public int TakeProfit { get; set; } + + + private Random random = new Random(); + + protected override void OnStart() + { + Positions.Closed += OnPositionsClosed; + + ExecuteOrder(InitialQuantity, GetRandomTradeType()); + } + + private void ExecuteOrder(double quantity, TradeType tradeType) + { + var volumeInUnits = Symbol.QuantityToVolumeInUnits(quantity); + var result = ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "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.SymbolName != SymbolName) + return; + + if (position.GrossProfit > 0) + { + ExecuteOrder(InitialQuantity, GetRandomTradeType()); + } + else + { + ExecuteOrder(position.Quantity * 2, position.TradeType); + } + } + + private TradeType GetRandomTradeType() + { + return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell; + } + } +} diff --git a/Sample Martingale cBot/Sample Martingale cBot/Sample Martingale cBot.csproj b/Sample Martingale cBot/Sample Martingale cBot/Sample Martingale cBot.csproj index 618f9b9..6d836c9 100644 --- a/Sample Martingale cBot/Sample Martingale cBot/Sample Martingale cBot.csproj +++ b/Sample Martingale cBot/Sample Martingale cBot/Sample Martingale cBot.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {96C42B4B-1B79-4F52-AB44-705F193D80A6} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample Martingale cBot - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample RSI cBot.algo b/Sample RSI cBot.algo index a07f7a5f747b70835324851738f49150d0bf8cee..4833cc3e49a93a62d486bbe99351715c6c32510f 100644 GIT binary patch literal 5999 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 literal 4693 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 H{{jC3@CFIo diff --git a/Sample RSI cBot/Sample RSI cBot.sln b/Sample RSI cBot/Sample RSI cBot.sln index 0051aae..1910d72 100644 --- a/Sample RSI cBot/Sample RSI cBot.sln +++ b/Sample RSI cBot/Sample RSI cBot.sln @@ -1,7 +1,9 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample RSI cBot", "Sample RSI cBot\Sample RSI cBot.csproj", "{C04DF10E-0CAD-49E4-81FB-0CD122535930}" + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample RSI cBot", "Sample RSI cBot\Sample RSI cBot.csproj", "{983B44CE-3B5A-48EA-9424-11C79826CAD2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -9,12 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C04DF10E-0CAD-49E4-81FB-0CD122535930}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C04DF10E-0CAD-49E4-81FB-0CD122535930}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C04DF10E-0CAD-49E4-81FB-0CD122535930}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C04DF10E-0CAD-49E4-81FB-0CD122535930}.Release|Any CPU.Build.0 = Release|Any CPU + {983B44CE-3B5A-48EA-9424-11C79826CAD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {983B44CE-3B5A-48EA-9424-11C79826CAD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {983B44CE-3B5A-48EA-9424-11C79826CAD2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {983B44CE-3B5A-48EA-9424-11C79826CAD2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8E5A48BD-8982-4BF9-AF97-C1B6B30746DF} + EndGlobalSection EndGlobal diff --git a/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.cs b/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.cs index d5c9864..a4c0b85 100644 --- a/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.cs +++ b/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.cs @@ -1,77 +1,73 @@ -// ------------------------------------------------------------------------------------------------- -// -// This code is a cTrader Automate API example. -// -// 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. -// -// All changes to this file might be lost on the next application update. -// If you are going to modify this file please make a copy using the "Duplicate" command. -// -// The "Sample RSI cBot" will create a buy order when the Relative Strength Index indicator crosses the level 30, -// and a Sell order when the RSI indicator crosses the level 70. The order is closed be either a Stop Loss, defined in -// the "Stop Loss" parameter, or by the opposite RSI crossing signal (buy orders close when RSI crosses the 70 level -// and sell orders are closed when RSI crosses the 30 level). -// -// The cBot can generate only one Buy or Sell order at any given time. -// -// ------------------------------------------------------------------------------------------------- - -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 SampleRSIcBot : Robot - { - [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] - public double Quantity { get; set; } - - [Parameter("Source", Group = "RSI")] - public DataSeries Source { get; set; } - - [Parameter("Periods", Group = "RSI", DefaultValue = 14)] - public int Periods { get; set; } - - private RelativeStrengthIndex rsi; - - protected override void OnStart() - { - rsi = Indicators.RelativeStrengthIndex(Source, Periods); - } - - protected override void OnTick() - { - if (rsi.Result.LastValue < 30) - { - Close(TradeType.Sell); - Open(TradeType.Buy); - } - else if (rsi.Result.LastValue > 70) - { - Close(TradeType.Buy); - Open(TradeType.Sell); - } - } - - private void Close(TradeType tradeType) - { - foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType)) - ClosePosition(position); - } - - private void Open(TradeType tradeType) - { - var position = Positions.Find("SampleRSI", SymbolName, tradeType); - var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity); - - if (position == null) - ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "SampleRSI"); - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// The "Sample RSI cBot" will create a buy order when the Relative Strength Index indicator crosses the level 30, +// and a Sell order when the RSI indicator crosses the level 70. The order is closed be either a Stop Loss, defined in +// the "Stop Loss" parameter, or by the opposite RSI crossing signal (buy orders close when RSI crosses the 70 level +// and sell orders are closed when RSI crosses the 30 level). +// +// The cBot can generate only one Buy or Sell order at any given time. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleRSIcBot : Robot + { + [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] + public double Quantity { get; set; } + + [Parameter("Source", Group = "RSI")] + public DataSeries Source { get; set; } + + [Parameter("Periods", Group = "RSI", DefaultValue = 14)] + public int Periods { get; set; } + + private RelativeStrengthIndex rsi; + + protected override void OnStart() + { + rsi = Indicators.RelativeStrengthIndex(Source, Periods); + } + + protected override void OnTick() + { + if (rsi.Result.LastValue < 30) + { + Close(TradeType.Sell); + Open(TradeType.Buy); + } + else if (rsi.Result.LastValue > 70) + { + Close(TradeType.Buy); + Open(TradeType.Sell); + } + } + + private void Close(TradeType tradeType) + { + foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType)) + ClosePosition(position); + } + + private void Open(TradeType tradeType) + { + var position = Positions.Find("SampleRSI", SymbolName, tradeType); + var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity); + + if (position == null) + ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "SampleRSI"); + } + } +} diff --git a/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.csproj b/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.csproj index d7efffa..6d836c9 100644 --- a/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.csproj +++ b/Sample RSI cBot/Sample RSI cBot/Sample RSI cBot.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {C04DF10E-0CAD-49E4-81FB-0CD122535930} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample RSI cBot - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample SAR Trailing Stop.algo b/Sample SAR Trailing Stop.algo index 6faaad01d1c2086518aaea535a5b7c8cd4d0b410..2e480449874e622ef08b38be4c470f5db60883a7 100644 GIT binary patch literal 6457 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 Tl)D*y0~a;%Tf^Z3n9Ei?Z{%`M literal 4693 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 Bid) - return; - if (newStopLoss - position.StopLoss < Symbol.TickSize) - return; - } - - if (position.TradeType == TradeType.Sell && isProtected) - { - if (newStopLoss < Bid) - return; - if (position.StopLoss - newStopLoss < Symbol.TickSize) - return; - } - - ModifyPosition(position, newStopLoss, null); - } - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// The "Sample SAR Trailing Stop" will create a market Buy order if the parabolic SAR of the previous bar is +// below the candlestick. A Sell order will be created if the parabolic SAR of the previous bar is above the candlestick. +// The order's volume is specified in the "Volume" parameter. The order will have a trailing stop defined by the +// previous periods' Parabolic SAR levels. The user can change the Parabolic SAR settings by adjusting the "MinAF" +// and "MaxAF" parameters. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleSARTrailingStop : Robot + { + [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] + public double Quantity { get; set; } + + [Parameter("Min AF", Group = "Parabolic SAR", DefaultValue = 0.02, MinValue = 0)] + public double MinAF { get; set; } + + [Parameter("Max AF", Group = "Parabolic SAR", DefaultValue = 0.2, MinValue = 0)] + public double MaxAF { get; set; } + + private ParabolicSAR parabolicSAR; + + protected override void OnStart() + { + parabolicSAR = Indicators.ParabolicSAR(MinAF, MaxAF); + var tradeType = parabolicSAR.Result.LastValue < Bid ? TradeType.Buy : TradeType.Sell; + Print("Trade type is {0}, Parabolic SAR is {1}, Bid is {2}", tradeType, parabolicSAR.Result.LastValue, Bid); + + var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity); + ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "PSAR TrailingStops"); + } + + protected override void OnTick() + { + var position = Positions.Find("PSAR TrailingStops", SymbolName); + + if (position == null) + { + Stop(); + } + else + { + double newStopLoss = parabolicSAR.Result.LastValue; + bool isProtected = position.StopLoss.HasValue; + + if (position.TradeType == TradeType.Buy && isProtected) + { + if (newStopLoss > Bid) + return; + if (newStopLoss - position.StopLoss < Symbol.TickSize) + return; + } + + if (position.TradeType == TradeType.Sell && isProtected) + { + if (newStopLoss < Bid) + return; + if (position.StopLoss - newStopLoss < Symbol.TickSize) + return; + } + + ModifyPosition(position, newStopLoss, null); + } + } + } +} diff --git a/Sample SAR Trailing Stop/Sample SAR Trailing Stop/Sample SAR Trailing Stop.csproj b/Sample SAR Trailing Stop/Sample SAR Trailing Stop/Sample SAR Trailing Stop.csproj index 562c1a7..6d836c9 100644 --- a/Sample SAR Trailing Stop/Sample SAR Trailing Stop/Sample SAR Trailing Stop.csproj +++ b/Sample SAR Trailing Stop/Sample SAR Trailing Stop/Sample SAR Trailing Stop.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {616A444A-C219-43E4-B836-B75B7C8E00E2} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample SAR Trailing Stop - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample Trading Panel.algo b/Sample Trading Panel.algo index 0c1b371867345fd5b52251f682886c39c219d280..80b98c5b85664ede51883fe870fdfcce3a044e1c 100644 GIT binary patch literal 10543 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 literal 16389 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�k<&ajvn`SKlp@dg;Abk1+N|VP!2EKM`G0n<*{- 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 - - - - 7.2 - Debug - AnyCPU - {216A9163-840F-4B66-BE24-414D0AB73B33} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo.Robots - Sample Trading Panel - v4.0 - Client - 512 - True - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - CS0108,CS0162,CS0109,CS0219,CS0169,CS0628 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - CS0108,CS0162,CS0109,CS0219,CS0169,CS0628 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample Trend cBot.algo b/Sample Trend cBot.algo index ab1ddf19f02890b7a6f41c8479f9ac9fef232c72..dc2b9cc8c7b0d080d26d4ec93d88c1cfd590a027 100644 GIT binary patch literal 6418 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 literal 4693 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 ebN previousFastMa && currentSlowMa <= currentFastMa && longPosition == null) - { - if (shortPosition != null) - ClosePosition(shortPosition); - ExecuteMarketOrder(TradeType.Buy, SymbolName, VolumeInUnits, label); - } - else if (previousSlowMa < previousFastMa && currentSlowMa >= currentFastMa && shortPosition == null) - { - if (longPosition != null) - ClosePosition(longPosition); - ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, label); - } - } - - private double VolumeInUnits - { - get { return Symbol.QuantityToVolumeInUnits(Quantity); } - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// The "Sample Trend cBot" will buy when fast period moving average crosses the slow period moving average and sell when +// the fast period moving average crosses the slow period moving average. The orders are closed when an opposite signal +// is generated. There can only by one Buy or Sell order at any time. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleTrendcBot : Robot + { + [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)] + public double Quantity { 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; } + + + private MovingAverage slowMa; + private MovingAverage fastMa; + private const string label = "Sample Trend cBot"; + + protected override void OnStart() + { + fastMa = Indicators.MovingAverage(SourceSeries, FastPeriods, MAType); + slowMa = Indicators.MovingAverage(SourceSeries, SlowPeriods, MAType); + } + + protected override void OnTick() + { + var longPosition = Positions.Find(label, SymbolName, TradeType.Buy); + var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell); + + var currentSlowMa = slowMa.Result.Last(0); + var currentFastMa = fastMa.Result.Last(0); + var previousSlowMa = slowMa.Result.Last(1); + var previousFastMa = fastMa.Result.Last(1); + + if (previousSlowMa > previousFastMa && currentSlowMa <= currentFastMa && longPosition == null) + { + if (shortPosition != null) + ClosePosition(shortPosition); + + ExecuteMarketOrder(TradeType.Buy, SymbolName, VolumeInUnits, label); + } + else if (previousSlowMa < previousFastMa && currentSlowMa >= currentFastMa && shortPosition == null) + { + if (longPosition != null) + ClosePosition(longPosition); + + ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, label); + } + } + + private double VolumeInUnits + { + get { return Symbol.QuantityToVolumeInUnits(Quantity); } + } + } +} diff --git a/Sample Trend cBot/Sample Trend cBot/Sample Trend cBot.csproj b/Sample Trend cBot/Sample Trend cBot/Sample Trend cBot.csproj index f28c4f3..6d836c9 100644 --- a/Sample Trend cBot/Sample Trend cBot/Sample Trend cBot.csproj +++ b/Sample Trend cBot/Sample Trend cBot/Sample Trend cBot.csproj @@ -1,58 +1,9 @@ - - - - - Debug - AnyCPU - {32FBD1DF-4635-4F16-9287-3CF4F9EB6280} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample Trend cBot - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sample cBot Reference SMA.algo b/Sample cBot Reference SMA.algo index a2dac103a3102788d23d974805764b19ac7fc3d0..2685833a3a147c761914b53db8ec5e8b1cc8a5b7 100644 GIT binary patch literal 7490 zcmV-I9lhdVY-eu*0006NABzY80000001AYZOK;jh6ovPd`X5HD4YH{T4~d0CM1@)! z6jK(dvKZSJca-srHIK9?%72e%u<-*Dya40#&7C>-9`pM33qrjhCp!?5aMqilo;Pp@ zZqKpGmSi9m&T=CR-J#d_y#8>ybtf~=osIm#WI7%Bqw!@Dia4Z<%6rm0x2Pjy1QR!sDsKm&+U*0u7ehuDlK5nKr4Z%gEl&% zB>n-1Eq?|!H-~F%WdiZYnce31cF|B)^8N(`#fL)LV=AFxHpUb-0%B5TtnK(Gya2TW ze5xPrNCNyEB@DXcf^wa7A8xRTiz?jK!DxlUQg^V&h5sF<+BzyqNvJ)wE1AI<=ng9! zLNRdJB?ZqxsCo=G{2k~lDVHD{v_?8=@y+?j%bKvtM}O$~V}J7P#-Ft7uJQkhIU(aV z5-Kne_nglf<@r~7v|dJe|rZ20RR630Ic)7+$;qE000005K7#2Qim9(2+Hy(d23`cz$Uwm z%4f;`G+L;dXA4pSu08ARHHE*A`WK-ZWF<>`My1`7w|;0i5`w))fSz_#Z^jC4|BVJe z(Sd%em+;29l4Wfy~M`9&}=O%palQgb;Pl}C!8s{`-t zW;hc|3DQdwURLKmN$jD9^UbWAaE(y`}A$i_68 zKVR*@%y^npF&uH(!c)!Wk8n|di% zkb?*ITi0N6)SB07$EO=mUy|LtZexHoL?HlM6Z+}a#7Lt_Hb1g6(q75;ots>~1pz;& z>A@wkLG?asARggE+(V3StZ|(b^E8K)V=%Y`0=tzdEC$fwSu9!u=-6FYfAEU;>6p#eWl?9)ONXwa$2HGf8hadjX586_*A28Mi^%G_*u;4l7 zAIOz_=$sX935U7=gS;~A4go)Nks%mGBDrX4E<*K}3fhN*G=*d6H@R%Zh=3!FA&&e0 zA6q|uA<KJ4lgomSP}QH196zkj2*{!$@FltB?!<=&6;-jdZySG3lAR>S{=kgyI!>ls0_pdr zz=5GhaO_4u^mI9qdGq-U%KAf~ct{1PfbC6ZeCi{7;a_(4rl75i1)W;eEiS5g$gS$m z76~akf;g%EJ*!fmME`B4144RdZ9Xcj`&yCaV3H?)x+)#M43yrk^3fx?wm&c8k=qbp zv6&odtFt<*22}inaas%4iT=q-c$X!#DqmJ7w9qM zY#Ve~B#}PHm(yK=+aDr+!hH4_6JZzO&DTONAEdW{!?e(zl!r%)n#;uPSFlD7Q?-#) z&R6DP#n!=99Eid|#)D6%I~Ip@Hy!YzS0#*SzCHJ%A*65Gr(D%#A9{t89fR*etUu?b z$<@0LlIhYq$xIGxl2LIe=gEm}RH1MOFanC6BWLz%$SUYeHB0GbH`-0*$R9<-_oF-7 z`+JmuggJ1UEM~6^MGr#iT8utYN8oUr;&tjLv2yV&-J_M@Vg;mnYqU}A@A5R#wW}cm z<*+bwhay0tltBsH9**%nQp@FVVGi;)9(=XfFeF@$6JgX3B>-C2KTcHDam2t!fUnrlUpN?QQCD(qPRx>1tq*(I4 zqRFK(_eLI1#IO3G9v&S~TN>3)^8SGGx1Oq#nFKSScjiv4Kbz52Vg^zah2k_@wNMv5 zy-Jn_#-TBnSe?d`S34@mMd_MBl@dTjCNWFOdkU%u9I&`E>D-IsjMVt-+L7j zJIr~%BAwf9)MQ)Pp};8)zK-+kh@A?b&o9V?MfxF& zXzw^mDk^Nws8ja;1VI+eKhaV70`-Mxb5mxGci#vy*W^Wpg8#8L|D_|uO3uraUI1>H zWt-;OIS6$BYZnWfWg)5+z*y;ECrBKFiZ~8-+K?g+=bZQhnudj0{6n z&G)=2N{8qg_6kh=0w`6#*$5JYz_M!xes4j`5zbOH@*!zREp;tW#0lUK2{!3vn9rtm zbz4cdG#NC?VRrapNVNtW7!LL*xeJ^{>F&}oeGe6$k(-Mcm6@J!2*JZ}$)kCiQ}kgt z(t`Ziy(wrni|lIkl6}a0v2?Ln?~?KEwIweuTd6c)$24>_(avw#-_OHa?Sg_FdCx{E zJfR*;G%Pw6$pe6kPjvDyjYs_T6pLC^pOw=3B9|t#XR%*2OUKeevA+JUUS~18pU&*K zllr>h6Zn6FP>RhT3to2IwVNcZpJlYGnv#Z};BNmFn;odm{*XDx5;ljy8es<^+u=aC zTydz*CY37kG&z+47DexK1c@_FGuuK4f7!jKTk`5XpKYDam{1m~DRraRTlX>~0mP}w zA~OfoXy*1Nkt7uROBg`@Apsl6H{UohfL&>}n-iM z<)<0&S});JHy6PWm}GnD>fnhiUT4fTc(y|c2E`wc+xRn-tHn?K>CvV=n#0kbR+H;` zrSm%`d2ZA5OtP%`xw|lP)Xn$^_=1Xz6*{AB@Hx_h5Brt`rZ}iaU>El8HOWFQ%m>Ra z>PckbuQ%3Fo@jxVjJUE6qrZ_J^_Zyb9qA>Qf%RhY6GFHx1CI5rMr*CZf>AQ#i9}Va zsPdzpy{K<1cLWs`kYyo{4#_M$rwl+-v!>_VBFjYI8XV_+!oXOlAqIV&mE*m5V^S;^KS#EPyB5RuDEp5$fv|o?;}xZWy23L?FTH@(!J+_?PX| zz81svIu~$;fGoN3!o_}7=m1)-8{Ct=1^F+JsW|#D;}Gwt{b*0YwsJUcHH&cKvW63R zs!OTMlVFA`%6{6Evlwi+V5_df4mN_pewc6)QQpr$Jdj~o05REK+L-7t$#O0*$C|AR za-`EG16`n%TR&AsNOS`dLYdUG+pltZXNh7imA8Ndsu^*+FT2y{7oHSY{(Wp60V4}M zmIx0L-rYr(X^_1`2s=u6^I>3*7WJ)-x&&w`9b>6Bk(Yl}vfFAAo3ujeLaM<6h~bE( zxse|l=GK3(S?+mHkF9=@Ih5%*=v_jhpOt+;QN4rqN49&x!>M{dQd{aU@F~DB2p%j5N)Bl$c4?5xjKb;HHy#xyD zq_okVhKISeooN>p>IX2oKe6wLAX8){u7MKU0Z~@trJ7h4Z@19_(|;X2lfyv1A3U5# zce=n*iEM>sT|3?d0Qn7gj+1U`j;{ZN+8A3`m*}+X8%?gkJAY#g9v269C?)7taT0j0 zlJDOIROp8Rwv%Gf_W02%u78N69Se@-X7`2(4!qu)Z!dEPVeX4=)e9#WbTQ|8bW@DX zCw8+a8O0XKvV!49e#3=pF~Jt4S(UB|2g2C$=|f4d;oq*L#pW|Z3mnH@(&~OY0{d24 z+Vs9DG+8tE^K9*E`!$OV{Tg{Hd8(plh==!>Mh)Vimm-J4vFXlEFk!Qon8iex7Ly1& zIBlIWkbZV-+__7DRyBaB45bqV)ThJicj@Pd%g&QMity0oRNj1G%e^!>HSZIWlaDj$ z9qmeoFu~=m6x*4F4I=>_R8FM;UVlsA=D^-2r||p3T2T|+`OBT=@$>%br%60cco2fZ ziJQQj=wRGUDQ94~sW3+pzbn);d-2W%vw+Xpx4cA0Av**Jaa~#!5A!SSF(o3(l2ssL<{V6cekYAp5r?|D0u{z$rlX=dxesdsciuxbtMfRWhF(^L$^V`o;(@1qMgPl zsv^Q7<@z9PG@)v~q-sO14(57IMD}rB3|yKtkrVv47Y$w}rMd1VL4T)5@>4&zjaCY3A$hQ_)JWW11Jq zhAL3sA|qPL7jgbBEj_A?8!S0`jRiF2T_2JaL10xdHhD@UXn#z%*u+p9JfnDlV@oZ7 zlv?m+Zsl7}?qRRZF(39F&XOT$eVhCv?CE%1_rlPim}!(z7@&Nxn$R?;ME%sx`F0nL zoBbd7OK&N128f~619NHYH8l$I9nAP;xyPRagh^#9Wis| zJQ#3Kd-eJum&hV>t?_k$%5-S27}pa-q*soSlw^Gx@t{_`!uKb5o897<+O~jfdmLhg zHh58pLU})=m*QF;f~q)~HR4kff(>(t>27YeQ8W3AWQV*Kar~Gc^$ovT9xwRc<9a>t z8Sw+CQnYs!o_X$(iTkVhR64^Tzocy4Dc9GMWu%dxh;u0SrQ{zu^5u!lWiSaM{h15S;c!0odRvKzg$h0y^Y@_~cjtm&hxw%rP1WU==G+K8)+;_LqD<&C3 zDqwtt!)R14FuxVc=;pCA*LCN$l*|lWK%S4(W*BCP(ZJy8<-yQ^VRXgBclJ_7r>Vaj zx@-xOosLMKU(clohBc0D&1Gp9*D40CXfk_J7t-5il+zCo=ySCL`Z?O)D37-uId)V? zXfdpN03bu7;T9&(*d%V!s%|Z)aaD@NKZwfw*&#bAYin}3%OYE#nE)tMJ2ZbVHP8ih zSV^7kg;ItO2;O>ITKYmU24UNWpjXOyt2`N_h{FOFfue&6 za#>nBbom-I-Mqvm%}ZAOX<~m9vdLTG=hj*b2y$?ujY-l#Af;nRjn>t!|>(QPXtG}IDC452yRmh(re z7aoVjx}k$hzJsW;?9?Fvpp5BGTDMP#y_h6V3!Xw@uZM+;)ur{ zSOyk{6E9=T^Ywm0O6UMs;_dJ`$41)QN*N?4{lgRuhH)ZqXehZ>m%&*uXRCrmeAYO> zIvt^`53z_-WTMx(M22RTP3KVb8vdDTS^WA$?oEwO=2ymM4bM+N)35tQyr3MKK$>Ov zA#=kz1cNT+ydE9+SZKJ{%AaujgZ5v{iSzl2zx(FlU#~A z(KV@o)6Bp^rba5Zv7v{XAzr;!X|GH@cRan-%T;nR^y&|TL;v6WE87yY0wTQuH zjq#vJeR3B+5}5pLXjb>gT7xCDf~dGCF*&W|>aV~*3Y7_xyCV>+Ec-qKc^6W@P~Ta5 zy(#ZGJLzSuE+e0dpun*|=+^wa!dgk;yBQcRpQp8&S&>Sh;03{eJ+WYEk=y;^?ri|T zhAdlJgr#q{Bi*lK(?ckJXX8%h^+xrvVhSY7DzG5hl<)bXi8rmuWxG67ssFsq)96hP z2}`Y=QA9P^n_L>P0c$8!I8cvs4B;aD6c?v}KD};gu0iF~X%;o8*dsd;bu>uSz6=yt znU$Xm8}lSxW|Pz*bP6~sjup0*Zi8Z%u8;qO3*W_I39(b_&`v-8=66z@ExYU&Y`wiX zG}PJ#lS*#*T#h4!Ws(kx-H{=4iqn7wuqBh{I!{I=A4??B%6^hcPrh?Y(Nuz|;A>_` z2o1>z8MS@$@og%v6Si9Lx~jF6X``i7u0oOdiIO0GSG2;X;mcp>Iw(DDUtGpWKk6%ZbhpavCQGvln@j^xZ6cBBvfZsbhZ zd~~hN%Mfq&&6lYugBVe;!A9zn^^xZze6_17hA%``#hU$Qi)V3r6x$0*-~T@s1l_7* zrrIC&5h#can)D$dQPo{Mh7FrXJpeMJ-aRL?u*#CiA^<}Zsf~n47AK@ zG6U(OQO`YZ3--*Eqpx05K$y9_GN;boCW<0MR#_#mMStc>Rl^P=zdVD1xQ5Gw$TsU? zt&H}mS03P2)ZRL*gBAo61|e%jJqsxx5H!jWIPKr9(dk^dK?<(S1wZGtH|f+=<|Fxv zsoRg+&o@Gxn>e1CqqwN{m5F7}elq}UNWaEeVwo@#gk4hnpfZ3cru{XUqU2OFPM&>pcBX%@H8q_7~8j;kwiJ0_rb*z8 z<}=TaK^-eOQjAd5<=CNLUfqUMKk3!sE-wLu#kx=<_93}0~(OBAd16~&P6`cuq5$%_4FiA_OO@s z?7(|st$;NLdj!91&}MyzqkW!>|pl84X>+nfIFU% znpMo6HV2_7ev9SF;7{-jjmtV(jI*!qo#Ss?%{`0|8YK@`g$6en8E!yW^h7X|Jo!V>m~> z+)h2YD-6gA0f@#hz!5r-w5>|=@P7W{y^G3ff-!Yb8)}mvCd1#!=zMDgH%6}3y|{67 zcLkX0S|W4$Jr(2Eu3MQ$Kx~{Bmoep32Rv0?oldc$;jW$9U+Q(s*jEp3@`rC#kkf$XN(sgX2~IRsLTW^0H%xe_8{?Gm#auJUu4I3sxub?ljBl1qF{5j113AV>G++fgsw?ymmX{i*+=AGn8nOHdq)+U><qYbu;C&{K(4FubOs$TM3h@MYyyS$1i6gT`98i)lkkP7L8#c(;|pU1 MSu;>&uasbTofnvP2><{9 literal 4693 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, SmaPeriod); - } - - protected override void OnTick() - { - Print("{0}", sma.Result.LastValue); - } - } -} +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// 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. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; + +namespace cAlgo +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SamplecBotReferenceSMA : Robot + { + [Parameter("Source")] + public DataSeries Source { get; set; } + + [Parameter("SMA Period", DefaultValue = 14)] + public int SmaPeriod { get; set; } + + private SampleSMA sma; + + protected override void OnStart() + { + sma = Indicators.GetIndicator(Source, SmaPeriod); + } + + protected override void OnTick() + { + Print("{0}", sma.Result.LastValue); + } + } +} diff --git a/Sample cBot Reference SMA/Sample cBot Reference SMA/Sample cBot Reference SMA.csproj b/Sample cBot Reference SMA/Sample cBot Reference SMA/Sample cBot Reference SMA.csproj index 6813fc6..f2c1652 100644 --- a/Sample cBot Reference SMA/Sample cBot Reference SMA/Sample cBot Reference SMA.csproj +++ b/Sample cBot Reference SMA/Sample cBot Reference SMA/Sample cBot Reference SMA.csproj @@ -1,65 +1,13 @@ - - - - - Debug - AnyCPU - {7D5AE8CC-6D29-4DAB-9F0B-80A6A59D0D8A} - {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - cAlgo - Sample cBot Reference SMA - v4.0 - Client - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - False - ..\..\..\..\API\cAlgo.API.dll - - - - - - - - - - - {4F4CCA28-4DD8-49A2-9A8B-2517C1DD9DA4} - Sample SMA - - + + + net6.0 + + + + + + + + + \ No newline at end of file