I don't think this was ever working. When the indicator is unloaded and destroyed, all references created by the indicator will do as well, same for the indicator's log. If you want to check this, write in an external file.
Best regards,
Panagiotis
Ok, now there is no way for the indicator to clear the interactive objects it created when it is deleted.
I am not sure what you mean, can you elaborate?
When my indicator is on the chart. Adds objects to the chart, such as rectangles and trend lines These objects are interactive. "IsInteractive = true;" When I remove the indicator from the chart, those objects remain in the chart! If their interactive feature is false, they will be deleted automatically, but as I said, I will turn on their interactive feature. I want to delete all the objects added to the chart when the indicator is deleted
Hi there,
Can you share the code you are using to delete the objects so that we can check?
As an added step, you should also obfuscate your code before compiling it. THis way, if someone does manage to decrypt your code, it'll still be hard to figure out.
Visual Studio comes with a free tool as it includes a copy of PreEmptive Protection - Dotfuscator Community, free for personal use. (This free version was previously known as Dotfuscator Community Edition or Dotfuscator CE.)
To begin using Dotfuscator Community from Visual Studio, type dotfuscator into the Search Box (Ctrl+Q).
The “takeprofit” parameter in the execute market order is in Pips; you're supplying an actual price.
Replace “takeProfit” in the ExecuteMarketOrder with your parameter “TakeProfitPips”.
OR what you need to do is convert “takeProfit” back to pips as a distance from the current candle close, which seems pointless in this scenario as you have it since TP is measured from the current “close” price when the order is placed.
Thanks @firemyst, changing to TakeProfitPips worked a treat. Your explanation makes perfect sense. Much appreciated.
I wonder if the ExecuteMarketOrder used to be coded to expect the price, rather than pips, since ChatGPT seems to think that's how it works.
Set the pips, and then immediately call:
ModifyTakeProfitPrice()
to set the price if you want to set it by exact price instead of pips.
Thanks, I think I tried googling a while back and didn't find much, but your link is the info I was looking for. It's clear now, I'm using the ctrader app version from a prop firm, it doesn't show the algo option like in the example above.
I think it might only be available in the “Spotware” version of the app.
Keep in mind that regardless of how Spotware/cTrader calculate the angle, the angle will vary depending on the chart's zoom level horizontally / vertically.
It will also change as more bars appear to the right or if you scroll the chart back to the left as cTrader automatically scales the chart.
The “takeprofit” parameter in the execute market order is in Pips; you're supplying an actual price.
Replace “takeProfit” in the ExecuteMarketOrder with your parameter “TakeProfitPips”.
OR what you need to do is convert “takeProfit” back to pips as a distance from the current candle close, which seems pointless in this scenario as you have it since TP is measured from the current “close” price when the order is placed.
Just glancing at your code, I noticed one way to improve it.
The “GetTrend()” method is a waste of CPU cycles. If the trend doesn't match a “sell”, it's always going to return a “buy”. If this is actually what you want, then redo the code like follows to remove a conditional check:
private TradeType GetTrend()
{
//Remove the first conditional check to save on CPU cycles and make your bot code
//that few nano-seconds faster
if (Bars.ClosePrices.Last(1) < ema200.Result.Last(1))
return TradeType.Sell;
else
return TradeType.Buy;
}
I'm not sure about a plugin situation, but you can save the toggle button states to a file, and when the file is updated have your other running cBots read/update their charts based on whatever values you have saved in the file.
Note that this method isn't possible if you're running bots in the cloud as I don't believe bots in the cloud can read/write files.
Still happening in 2024. i have multiple instances running. when a position closes and the position_closed event fires, it triggers this method for all instances (although it does just close the actual trade)
I can tell because i receive the SMS's *freaked me out
In fact, i noticed this behaviour in Positions_Modified and Positions_Opened aswell
My fix
private void Positions_Closed(PositionClosedEventArgs obj){ //step: weird bug - do not fire for symbols that are not the same - picked this up in my sms's if(obj.Position.Symbol.Name.ToUpper() != Symbol.Name.ToUpper()) return;
It appears this is intended behavior because of the way the event is wired. It's wired this way because it's on the “Positions” collection, not the individual “Position”. The “positions” is all the positions, not just a singular one.
It occurs every time a position is closed. So it doesn't matter if a position is closed from a bot, a stop loss, a take profit, or someone manually closing it. That's why there's the “args” parameter is supplied so you can filter the event based on the symbol from the “positions” collection.
firemyst
17 Oct 2024, 01:40
( Updated at: 17 Oct 2024, 04:57 )
Depends on what you want.
You're getting the LastValue, which is value as of the moment it's taken in the current bar. As you know, values for the current bar can change depending on what the price does.
So at the beginning of the bar for example, the top band could be one value, but then if price really skyrockets and the band expands, the top band could end up being another value by the close of the bar.
If that's what you want, fine.
Perhaps what you want is the value of the previous bar when price closed? With Bollinger Bands, that shouldn't change. So instead of getting the .LastValue, you need to get .Last(1).
firemyst
04 Nov 2024, 23:23
RE: ChartTrendLines don't get removed from OnDestroy() method when indicator removed from chart
AlgoCreators said:
I'm not sure where you've been, but OnDestroy() has been there since version 4.2:
@firemyst