Hi, I'm trying to take snapshots of resulting equity curves during
Optimization.
Here's a snippet of AA code:
//
.
MAlb = Optimize("MA lookback",15,5,30,5);
//
.
if (Status("action") == actionPortfolio)
{
bo = GetBacktesterObject();
optPass = "MAlb" + MAlb;
// optPass is unique string, containing info on this optimizer pass
StaticVarSetText("SVoptPass", optPass);
bo.Backtest();
oAB = CreateObject("Broker.Application");
oAB.RefreshAll();
// lots of processing, studying trades, creating custom metrics, etc
//
..
}
A snippet of code from the indicator I have running in the active
window:
optPass = StaticVarGetText("SVoptPass");
Plot(Foreign("~~~Equity", "C"), " Equity");
_N(Title = optPass);
// title of the chart = static var set in AA code
oAB = CreateObject("Broker.Application");
oAW = oAB.ActiveWindow;
rc = oAW.ExportImage(optPass + ".png", 800, 600); // name of the
file = static var set in AA code
The idea is obvious: when the data is ready, AA code generates
RefreshAll(), indicator code is thus invoked, it plots the curve and
exports the image. The name of the file and the title on the chart
should be equal.
In fact this approach sorta works, but not entirely as expected.
Firstly, most of the times filename and the chart title don't match,
eg, filename is MAlb10 and the title of the chart is MAlb15. Sometimes
one chart with the same title appears several times under different
filenames. Some charts seem to be caught in mid-rendering or something,
etc etc.
Now I should say I tried all methods of invoking RefreshAll() and
ExportImage() I know the one shown in the snippets above (for
sheer simplicity), its modification using CreateStaticObject, also
tried this:
OWSHShell = CreateObject( "WScript.Shell" );
rc = OWSHShell.Run( "myscript.vbs", 4, False );
, tried all possible combinations of these
The results varied a
little, but unfortunately none was reliable. I moved the code around,
tried moving ExportImage() part from indicator into AA code (very end of
Status("action") == actionPortfolio block) same stuff
I also
had this wild thought: maybe indicator code is somehow being re-entered
and enclosed it in the code below, but this didn't help either:
if (NOT Nz(StaticVarGet("_snapshot_running")))
{
StaticVarSet("_snapshot_running", True);
// main indicator code
StaticVarSet("_snapshot_running ", False);
}
I came to the conclusion that most function calls are asynchronous,
RefreshAll() is not guaranteed to be honored when it's issued,
rendering is not guaranteed to be finished when the next line of code
after Plot() is being executed and so forth. That's why AFL is so
quick, I guess
Now, if only I had a way to suspend the AA code for a sec yielding
processor time to other threads (like indicator), I could solve my
problem
(Tomasz? Not all code is real-time!) Synchronous version
of Plot() would also help.
Any ideas, anyone? It's a shame to be so close to the solution yet
unable to reach it!!!
Many thanks!