Programmazione Prorealtime supertrend indicator (1 Viewer)

ender85

Forumer attivo
Pare che ci sia il "solito indiano" che l'ha codificato a modo per Amibroker.
http://www.marketcalls.in/amibroker/super-trend-intraday-afl-code-for-amibroker.html
"Why reinvent the wheel?"
:up:

Si è praticamente il mio codice e neanche lui è riuscito a farlo senza ciclo, questo mi consola :D

Cmq lo incollo per futura memoria:

Codice:
/* Done      by    Rajandran R */
/* Author of www.marketcalls.in  */

_SECTION_BEGIN("SuperTrend");
SetBarsRequired(100000,0);
GraphXSpace = 15;
SetChartOptions(0,chartShowArrows|chartShowDates);
SetChartBkColor(ParamColor("bkcolor",ColorRGB(0,0, 0)));
GfxSetBkMode(0); 
GfxSetOverlayMode(1);
SetBarFillColor(IIf(C>O,ParamColor("Candle UP Color", colorGreen),IIf(C<=O,ParamColor("Candle Down Color", colorRed),colorLightGrey)));
Plot(C,"\nPrice",IIf(C>O,ParamColor("Wick UP Color", colorDarkGreen),IIf(C<=O,ParamColor("Wick Down Color", colorDarkRed),colorLightGrey)),64,0,0,0,0);

SetTradeDelays(1,1,1,1);

_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));

Factor=Param("Factor",3,1,10,1);
Pd=Param("ATR Periods",10,1,100,1);
Up=(H+L)/2+(Factor*ATR(Pd));
Dn=(H+L)/2-(Factor*ATR(Pd));
iATR=ATR(Pd);
TrendUp=TrendDown=Null;
trend[0]=1;
changeOfTrend=0;
flag=flagh=0;

for (i = 1; i <BarCount; i++) {
      TrendUp[i] = Null;
      TrendDown[i] = Null;
     
      trend[i]=1;
   
      
      if (Close[i]>Up[i-1]) {
         trend[i]=1;
         if (trend[i-1] == -1) changeOfTrend = 1;
         
      }
      else if (Close[i]<Dn[i-1]) {
         trend[i]=-1;
         if (trend[i-1] == 1) changeOfTrend = 1;
      }
      else if (trend[i-1]==1) {
         trend[i]=1;
         changeOfTrend = 0;       
      }
      else if (trend[i-1]==-1) {
         trend[i]=-1;
         changeOfTrend = 0;
      }

      if (trend[i]<0 && trend[i-1]>0) {
         flag=1;
      }
      else {
         flag=0;
      }
      
      if (trend[i]>0 && trend[i-1]<0) {
         flagh=1;
      }
      else {
         flagh=0;
      }
      
      if (trend[i]>0 && Dn[i]<Dn[i-1]){
         Dn[i]=Dn[i-1];
		}
      
      if (trend[i]<0 && Up[i]>Up[i-1])
        { Up[i]=Up[i-1];
		}
      
      if (flag==1)
       {  Up[i]=(H[i]+L[i])/2+(Factor*iATR[i]);;
        } 
      if (flagh==1)
        { Dn[i]=(H[i]+L[i])/2-(Factor*iATR[i]);;
         }
      if (trend[i]==1) {
         TrendUp[i]=Dn[i];
         if (changeOfTrend == 1) {
            TrendUp[i-1] = TrendDown[i-1];
            changeOfTrend = 0;
         }
      }
      else if (trend[i]==-1) {
         TrendDown[i]=Up[i];
         if (changeOfTrend == 1) {
            TrendDown[i-1] = TrendUp[i-1];
            changeOfTrend = 0;
         }
      }
   } 

Plot(TrendUp,"Trend",colorGreen);
Plot(TrendDown,"Down",colorRed);

Buy = trend==1;
Sell=trend==-1;

Buy=ExRem(Buy,Sell);
Sell=ExRem(Sell,Buy);
Short=Sell;
Cover=Buy;


BuyPrice=ValueWhen(Buy,C);
SellPrice=ValueWhen(Sell,C);
ShortPrice=ValueWhen(Short,C);
CoverPrice=ValueWhen(Cover,C);


Title = EncodeColor(colorWhite)+ "Super Trend AFL code from www.marketcalls.in" + " - " +  Name() + " - " + EncodeColor(colorRed)+ Interval(2) + EncodeColor(colorWhite) +
 "  - " + Date() +" - "+"\n" +EncodeColor(colorRed) +"Op-"+O+"  "+"Hi-"+H+"  "+"Lo-"+L+"  "+
