Topics
Replies
sebastien.t
03 Oct 2024, 07:53
RE: Market VWAP is worse than Limit price
Thank you. To be honest it was the answer I was expected.
I m happy with that, no issue at all. I have my rules about the slippage so that s fine.
I will look around and try other brokers to get more liquidity/ depth market.
Thank you!
PanagiotisCharalampous said:
Hi there,
Many people think that stop limit orders somehow improve execution and magically eliminate slippage. They don't. They only thing a stop limit order does is that it does not execute the part of the order that falls beyond the slippage you can tolerate. This is what happens in your case. The stop limit order did what you instructed it to do. It did not execute the order because it could not meet your slippage criteria. If you want your orders to be executed, just use market orders.
Best regards,
Panagiotis
@sebastien.t
sebastien.t
03 Oct 2024, 07:50
RE: Market VWAP is worse than Limit price
My spread was 1 point.
The issue is not about the SL but the Stop Limit Range of 2. Because my order was not even triggered…
firemyst said:
What's the spread on your US30 when you place the order?
On a few brokers, the spread is larger than the 2-point SL you set.
If you're doing this in a bot or indicator, you need to check the spread before placing your order. It's not a guarantee since the spread could hypothetically change at any given moment, but it's a good safety check
@sebastien.t
sebastien.t
02 Oct 2024, 12:24
RE: Get the EntryPrice of a PlaceStopLimitOrder
Amazing, thank you!!!
PanagiotisCharalampous said:
Hi there,
The correct property is PendingOrder.TargetPrice.
Best regards,
Panagiotis
@sebastien.t
sebastien.t
02 Oct 2024, 08:31
( Updated at: 02 Oct 2024, 09:23 )
RE: Get the EntryPrice of a PlaceStopLimitOrder
Thank you for you answer. I want to get it from the Position itself when it is successful. I want to store it in Local storage before the execution to be able to monitor the slippage.
When the Position is executed it is too late…
Do you have any idea?
@sebastien.t
sebastien.t
04 Sep 2024, 08:10
RE: RE: RE: RE: RE: RE: Placing Stop Order - FAILED with error "TechnicalError"
I found the stupid issue. I was using the old ticker DE30 (but still available for this broker…) instead of the good new one DE40…
Now it s working perfectly!
Thank you for your support
sebastien.t said:
i was working on the DE40
PanagiotisCharalampous said:
sebastien.t said:
My broker is ICMarkets and here is the simple code, I just put an order. It could be anything a Market order or a stop order, i have always the Failure message.
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using System;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class StopLimitOrdersAt915 : Robot
{
private double _high15;
private double _low15;
[Parameter("Volume (in units)", DefaultValue = 10)]
public int VolumeInUnits { get; set; }
[Parameter("Offset (points)", DefaultValue = 20)]
public double OffsetInPoints { get; set; }
[Parameter("Take Profit (points)", DefaultValue = 50)]
public double TakeProfitInPoints { get; set; }
protected override void OnStart(){
var closedBar = Bars[1];
_high15 = closedBar.High;
_low15 = closedBar.Low;
double sellStopLoss = OffsetInPoints / Symbol.PipSize;
double takeProfit = TakeProfitInPoints / Symbol.PipSize;
double StopLoss= (_high15-_low15)/Symbol.PipSize
PlaceStopOrder(TradeType.Sell, SymbolName, VolumeInUnits, _low15, "Sell Stop Limit Order", StopLoss, takeProfit);
}
}}
Please let us know the symbol as well. I tried this on EURUSD and works fine
@sebastien.t
sebastien.t
04 Sep 2024, 05:35
RE: RE: RE: RE: RE: Placing Stop Order - FAILED with error "TechnicalError"
i was working on the DE40
PanagiotisCharalampous said:
sebastien.t said:
My broker is ICMarkets and here is the simple code, I just put an order. It could be anything a Market order or a stop order, i have always the Failure message.
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using System;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class StopLimitOrdersAt915 : Robot
{
private double _high15;
private double _low15;
[Parameter("Volume (in units)", DefaultValue = 10)]
public int VolumeInUnits { get; set; }
[Parameter("Offset (points)", DefaultValue = 20)]
public double OffsetInPoints { get; set; }
[Parameter("Take Profit (points)", DefaultValue = 50)]
public double TakeProfitInPoints { get; set; }
protected override void OnStart(){
var closedBar = Bars[1];
_high15 = closedBar.High;
_low15 = closedBar.Low;
double sellStopLoss = OffsetInPoints / Symbol.PipSize;
double takeProfit = TakeProfitInPoints / Symbol.PipSize;
double StopLoss= (_high15-_low15)/Symbol.PipSize
PlaceStopOrder(TradeType.Sell, SymbolName, VolumeInUnits, _low15, "Sell Stop Limit Order", StopLoss, takeProfit);
}
}}
Please let us know the symbol as well. I tried this on EURUSD and works fine
@sebastien.t
sebastien.t
03 Sep 2024, 13:31
RE: RE: RE: Placing Stop Order - FAILED with error "TechnicalError"
My broker is ICMarkets and here is the simple code, I just put an order. It could be anything a Market order or a stop order, i have always the Failure message.
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using System;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class StopLimitOrdersAt915 : Robot
{
private double _high15;
private double _low15;
[Parameter("Volume (in units)", DefaultValue = 10)]
public int VolumeInUnits { get; set; }
[Parameter("Offset (points)", DefaultValue = 20)]
public double OffsetInPoints { get; set; }
[Parameter("Take Profit (points)", DefaultValue = 50)]
public double TakeProfitInPoints { get; set; }
protected override void OnStart()
{
var closedBar = Bars[1];
_high15 = closedBar.High;
_low15 = closedBar.Low;
double sellStopLoss = OffsetInPoints / Symbol.PipSize;
double takeProfit = TakeProfitInPoints / Symbol.PipSize;
double StopLoss= (_high15-_low15)/Symbol.PipSize
PlaceStopOrder(TradeType.Sell, SymbolName, VolumeInUnits, _low15, "Sell Stop Limit Order", StopLoss, takeProfit);
}
}
}
@sebastien.t
sebastien.t
03 Sep 2024, 06:52
( Updated at: 03 Sep 2024, 07:39 )
RE: Placing Stop Order - FAILED with error "TechnicalError"
Hello,
thank you for your answer.
I modified the code to respect the Ticksize. I still get an error
Trade | → Placing Stop Order to Sell 10 DE30 (Price: 18772.6, SL: 5700, TP: 5000) FAILED with error "TechnicalError"
I also tried to use the Pipsize :
But I have the same issue Trade | → Placing Stop Order to Sell 10 DE30 (Price: 18772.6, SL: 570, TP: 500) FAILED with error "TechnicalError"
Thank you for your help.
PanagiotisCharalampous said:
Hi there,
You are setting the SL and TP is absolute price. You need to set them in pips.
Best regards,
Panagiotis
@sebastien.t
sebastien.t
20 May 2024, 15:05
RE: RE: Cbot on Cloud
sebastien.t said:
Is it on Windows?
because I have the Mac app and I can't see any of those options.
Thank you
Good day,
could you revert please?
@sebastien.t
sebastien.t
20 May 2024, 08:43
RE: Cbot on Cloud
Is it on Windows?
because I have the Mac app and I can't see any of those options.
Thank you
@sebastien.t
sebastien.t
30 Apr 2024, 08:32
RE: RE: RE: RE: RE: RE: RE: RE: RE: Issue / explanation AmountRisked
Hello,
I think there is also a huge issue on the lot calculation on the FOREX. I tried the function on GBPUSD
For an account of $1.000.000 and 10 pips Stop Loss, the function Symbol.VolumeForProportionalRisk proposed me to buy 2.500.00 lots which is by far too much…
But when I trued to reverse it with the function Symbol.AmountRisked, it says that I risk $2.500 which is the right number because my risk is 0.25% of the balance.
But obviously, it is not the risk that I have for 2.500.000 lots with a 10pips Stop Loss.
I can't even put a trade with that figures…
Is it also a but? When do you expect to fix it?
Thank you
protected override void OnStart()
{
Print("Symbol "+ Symbol.Name);
Print("Pip size "+Symbol.PipSize);
Print("Account Balance " + Account.Balance);
Print("Volume to risk for SL 10pips " + Symbol.VolumeForProportionalRisk( ProportionalAmountType.Balance, RiskPerTrade, 10));
Print("Amount risked for Volume 2 500 000 with SL 10pips " + Symbol.AmountRisked(Symbol.VolumeForProportionalRisk( ProportionalAmountType.Balance, RiskPerTrade, 10), 10));
}
@sebastien.t
sebastien.t
29 Apr 2024, 15:08
( Updated at: 30 Apr 2024, 05:23 )
RE: RE: RE: RE: RE: RE: RE: Issue / explanation AmountRisked
Do you have any idea where the issue is?
It is very weird…
Thank you
@sebastien.t
sebastien.t
29 Apr 2024, 08:39
RE: RE: RE: RE: RE: RE: Issue / explanation AmountRisked
Your issue is definitely coming from the Spotware Demo Account.
Here is my result for the S&P with an other broker
But i would need your Demo account because you have by far deeper historical for my backtesting…
@sebastien.t
sebastien.t
29 Apr 2024, 08:15
RE: RE: RE: RE: RE: Issue / explanation AmountRisked
On Mac, I use the Demo account for my bot testing
On Windows :
The same Demo account
@sebastien.t
sebastien.t
29 Apr 2024, 06:25
RE: RE: RE: Issue / explanation AmountRisked
Good day,
I have both Mac and Windows
Here is the results this morning from my Mac
And from my Windows server
The only difference I can see with your screenshot is the PipSize…
@sebastien.t
sebastien.t
28 Apr 2024, 19:59
RE: Issue / explanation AmountRisked
True in your case it is perfectly fine.
But look at my results for the same code on a Demo account
I have no idea why I get the weird results…
PanagiotisCharalampous said:
Hi there,
I don't see any problem.
Can you please explain what the problem is?
Best regards,
Panagiotis
@sebastien.t
sebastien.t
28 Apr 2024, 10:48
Good day,
I have a problem the function AmountRisked. I would like to risk 0.5% of my Balance for each trade.
So I tried to use that function. So basically for the same % of risk, I expect the Volume calulated to be doubled when my Stop Loss is divided by 2.
Here is my code
protected override void OnStart()
{
Print("Pip size "+Symbol.PipSize);
Print("Account Balance " + Account.Balance);
var Volume_10pips_SL = Symbol.VolumeForProportionalRisk( ProportionalAmountType.Balance, RiskPerTrade, 10);
var Volume_20pips_SL = Symbol.VolumeForProportionalRisk( ProportionalAmountType.Balance, RiskPerTrade, 20);
Print("Volume for 0.5% Risk of the Balance with 10 pips Stop Loss "+ Volume_10pips_SL);
Print("Volume for 0.5% Risk of the Balance with 20 pips Stop Loss "+ Volume_20pips_SL);
Print("AmountRisked for 0.5% Risk of the Balance with 10 pips Stop Loss " + Symbol.AmountRisked(Volume_10pips_SL, 10));
Print("AmountRisked for 0.5% Risk of the Balance with 20 pips Stop Loss " + Symbol.AmountRisked(Volume_20pips_SL, 20));
}
And the result for US500
Could you help what is going wrong in my usage of the function Symbol.VolumeForProportionalRisk?
Thank you
@sebastien.t
sebastien.t
24 Apr 2024, 08:28
( Updated at: 25 Apr 2024, 05:47 )
RE: RE: RE: RE: RE: RE: Backtesting on Multi Timeframe
Thank you @Panagiotis for your help. now my backtesting is working!
PanagiotisCharalampous said:
sebastien.t said:
Hi Panagiotis,
I tried to use your workaround but it doesn't really work for 2 reasons :
1/ if I want to backtest the bot that I use on Live market I can't change a lot of code and so I have to keep using the same functions. It seems that even if the history date are loaded (I can see see it if I check the date with Bars[0]), I can't recall that data with the MarketData.GetBars
2/ To run the Backtest I have to choose 1 timeframe (let s say H1) but in my bot I need check the historical data of the H4 and the Daily. And so even if I start the backtest to beofre my “real” backtesting date to load the data, it loads only the data for H1 and not for H4/Daily.
Here is my code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
[Robot(AccessRights = AccessRights.None)]
public class EasyHistoLoad : Robot
{
[Parameter("Backtest On/Off", Group = "BackTest", DefaultValue = false)]
public bool BackTest { get; set; }
[Parameter("Backtest Date", Group = "BackTest", DefaultValue = "2024/03/01 01:00:00")]
public string BackTestDate { get; set; }
protected override void OnStart()
{
// To learn more about cTrader Automate visit our Help Center:
// https://help.ctrader.com/ctrader-automate
// Print(Bars.Count());
DateTime time_to_test = Bars[Bars.Count()-5].OpenTime.AddDays(-15);
// Print(time_to_test);
// Get m1 Bars
if(BackTest && Bars.Last().OpenTime>DateTime.Parse(BackTestDate)){
Bars _OfTimeFrameBars = MarketData.GetBars(TimeFrame.Minute, SymbolName);
var LastOpenTimeLoaded = _OfTimeFrameBars.OpenTimes[0];
Print("Bars[0].OpenTime " + Bars[0].OpenTime+ " _OfTimeFrameBars.OpenTimes[0] "+ _OfTimeFrameBars.OpenTimes[0] + " time_to_test "+ time_to_test);
if (_OfTimeFrameBars.OpenTimes[0] > time_to_test){
Print("_OfTimeFrameBars is not using Bars history already loaded");
}
}
}
protected override void OnBarClosed()
{
DateTime time_to_test = Bars[Bars.Count()-5].OpenTime.AddDays(-15);
if(BackTest && Bars.Last().OpenTime>DateTime.Parse(BackTestDate)){
Bars _OfTimeFrameBars = MarketData.GetBars(TimeFrame.Minute, SymbolName);
var LastOpenTimeLoaded = _OfTimeFrameBars.OpenTimes[0];
Print("Bars[0].OpenTime " + Bars[0].OpenTime+ " _OfTimeFrameBars.OpenTimes[0] "+ _OfTimeFrameBars.OpenTimes[0] + " time_to_test "+ time_to_test);
if (_OfTimeFrameBars.OpenTimes[0] > time_to_test){
Print("_OfTimeFrameBars is not using Bars history already loaded");
}
}
}
protected override void OnStop()
{
// Handle cBot stop here
}
}
}
sebastien.t said:
Thank s for your answer, that seems a very nice option!
PanagiotisCharalampous said:
sebastien.t said:
Good day,
thank you for your answer.
Do you have a workaround?
The idea of my code/bot is to check some data in the past for the H4 to know if I am bullish or bearish and the to deep dive in the 1 minute chart.
Basically I have to go 60 bars on the timeframe and then go to the m1. Let s say I want to backtest from the 1st february, I check the H4 10 days before (60*4/24), that should be around mid of January and then I check some data on that date on the m1.
So most of the time I need to LoadMoreHistory on the m1.
Thank you
Seb
PanagiotisCharalampous said:
Hi there,
Your problem is here
while (_OfTimeFrameBars.OpenTimes[0] > time_to_test){ var numberOfLoadedBars = _OfTimeFrameBars.LoadMoreHistory();
LoadMoreHistory does not work in backtesting therefore your code enters an infinite loop.
Best regards,
Panagiotis
Hi Seb,
The workaround I use is to start the backtesting at earlier dates so that all the necessary information is loaded, while skipping all trading operations until a custom defined date. So I have a set of parameters like this
which replace the backtesting start date and I move my backtesting start date as far in the past as I want.
Best regards,
Panagiotis
Hi Seb,
- I did not understand what the problem is here, sorry
- You should retrieve the data on start, before the if condition. That's the whole point of the workaround
protected override void OnStart() { // To learn more about cTrader Automate visit our Help Center: // https://help.ctrader.com/ctrader-automate // Print(Bars.Count()); DateTime time_to_test = Bars[Bars.Count() - 5].OpenTime.AddDays(-15); Bars _OfTimeFrameBars = MarketData.GetBars(TimeFrame.Minute, SymbolName); Print("Bars[0].OpenTime " + Bars[0].OpenTime + " _OfTimeFrameBars.OpenTimes[0] " + _OfTimeFrameBars.OpenTimes[0] + " time_to_test " + time_to_test); // Print(time_to_test); // Get m1 Bars if (BackTest && Bars.Last().OpenTime > DateTime.Parse(BackTestDate)) { var LastOpenTimeLoaded = _OfTimeFrameBars.OpenTimes[0]; if (_OfTimeFrameBars.OpenTimes[0] > time_to_test) { Print("_OfTimeFrameBars is not using Bars history already loaded"); } } }
@sebastien.t
sebastien.t
22 Apr 2024, 19:44
( Updated at: 23 Apr 2024, 05:47 )
RE: RE: RE: RE: Backtesting on Multi Timeframe
Hi Panagiotis,
I tried to use your workaround but it doesn't really work for 2 reasons :
1/ if I want to backtest the bot that I use on Live market I can't change a lot of code and so I have to keep using the same functions. It seems that even if the history date are loaded (I can see see it if I check the date with Bars[0]), I can't recall that data with the MarketData.GetBars
2/ To run the Backtest I have to choose 1 timeframe (let s say H1) but in my bot I need check the historical data of the H4 and the Daily. And so even if I start the backtest to beofre my “real” backtesting date to load the data, it loads only the data for H1 and not for H4/Daily.
Here is my code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
[Robot(AccessRights = AccessRights.None)]
public class EasyHistoLoad : Robot
{
[Parameter("Backtest On/Off", Group = "BackTest", DefaultValue = false)]
public bool BackTest { get; set; }
[Parameter("Backtest Date", Group = "BackTest", DefaultValue = "2024/03/01 01:00:00")]
public string BackTestDate { get; set; }
protected override void OnStart()
{
// To learn more about cTrader Automate visit our Help Center:
// https://help.ctrader.com/ctrader-automate
// Print(Bars.Count());
DateTime time_to_test = Bars[Bars.Count()-5].OpenTime.AddDays(-15);
// Print(time_to_test);
// Get m1 Bars
if(BackTest && Bars.Last().OpenTime>DateTime.Parse(BackTestDate)){
Bars _OfTimeFrameBars = MarketData.GetBars(TimeFrame.Minute, SymbolName);
var LastOpenTimeLoaded = _OfTimeFrameBars.OpenTimes[0];
Print("Bars[0].OpenTime " + Bars[0].OpenTime+ " _OfTimeFrameBars.OpenTimes[0] "+ _OfTimeFrameBars.OpenTimes[0] + " time_to_test "+ time_to_test);
if (_OfTimeFrameBars.OpenTimes[0] > time_to_test){
Print("_OfTimeFrameBars is not using Bars history already loaded");
}
}
}
protected override void OnBarClosed()
{
DateTime time_to_test = Bars[Bars.Count()-5].OpenTime.AddDays(-15);
if(BackTest && Bars.Last().OpenTime>DateTime.Parse(BackTestDate)){
Bars _OfTimeFrameBars = MarketData.GetBars(TimeFrame.Minute, SymbolName);
var LastOpenTimeLoaded = _OfTimeFrameBars.OpenTimes[0];
Print("Bars[0].OpenTime " + Bars[0].OpenTime+ " _OfTimeFrameBars.OpenTimes[0] "+ _OfTimeFrameBars.OpenTimes[0] + " time_to_test "+ time_to_test);
if (_OfTimeFrameBars.OpenTimes[0] > time_to_test){
Print("_OfTimeFrameBars is not using Bars history already loaded");
}
}
}
protected override void OnStop()
{
// Handle cBot stop here
}
}
}
sebastien.t said:
Thank s for your answer, that seems a very nice option!
PanagiotisCharalampous said:
sebastien.t said:
Good day,
thank you for your answer.
Do you have a workaround?
The idea of my code/bot is to check some data in the past for the H4 to know if I am bullish or bearish and the to deep dive in the 1 minute chart.
Basically I have to go 60 bars on the timeframe and then go to the m1. Let s say I want to backtest from the 1st february, I check the H4 10 days before (60*4/24), that should be around mid of January and then I check some data on that date on the m1.
So most of the time I need to LoadMoreHistory on the m1.
Thank you
Seb
PanagiotisCharalampous said:
Hi there,
Your problem is here
while (_OfTimeFrameBars.OpenTimes[0] > time_to_test){ var numberOfLoadedBars = _OfTimeFrameBars.LoadMoreHistory();
LoadMoreHistory does not work in backtesting therefore your code enters an infinite loop.
Best regards,
Panagiotis
Hi Seb,
The workaround I use is to start the backtesting at earlier dates so that all the necessary information is loaded, while skipping all trading operations until a custom defined date. So I have a set of parameters like this
which replace the backtesting start date and I move my backtesting start date as far in the past as I want.
Best regards,
Panagiotis
@sebastien.t
sebastien.t
04 Oct 2024, 08:45
RE: Stop Limit Order and Spread
Hi there,
thank you for your answer.
For the TP, my bot is managing multiple position at the same time, I have to change the TP when the position is opened. So the only option I was thinking about is to store in LocalStorage the TargetPrice for every position and then calculate manually the TP and modify it. Is it my only way?
About the Stop Limit order entry, you say that the spread is irrelevant but on some US30 position yesterday I was not filled and I was thinking of the spread.
Let s say that the spread is 3 and I set a Long Stop Limit with a TargetPrice at 100 and a range at 2, is it possible to be filled?
Thank you
PanagiotisCharalampous said:
@sebastien.t