[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Code needed - fopen fget - use csv file as input ?



PureBytes Links

Trading Reference Links

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 amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@xxx> 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 amibroker@xxxxxxxxxxxxxxx, "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 amibroker@xxxxxxxxxxxxxxx, "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," );
> > >
> > >
> > > amibroker@xxxxxxxxxxxxxxx, "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 amibroker@xxxxxxxxxxxxxxx, "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 amibroker@xxxxxxxxxxxxxxx, "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();
> > > > > >
> > > > >
> > > >
> > >
> >
>




------------------------------------

**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

TO GET TECHNICAL SUPPORT send an e-mail directly to 
SUPPORT {at} amibroker.com

TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/