PureBytes Links
Trading Reference Links
|
The only problem with that theory being that AFL doesn't seem to
support the file rename function either...
--- In amibroker@xxxxxxxxxxxxxxx, "gp_sydney" <gp.investment@xxx> wrote:
>
> Ed,
>
> As Tomasz said, exposing fseek etc. in a DLL would be fairly easy, but
> using them can be difficult. Typically this would only be done with
> files that have fixed length records in them, which is rarely the case
> with any sort of text file.
>
> One thing to be wary of with Tomasz's code is that the moment you open
> the file for write with the same filename, you've deleted your
> original file. If the writing doesn't complete successfully for any
> reason, you've lost the file. That's why I prefer writing to a
> temporary file and only deleting and renaming once the file has been
> successfully written. Even if the rename fails, the temporary file
> will still be sitting there. Otherwise you need to make sure you
> always keep a recent backup of the file (which of course is a good
> idea anyway).
>
> Regards,
> GP
>
>
> --- In amibroker@xxxxxxxxxxxxxxx, "Edward Pottasch" <empottasch@>
> wrote:
> >
> > great idea. Didn't think of that. Thanks a lot!
> >
> > regards, ed
> >
> >
> >
> >
> > ----- Original Message -----
> > From: Tomasz Janeczko
> > To: amibroker@xxxxxxxxxxxxxxx
> > Sent: Sunday, July 22, 2007 8:03 PM
> > Subject: Re: [amibroker] Re: fopen
> >
> >
> >
> > Hello,
> >
> >
> > >I thought of StrReplace also. You can read a single line from a
> file, save it in a string array, replace a certain part in this
> string, but then you will not be able to put it back to the same
> file. At >least I do not know how to do it in AFL. Indeed this
> can be used if you write it to another file using AFL only.
> >
> > This part is easy.
> > fgets - this function reads entire LINE into string variable. You
> can read all lines using simple while loop and feof()
> >
> > fh = fopen("filename", "r" );
> >
> > line = 0;
> > while( ! feof( fh ) )
> > {
> > VarSetText("line"+(line++), fgets( fh ));
> > }
> >
> > fclose( fh );
> >
> > // now you have all lines in lineNNN variables
> > /// manipulate them here and then write to the SAME file
> >
> > fh = fopen("filename", "w" );
> >
> > for( i = 0; i < line; i++ )
> > {
> > fputs( VarGetText("line"+i, fh );
> > }
> >
> > fclose( fh );
> >
> > Best regards,
> > Tomasz Janeczko
> > amibroker.com
> > ----- Original Message -----
> > From: Edward Pottasch
> > To: amibroker@xxxxxxxxxxxxxxx
> > Sent: Sunday, July 22, 2007 7:54 PM
> > Subject: Re: [amibroker] Re: fopen
> >
> >
> > using "r+" works but it is not that simple. It works as in C and
> I believe opening a file with "r+" is a pointer and in C you need
> certain functions to work with them (fseek, rewind .... i believe).
> As far as I understand now it can be done but not in AFL alone.
> >
> > I thought of StrReplace also. You can read a single line from a
> file, save it in a string array, replace a certain part in this
> string, but then you will not be able to put it back to the same
> file. At least I do not know how to do it in AFL. Indeed this can
> be used if you write it to another file using AFL only.
> >
> > regards, Ed
> >
> >
> >
> >
> > ----- Original Message -----
> > From: dingo
> > To: amibroker@xxxxxxxxxxxxxxx
> > Sent: Sunday, July 22, 2007 7:24 PM
> > Subject: RE: [amibroker] Re: fopen
> >
> >
> >
> > If the r+ thingy handles the rewrite of a different sized file
> then you can do it without 2 files.
> >
> > Also, you can simplify the whole thing by looking at the
> string functions in AFL: StrReplace, etc.
> >
> > d
> >
> >
> >
> >
------------------------------------------------------------------------
> > From: amibroker@xxxxxxxxxxxxxxx
> [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf Of Edward Pottasch
> > Sent: Sunday, July 22, 2007 1:16 PM
> > To: amibroker@xxxxxxxxxxxxxxx
> > Subject: Re: [amibroker] Re: fopen
> >
> >
> > hi Ara,
> >
> > I asked for this functionality in the feedback centre and
> get a reply that this functionality exists. Indeed "r+" seems to be
> working. However I am not sure if it can be solved in AFL entirely or
> that one needs to write a dll for it, or some script. I focus on AFL
> so I guess I will need to write the adjusted file to a new filename ...
> >
> > Also I guess it would not be so hard to write a function in
> C++ that replaces some text in the form of a dll, nice would be to
> solve it in AFL.
> >
> > regards, ed
> >
> >
> >
> >
> > ----- Original Message -----
> > From: Ara Kaloustian
> > To: amibroker@xxxxxxxxxxxxxxx
> > Sent: Sunday, July 22, 2007 7:00 PM
> > Subject: Re: [amibroker] Re: fopen
> >
> >
> >
> > Ed,
> >
> > I beleive for a text file, only way to handle it is to
> read the file (line by line), make the chages you want and create a
> second file with the modifications.The delete original file.
> > ----- Original Message -----
> > From: Edward Pottasch
> > To: amibroker@xxxxxxxxxxxxxxx
> > Sent: Sunday, July 22, 2007 7:59 AM
> > Subject: Re: [amibroker] Re: fopen
> >
> >
> > hi GP,
> >
> > yes I thought of that as well and this is easy to
> implement however since it seems possible to use
> >
> > // open file
> > fh = fopen(basketName, "r+");
> >
> > I was hoping someone would know how. My AFL routine
> compares the real number of shares in my portfolio with the number of
> shares in my basket file. I want to adjust the numbers in the
> basketfile which is usually a small correction.
> >
> > Would you know how to do such a thing in AFL? Does AFL
> also work with pointers?
> >
> > thanks, Ed
> >
> >
> >
> >
> > ----- Original Message -----
> > From: gp_sydney
> > To: amibroker@xxxxxxxxxxxxxxx
> > Sent: Sunday, July 22, 2007 4:43 PM
> > Subject: [amibroker] Re: fopen
> >
> >
> > Ed,
> >
> > Using fseek etc. to randomly access a file is only
> useful if the data
> > size stays exactly the same. For example, if you
> wanted to replace 247
> > with 2947 you'd have a problem because the replacement
> is longer,
> > which means the rest of the file would need to all be
> moved down a
> > character.
> >
> > The more common way to handle this is to effectively
> copy the file to
> > a new one and replace the values you want as you go.
> That way the two
> > files can end up different lengths.
> >
> > The way I'd typically do it would be:
> >
> > - Open the existing file with read access.
> > - Create a new temporary file with write access.
> > - Read from the existing and write to the new with
> your modifications.
> > - Close both files.
> >
> > If all that goes smoothly, then:
> >
> > - Delete the original file.
> > - Rename the temporary file to the name of the
> original one.
> >
> > For temporary files, I usually pick something like
> $$MyTemp.$$$ as a
> > filename to minimise the risk that the file might
> exist already with
> > something else in it, otherwise it would get deleted.
> If you're really
> > concerned about that, you can test for it by trying to
> open the file
> > first with read-only access. If the open fails, then
> you know the file
> > doesn't exist. If the open is successful though, then
> it does (and
> > should be closed again). Of course it could just be an
> unwanted
> > temporary file from a previous pass that never got
> deleted for some
> > reason, which is why I generally just pick a highly
> unlikely name and
> > don't even bother testing if it exists already.
> >
> > Regards,
> > GP
> >
> > --- In amibroker@xxxxxxxxxxxxxxx, "Edward Pottasch"
> <empottasch@>
> > wrote:
> > >
> > > hi,
> > >
> > > I want to replace numbers inside a file. For
> instance if I have a
> > text file containing the lines:
> > >
> > > SELL, 247, JNS, STK, SMART, LMT, 32.05, 3,
> > > SELL, 244, SIGM, STK, SMART, LMT, 34.15, 3,
> > >
> > > I want to replace 247 with 248 and 244 with 245.
> > >
> > > According to my latest information this should be
> possible in
> > Amibroker using fh = fopen(basketName, "r+");
> > >
> > > The C runtime library mode "r+"
> > >
> > > I have been looking for examples how to do such a
> think in C. It
> > seems that I will need additional functions like
> rewind, fseek etc
> > which do not seem available in AFL. I haven't got a
> clue but it
> > should be possible in AFL as well. Anyone with
> experience in C would
> > know how to do this?
> > >
> > > Below some code that reads a file containing the
> lines I want to
> > replace. Now I need additional code that does the
> actual replacement.
> > >
> > > thanks, Ed
> > >
> > >
> > >
> > >
> > > basketName = "C:\\tt.txt";
> > >
> > >
> > > // open file
> > > fh = fopen(basketName, "r+");
> > >
> > > if(fh) {
> > >
> > > while( !feof(fh )) {
> > >
> > > // format basket line: SELL, 100, CHRW, STK,
SMART, LMT,
> > 52.44, 1,
> > > ss = fgets(fh);
> > >
> > > // string length
> > > sl = StrLen(ss);
> > > // storage array
> > > strpos = 0;
> > >
> > > cnt = 0;
> > > for (i=0; i<sl; i++) {
> > >
> > > if (StrMid(ss,i,1) == ",") {
> > >
> > > strpos[ cnt ] = i;
> > > cnt = cnt + 1;
> > >
> > > }
> > >
> > > }
> > >
> > > // check if we did read a blank line
> > > if (cnt > 0) {
> > >
> > > // extract action (BUY or SELL)
> > > sp1 = strpos[ 0 ];
> > > actn = StrMid(ss,0,sp1);
> > >
> > > // extract number of shares
> > > sp2 = strpos[ 1 ];
> > > nos = StrMid(ss,sp1 + 2, sp2 - sp1 - 2); nos =
> StrToNum(nos);
> > >
> > > // extract ticker, e.g. CHRW
> > > sp3 = strpos[ 2 ];
> > > tckr = StrMid(ss,sp2 + 2,sp3 - sp2 - 2);
> > >
> > > // extract limit price
> > > sp6 = strpos[ 5 ];
> > > sp7 = strpos[ 6 ];
> > > lprc = StrMid(ss,sp6 + 2,sp7 - sp6 - 2); lprc =
> > StrToNum(lprc);
> > >
> > > // extract whether trade is (1) an entry order, (2)
> an exit
> > order, or (3) a profit stop order
> > > sp7 = strpos[ 6 ];
> > > sp8 = strpos[ 7 ];
> > > ee = StrMid(ss,sp7 + 2,sp8 - sp7 - 2); ee =
> StrToNum(ee);
> > >
> > >
> > >
> > > // construct new line
> > > newl = actn + ", " + nos + ", " + tckr + ", " + "STK,
> > SMART, LMT, " + ee + ",";
> > >
> > > }
> > >
> > > }
> > >
> > > fclose(fh);
> > >
> > > } else {
> > >
> > > printf("ERROR: file can not be found (does not
> exist)");
> > >
> > > }
> > >
> >
>
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
For other support material please check also:
http://www.amibroker.com/support.html
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/
|