Can you please share a full screenshot of your UI so that we can see what you are looking at?
Best regards,
Panagiotis
Here a snapshot of the screen of for backtesting. But sometimes it starts after a while… Best regards. Joao Martins
Hi Joao,
There is no obvious problem in the screenshot you have posted. The button seems enabled. As you sai, it might take some time for the backtesting to start.
This is not expected to happen anytime soon. While the Mac team is catching up, the Windows team is developing new features. So there will be differences at least for the foreseeable future.
I have a backgroundworker that needs to use some indicators(eg DMS) while running calculating some MTF bars. The values of the indicators are to be used in the backgroundcalculations and the indicators should preferably be local to the static backgroundworker. Usage like var O = Bars[10].Open; and like var RS = Indicators.RelativeStrengthIndex(closePrices, entry.14); var I DM = Indicators.DirectionalMovementSystem(entry.14);
How to achieve that without invoking the main thread?
You can't. If you need data from the Bars object, you need to work on the main thread.
Ok. Related Question. Is there a way to start a Plugin from an indicator or Cbot. Alternate: can i start Backtesting (from plugin) in Indicator/Cbot?
Could you pleasesend us some troubleshooting information the next time this happens? Please paste a link to this discussion inside the text box before you submit it.
You can use ChartFibonacciRetracement but I do not think is necessary. Fibo level calculation is straight forward, you can calculate them yourself using the selected high and low.
Since yesterday, I'm no longer getting push notifications on the iOS cTrader app either. I've checked the settings on the app, cTrader account, iOS notification settings and they're all turned on. I've reinstalled the app but still nothing. 🤷♂️
It seems we have not received this email. Can you please resend it to support@ctrader.com?
Best regards,
Panagiotis
Resent as requested. PLease let me know if you received it. If not, I might have to send separate individual emails with all the info as I wonder if your email system might be blocking it or sending it to spam for some reason.
Just wanting to confirm you've received the messages I've sent? If not, I think Spotware's email system is blocking them for some reason because all my initial messages got through to the Community team - obviously since they asked for the VPS' details to check out the issue.
Thank you
Hi firemyst,
Messages received, the team will check later this week or early next week. Thanks for your patience!
There are no limits to how many symbols you can subscribe. One thing that could be happening is that you do not read the incoming messages fast enough causing a buffer overflow on the server which eventually drops your connection. If you cannot figure it out yourself, contact the Open API support on Telegram so that they can check what is happening with your connection
The code below works perfectly locally. All it does it connect to a websocket, and prints OnStart…
When I run this in the cloud I get no errors, and no prints either. Should I not see a Print statement with this?
using System;using cAlgo.API;using cAlgo.API.Collections;using cAlgo.API.Indicators;using cAlgo.API.Internals;namespace cAlgo.Robots{ [Robot(AccessRights = AccessRights.None, AddIndicators = true)] public class AlgoBot2 : Robot { // Defining the necessary WebSocketClientOptions private static WebSocketClientOptions _webSocketClientOptions = new WebSocketClientOptions { KeepAliveInterval = new TimeSpan(0, 1, 30), UseDefaultCredentials = true, }; // Initialising the WebSocketClient private WebSocketClient _webSocketClient = new WebSocketClient(_webSocketClientOptions); // Defining the target URI where the AI service is available private readonly Uri _targetUri = new Uri("wss://custom-subdomain.loca.lt"); protected override void OnStart() { Print("OnStart..."); _webSocketClient.Connect(_targetUri); // Serialize JSON data string jsonMessage = System.Text.Json.JsonSerializer.Serialize(new { hello = "world" }); _webSocketClient.Send(jsonMessage); _webSocketClient.TextReceived += webSocketClient_TextReceived; } protected override void OnBarClosed() { // Attaining data for the current bar that has just closed // and the preceding bar var currentBar = Bars.LastBar; var previousBar = Bars.Last(Bars.Count - 2); // Creating a prompt for market analysis based on bar data string marketPrompt = @$" For the current bar, the high, low, open, and close were the following: {currentBar.High}, {currentBar.Low}, {currentBar.Open}, {currentBar.Close}. For the previous bar, these values were {previousBar.High}, {previousBar.Low}, {previousBar.Open}, {previousBar.Close}. Make predictions about the future. "; // Sending the new prompt to the AI service _webSocketClient.Send(marketPrompt); } protected void webSocketClient_TextReceived(WebSocketClientTextReceivedEventArgs obj) { Print("Received message"); } protected override void OnStop() { // Disposing of the WebSocketClient to avoid memory leaks _webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure); } }}
Can you share a screenshot of the cBot log as well?
Please share your cBot code and make sure you are using tick data for your backtests.
Best regards,
Panagiotis
using System;using System.Collections.Generic;using cAlgo.API;using cAlgo.API.Indicators;using cAlgo.API.Internals;namespace cAlgo.Robots{ [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)] public class TradingBot : Robot { [Parameter("Risk Percentage", DefaultValue = 1, MinValue = 0.1, MaxValue = 10)] public double RiskPercentage { get; set; } [Parameter("Stop Loss (Pips)", DefaultValue = 40, MinValue = 0, MaxValue = 100)] public double StopLossPips { get; set; } [Parameter("Take Profit (Pips)", DefaultValue = 20, MinValue = 0, MaxValue = 200)] public double TakeProfitPips { get; set; } private AI_101.ML101.ModelInput _modelInput; private double _lastPrediction; protected override void OnStart() { _modelInput = new AI_101.ML101.ModelInput(); } protected override void OnTick() { // Ensure only one open position per currency pair if (Positions.FindAll("ML Prediction", Symbol.Name).Length > 0) return; // Update model input with the latest close price _modelInput.ClosePrice = (float)Symbol.Bid; // Use Symbol.Bid instead of Symbol.LastTick.Bid // Get prediction var prediction = AI_101.ML101.Predict(_modelInput); // Calculate the predicted price change double predictedChange = prediction.ClosePrice[0] - _modelInput.ClosePrice; // Determine if we should open a position if (Math.Abs(predictedChange) > Symbol.PipSize) { if (predictedChange > 0 && _lastPrediction <= 0) { OpenPosition(TradeType.Buy); } else if (predictedChange < 0 && _lastPrediction >= 0) { OpenPosition(TradeType.Sell); } } _lastPrediction = predictedChange; } private void OpenPosition(TradeType tradeType) { // Calculate position size based on risk double riskAmount = Account.Balance * (RiskPercentage / 100); double volumeInUnits = riskAmount / (StopLossPips * Symbol.PipValue); // Ensure volume is within acceptable range and increments volumeInUnits = Symbol.NormalizeVolumeInUnits(volumeInUnits, RoundingMode.ToNearest); // Check if the volume is valid if (volumeInUnits < Symbol.VolumeInUnitsMin || volumeInUnits > Symbol.VolumeInUnitsMax) { Print("Volume is out of range: " + volumeInUnits); return; } // Open the position ExecuteMarketOrder(tradeType, Symbol.Name, volumeInUnits, "ML Prediction", StopLossPips, TakeProfitPips); } }}
My thought was:
Since I collected only m5 candle data for my Machine learning module I changed the “Data” in settings to “m5 bars from server” for backtesting
and I was considering to change “protected override void OnTick()” to "protected override void OnBar()".
Is that wrong?
What is the best solution?
Thank you
Hi there,
If you are using fixed SL and TP, you need to use tick data to ensure accurate results in backtesting.
Best regards,
Panagiotis
Okay, my cbot code uses
protected override void OnTick()
I still get wrong TP.
You need to use tick data on your backtesting settings. OnTick() is irrelevant.
Where does the option “m5 bars from server” come from?
I thought the system provided the best possible set-up because of my csv file, which contains only m5 bars data.
I don't understand what you mean. It's just an option in a dropdown list
My friend,
I created a csv file with m5 bars only to train my module. I thought that is why I the option “M5” is available.
Can you please explain why in any of the options in Backtesting drop-down list is not triggering my predefined TP or SL .
What is the point of predefining it?
I thought the Backtesting process should prepare for the real environment. But when there are options which are not correctly executed by the system makes no sense to me.
The options have nothing to do with the data you used to generate the model. The backtesting module has no clue what your cBot is doing. Those options are there to choose the data source to be used for the backtesting. If you don't use tick data but you use SP and TP at specific price levels, your execution will be inaccurate, since m5 bars data source only uses open prices for the execution
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.
PanagiotisCharalampous
06 Sep 2024, 05:19
Hi there,
No there is no such option in APIs available for traders. Account creation is only available to brokers.
Best regards,
Panagiotis
@PanagiotisCharalampous