Doh! Looks like I forgot the fclose call again. Good luck with your efforts.
Mike --- In [email protected], "gmorlosky" <gmorlo...@...> wrote: > > Thanks for all the details and explanations. That has really enhanced my > education. > I now have one final step to complete and that is taking the "ids" string and > applying it to "param". I think I'll start by looking at: > EXAMPLE OrderType = ParamList("Order Type", "MKT|LMT|STP" ); > > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > Just to avoid any ambiguity, a sample data file would be as follows: > > > > 10,12,15 > > 13,28 > > 4 > > 9 > > 33,55 > > > > Basically; Any number of lines, each of which has 1 or more comma separated > > values. There are no leading commas, no trailing commas, no embedded > > spaces, no blank lines. > > > > Mike > > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > > > > > > Hi, > > > > > > I took a look at my original post (now that I have AmiBroker in front of > > > me). I mistakenly reversed the arguments to StrFind, which you have > > > corrected. I also indicated in my notes that the code would work for > > > multiline csv files, but did not actually include any handling for the > > > newline characters. > > > > > > Whereas my original code worked for a single line of multiple IDs > > > separated by commas, but not multiple lines. Your proposed revision > > > works for multiple lines of single entries but not for lines with > > > multiple IDs. > > > > > > If you plan to have a single ID per line in your file, then you can get > > > rid of the whole building up of the ids string altogeather. The only > > > reason for prepending the initial "," concatenating the results and > > > appending the final "," was to be able to do a generic StrFind using > > > comma delimiters. e.g. given "10,5,24" would end up with ",10,5,24," and > > > could generically search for ",<any value>,". > > > > > > Below is a corrected version of my original that passes the StrFind > > > arguments in the right order and has been corrected to strip any newline > > > characters found. Note that the last line of a file might not have a > > > newline. This version delivers on my original claim to handle any number > > > of comma seperated values on each of any number of lines. > > > > > > function IncludeIndustry( id ) > > > { > > > local ids; > > > local fh; > > > local line; > > > > > > ids = ","; > > > fh = fopen( "C:\\temp\\filter.csv", "r" ); > > > > > > if ( fh ) > > > { > > > while ( !feof( fh ) ) > > > { > > > line = fgets( fh ); > > > > > > if ( StrFind( line, "\n" ) ) > > > { > > > line = StrLeft( line, StrLen( line ) - 1 ); > > > } > > > > > > ids += line; > > > ids += ","; > > > } > > > } > > > > > > _TRACE(ids); > > > return StrFind( ids, "," + id + "," ); > > > } > > > > > > Filter = IncludeIndustry( IndustryID() ); > > > > > > AddColumn( IndustryID(), "Industry" ); > > > > > > > > > A couple of additional notes on your last submission: > > > > > > * Your usage of Match = IIf(RID > 0,1,0); is redundent. Filter will > > > accept any non zero value. Just set Filter = RID. Better yet, Filter = > > > IncludeIndustry(IndustryID()) as per the original code, unless you > > > specifically wanted to keep the return value for something. Either way, > > > get rid of Match. > > > * Try to avoid calling the same function repeatedly. You've already > > > stored the value of IndustryID() in IID, so just use IID from that point > > > on instead of calling IndustryID() again. > > > * Your assumption that ever line in the file will end with a "\n" is > > > false. The last line might not. > > > * ids is declared as local in the function, therefore it is not > > > available to your trace statements in the main script. The IDS > > > declaration that you added above the function is not the same variable > > > as what is used inside the function. > > > > > > Just for kicks, if you wanted to only ever run the file reading once per > > > AmiBroker session, you could use a static variable to hang on to the > > > values read and skip the redundent reading on any subsequent calls. This > > > would not be a good idea if you plan to modify the .csv file while > > > AmiBroker is still running. But, it will speed up your exploration if > > > you don't plan to change the .csv file. > > > > > > function GetIndustries() > > > { > > > local ids; > > > local fh; > > > local line; > > > > > > ids = StaticVarGetText( "StaticIDs" ); > > > > > > if ( StrLen( ids ) == 0 ) > > > { > > > _TRACE( "Inside static block" ); > > > fh = fopen( "C:\\temp\\filter.csv", "r" ); > > > > > > if ( fh ) > > > { > > > ids = ","; > > > > > > while ( !feof( fh ) ) > > > { > > > line = fgets( fh ); > > > > > > if ( StrFind( line, "\n" ) ) > > > { > > > line = StrLeft( line, StrLen( line ) - 1 ); > > > } > > > > > > ids += line; > > > ids += ","; > > > } > > > } > > > > > > StaticVarSetText( "StaticIDs", ids ); > > > } > > > > > > return ids; > > > } > > > > > > function IncludeIndustry( id ) > > > { > > > return StrFind( GetIndustries(), "," + id + "," ); > > > } > > > > > > Filter = IncludeIndustry( IndustryID() ); > > > > > > AddColumn( IndustryID(), "Industry" ); > > > > > > Mike > > > > > > > > > --- In [email protected], "gmorlosky" <gmorlosky@> wrote: > > > > > > > > One slight edit. In the following line I needed to change the "," to > > > "\n", else a ,1 is equal to ,10 or ,100. working Great > > > > > > > > return StrFind( ids, "," + id + "\n," ); > > > > > > > > > > > > [email protected], "gmorlosky" gmorlosky@ wrote: > > > > > > > > > > Hi Mike; > > > > > I figured it out, THANKS to all your help. The creation of the ids > > > file has a format that includes an end of line on each line and it is > > > counted as a position, SO if I expect token 4 it is actually finding 13 > > > as the position, when I reset the StrFind code to not include the last > > > ",", because that found nothing. Therfore I coded the filter for > 0 > > > (meaning the number was found), then it works > > > > > > > > > > return StrFind( ids, "," + id /* + "," */ ); // removed last comma > > > > > ,0 // 0,1,2 > > > > > ,1 // 3,4,5 > > > > > ,2 // 6,7,8 > > > > > ,3 // 9,10,11 > > > > > ,4 // 12,13 > > > > > > > > > > I then tested against the following and it worked great. > > > > > ,0 > > > > > ,2 > > > > > ,20 > > > > > ,200 > > > > > > > > > > Below is the working code: > > > > > > > > > > _SECTION_BEGIN("ReadingCSV Function"); > > > > > Title = "ReadingCSV Function"; > > > > > IndID = 0; > > > > > IID = 0; > > > > > ids = ""; > > > > > function IncludeIndustry( id ) > > > > > { > > > > > local ids; > > > > > local fh; > > > > > ids = ","; > > > > > fh = fopen( "C:\\AmiBroker CSV\\ABTest.csv", "r" ); > > > > > if ( fh ) > > > > > { > > > > > while ( !feof( fh ) ) > > > > > { > > > > > ids += fgets( fh ); > > > > > ids += ","; > > > > > } > > > > > fclose( fh ); > > > > > printf( ids ); > > > > > } > > > > > // return StrFind( "," + id + "," , ids); // original code > > > > > return StrFind( ids, "," + id /* + "," */ ); > > > > > } > > > > > //Filter = IncludeIndustry( IndustryID() ); // original code > > > > > IID = IndustryID(); > > > > > RID = IncludeIndustry( IndustryID() ); > > > > > Match = IIf(RID > 0,1,0); > > > > > Filter = Match; > > > > > Check = IndustryID() == RID; > > > > > Buy = Close >= 0; > > > > > Sell = Close == 0; > > > > > AddColumn ( Buy,"Buy" ); > > > > > AddColumn ( Sell,"Sell" ); > > > > > AddColumn ( Close,"Close" ); > > > > > AddTextColumn( FullName(),"FullName" ); > > > > > AddColumn( IndustryID(), "IndId" ); > > > > > AddColumn( Check, "Check" ); > > > > > _TRACE ("IID: "+ IID +" RID: "+ RID +" IDS: "+ IDS+" Match: "+ > > > Match); > > > > > _SECTION_END(); > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --- In [email protected], "gmorlosky" <gmorlosky@> wrote: > > > > > > > > > > > > I started using _TRACE and find that the only number that comes > > > back from "IndustryID() == IncludeIndustry( IndustryID() )" is 0, > > > therefore IndustryID == 0 works, but all others fail. > > > > > > Wondering if the problem is with the format of the created IDs > > > file or the read of the IDs file ??? > > > > > > > > > > > > Any thoughts > > > > > > > > > > > > --- In [email protected], "gmorlosky" <gmorlosky@> wrote: > > > > > > > > > > > > > > Here is the latest code, but it still is displaying in an > > > Explore only IndustryID() == 0. > > > > > > > I did make 2 changes to the code: > > > > > > > 1) flipped the StrFind parameters > > > > > > > 2) expanded the Filter to include IndustryID() == > > > > > > > 3) Commentary display of printf(ID) looks like this: > > > > > > > > > > > > > > ,,0 > > > > > > > ,1 > > > > > > > ,2 > > > > > > > ,3 > > > > > > > ,4 > > > > > > > ,5 > > > > > > > ,6 > > > > > > > ,7 > > > > > > > ,8 > > > > > > > ,9 > > > > > > > ,10 > > > > > > > ,, > > > > > > > > > > > > > > > > > > > > > > > > > > > > _SECTION_BEGIN("ReadingCSV Function"); > > > > > > > Title = "ReadingCSV Function"; > > > > > > > id = 0; > > > > > > > function IncludeIndustry( id ) > > > > > > > { > > > > > > > local ids; > > > > > > > local fh; > > > > > > > > > > > > > > ids = ","; > > > > > > > fh = fopen( "C:\\AmiBroker CSV\\ABTest.csv", "r" ); > > > > > > > > > > > > > > if ( fh ) > > > > > > > { > > > > > > > while ( !feof( fh ) ) > > > > > > > { > > > > > > > ids += fgets( fh ); > > > > > > > ids += ","; > > > > > > > printf( ids ); > > > > > > > } > > > > > > > fclose( fh ); > > > > > > > } > > > > > > > // return StrFind( "," + id + "," , ids); // original code > > > > > > > return StrFind( ids, "," + id + "," ); > > > > > > > } > > > > > > > > > > > > > > //Filter = IncludeIndustry( IndustryID() ); // original code > > > > > > > Filter = IndustryID() == IncludeIndustry( IndustryID() ); > > > > > > > > > > > > > > Buy = Close >= 0; > > > > > > > Sell = Close == 0; > > > > > > > AddColumn ( Buy,"Buy" ); > > > > > > > AddColumn ( Sell,"Sell" ); > > > > > > > AddColumn ( Close,"Close" ); > > > > > > > AddTextColumn( FullName(),"FullName" ); > > > > > > > AddColumn( id, "Id" ); > > > > > > > _SECTION_END(); > > > > > > > > > > > > > > > > > > > > > > > > > > > >
