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

[amibroker] Re: Multiple Stock charts...



PureBytes Links

Trading Reference Links

Hi Mark,

thanks again for your time and effort.

I had spent quite a bit of time going through the scripts you supplied
to understand the logic in them, and have made considerable progress
in that regard.

Just didn't know why there were no trades executed. From your
explanation, it is obvious that I have been stuggling to get my head
around the way Amibroker works... now it makes sense.

All a learning curve...

Cheers,

George.

--- In amibroker@xxxxxxxxxxxxxxx, "Mark Jarvis" <jarvis.spam@xxx> wrote:
>
> Hi Gpzany,
> 
> The script is mine.   To run it on multiple symbols you simply
'scan' every
> XX period via Automatic Analysis.  To restrict the stocks to the Final
> Universe, you keep them in a watchlist.  From memory, the script
points to
> watchlist (1).
> 
> However, as I have stated repeatedly, if you are not 100% clear on
what the
> formula does, please don't run it.  Auto-trading on a script you are not
> clear on is a fast way to lose money.
> 
> Regards,
> 
> Mark
> 
> On 7/24/07, gpzany13 <gpzany13@xxx> wrote:
> >
> >   Hello Tomasz,
> >
> > Thanks for the reply...
> >
> > You are correct. I am no expert or a programmer... the script was
> > posted freely on a forum by a generous chap for others to use, and I
> > have had alot of trouble working out the right way to run the script
> > on multiple symbols in real time simultaneously.
> >
> > Here is the script:
> >
> > =====================================================================
> >
> > SetBarsRequired(100000,100000);
> > SetChartOptions(0,chartShowArrows|chartShowDates);
> > _N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g,
> > Lo %g, Close %g (%.1f%%)\n {{VALUES}}", O, H, L, C, SelectedValue(
> > ROC( C, 1 ) ) ));
> > Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle |
> > ParamStyle("Style") | GetPriceStyle() );
> >
> > TimeFrameSet(inDaily);
> > DU1 = EMA(V,30) - 3 * EMA(V,5) > 0 AND EMA(V,5) > 0;
> > DU2 = EMA(V,30) > 2 * Ref(EMA(V,3),-6) AND EMA(V,30) > 2 * EMA(V,3)
> > AND Ref(EMA(V,3),-3) - EMA(V,3) > 0;
> > DU3 = EMA(V,30) > 2 * Ref(EMA(V,6),-3) AND EMA(V,30) > 2 * EMA(V,3)
> > AND Ref(EMA(V,6),-3) - EMA(V,3) > 0;
> > DU4 = V < 0.5* EMA(V,65);
> >
> > //Dry Up Calculations
> > LowV = LLV(V,21);
> > MDU1 = ValueWhen(Month()!=Ref(Month(),-1),Ref(LowV,-1),1);
> > MDU2 = ValueWhen(Month()!=Ref(Month(),-1),Ref(LowV,-1),2);
> > MDU3 = ValueWhen(Month()!=Ref(Month(),-1),Ref(LowV,-1),3);
> > AvgDU = (MDU1 + MDU2 + MDU3)/3;
> > "AvgDU = " + AvgDU;
> > DUBand = AvgDU * (4986/10000);
> > "DUBand = " + DUBand;
> > DU5 = V < AvgDU + DUBand;
> > LBDU = AvgDU - DUBand;
> > "LBDU = " + LBDU;
> > FRV = 3 * AvgDU;
> > FRV1 = EMA(V,5) - EMA(V,30) > 100000;
> > "FRV1 = " + WriteVal(EMA(V,5) - EMA(V,30),1) + " > 100,000";
> > EMAV65 = EMA(V,65);
> > DV=V;
> > DryUp = (du1 OR DU2 OR DU3 OR DU4 OR du5);
> > TimeFrameRestore();
> > IDU1 = TimeFrameExpand(DU1,inDaily,expandFirst);
> > IDU2 = TimeFrameExpand(DU2,inDaily,expandFirst);
> > IDU3 = TimeFrameExpand(DU3,inDaily,expandFirst);
> > IDU4 = TimeFrameExpand(DU4,inDaily,expandFirst);
> > IDU5 = TimeFrameExpand(DU5,inDaily,expandFirst);
> > DailyEMAV65 = TimeFrameExpand(EMAV65,inDaily,expandFirst);
> > DayVol = TimeFrameExpand(DV,inDaily,expandFirst);
> > InDryUp = TimeFrameExpand(DryUp,inDaily,expandFirst);
> > DryUpSignal = TimeFrameExpand(Ref(DryUp,-1),inDaily,expandFirst);
> > PrevLBDU = TimeFrameExpand(Ref(LBDU,-1),inDaily,expandFirst);
> > DryUpVolume = TimeFrameExpand(AvgDU,inDaily,expandFirst);
> > FRV = 3 * DryUpVolume * 0.95;
> > PeakV = (6 * DryUpVolume);
> >
> > //Exit conditions:
> > //Gainers Over Yesterday Between 5% AND 10% Inc.
> > //((C - C1) / C1) * 100 > 5 AND ((C - C1) / C1) * 100 < 10
> > //Gainers Over Yesterday Greater than 10%
> > //((C - C1) / C1) * 100 > 10
> >
> > //Stage 1 OR Stage 3
> > //(H30 < 1.1 * L5) AND (H5 < 1.1 * L30)
> >
> > //Stage 2 OR Stage 4
> > //((MAXC126 - MINC126) / MINC126) * 100
> >
> > //Gappers
> > //L > H1 OR H < L1 AND V > 1000 OR (C * V) > 2500
> >
> > //- - - - - - - - - - - - - - /- - - - - - - - - - - - - - /- - - - -
> > - - - - - - - - - /- - - - - - - - - - - - - -
> >
> > Scan = Status("action") == 3; //Tests whether formula is being used
> > for a scan
> > IDStochThreshold = Param("Intraday Stochastic Threshold",80,1,100,1);
> > IDMACDThreshold = Param("Intraday MACDThreshold",0,-5,5,0.1);
> > StopLoss = Param("Stop Loss",2,0.5,20,0.5)/100; //Trade stop loss
> > percentage
> > ProfitTarget = Param("Profit Target",10,1,50,1)/100; //Trade
> > profit target
> > Gapsize = Param("Gap Size", 5,1,20,1)/100;
> > //Compress bars to create 30 min stochastic and MACD.
> > TimeFrameSet(in15Minute*2);
> > r1 = Param( "Fast avg", 5, 2, 200, 1 );
> > r2 = Param( "Slow avg", 13, 2, 200, 1 );
> > r3 = Param( "Signal avg", 6, 2, 200, 1 );
> > ml = MACD(r1, r2);
> > sl = Signal(r1,r2,r3);
> > mh=ml-sl;
> >
> > periods = Param( "Periods", 15, 1, 200, 1 );
> > Ksmooth = Param( "%K avg", 3, 1, 200, 1 );
> > HS = StochK( periods , Ksmooth);
> > TimeFrameRestore();
> >
> > //Bring them down to current timeframe
> > IDStoch = TimeFrameExpand(HS,in15Minute*2,expandFirst);
> > IDMACD = TimeFrameExpand(MH,in15Minute*2,expandFirst);
> >
> > //Cumulative Volume Calculations
> > D = Day();
> > CV[0]=V[0];
> > for(i=1;i<BarCount;i++)
> > {if(D[i] == D[i-1])
> > {CV[i]=V[i]+CV[i-1];
> > }
> > else
> > {CV[i]=V[i];
> > }
> > }
> > FRVPercent = Param("FRVPercent",200,1,500,5)/100;
> >
> > //The following items are treated as static variables so I can pass
> > them automatically to my cumulative volume indicator
> > //StaticVarSet("PrevLBDU",PrevLBDU); //What percentage of dry up
> > volume is treated as a buy signal?
> > StaticVarSet("VolTime",ParamTime("Time to Volume Breakout","11:00"));
> > //Before what time must DU Volume be exceeded?
> >
> > TodaysOpen = TimeFrameGetPrice("O",inDaily,0,expandFirst);
> > PrevDayClose = TimeFrameGetPrice("C",inDaily,-1);
> > NoGap = abs((TodaysOpen-PrevDayClose)/PrevDayClose) <= GapSize;
> >
> > VolTime = StaticVarGet("VolTime");
> > DUVolExceeded = (TimeNum() <= VolTime AND CV > PrevLBDU);
> >
> > //Code below records when all buy triggers are satisfied
> > PurchTrigger = DryupSignal AND NOGAP AND DUVolExceeded AND IDStoch >
> > IDStochThreshold AND IDMACD > IDMACDThreshold AND C >
> > TimeFrameGetPrice("C",inDaily,-1);
> > TriggerExecuted = Flip(PurchTrigger,Day()!=Ref(Day(),-1)); //Set a
> > flag when purchase occurs, to allow for buyprice, etc. to be plotted
> > on price window.
> > FRVReached = CV>=FRV;
> >
> > //Hold the buy prices, etc so we can plot them. Assume that C is the
> > buy price(indicator only)
> > BPrice = IIf(TriggerExecuted,ValueWhen(PurchTrigger AND NOT
> > Ref(PurchTrigger,-1),C),Null);
> > SLoss = IIf(TriggerExecuted,ValueWhen(PurchTrigger AND NOT
> > Ref(PurchTrigger,-1),C*(1-StopLoss)),Null);
> > PTarget = IIf(TriggerExecuted,ValueWhen(PurchTrigger AND NOT
> > Ref(PurchTrigger,-1),C*(1+ProfitTarget)),Null);
> >
> > //--PLOT STATEMENTS FOR PRICE CHART ONLY--
> > _N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g,
> > Lo %g, Close %g (%.1f%%)\n {{VALUES}}", O, H, L, C, SelectedValue(
> > ROC( C, 1 ) ) ));
> > Plot( C, "Close", IIf(Purchtrigger AND NOT
> > Ref(PurchTrigger,-1),colorYellow,IIf(C>O,colorGreen,colorRed)),
> > styleNoTitle|ParamStyle("Style") | GetPriceStyle() );
> >
> > //Next few lines are for plotting text.
> > dist = 1*ATR(1);
> > for(i=1;i<BarCount;i++)
> > {
> > if( Purchtrigger[i] AND NOT Purchtrigger[i-1] ) PlotText( "Buy\n" +
> > "Stoch: " + Prec(IDStoch[i],1) + "\nMACD: " + Prec(IDMACD[i],2) +
> > "\nPT: " + C[i]*1.1, i, L[ i ]-dist[i], colorYellow);
> > }
> >
> > //Misc plots in price window
> > Plot(NoGap,"NOGAP",colorYellow,styleNoDraw|styleNoRescale);
> > Plot(Day()!=Ref(Day(),-1),"",colorWhite,styleOwnScale|styleHistogram);
> >
Plot(PurchTrigger,"PurchTrigger",colorYellow,styleNoDraw|styleNoRescale);
> > Plot(IDStoch > IDStochThreshold
> > ,"IDStoch",colorYellow,styleNoDraw|styleNoRescale);
> > Plot(IDMACD >
> > IDMACDThreshold,"IDMACD",colorYellow,styleNoDraw|styleNoRescale);
> > Plot(DUVolExceeded ,"DUVE",colorYellow,styleNoDraw|styleNoRescale);
> > Plot(C >
> >
> >
TimeFrameGetPrice("C",inDaily,-1),"C>C",colorYellow,styleNoDraw|styleNoRescale);
> > Plot(Day()!=Ref(Day(),-1),"",colorWhite,styleOwnScale|styleHistogram);
> > Plot(BPrice,"Bprice",colorYellow,styleLine);
> > Plot(Sloss,"SLoss",colorRed,styleLine|styleDashed);
> >
> >
Plot(PTarget,"PTarget",colorBrightGreen,styleLine|styleDashed|styleNoRescale);
> >
> > Plot(CV,"CV",colorWhite,styleNoDraw|styleNoRescale);
> > Plot(PrevLBDU,"LBDU",colorYellow,styleNoDraw|styleNoRescale);
> > Plot(DryUpVolume,"AvgDU",colorPink,styleNoDraw|styleNoRescale);
> > Plot(FRV,"FRV",colorBrightGreen,styleNoDraw|styleNoRescale);
> > Plot(PeakV,"Peak",colorGold,styleNoDraw|styleNoRescale);
> >
> >
> >
Plot(DayVol,"DayVol",IIf(indryup,colorWhite,ColorRGB(218,200,220)),styleArea|styleThick|styleLeftAxisScale);
> >
Plot(IDU1,"DU1",colorWhite,styleNoDraw|styleNoRescale|styleLeftAxisScale);
> >
Plot(IDU2,"DU2",colorWhite,styleNoDraw|styleNoRescale|styleLeftAxisScale);
> >
Plot(IDU3,"DU3",colorWhite,styleNoDraw|styleNoRescale|styleLeftAxisScale);
> >
Plot(IDU4,"DU4",colorWhite,styleNoDraw|styleNoRescale|styleLeftAxisScale);
> >
Plot(IDU5,"DU5",colorWhite,styleNoDraw|styleNoRescale|styleLeftAxisScale);
> >
> >
Plot(DailyEMAV65,"EMAV65",colorPink,styleLine|styleThick|styleLeftAxisScale);
> >
> > //Test outputs to Interpretation Window
> >
> > //AUTO TRADE
> > PortfolioRiskPercent = Param("Portfolio Risk
> > Percent",0.015,0.001,0.1,0.001);
> > AutoTradeOn = ParamToggle("Auto Trade","OFF|ON"); //Only autotrade
> > when this is active. Safeguard. Off by default.
> > MaxDailyTrades = Param("Max Daily Trades",3,0,10,1);
> >
> > OrdersPlaced = StaticVarGet("OrdersPlaced");
> > if(IsEmpty(StaticVarGet("OrdersPlaced")))
> > {StaticVarSet("OrdersPlaced",0);
> > }
> >
> > Ask_Price = GetRTData("Ask");
> > Bid_Price = GetRTData("Bid");
> > Last_Price = GetRTData("Last");
> > "Last Price = " + Last_Price;
> > "Ask Price = " + Ask_Price;
> > "Bid Price = " + Bid_Price;
> > Spread = Ask_Price - Bid_Price;
> > "Spread = " + Spread;
> > SpreadPercent = Prec((Spread / Bid_Price)*100,2);
> > "Spread Percent = " + SpreadPercent + "%";
> >
> > TestBuy = ParamTrigger("Test Order", "Execute"); //This is a one
> > shot test code. If I want to test a bit of the autotrading code, I
> > stick testbuy in as the
> > //'if' value and then can activate the code by pressing
> > 'execute' in the parameters dialog box.
> > //When autotrading, need to use lastvalue (which is a number), as
> > arrays don't work. Also stops old values triggering buys.
> > intrades = InWatchList(8); //Is the stock in the watchlist
> > where tickers with executed trades are placed.
> > Buy= (purchtrigger AND scan AND NOT intrades);
> >
> > ibc = GetTradingInterface("IB");
> > BP = StrToNum(ibc.getaccountvalue("AvailableFunds"))*2;
> > AC = StrToNum(ibc.getaccountvalue("NetLiquidation")); //current equity
> >
> > Risk = ac* PortfolioRiskPercent;
> > PurchasingPower = (StrToNum(ibc.getaccountvalue("RegTEquity")) -
> > StrToNum(ibc.getaccountvalue("RegTMargin")))*1.8;
> > orderid = ""; //Clear order id in case orders have been previously
> > submitted.
> > NumShares = Risk/(C*StopLoss);
> > PositionSize = C*NumShares;
> > NumLots = LastValue(IIf(PositionSize < PurchasingPower, Numshares -
> > NumShares%100,(PurchasingPower/C)-(PurchasingPower/C)%100));
> > StopLossShares = Ask_Price*(1-StopLoss);
> > ProfitTargetShares = Ask_Price*(1+ProfitTarget);
> > "Is Connected = " + ibc.isconnected;
> > "Buying Power = " + BP;
> > "PurchasingPower = " + PurchasingPower;
> > "Risk = " + Risk;
> > "Account Balance = " + AC;
> > "Name = " + Name();
> > "Current No. shares owned = " + ibc.getpositionsize(Name());
> > "NumShares = " + NumShares;
> > "Raw Position Size = " + PositionSize;
> > "NumLots = " + NumLots;
> > "Position Size (in round lots) = " + Numlots * C;
> > if(AutoTradeOn)
> > {
> > if(ibc.getpositionsize(Name())==0 AND LastValue(Buy) AND
> > LastValue((Numlots*C) < PurchasingPower) AND LastValue(numlots) > 0
> > AND StaticVarGet("OrdersPlaced") <= MaxDailyTrades)
> > {orderid =
> > ibc.placeorder(Name(),"Buy",NumLots,"LMT",Ask_Price,0,"GTC",False);
> >
> > ibc.placeorder
> >
(Name(),"SELL",NumLots,"STP",0,StopLossShares,"GTC",False,100,"",OrderID);
> >
> > ibc.placeorder
> >
(Name(),"SELL",NumLots,"LMT",ProfitTargetShares,0,"GTC",True,100,"",OrderID);
> > if(StrToNum(ORderid) > 0)
> > {CategoryAddSymbol(Name(),categoryWatchlist,8);
> > StaticVarSet("OrdersPlaced",StaticVarGet("OrdersPlaced")+1);
> > //Remove the symbol so we don't get multiple buy orders.
> > }
> > }
> > }
> > "Orders Placed = " + StaticVarGet("OrdersPlaced");
> > Filter = InDryUp;
> > AddColumn(DayVOL,"Day Vol",1);
> > AddColumn(DailyEMAV65,"65 Day Avg",1);
> > AddColumn(IDU1,"DU1",1);
> > AddColumn(IDU2,"DU2",1);
> > AddColumn(IDU3,"DU3",1);
> > AddColumn(IDU4,"DU4",1);
> > AddColumn(IDU5,"DU5",1);
> >
> > ====================================================================
> >
> > Kind Regards,
> >
> > George.
> >
> > --- In amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>,
"Tomasz
> > Janeczko" <groups@> wrote:
> > >
> > > Hello,
> > >
> > > Your formula is probably written in wrong way (highly inefficient)
> > > Without showing it - no one is able to provide you any help.
> > >
> > > And no, you don't need several chart windows,
> > > you can use Foreign() function to access other symbols data.
> > > This is especially true for automated trading - you should
> > > NOT have more than one automatic trading formula running at the same
> > > time unless you are true EXPERT in programming, because
> > > having two or more automatic trading formulas running at the same
> > > time requires lots of bookkeeping, synchronization, etc, etc.
> > >
> > > Since you are asking such a basic question - it is pretty clear
> > > that you are not expert and you should rather develop your system
> > > in very small steps.
> > >
> > > Best regards,
> > > Tomasz Janeczko
> > > amibroker.com
> > > ----- Original Message -----
> > > From: "gpzany13" <gpzany13@>
> > > To: <amibroker@xxxxxxxxxxxxxxx <amibroker%40yahoogroups.com>>
> > > Sent: Saturday, July 21, 2007 2:08 AM
> > > Subject: [amibroker] Multiple Stock charts...
> > >
> > >
> > > > Hi everyone,
> > > >
> > > > I am trying to run an afl script on one minute candle charts for
> > > > approximately 15 stock symbols.
> > > >
> > > > Originally, I had the symbols in a watch list, but if I am
correct,
> > > > only the active symbol in the chart window has the afl script
active
> > > > to autoexecute signals into IBcontroller...
> > > >
> > > > So I opened a blank chart per symbol, and CPU usage went +60%
peaking
> > > > regularly at +90%, with Amibroker seriously slowing down...
> > > >
> > > > Is there a way I can have my script running in real time on
multiple
> > > > symbols, executing trades without having that many chart
windows open?
> > > > Or is there another way of doing this...
> > > >
> > > > Thanks in advance,
> > > >
> > > > George.
> > > >
> > > >
> > > >
> > > > 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
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> >
> >  
> >
>



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/