A post was merged into an existing topic: Will Amibroker develop add-on for connecting prop trade firm
A post was merged into an existing topic: Will Amibroker develop add-on for connecting prop trade firm
The more bullet proof way is to keep guard_code in an AFL and include in all your APXs(AFL), my sample is a bit primitive from what I use, but this works better for all cases to prevent accidental execution.
isHoliday = CheckHolidayToday(); // my custom func
DoW = LastValue( dayofweek() );
isWeekEnd = DoW==0 OR DoW==6;
if( Now(4) < 91500 OR Now(4) > 153000 OR isWeekEnd OR isHoliday
OR NOT Status("actionIndicator") ) {
_exit();
}
You can add more customization to test if Name() is a Futures, OR in a specific Category like WL/Market to allow in extended hours etc.
You can also make a few variations and use them differently for different use cases.
Thank you for the suggestion and example code.
Hi @Tomasz. Im still on the learning phase but coming from a few others platforms, Im quite impressed with the level of customization, features and speed of Amibroker. Very likely this will be my main platform from now on (Algotrading). Congratulations!!! There is one thing missing that I use in my workflow, It would be incredible to have a WFA Cluster/Matrix backtest, (Various n Runs and OOS %) similar to other platforms. Combined with Amibroker’s speed, capabilities and customization, it would be an exceptionally powerful solution and at the same time bringing value to the platform. Thank you.
Add connection to BINANCE for live market data, that would be great.
Please add the possibility of maintaining a static parameter without having to add a new line of code by use of 0 in the Optimization step.
Ex.: variable = Optimize("variable", 14, 1, 30, 0);
For that you use Param() not Optimize() call.
variable = Param("variable", 14, 1, 30 );
The purpose of optimization is to find single optimum value from range of allowed values. If you have 'static' parameter, then you don't need Optimize() call at all.
After optimization, some parameters should remain static for WFA. Currently this requires commenting out Optimize() and replacing it with a hard-coded value. Allowing Step = 0 in Optimize() would make this an easier and less workload flow.
Just to be sure that we are on the same page.
In Walk-Forward Analysis you have TWO phases:
- In-sample optimization - where best (optimum) parameter set is found
- Out-of-sample backtest - when parameters from in-sample are FROZEN (static as you call) automatically
So ALL parameters are fixed/frozen in out-of-sample WFA phase.
That is how it works already.
Bottom line is I don't know what you are after when you say to have "some" paramters fixed in WFA.
Ok Tomasz, you are completely right in what you are saying but I can see that we are not on the same page. I didn't explain myself properly.
This is one potential flow:
- Run Optimization for general filters and setting that work, on a certain block of time. (exploration of possibilities).
- Fix Some of them (like filters types for instance)
- Run WFA on Full history data with the above filters fixed and settings with wiggle room.
When I go from phase 1 to 2, I need to make some parameters static (that were optimized before) and leave others still "Optimizable".
In order to do this I need to comment the Optimize line and create a new one to make it static like this for example:
// filter = Optimize(1, 1, 10, 1);
filter = 5;
If I was able to do this (without having to add another line) it would make the workflow faster, easier and it would not hurt any of the AFL logic.
filter = Optimize(5, 1, 10, 0);
Thanks for your time and help.
OK, now I understand what you are after. In this case you can achieve it quite simply by defining your own optimize function
function MyOptimize( nam, def, minv, maxv, step )
{
retval = def;
if( step > 0 ) retval = Optimize( nam, def, minv, maxv, step );
return retval;
}
And later just use MyOptimize()
Alright! That's an awesome solution. I just hope it won't degrade performance significantly
. Thanks.
It will have zero impact on performance.
Perfect!!
Thanks
You guys are great. Adding more markets would also save me a lot of hassle, so hoping this in in your future plans.
Firstly, thanks for your work and keeping the application robust and try to provide best features every time.
My wishes,
- Please keep options to select multiple values or folder using keyboard. Like we do it in CTRL+A (to select all) or Shift+Up or Down arrow) for perticular selections in word document. So that we can select multiplle folders or values in symbol list ot any other do do easy modification. Example, If I want to delete unnecessory Watchlists, I have to delete each list member one by one!!
-
Please keep changes of all windows of Amibroker as it is, where my work stopped or I closed before. Basically, I want to save my work and all windows wehere I left in my last time. It saves lot of time literally!! Please please do this.
-
When are you planning to provide mobile friendly application? Please plan iOS and Android applications for Amibroker. This also helps alot! I understood Amibroker uses local drives and Databases. But appeciate if we implement in cloud based DB so that we can use mobile applications as well. This is not urgent though But really helpful if it comes into reality!
Thanks again!
I have been using Tiingo for most of my data and I have been using AmiQuote to download from Tiingo. It has been working well for me. But recently I have been creating a lot of unique, composite symbols. To access them from AFL scripts they must reside in the same database as the market symbol data I get from Tiingo. What used to be an easy process of going to Tools - Auto Update Quotes has now gotten more complicated because AmiQuote sends out request for data on all of these non-market symbols because they are also in the same database.
I would like to request a way to automatically disable requests for my synthetic data symbols. One way might be to specify any symbol name with a non-alphabetic leading character like the ~ would not be sent to the data provider to request data.
You need to mark them as group 253 (composites) and then they should be excluded. If they aren't already I will check this out but the original idea was that composites are excluded.
Since the default behavior of AddToComposite() is to add new symbols to Group 253, another way to handle this would be to add a setting to AmiQuote telling it to ignore Group 253 when updating the entire database.

