By the way, you were correct @Tomasz, it does appear that it did need StaticVarGetText() instead....thank you!
@MCassICT,
Looks like you've been hard at work.
So sorry about not responding the past couple of months, it's been a bit crazy and now I'm in my yearly review phase of all my trades of 2019.
If you still need help keep posting here and I or someone else can help.
Happy New Year!
Mike
Yes I have been hard at it! I can't tell you how much I appreciate you sharing your work. It has become an integral part of my daily process. I have made much progress adapting it but am sure I will still occasionally seek your advice!
Fantastic! Thank you for sharing RocketPower
Tony R
Hi @MCassICT - I am working my way through this and am embarrassed to say I can't figure out how to complete Step 2 - run the AFL from the editor. Are you able to help me out and explain how you run the scraping AFL from the editor window to read the text files to populate the watch list? (note: I created the IBDMLList watch list).
Thanks in advance!
@Jeremy running the scrape from the AFL editor is simple. Once you have the code in the editor, just got to Debug-->Go. This will run the code and scrape the data from IBD eTables into your watchlist. If you run into any issues with this let me know. One of the problems I had, was realizing that a few modifications were necessary to the code that @rocketPower posted to get it to work with my file system. If you can't get it to work I would presume that would be your next step. Debug-->Go should work if you've done everything else correctly up to that point.
@MCassICT thank you so much for the reply. I tried that but I cannot get it to populate the IBDMLList watchlist - went through and reread everything again but still stuck. That said, I am wondering based on some of your posts if it is the -fgets(file) line. It is calling file, which I think is right, but I must be missing something. Below is the code (not all of it, but just the first part):
/*
Scrape all IBD eTables and set static variables for all IBD prop ratings
Author: Michael Angelo Mustillo
Original Date: 2019/10/11
Revision NC
JJM: In AFL Formula Editor - Use Debug > Go to run
*/
/*
Update Log
----------
N/A
*/
//////////////////////////////////////////////////////////////////////////////////////
// Master Watchlist Prep
{
// Prepare Watchlist by clearing it
IBDMLList = CategoryFind("eTables_MasterList", categoryWatchlist);
// retrive comma-separated list of symbols in watch list
MLlist = CategoryGetSymbols( categoryWatchlist, IBDMLList );
//iterate through watchlist members and remove
for( i = 0; ( sym = StrExtract( MLlist, i ) ) != ""; i++ )
{
CategoryRemoveSymbol( sym, categoryWatchlist, IBDMLList );
}
}
//////////////////////////////////////////////////////////////////////////////////////
// IBD50 Table Scrape
//
{
// Prepare Watchlist by clearing it
IBD50List = CategoryFind("eTables_IBD50", categoryWatchlist);
// retrive comma-separated list of symbols in watch list
list = CategoryGetSymbols( categoryWatchlist, IBD50List );
//iterate through watchlist members and remove
for( i = 0; ( sym = StrExtract( list, i ) ) != ""; i++ )
{
CategoryRemoveSymbol( sym, categoryWatchlist, IBD50List );
}
// openfile
file = fopen("C:\\Users\\jerem\\Documents\\Amibroker_IBD_Scrape\\ibd50_eTables.txt", "r");
// Goto date and store for records
for(i = 0; i < 2; i++)
CL = fgets(file);
IBDSTDate = StrMid(CL, 11);
StaticVarSetText("IBDSTUpdateDate", IBDSTDate, True);
// prep file position for loop
for(i = 0; i < 2; i++)
CL = fgets(file);
// Loop to extract data of each IBD50 stock
for(i = 0; i < 50; i++)
{
for(j = 0; j < 2; j++)
CL = fgets(file);
// Extract ticker
DirtyTicker = StrMid(CL, 26, 6);
// Clean up ticker
char = "";
Ticker = "";
j = 0;
while(char != ")")
{
char = StrMid(DirtyTicker, j++, 1);
if (char != ")")
Ticker = Ticker + char;
}
// Extract Summary
Raw = StrMid(CL, 30);
StaticVarSetText(Ticker + "_Brief", Raw, True);
// Goto Data Line
CL = fgets(file);
// Get IBD50 ranking
Raw = StrMid(CL, 0, 2);
IBD50Rank = StrToNum(Raw);
StaticVarSet(Ticker + "_IBD50Rank", IBD50Rank, True);
// Get Composite Rating
Raw = StrMid(CL, 8, 2);
CR = StrToNum(Raw);
StaticVarSet(Ticker + "_CR", CR, True);
// Get EPS Rating
Raw = StrMid(CL, 26, 2);
EPS = StrToNum(Raw);
StaticVarSet(Ticker + "_EPS", EPS, True);
// Get RS Rating
Raw = StrMid(CL, 34, 2);
RS = StrToNum(Raw);
StaticVarSet(Ticker + "_RS", RS, True);
// Get IGRS Rating
Raw = StrMid(CL, 42, 2);
IGRS = StrTrim(Raw, " ");
StaticVarSetText(Ticker + "_IGRS", IGRS, True);
// Get SMR Rating
Raw = StrMid(CL, 57, 2);
SMR = StrTrim(Raw, " ");
StaticVarSetText(Ticker + "_SMR", SMR, True);
// Get Acc/Dis Rating
Raw = StrMid(CL, 65, 2);
AD = StrTrim(Raw, " ");
StaticVarSetText(Ticker + "_AD", AD, True);
// Get Sponsorship Rating
Raw = StrMid(CL, 74, 2);
Spon = StrTrim(Raw, " ");
StaticVarSetText(Ticker + "_Spon", Spon, True);
// Get P/E
Raw = StrMid(CL, 142, 4);
PE = StrToNum(Raw);
StaticVarSet(Ticker + "_PE", PE, True);
// Get Last Quarter Sales
Raw = StrMid(CL, 158, 4);
LQSales = StrToNum(Raw);
StaticVarSet(Ticker + "_LQSales", LQSales, True);
// Get Last Quarter EPS
Raw = StrMid(CL, 170, 4);
LQEPS = StrToNum(Raw);
StaticVarSet(Ticker + "_LQEPS", LQEPS, True);
// Get Consecutive Quarters of +15% EPS
Raw = StrMid(CL, 182, 4);
CQEPS15 = StrToNum(Raw);
StaticVarSet(Ticker + "_CQEPS15", CQEPS15, True);
// Get Current Quarter EPS Estimated Change
Raw = StrMid(CL, 194, 4);
CQEPSEst = StrToNum(Raw);
StaticVarSet(Ticker + "_CQEPSEst", CQEPSEst, True);
// Get Current Year EPS Estimated Change
Raw = StrMid(CL, 206, 4);
CYEPSEst = StrToNum(Raw);
StaticVarSet(Ticker + "_CYEPSEst", CYEPSEst, True);
// Get Pretax Margin
Raw = StrMid(CL, 218, 4);
PTMargin = StrToNum(Raw);
StaticVarSet(Ticker + "_PTMargin", PTMargin, True);
// Get Return on Equity
Raw = StrMid(CL, 226, 4);
ROE = StrToNum(Raw);
StaticVarSet(Ticker + "_ROE", ROE, True);
// Add ticker to watchlist
CategoryAddSymbol(Ticker, categoryWatchlist, IBD50List);
CategoryAddSymbol(Ticker, categoryWatchlist, IBDMLList);
}
// Close IBD50 file
fclose(file);
}
Any thoughts - thanks in advance - this thread is amazing - thanks to @rocketPower for posting this and you for all your questions - has helped me a lot!
Hi Jeremy,
I was confused about this as well, due to the comment explicit mentioning "IBDMLList". The trick is to name the watchlist "eTables_MasterList" (the red code). I am still a newbie and guess IBDMLList ist just the variable in the code.
Best regards
RioL
That was it! - thanks @RioL. Works fine now - I should have know that looking at the code now but totally missed it. Thanks to you as well as @MCassICT for your help. Now on to Step 3...
Very good @RioL ....that is exactly it. Sorry I didnt find time to take a look sooner @Jeremy . Glad he was able to get you taken care of though!
I have been using this as part of my system for many months with no problems. This morning I went to update my watch lists using the table scrape at the beginning of this post. For some reason however, this morning I all of a sudden have an error popping up and it is not updating the watch lists properly. If I look at the code, I don't see any glaring issues that might indicate something has changed. Any ideas what might be causing this? The specific error is shown in the pic below and occurs 6 times throughout the code. If needed I can post script in separate post do to size restrictions:
@MCassICT, I suspect that there is an issue in the file.
Probably there is a line that DOES NOT have a closing ") " for the ticker (or the file content is not in the expected sequence of 3 lines [Ticker + Brief line][Values line][Empty line]).
As a first step, simply check the downloaded file in a text editor and see if you can fix it, adding the missing closing parenthesis (be careful since IBD files use tabs to separate items) or realign it.
Then, try to work on the parsing code to make it more robust to handle any malformed data.
Thanks @beppe Ill give that a look!
This week the "brief" section of the exported text files had a newline character in the middle of it for BMRN that is unusual. My code isn't very robust, so you need to make sure the exports comply to what the code expects.
I usually download files in my browser with the option to choose the location via the "Save as"-dialog. So I always had to save all etables manually, because the save as dialog popped up, which was annoying until now: Just set the browser to save the files always in the download folder.
To move the files to my desired folder I created a batch which also permits me to use it in the Amibroker Batch.
Running the following batch downloads the eTables into the "Download" folder and moves them then to your desired folder. You need also to create a "_SepaDate.txt" with the filename. In my case it is defined as YYMMDD.
::Save this file as *.bat-file.
::
::Download the IBD etables.
::Set your browser to download directly to the "Download"-folder, otherwise the "Save as"-dialog pops up and needs manual interaction.
::Make sure the Download folder does not contain any old etables file, otherwise the filename would be sligthly different and it might cause trouble later on.
::Replace [enter your directory] with your directory. I left the partition and the last folder just as example, change it too if needed.
::Replace "Brave" with your desired browser.
::
::Table settings for eTables download and batch code.
::Author: Michael Angelo Mustillo (@rocketpower)
::source: https://forum.amibroker.com/t/using-etables-with-amibroker/15382
::Update Log:
::RioL: Replaced Chrome-Browser with Brave Browser
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=IBD100&columnsort1=ibd100rank&columnsorttype1=ASC&columnsort2=&columnsorttype2=DESC&search=&filter="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=NEWAMERICA&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=IBD8585&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=epsrank&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=relst&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=grpstr&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=smr&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=accdis&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start Brave "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=sponrating&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
::The following code creates a new folder and moves the files to it.
::Author: RioL
::Create the new folder for the etables data.
::Reading the variable from the file "_SepaDate.txt", it contains only one date in the format "YYMMDD".
set /p SepaDate=<"C:\[enter your directory]\_SepaDate.txt"
::pushd sets the directory as working directory!
pushd "C:\[enter your directory]\IBD_eTables"
mkdir "%SepaDate%"
cd "%SepaDate%"
::Move the downloaded files to the new folder.
set "FromPath=C:\[enter your directory]\Downloads"
set "ToPath=C:\[enter your directory]\IBD_eTables"
move "%FromPath%\ibd50_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibd8585_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdnewamerica_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (1).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (2).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (3).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (4).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (5).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (6).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables.txt" "%ToPath%\%SepaDate%"
PS: In my search for a solution to automate the a big chunk of the SEPA-strategy I had trouble with my approach to save everyday all data to a YYMMDD folder. Accessing these folders dynamic via *.bat and *.afl caused me some trouble until I figured out to use an extra temporary folder in which I copy the desired data. All formulas access this temporary folder and at the end I copy the results to the desired YYMMDD result folder. To have just one place to enter this YYMMDD I decided to create this "_SepaDate.txt" with just this YYMMDD. I know, for afl-code it would be better to write something like "SepaDate = "YYMMDD";" in the file to directly include it as a parameter. But I was not able to access this easily via *.bat file, so I choose to just write "YYMMDD" into the file and use it for *.bat and *.afl.
Howdy!
Sorry I haven't responded but with everything going on in the world combined with an international move forced to stop all non-essential stuff. But I finally got around to this and THANK YOU! I had to tweak it slightly by adding TIMEOUT 10 after the browser calls, because it would try to move the files before they even finished downloading, so the files would never move to the dated folder.
Of course it takes way less than 10 seconds, but you never know.
Here's the code I finalized with:
::Save this file as *.bat-file.
::
::Download the IBD etables.
::Set your browser to download directly to the "Download"-folder, otherwise the "Save as"-dialog pops up and needs manual interaction.
::Make sure the Download folder does not contain any old etables file, otherwise the filename would be sligthly different and it might cause trouble later on.
::Replace [enter your directory] with your directory. I left the partition and the last folder just as example, change it too if needed.
::Replace "Brave" with your desired browser.
::
::Table settings for eTables download and batch code.
::Author: Michael Angelo Mustillo (@rocketpower)
::source: https://forum.amibroker.com/t/using-etables-with-amibroker/15382
::Update Log:
::RioL: Replaced Chrome-Browser with Brave Browser
echo on
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=IBD100&columnsort1=ibd100rank&columnsorttype1=ASC&columnsort2=&columnsorttype2=DESC&search=&filter="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=NEWAMERICA&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=IBD8585&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=epsrank&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=relst&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=grpstr&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=smr&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=accdis&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=sponrating&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
TIMEOUT 10
::The following code creates a new folder and moves the files to it.
::Author: RioL
::Create the new folder for the etables data.
::Reading the variable from the file "_SepaDate.txt", it contains only one date in the format "YYMMDD".
set /p SepaDate=<"D:\Dropbox\Michael\Documents\Investing\eTables\_SepaDate.txt"
::pushd sets the directory as working directory!
pushd "D:\Dropbox\Michael\Documents\Investing\eTables\current"
mkdir "%SepaDate%"
cd "%SepaDate%"
::Move the downloaded files to the new folder.
set "FromPath=C:\Users\MikeM\Desktop\temp"
set "ToPath=D:\Dropbox\Michael\Documents\Investing\eTables\current"
move "%FromPath%\ibd50_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibd8585_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdnewamerica_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (1).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (2).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (3).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (4).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (5).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (6).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables.txt" "%ToPath%\%SepaDate%"
Again thanks for this much more efficient method!
Regards,
Mike
Hello again,
I found out how to automate the creation of the date folder.
Didn't think about this until after I posted, sorry!
::Save this file as *.bat-file.
::
::Download the IBD etables.
::Set your browser to download directly to the "Download"-folder, otherwise the "Save as"-dialog pops up and needs manual interaction.
::Make sure the Download folder does not contain any old etables file, otherwise the filename would be sligthly different and it might cause trouble later on.
::Replace [enter your directory] with your directory. I left the partition and the last folder just as example, change it too if needed.
::Replace "Brave" with your desired browser.
::
::Table settings for eTables download and batch code.
::Author: Michael Angelo Mustillo (@rocketpower)
::source: https://forum.amibroker.com/t/using-etables-with-amibroker/15382
::Update Log:
::RioL: Replaced Chrome-Browser with Brave Browser
echo on
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=IBD100&columnsort1=ibd100rank&columnsorttype1=ASC&columnsort2=&columnsorttype2=DESC&search=&filter="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=NEWAMERICA&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=IBD8585&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=comprating&columnsorttype1=DESC&columnsort2=&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=epsrank&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=relst&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=grpstr&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=smr&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=accdis&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
start chrome "https://research.investors.com/etables/ViewText.aspx?tabView=STOCKTABLES&columnsort1=sponrating&columnsorttype1=DESC&columnsort2=comprating&columnsorttype2=DESC&search=&filter=&listType="
TIMEOUT 5
::The following code creates a new folder and moves the files to it.
::Author: RioL
::Create the new folder for the etables data.
::Generate date folder, it contains only one date in the format "YYYY-MM-DD".
set SepaDate=%date:~-4,4%"-"%date:~-7,2%"-"%date:~-10,2%
::pushd sets the directory as working directory!
pushd "D:\Dropbox\Michael\Documents\Investing\eTables\current"
mkdir "%SepaDate%"
cd "%SepaDate%"
::Move the downloaded files to the new folder.
set "FromPath=C:\Users\MikeM\Desktop\temp"
set "ToPath=D:\Dropbox\Michael\Documents\Investing\eTables\current"
move "%FromPath%\ibd50_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibd8585_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdnewamerica_eTables.txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (1).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (2).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (3).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (4).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (5).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables (6).txt" "%ToPath%\%SepaDate%"
move "%FromPath%\ibdstocktables_eTables.txt" "%ToPath%\%SepaDate%"
Hi Mike,
don't worry, I know how much time other stuff and coding can take. I am glad it is of use to you. I rechecked my script: And indeed, I also added (probably later) a 3 second timeout to it too - sorry for not updating the thread.
TIMEOUT /T 3
Thanks for the date code, I think I stumbled over sth. like it before, I just didn't try this yet because I use the date as a variable in many afl-formulas and scripts. And I use it also to access my historic datasets.
Regards
Mario
Today same issue with FTNT
Thanks for the heads up! Sorry, it doesn't happen often, so I haven't bothered to code a work-around.