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

[amibroker] Re: Multiple Stock charts...



PureBytes Links

Trading Reference Links

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, "Tomasz Janeczko" <groups@xxx> 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@xxx>
> To: <amibroker@xxxxxxxxxxxxxxx>
> 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/