January 27, 2016
The problem is as follows: during multiple-symbol Scan (or any other multi-threaded Analysis operation) we want to create a single, shared file and append content generated from multiple symbols to it.
There are two things that we must consider if we are running in multiple treaded scenario.
1. If we want to get just single-run results, before appending content to the file, we need first to delete file generated in previous runs.
2. We have to take care to open the file in share-aware mode so multiple threads do not write at the same time (preventing corruption).
A sample formula is presented below.
// our scanning code
Buy = Cross( MACD(), Signal() );
filepath = "C:\\ScanExport.txt";
if( Status("stocknum") == 0 )
// delete previous file before anything else
fdelete( filepath );
// open file in "share-aware" append mode
fh = fopen( filepath, "a", True );
// proceed if file handle is correct
if ( fh )
lastbuyDT = LastValue( ValueWhen( Buy, DateTime() ) ) ;
// write to file
fputs( Name() +", Last Buy: " + DateTimeToStr( lastBuyDT ) +"\n", fh );
// close file handle
fclose( fh );
_TRACE("Failed to open the file");
One important thing to remember is that in multi-threaded environment threads execute independently and there is no guarantee they will all execute sequentially, so the order of items (symbols) in the file may not be alphabetical.
If we want strictly sequential execution, then we must limit ourselves to just running in single-thread. A single-thread execution in New Analysis window can be achieved by placing the following pragma call at the top of the formula.
#pragma maxthreads 1
#pragma maxthreads limits the number of parallel threads used by New Analysis window. This command is available in AmiBroker version 6 or higher.