"Cl-"+C+"  "+ "Vol= "+ WriteVal(V)+"\n"+ 
EncodeColor(colorLime)+
WriteIf (Buy , " GO LONG / Reverse Signal at "+C+"  ","")+
WriteIf (Sell , " EXIT LONG / Reverse Signal at "+C+"  ","")+"\n"+EncodeColor(colorYellow)+
WriteIf(Sell , "Total Profit/Loss for the Last Trade Rs."+(C-BuyPrice)+"","")+
WriteIf(Buy  , "Total Profit/Loss for the Last trade Rs."+(SellPrice-C)+"","");

PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorGreen, 0, L, Offset=-40);
PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorLime, 0,L, Offset=-50);                      
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone),colorWhite, 0,L, Offset=-45); 
PlotShapes(IIf(Short, shapeSquare, shapeNone),colorRed, 0, H, Offset=40);
PlotShapes(IIf(Short, shapeSquare, shapeNone),colorOrange, 0,H, Offset=50);                      
PlotShapes(IIf(Short, shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45);

TrendSL=IIf(trend==1,TrendUp,TrendDown);

for(i=BarCount-1;i>1;i--)
{
if(Buy[i] == 1)
{
entry = C[i];
sig = "BUY";
sl = TrendSL[i];
tar1 = entry + (entry * .0050);
tar2 = entry + (entry * .0092);
tar3 = entry + (entry * .0179);
 
bars = i;
i = 0;
}
if(Sell[i] == 1)
{
sig = "SELL";
entry = C[i];
sl = TrendSL[i];
tar1 = entry - (entry * .0050);
tar2 = entry - (entry * .0112);
tar3 = entry - (entry * .0212);
 
 
bars = i;
i = 0;
}
}
Offset = 20;
Clr = IIf(sig == "BUY", colorLime, colorRed);
ssl = IIf(bars == BarCount-1, TrendSL[BarCount-1], Ref(TrendSL, -1));
sl = ssl[BarCount-1];
 

Plot(LineArray(bars-Offset, tar1, BarCount, tar1,1), "", Clr, styleLine|styleDots, Null, Null, Offset);
Plot(LineArray(bars-Offset, tar2, BarCount, tar2,1), "", Clr, styleLine|styleDots, Null, Null, Offset);
Plot(LineArray(bars-Offset, tar3, BarCount, tar3,1), "", Clr, styleLine|styleDots, Null, Null, Offset);

//Plot(LineArray(bars-Offset, sl, BarCount, sl,1), "", colorDarkRed, styleLine|styleLine, Null, Null, Offset);
//Plot(LineArray(bars-Offset, entry, BarCount, entry,1), "", colorGreen, styleLine|styleLine, Null, Null, Offset);
 
for (i=bars; i <BarCount;i++)
{
PlotText(""+sig+"@"+entry, BarCount+1,entry,Null,colorBlue);
PlotText("T1@"+tar1,BarCount+3,tar1,Null,Clr);PlotText("T2@"+tar2,BarCount+3,tar2,Null,Clr);PlotText ("T3@"+tar3,BarCount+3,tar3,Null,Clr);
 
}
 
messageboard = ParamToggle("Message Board","Show|Hide",1);
if (messageboard == 1 )
{
GfxSelectFont( "Tahoma", 13, 100 );
GfxSetBkMode( 1 );
GfxSetTextColor( colorWhite );
 
if ( sig =="BUY")
{
GfxSelectSolidBrush( colorBlue ); // this is the box background color
}
else
{
GfxSelectSolidBrush( colorRed ); // this is the box background color
}
pxHeight = Status( "pxchartheight" ) ;
xx = Status( "pxchartwidth");
Left = 1100;
width = 310;
x = 5;
x2 = 290;
 
y = pxHeight;
 
GfxSelectPen( colorGreen, 1); // broader color
GfxRoundRect( x, y - 98, x2, y , 7, 7 ) ;
GfxTextOut( ( "Marketcalls - Supertrend"),13,y-100);
GfxTextOut( (" "),27,y-100);
GfxTextOut( ("Last " + sig + " Signal came " + (BarCount-bars-1) * Interval()/60 + " mins ago"), 13, y-80) ; // The text format location
GfxTextOut( ("" + WriteIf(sig =="BUY",sig + " @ ",sig + " @") + " : " + entry), 13, y-60);
GfxTextOut( ("Trailing SL : " + TrendSL + " (" + WriteVal(IIf(sig == "SELL",entry-sl,sl-entry), 2.2) + ")"), 13, y-40);
/*GfxTextOut( ("TGT:1 : " + tar1), 13, y -80);
GfxTextOut( ("TGT:2 : " + tar2), 13,y-60);
GfxTextOut( ("TGT:3 : " + tar3), 13,y-40);*/
GfxTextOut( ("Current P/L : " + WriteVal(IIf(sig == "BUY",(C-entry),(entry-C)),2.2)), 13, y-22);;
 
}

_SECTION_END();
 

starless

Forumer attivo
qualcuno mi favorirebbe una spiegazione in ita(g)liano de sto supertrend, senza dovermi mettere a leggere il codice? guardando rapidamente sembra una specie di sar... come si userebbe? thx
 

ender85

Forumer attivo
qualcuno mi favorirebbe una spiegazione in ita(g)liano de sto supertrend, senza dovermi mettere a leggere il codice? guardando rapidamente sembra una specie di sar... come si userebbe? thx

Non è un indicatore che ti dice quando entrare, piuttosto se sei dentro e vuoi usare un trailing profit al posto di usare quello classico basato sui punti di ritracciamento fissi, con il supertrend i punti di ritracciamento sono scelti dalla volatilità misurata con l'atr.
Ogni altro utilizzo è sconsigliabile :up:
 

reef

...
Non è un indicatore che ti dice quando entrare, piuttosto se sei dentro e vuoi usare un trailing profit al posto di usare quello classico basato sui punti di ritracciamento fissi, con il supertrend i punti di ritracciamento sono scelti dalla volatilità misurata con l'atr.
Ogni altro utilizzo è sconsigliabile :up:

Regola che vale per tutti gli indicatori "stupidi" ;)
 
