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

[amibroker] Re: Trying to isolate Buy occurences in order to dump data to file



PureBytes Links

Trading Reference Links

The change you suggest makes sense to me. However, my profitdump text file only receives a single value, in a backtest that generates 100 Buy/Sells. And that value is not even one of the profit targets, which is really strange.

The file receives "0.002".

If you run a quick backtest on this code, do you get correct results in the text file? 

I'm testing Forex, but I suppose it would work on any symbol with minor mods.


--- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@xxx> wrote:
>
> Change:
> LastProfitTarget = LastValue( ValueWhen( Buy, ProfitTarget ) );
> 
> To:
> LastProfitTarget = LastValue( ValueWhen( Buy, ProfitStop ) );
> 
> The idea is that the ProfitStop array is now holding the applicable  ProfitTarget scaler for each bar. Whereas ProfitTarget is left holding only the value of Profit6.
> 
> Note also that your loop condition needs to be (...; i <= 6; ...) else the 6th condition will not be checked.
> 
> Mike
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@> wrote:
> >
> > Mike,
> > 
> > Thanks, as always, for your input.
> > 
> > One of my dynamic variables is an array. And the other, the profit
> > target, is a scalar.
> > 
> > I tried implementing your suggestions in my code, but am still having
> > some difficulty making it work. Below is a much simplified version of my
> > actual code, with the changes implemented. Hopefully you (or anyone)
> > might be able to spot my mistake. I'm sure it is something simple that I
> > am overlooking.
> > 
> > You can ignore the ProfitStop var and ApplyStops functions. Those are
> > just there to make the backtest functional for now.
> > 
> > The actual system is much more complex, but if I can get this simple one
> > working, I know I can get the bigger system working.
> > 
> > For now, I want to 'append' the ProfitDump.txt file, so I can ensure
> > that it is dumping all the profit targets to file.  Right now it's not
> > doing that - only dumping a single value, even though there are hundreds
> > of Buy/Sells in the backtest.
> > 
> > Once I am sure the dump is working correctly, then I will change
> > 'append' to 'write' to just keep the latest profit target in the file,
> > for Sell/Cover extraction of the live trading version.
> > 
> > Hopefully this code is not too difficult to follow:
> > 
> > 
> > 
> > // ----------------------------------------------------------- //
> > //     ADD THE CUSTOM COLUMN, "RANGE #" TO BACKTEST REPORT     //
> > // ----------------------------------------------------------- //
> > 
> > SetCustomBacktestProc( "" );
> > 
> > if ( Status( "action" ) == actionPortfolio )
> > {
> >    bo = GetBacktesterObject();
> > 
> >    bo.Backtest( 1 );
> > 
> >    for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())
> >    {
> >    trade.AddCustomMetric( "Range#", trade.Score );
> > 
> >    }
> > 
> >    bo.ListTrades();
> > }
> > 
> > 
> > // ----------------------------------------------------------- //
> > //                BEGIN TRADING SYSTEM FORMULA                 //
> > // ----------------------------------------------------------- //
> > 
> > TickSize         = 0.0001;
> > 
> > Buy              = Sell          = Short            = Cover  =
> > PositionScore    = ProfitTargets = LastProfitTarget = 0;
> > 
> > myMA1            = MA(O, 4);
> > 
> > 
> > // Set up Buying Ranges and Profit Targets
> > Range1          = O >= myMA1 + 0.0001 && O < myMA1 + 0.0002;
> > Profit1          =  5;
> > 
> > Range2          = O >= myMA1 + 0.0002 && O < myMA1 + 0.0003;
> > Profit2          = 10;
> > 
> > Range3          = O >= myMA1 + 0.0003 && O < myMA1 + 0.0004;
> > Profit3          = 15;
> > 
> > Range4          = O >= myMA1 + 0.0004 && O < myMA1 + 0.0005;
> > Profit4          = 20;
> > 
> > Range5          = O >= myMA1 + 0.0005 && O < myMA1 + 0.0006;
> > Profit5          = 25;
> > 
> > Range6          = O >= myMA1 + 0.0006;
> > Profit6          = 30;
> > 
> > 
> > ProfitTarget     = ProfitStop = Null;
> > 
> > 
> > // Enter a Long Position when a Range is True:
> > 
> > for(i=1; i < 6 + 1; ++i)
> > {
> > 
> > ProfitTarget    = VarGet( "Profit" + i);
> > 
> > TestLong        = VarGet( "Range"  + i );
> > 
> > Buy             = Buy || TestLong;
> > 
> > ProfitStop      = IIf(TestLong , ProfitTarget * TickSize, ProfitStop);
> > 
> > PositionScore   = IIf( TestLong, i, PositionScore );
> > 
> > }
> > 
> > LastProfitTarget = LastValue( ValueWhen( Buy, ProfitTarget ) );
> > 
> > 
> > if ( LastProfitTarget > 0 )
> > {
> >      // Dump ProfitTargets to file.
> >      fh = fopen( "F:\\ProfitDump.txt", "a" );
> > 
> >      if ( fh )
> >      {
> >          ProfitTargetStr = NumToStr( LastProfitTarget );
> >          fputs( ProfitTargetStr, fh );
> >      }
> > 
> >      fclose( fh );
> > }
> > 
> > 
> > ApplyStop( stopTypeProfit, stopModePoint, ProfitStop, 1, 0, 0 );
> > ApplyStop( stopTypeLoss, stopModePoint,   Stop,       1, 0, 0 );
> > 
> > 
> > 
> > 
> > 
> > --- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@> wrote:
> > >
> > >
> > > Ozzy,
> > >
> > > I assume that yoru dynamic variables are all arrays.
> > >
> > > I assume that you are re-running this every bar.
> > >
> > > I also assume that you can check for an existing buy in your exit
> > logic
> > > rather than depending on the presence or absence of a value in this
> > file
> > > (probably a good idea since you don't want to blindly sell without
> > > verifying that you *actually* have a position, regardless of what the
> > > file on disk says!).
> > >
> > > Given the above, you can just leave a running value in the file of the
> > > last target, regardless of when the last buy was, and regardless as to
> > > whether or not the position has already been closed.
> > >
> > > That being the case, try the following and see if it does the job.
> > >
> > > Mike
> > >
> > > Buy = Targets = 0;
> > >
> > > for ( i = 1; i <= 500; ++i )
> > > {
> > >      TestCondition = VarGet( "Condition"  + i );
> > >      Target = VarGet( "Profit" + i );
> > >
> > >      Buy |= ( TestCondition > 0 );
> > >      Targets += IIF( TestCondition, Target, 0 );
> > > }
> > >
> > > LastTarget = LastValue( ValueWhen( Buy, Targets ) );
> > >
> > > if ( LastTarget > 0 )
> > > {
> > >      // Dump the profit target of the most recent buy.
> > >      fh = fopen( "F:\\ProfitDump.txt", "w" );
> > >
> > >      if ( fh )
> > >      {
> > >          TargetStr = NumToStr( LastTarget );
> > >          fputs( TargetStr, fh );
> > >      }
> > >
> > >      fclose( fh );
> > > }
> > >
> > > --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" zoopfree@ wrote:
> > > >
> > > > Hello, hoping someone may be able to help out with this. I have a
> > > > trading system that cycles through a number of unique conditions, to
> > > > look for a Buy. Each condition also has a specific associated profit
> > > > target. I am trying to dump the true profit target to an external
> > > file,
> > > > any time there is a Buy. Right now I am using LastValue( ) to do
> > that,
> > > > and maybe that is where the problem lies - because it does not work.
> > > The
> > > > file is always empty.
> > > >
> > > > Below is a much simplified version. The part in red is where the
> > > problem
> > > > is. Right now I am using this in backtesting. And save for the Fput
> > > > subroutine, the system otherwise works fine. But in order to convert
> > > > this to a live auto trading system, I need to be able to isolate and
> > > > dump the correct Profit Target to file, so that I can pull it during
> > > the
> > > > subsequent exit subroutines.
> > > >
> > > > Any input much appreciated:
> > > >
> > > > // Enter a Long Position if any one of 500 Conditions are true.
> > > > // Conditions are generated from another algorithm. Only one
> > Condition
> > > > can
> > > > // be true on any bar. Each Condition has an associated Profit
> > Target.
> > > >
> > > > // Whenever we enter a Position, dump the ProfitTarget to file.
> > > >
> > > >
> > > > for(i=1; i < 500 + 1; ++i)
> > > > {
> > > >
> > > > TestCondition = VarGet( "Condition" + i );
> > > > Profit = VarGet( "Profit" + i );
> > > >
> > > > Buy = Buy || TestCondition;
> > > >
> > > > ProfitTarget = IIf(TestCondition , Profit, ProfitTarget);
> > > >
> > > > // if we bought, dump the profit target that we used, to file:
> > > >
> > > > if(LastValue(Buy) > 0)
> > > > {
> > > > ProfitNum = LastValue(ProfitTarget);
> > > >
> > > > ProfitStr = NumToStr(ProfitNum);
> > > >
> > > > fh = fopen( "F:\\ProfitDump.txt", "w");
> > > >
> > > > if( fh )
> > > > {
> > > > fputs( ProfitStr, fh );
> > > > }
> > > > fclose( fh );
> > > > }
> > > > }
> > > >
> > >
> >
>




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

**** 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/