Topics
Replies
armstr.tradie
15 Dec 2017, 00:06
It worked!
Thank you, Panagiotis for your help. Sorry for the late reply.
With a bit of tweaking of the code I was able to get it to work in a satisfactory manner.
Here is my code for others to use if they are interested. Please suggest any improvements.
//Sets the minimum distance between a pending order and an open position.
[Parameter("Minimum Trade Separation", DefaultValue = 3)]
public double MinPipDistance { get; set; }
//Removes any pending order at the same level or near an already existing position of the same TradeType
protected void PositionExists()
{
var longPosition = Positions.Find(Label, Symbol, TradeType.Buy);
var shortPosition = Positions.Find(Label, Symbol, TradeType.Sell);
if (longPosition != null)
{
var MinBuyDistance = longPosition.EntryPrice + MinPipDistance * Symbol.PipSize;
foreach (var order in PendingOrders)
{
if (order.TradeType == TradeType.Buy)
{
if ((order.TargetPrice >= longPosition.EntryPrice) && (order.TargetPrice < MinBuyDistance))
{
CancelPendingOrder(order);
}
}
}
}
else if (shortPosition != null)
{
var MinSellDistance = shortPosition.EntryPrice - MinPipDistance * Symbol.PipSize;
foreach (var order in PendingOrders)
{
if (order.TradeType == TradeType.Sell)
{
if ((order.TargetPrice <= shortPosition.EntryPrice) && (order.TargetPrice > MinSellDistance))
{
CancelPendingOrder(order);
}
}
}
}
}
Thank you again Panagiotis for your help. You have made using cAlgo that much easier and I very grateful for all your time and help.
@armstr.tradie
armstr.tradie
21 Nov 2017, 20:37
Thanks again Panagiotis for the quick reply,
I've added 'not null' logic in the code, as you can see below.
protected void PositionExistsBuy()
{
var longPosition = Positions.Find(Label, Symbol, TradeType.Buy);
var MinBuyDistance = longPosition.EntryPrice + MinPipDistance * Symbol.PipSize;
foreach (var order in PendingOrders)
{
if (longPosition != null)
{
if (order.TradeType == TradeType.Buy)
{
//var pipDistance = Math.Abs((order.TargetPrice + longPosition.EntryPrice) / Symbol.PipValue);
if (order.TargetPrice < MinPipDistance)
{
CancelPendingOrder(order);
}
}
}
}
}
protected void PositionExistsSell()
{
var shortPosition = Positions.Find(Label, Symbol, TradeType.Sell);
var MinSellDistance = shortPosition.EntryPrice - MinPipDistance * Symbol.PipSize;
foreach (var order in PendingOrders)
{
if (shortPosition != null)
{
if (order.TradeType == TradeType.Sell)
{
//var pipDistance = Math.Abs((order.TargetPrice - shortPosition.EntryPrice) / Symbol.PipValue);
if (order.TargetPrice > MinPipDistance)
{
CancelPendingOrder(order);
}
}
}
}
}
Unfortunately, again I get the same issue. It starts the robot, creates a series of pending orders, closes them, and then stops the bot.
Perhaps taking a different approach may be better?. My understanding of C# is not as advanced as others - so I more than welcome any other ideas that could help.
Thank you
@armstr.tradie
armstr.tradie
21 Nov 2017, 10:29
Thank you Panagiotis for your very quick reply.
Here is the code for my bot. As you can see it is based on a renko indicator. The indicator referenced in the bot is this one: /algos/indicators/show/1086 - full credit to 'tmc' who created it. The renko system helps set the price level and trend of the bot.
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo.Robots
{
[Robot()]
public class RENKO : Robot
{
//################################################## - Bot Label - ##################################################
[Parameter(DefaultValue = "Abot")]
public string Label { get; set; }
//################################################## - RENKO details - #############################################
[Parameter(DefaultValue = 250)]
public double RenkoPips { get; set; }
//public double RenkoPips = 50;
public int BricksToShow = 10000;
private Renko renko;
//################################################## - Other parameters - #############################################
[Parameter(DefaultValue = 1000)]
public int Volume { get; set; }
[Parameter("Take Profit (pips)", DefaultValue = 2000)]
public double TakeProfit { get; set; }
[Parameter("Stop Loss (pips)", DefaultValue = 1000)]
public double StopLoss { get; set; }
//################################################## - Dynamic stops - #############################################
[Parameter("Break Even Trigger", DefaultValue = 200)]
public double SL1Trigger { get; set; }
[Parameter("Break Even", DefaultValue = 25)]
public double SL1 { get; set; }
[Parameter("Trailing Stop Trigger", DefaultValue = 1000)]
public double SL2Trigger { get; set; }
[Parameter("Trailing Stop Level", DefaultValue = 500)]
public double SL2 { get; set; }
//################################################## - Buy/Sell range - #############################################
// Sets the level at which pending trades are separated from one another.
[Parameter("Order Price Level", DefaultValue = 100)]
public double TP1 { get; set; }
// How many orders to be made when the bot runs.
[Parameter("Number of Orders", DefaultValue = 31)]
public int HowMuchPositions { get; set; }
// Option to possible have multiple orders at the same level.
[Parameter("Multiply Orders x ...", DefaultValue = 1)]
public double MaxPendingOrders { get; set; }
// Option designed to stop double-up of trades near a similar price level.
[Parameter("Minimum Trade Separation", DefaultValue = 90)]
public double MinPipDistance { get; set; }
//################################################## - OnStart - ##################################################
protected override void OnStart()
{
renko = Indicators.GetIndicator<Renko>(RenkoPips, BricksToShow, 3, "SeaGreen", "Tomato");
}
//################################################## - OnTick - ##################################################
protected override void OnTick()
{
BuyAndSell();
BreakEven();
TrailingStop();
PositionExistsBuy();
PositionExistsSell();
}
//################################################## - Buy & Sell Details - ##################################################
protected void BuyAndSell()
{
double rClose = renko.Close.Last(0);
double rOpen = renko.Open.Last(0);
double Close = MarketSeries.Close.LastValue;
double Open = MarketSeries.Open.LastValue;
var MaxOrders = PendingOrders.Count < MaxPendingOrders;
// Setup pending BUY
if (Close > rOpen)
{
ClosePendingSell();
if (MaxOrders)
{
for (double i = 1; i < HowMuchPositions; i++)
{
PlaceStopOrder(TradeType.Buy, Symbol, Volume, rOpen + TP1 * i * Symbol.PipSize, Label, StopLoss, TakeProfit);
}
}
}
// Setup pending SELL
else if (Close < rOpen)
{
ClosePendingBuy();
if (MaxOrders)
{
for (double j = 1; j < HowMuchPositions; j++)
{
PlaceStopOrder(TradeType.Sell, Symbol, Volume, rOpen - TP1 * j * Symbol.PipSize, Label, StopLoss, TakeProfit);
}
}
}
}
//################################################## - Pending Order Close Logic - ##################################################
protected void ClosePendingSell()
{
foreach (var order in PendingOrders)
{
if (order.TradeType == TradeType.Sell)
CancelPendingOrderAsync(order);
}
}
protected void ClosePendingBuy()
{
foreach (var order in PendingOrders)
{
if (order.TradeType == TradeType.Buy)
CancelPendingOrderAsync(order);
}
}
//################################################## - Removal of trade double up logic - ##################################################
protected void PositionExistsBuy()
{
var longPosition = Positions.Find(Label, Symbol, TradeType.Buy);
var MinBuyDistance = longPosition.EntryPrice + MinPipDistance * Symbol.PipSize;
foreach (var order in PendingOrders)
{
if (order.TradeType == TradeType.Buy)
{
//var pipDistance = Math.Abs((order.TargetPrice + longPosition.EntryPrice) / Symbol.PipValue);
if (order.TargetPrice < MinPipDistance)
{
CancelPendingOrder(order);
}
}
}
}
protected void PositionExistsSell()
{
var shortPosition = Positions.Find(Label, Symbol, TradeType.Sell);
var MinSellDistance = shortPosition.EntryPrice - MinPipDistance * Symbol.PipSize;
foreach (var order in PendingOrders)
{
if (order.TradeType == TradeType.Sell)
{
//var pipDistance = Math.Abs((order.TargetPrice - shortPosition.EntryPrice) / Symbol.PipValue);
if (order.TargetPrice > MinPipDistance)
{
CancelPendingOrder(order);
}
}
}
}
//################################################## - Stop Loss Details - ##################################################
protected void BreakEven()
{
double rClose = renko.Close.Last(0);
double rOpen = renko.Open.Last(0);
double Close = MarketSeries.Close.LastValue;
var positions = Positions.FindAll(Label);
if (positions == null)
return;
foreach (var position in positions)
{
if (position.Pips >= SL1Trigger)
{
if (position.TradeType == TradeType.Buy)
{
var newStopLoss = position.EntryPrice + SL1 * Symbol.PipSize;
if (position.StopLoss < newStopLoss)
ModifyPosition(position, newStopLoss, position.TakeProfit);
}
else if (position.TradeType == TradeType.Sell)
{
var newStopLoss = position.EntryPrice - SL1 * Symbol.PipSize;
if (position.StopLoss > newStopLoss)
ModifyPosition(position, newStopLoss, position.TakeProfit);
}
}
}
}
protected void TrailingStop()
{
double rClose = renko.Close.Last(0);
double rOpen = renko.Open.Last(0);
double Close = MarketSeries.Close.LastValue;
var positions = Positions.FindAll(Label);
if (positions == null)
return;
foreach (var position in positions)
{
if (position.Pips >= SL2Trigger)
{
if (position.TradeType == TradeType.Buy)
{
var newStopLoss2 = Symbol.Bid - SL2 * Symbol.PipSize;
if (position.StopLoss < newStopLoss2)
ModifyPosition(position, newStopLoss2, position.TakeProfit);
}
else if (position.TradeType == TradeType.Sell)
{
var newStopLoss2 = Symbol.Ask + SL2 * Symbol.PipSize;
if (position.StopLoss > newStopLoss2)
ModifyPosition(position, newStopLoss2, position.TakeProfit);
}
}
}
}
}
}
Thank you again for your help.
@armstr.tradie
armstr.tradie
27 Aug 2016, 05:50
RE:
lucian said:
Try :
var newStopLoss = position.EntryPrice+/-Stoplevel * Symbol.PipSize;
Thanks lucian.
I'l give it ago on Sunday/Monday when the markets open and see how it goes.
@armstr.tradie
armstr.tradie
19 Aug 2016, 05:56
RE:
lucian said:
First try to change:
private void MoveToBreakEven() { foreach (var position in Positions.FindAll(label, Symbol)) { if (position.StopLoss != position.EntryPrice) { if (position.Pips >= 5) { ModifyPosition(position, position.EntryPrice, position.TakeProfit); } } } }in :
private void MoveToBreakEven() { foreach (var position in Positions.FindAll(label, Symbol,TradeType.Sell)) { if (position.StopLoss != position.EntryPrice) { if (position.Pips >= 5) { ModifyPosition(position, position.EntryPrice-(Symbol.PipSize*1), position.TakeProfit); } } } }foreach (var position in Positions.FindAll(label, Symbol,TradeType.Buy)) { if (position.StopLoss != position.EntryPrice) { if (position.Pips >= 5) { ModifyPosition(position, position.EntryPrice+(Symbol.PipSize*1), position.TakeProfit); } } } }
Thanks Lucian. It appeared to work well but there seems to be an issue with the triggers I think. It worked as intended when it got to the first trigger for the break-even, but when it reached the second trigger that got the trailing stop loss going the stop loss began to jump to and from the new stop-loss price to the old one with each movement of the bid and ask price.
I wonder if a jumping stop may be the only way out of this issue. Or is there a way to have another stop-loss in same bot - kinda like the advanced take profit? I think the problem is that it has the same stop-loss following two different triggers and it doesn't know which one to follow. Could one make another stop - so you have say "SL" and "SL2"?
Again any help on this would be greatly appreciated. Thank you.
@armstr.tradie
armstr.tradie
07 Jan 2018, 07:57
Thank you Paul, it worked perfectly. Keep up the good work. I appreciate the help you provide on this forum.
@armstr.tradie