caro reef ho la versione 5.2 di amibroker e proprio non riesco a far girare la tua versione.Continua a darmi errori di sintassi.Come posso fare?
Sono un utilizzatore di metastock,ma da quando sto lavorando al supertrend ho scoperto che listati in linguaggio ms sono pochissimi e di scarso valore.
Dopo decine di verifiche il mio punto di partenza è la seguente versione del supertrend:
_SECTION_BEGIN("SuperTrend prova");
period = Param("Period", 13, 1, 240, 1);
mult = Param("Multiplier", 1.7, 1, 240, 0.1);

f=ATR(period);

VS[0] = Close[0];
trend[0] = 0;
HighC[0]=0;
Lowc[0]=0;

for( i = period+1; i < BarCount; i++ )
{

vs = vs[i-1];
trend = trend[i-1];
highC = HighC[i-1];
lowc = lowc[i-1];

if ((trend>=0) && ( C <VS ))
{
trend =-1;
HighC = C;
lowc = C;
}

if ((trend<=0) && (C >VS))
{
trend=1;
HighC = C;
lowc = C;
}

if (trend==-1)
{
if (C<lowc) lowc = C;
VS= lowc+ (mult*f);
}


if (trend==1)
{
if (C>HighC) HighC = C;
VS= HighC-(mult*f);
}

}


Buy=Cross(Trend,0);
Sell=Cross(0, Trend);

Plot(Close,"Close",colorBlue,styleCandle);
Plot(VS, "Vol Stop",IIf(trend==1,10,11 ),styleThick);

mkol = IIf( Trend==1, 10, 11);
Plot(5, "ribbon", mkol, styleOwnScale|styleArea|styleNoLabel, 0, -5); // Weekly trend

shape = Buy * shapeUpArrow + Sell * shapeDownArrow;
PlotShapes( shape, IIf( Buy, colorGreen, colorRed ), 0, IIf( Buy, Low-f, High+f));
_SECTION_END();
_SECTION_END();

