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!