Il supertrend si articola su due bande che di solito sono:
Upper= medianprice+k*Atr(ped)
Lower= medianprice-k*Atr(ped)
Quasi sempre,il segnale buy scatta se il prezzo di chiusura supera la Upper e il segnale sell quando il prezzo di chiusura è inferiore alla lower.
Credo fermamente che se si modificano le modalità operative ed il metodo di calcolo dell'indicatore si possa migliorare di molto il suo utilizzo.
Cioè la upper dovrebbe essere:
Upper= Low+k*Atr(ped)
la lower:
Lower= High-k*Atr(ped)
Il segnale buy scatterebbe quando l'high(e non il close)supera la upper e il close è il più alto delle ultime x sedute.Il segnale sell scatterebbe,invece,quando il low è minore o uguale alla lower ed il close corrispondente è il più basso delle ultime x sedute.
Sarebbe possibile riscrivere il codice inserendo queste modifiche?
Grazie per l'attenzione.
 

ender85

Forumer attivo
vuoi dire che esistono anche indicatori "non stupidi" ?:-?

Dipende dalla propria definizione di "indicatore", per chi fa A.T la media è un indicatore...
Nessun strumento è stupido, bisogna solo saper usare o saper di non usare uno strumento :D
Cmq indicate la strada corretta e suggerite di non andare a mercato se non molto ben preparati, ma lasciate commettere gli errori in paper ai novizi.
Le persone finchè non sbagliano da sole non imparano e sono i propri errori a sviluppare una coscienza/conoscenza critica; se gli tappate le ali troppo presto non potranno mai andare avanti con le proprie gambe.

Recita un famoso Koan:
Prima di praticare lo Zen, le montagne mi sembravano montagne e i fiumi mi sembravano fiumi.
Da quando pratico lo Zen, vedo che i fiumi non sono più fiumi e le montagne non sono più montagne.
Ma da quando ho raggiunto l’illuminazione, le montagne sono di nuovo montagne e i fiumi di nuovo fiumi.​
 

f4f

翠鸟科
Si, però la versione pubblicata al primo post non è quella da cui sono partito io: http://www.investireoggi.it/forum/s...er-simile-prorealtime-vt42498.html#post918074

Eccoti il codice,
Codice:
moltiplicatore = 3;//Optimize("Moltiplicatore",2,1,3,1);
periodo =100;// Optimize("per",200,50,200,5);
SetBarsRequired(periodo);//Disabilito il QuickAFL
SetTradeDelays(1,1,1,1);
SetPositionSize(1,4);
//PositionSize=50000;
BuyPrice = ShortPrice = SellPrice = CoverPrice = Open;

prezzomediano = ( High + Low ) / 2;
volatilita = ATR(periodo); 
bandaup = prezzomediano + ( moltiplicatore * volatilita );
bandadn = prezzomediano - ( moltiplicatore * volatilita );
trend = 1;
sp=0;

for ( i = periodo+1; i < BarCount; i++ )
{
    trend[i]=trend[i-1];
    if ( trend[i] == 1 AND Close[i] < bandadn[i-1] )
    {
        trend = -1;
        bandaup[i] = prezzomediano[i] +( moltiplicatore[i] * volatilita[i] );
        sp[i] = bandaup[i];
    }



    if ( trend[i] == 1 AND Close[i] >= bandadn[i-1] AND bandadn[i] < bandadn[i-1] )
    {
        bandadn[i] = bandadn[i-1];
        sp[i] = bandadn[i];
    }


    if (trend[i]== 1 AND Close[i] >= bandadn[i-1] AND bandadn[i] >= bandadn[i-1])
    {
        sp[i] = bandadn[i];
    }



    if (trend[i] == -1 AND Close[i] > bandaup[i-1])
    {
        trend = 1;
        bandadn[i] = prezzomediano[i] - ( moltiplicatore[i] * volatilita[i] );
        sp[i] = bandadn[i];
    }


    if (trend[i]== -1 AND  Close[i] <= bandaup[i] AND bandaup[i] > bandaup[i-1])
    {
        bandaup[i] = bandaup[i-1];
        sp[i] = bandaup[i];
    }


    if (trend[i]== -1 AND  Close[i] <= bandaup[i] AND bandaup[i] <= bandaup[i-1])
    {
        sp[i] = bandaup[i];
    }
}

Buy=Cover = Cross(C,sp);
Short = Sell= Cross(sp,C);

Plot( sp, "Supertrend", colorRed );
Purtroppo è fatto con il ciclo for, se riuscissi a farlo senza sarebbe un ottima cosa ma all'epoca della codifica non avevo le stesse capacità di ora :D


:D si può fare senza ciclo FOR?
avevo provato per qualche settimana a farlo in excel ( aka: senza il FOR)
ma tutte le prove generavano mostri di IF concatenati ....
 

Users who are viewing this thread

Alto