help needed tocorrect this afl pls

jsb2012

Active Member
#1
/*
VierBox ver 0.1. Messy programming, rough plotting, barely usable :D
ver 0.2. * Parameter VierBox per saham bisa di save. Tidak perlu lagi memakai
Draw Rectangle. Big time saver :D
* Plot yang lebih halus
* fitur untuk menampilkan/menyembunyikan VierBox
* fitur untuk menampilkan/menyembunyikan garis vertikal
* fitur untuk menampilkan dan merubah warna VierBox (masih sangat sederhana)
* fitur untuk merubah warna garis
* Bagian Title akan memberikan informasi jika ada parameter yang berubah sejak
disave dan memberi rekomendasi apa yang hrs dilakukan.
ver 0.3. * Warna box sesuai rules pak Vier. Maap pak Vier, baru kelar sekarang . Ternyata susah juga buatnya :D
* text di box untuk menandakan box uptrend, downtrend, stackingBox, etc.
* Warna Outline candlestick bisa dirubah di parameter
ver 0.3.1 * text di box untuk ExplosiveBox


Cara penggunaan: Dari Menu Parameters, Klik "RESET ALL" untuk menampilkan parameter yang telah disave
atau
Dari Menu Parameters, Klik "SAVE" untuk menyimpan parameter yang telah dirubah

Catatan teknis: parameter setiap saham disimpan di directory C:\amibroker\vierbox\namasaham.txt

Saran, usul dan komentar dipersilahkan.

*/

//bikin fungsi start warna box



function startWarna( y1, y2, range )
{

result = colorWhite;

if ( AlmostEqual( y1, y2 + range* 1 / 2 ) )
result = colorRose; //downTrend

if ( AlmostEqual( y1, y2 + range*3 / 2 ) )
result = colorPink;//reversal

if ( AlmostEqual( y1, y2 + range*5 / 2 ) )
result = colorRed;//Crash

if ( AlmostEqual( y1, y2 + range*7 / 2 ) )
result = colorDarkRed;//Crash2

if ( AlmostEqual( y1, y2 + range*9 / 2 ) )
result = colorDarkRed;//Crash3

if ( AlmostEqual( y1, y2 - range* 1 / 2 ) )
result = colorAqua;//upTrend

if ( AlmostEqual( y1, y2 - range* 3 / 2 ) )
result = colorTurquoise;//stackingBox

if ( AlmostEqual( y1, y2 - range* 5 / 2 ) )
result = colorTeal;//ExplosiveBox

if ( AlmostEqual( y1, y2 - range* 7 / 2 ) )
result = colorDarkGreen;//ExplosiveBox2

if ( AlmostEqual( y1, y2 - range* 9 / 2 ) )
result = colorDarkOliveGreen;//ExplosiveBox3

return result;
} //end function ColorWhite

function textTrend( y1, y2, range )
{

result = "?";

if ( AlmostEqual( y1, y2 + range* 1 / 2 ) )
result = "DownTrend";

if ( AlmostEqual( y1, y2 + range* 3 / 2 ) )
result = "Reversal";

if ( AlmostEqual( y1, y2 + range* 5 / 2 ) )
result = "Crash";

if ( AlmostEqual( y1, y2 + range* 7 / 2 ) )
result = "Crash2";

if ( AlmostEqual( y1, y2 + range* 9 / 2 ) )
result = "Crash3";

if ( AlmostEqual( y1, y2 - range* 1 / 2 ) )
result = "UpTrend";

if ( AlmostEqual( y1, y2 - range* 3 / 2 ) )
result = "StackingBox";

if ( AlmostEqual( y1, y2 - range* 5 / 2 ) )
result = "ExplosiveBox";

if ( AlmostEqual( y1, y2 - range* 7 / 2 ) )
result = "ExplosiveBox2";

if ( AlmostEqual( y1, y2 - range* 9 / 2 ) )
result = "ExplosiveBox3";

return result;
} //end function textTrend


_SECTION_BEGIN( "Save" );
save = ParamTrigger( "Save Parameter VierBox?", "KLIK DISINI UNTUK SAVE" ) ;
_SECTION_END(); //end section "Save"

_SECTION_BEGIN( "Price" );
SetChartOptions( 0, chartShowArrows | chartShowDates );
Plot( C, "Close", ParamColor( "Warna Outline Candlestick", colorBlack ), styleNoTitle | GetPriceStyle() );
_SECTION_END(); //end section "Price"

_SECTION_BEGIN( "Tampilkan VierBox" );
DisplayVierBox = ParamToggle( "Tampilkan VierBox?", "Tidak|Ya", 1 );
_SECTION_END(); //end section "Tampilkan VierBox"

_SECTION_BEGIN( "VierBox by DF" );

//tampilanVierBox=ParamToggle("VierBox yang Ditampilkan","Permanen|Setup",0);
//jumlahBarDiBox = Param("Jumlah Bar di Box", 15, 5, 20);
//Offset= Param("Start mundur berapa bar",75,1,200);
//LineColor = ParamColor("Warna Garis Outline", colorGreen);
//ColorStartBox = ParamColor("Warna Box Start",colorLightYellow);
//ColorBox2 = ParamColor("Warna Box 2",colorAqua);
//DisplayBoxColor=ParamToggle("Display Box Color","Yes|No",0);
//displayBoxLine=ParamToggle("Tampilkan Garis Outline Box","Ya|Tidak",0);

SetChartOptions( 0, chartShowArrows | chartShowDates );
SetBarsRequired( 100000, 100000 ); //use all bars
//EnableTextOutput( False );

if ( displayVierBox == 1 ) //section vierbox by DF hanya akan ditampilkan kalau displayVierBox==1
{

//Buka file
input_file = Name() + ".txt";
input_folder = "vierbox";
fh = fopen( input_folder + "\\" + input_file, "r" );

if ( fh )
{
strFile = fgets( fh );
fclose( fh );

strStartBar = StrExtract( strfile, 0 );
strJumlahBarDiBox = StrExtract( strFile, 1 );
strdisplayBoxLine = StrExtract( strFile, 2 );
strDisplayBoxColor = StrExtract( strFile, 3 );
strlineColor = StrExtract( strFile, 4 );
strColorStartBox = StrExtract( strFile, 5 );
//strColorBox2 = StrExtract( strFile, 6 );

startBar = StrToNum( strStartBar );
lastBar = LastValue( BarIndex() ); //value jumlah total bar . Base 0
Offset = Lastbar - startBar; //box mulai di sini. Nilai offset keluar cuma sekali di sini!
Offset = Param( "Start Mundur Berapa Bar?", Offset, 1, 200 );
startBar = LastBar - Offset;
jumlahBarDiBox = StrToNum( strJumlahBarDiBox );

jumlahBarDiBox = Param( "Jumlah Bar di Box", StrToNum( strJumlahBarDiBox ), 5, 20 );
displayBoxLine = ParamToggle( "Tampilkan Garis Outline Box", "Tidak|Ya", StrToNum( strdisplayBoxLine ) );
lineColor = ParamColor( "Warna Garis Outline Box", StrToNum( strLineColor ) );
DisplayBoxColor = ParamToggle( "Tampilkan Warna Box", "Tidak|Ya", StrToNum( strDisplayBoxColor ) );
ColorStartBox = ParamColor( "Warna Start Box", StrToNum( strColorStartBox ) );
//ColorBox2 = ParamColor( "Warna Box 2", StrToNum( strColorBox2 ) );

}
else //jika file yang mau dibuka gak ada, bikin jadi default dan save
{
printf( "error open file" );
Offset = Param( "Start Mundur Berapa Bar?", 75, 1, 200 );
lastBar = LastValue( BarIndex() );
startBar = Lastbar - Offset;

jumlahBarDiBox = Param( "Jumlah Bar di Box", 15, 5, 20 );
displayBoxLine = ParamToggle( "Tampilkan Garis Outline Box", "Tidak|Ya", 0 );
LineColor = ParamColor( "Warna Garis Outline", colorGreen );
DisplayBoxColor = ParamToggle( "Display Box Color", "Tidak|Ya", 1 );
ColorStartBox = ParamColor( "Warna Start Box", colorLightYellow );
//ColorBox2 = ParamColor( "Warna Box 2", colorAqua );


//save
Output_file = Name() + ".txt";
Output_folder = "vierbox";
fmkdir( Output_folder );
fh = fopen( Output_folder + "\\" + Output_file, "w" );
fputs( NumToStr( startBar, 1.0, False ) + "," + NumToStr( jumlahBarDiBox, 1.0, False ) + "," +
NumToStr( displayBoxLine, 1.0, False ) + "," + NumToStr( displayBoxColor, 1.0, False ) + "," +
NumToStr( Linecolor, 1.0, False ) + "," + NumToStr( ColorStartBox, 1.0, False ) + ",", fh );
fclose( fh );
fclose( fh );
}

; //end if fh

lastBar = LastValue( BarIndex() ); //value jumlah total bar

lArray = LLV( Low, jumlahBardiBox ); //cari Low terendah di box awal

hArray = HHV( High, jumlahBardiBox ); //cari High tertinggi di box awal

VierL = Larray[startBar-1];//convert lArray jadi value

VierH = Harray[startBar-1];//convert hArray jadi value

range = VierH - VierL;//hitung tinggi box awal


//cari baseline box, sedekat mungkin dengan harga 0
//berguna agar box-box di depan selalu berada dekat bar-bar harga
baselineBoxGenap = VierL - int( VierL / range ) * range;

baselineBoxGanjil = VierL - int( VierL / range ) * range - range / 2;

//start Buat box awal
x0 = -jumlahBarDiBox + startBar;

x1 = startBar ;

garisBawah = LineArray( x0, VierL, x1 - 1, VierL, 0 );

garisAtas = LineArray( x0, VierH, x1 - 1, VierH, 0 );

if ( displayBoxLine == 1 )
{
garisKiriBawah = LineArray( x0 - 1, VierL + range / 2, x0, VierL , 0 );
garisKiriAtas = LineArray( x0 - 1, VierL + range / 2, x0, VierL + range, 0 );
garisKananBawah = LineArray( x1 - 1, VierL , x1, VierL + range / 2, 0 );
garisKananAtas = LineArray( x1 - 1, VierL + range, x1, VierL + range / 2, 0 );


Plot( garisBawah, "", LineColor, styleNoLabel );
Plot( garisatas, "", LineColor );
Plot( garisKiriBawah, "", LineColor, styleNoLabel );
Plot( garisKiriAtas, "", LineColor, styleNoLabel );
Plot( garisKananBawah, "", LineColor, styleNoLabel );
Plot( garisKananAtas, "", LineColor, styleNoLabel );
}

//selesai buat box awal

//hitung harus buat berapa box ke depan(horisontal dan vertikal)
jumlahBoxH = int( ( LastBar - startBar ) / jumlahBarDiBox ) + 1;//jumlah box ke depan yang akan dibuat


/*unused. replaced with new code.

//Plot Vertical Line
if ( displayBoxLine == 1 )
{
for ( k = 0;k < jumlahBoxH + 1;k++ )
{
x0 = -jumlahBarDiBox + startBar + k * jumlahBarDiBox;
Plot( BarIndex() == x0, "", LineColor, styleOwnScale + styleHistogram + styleNoLabel );
} //end for
}

*/

if ( displayBoxColor == 1 )
{
PlotOHLC( Null, garisAtas, garisBawah, Null, "", ColorStartBox, styleCloud + styleNoLabel );
PlotText( "Start", startBar - jumlahBarDiBox*2 / 3, VierL + Range / 2 , colorBlack, colorYellow );
} //end if displayBoxColor

baselineBox[0] = VierL; //akan dipakai untuk nilai y1 di box horisontal ke 1

//buat baselineBox[boxNo] dari box horisontal pertama sampai terakhir
for ( boxNo = 1;boxNo <= jumlahBoxH;boxNo++ )
{
testGanjil = frac( boxNo / 2 ) != 0;//genap jika nilainya 0

if ( testGanjil == 0 )
{
baselineBox[boxNo] = BaselineBoxGenap;
}
else
{
baselineBox[boxNo] = BaselineBoxGanjil;
} //end testGanjil
} //end for buat baselineBox[boxNo]

for ( boxNo = 1;boxNo < jumlahBoxH;boxNo++ ) //mulai buat box didepan sebanyak jumlahBoxH
{

boxL = lArray[startBar-1 + boxNo*jumlahBarDiBox];//nilai minimum harga di box no k
boxH = hArray[startBar-1 + boxNo*jumlahBarDiBox];//nilai maksimum harga di box no k

//hitung jumlahBoxV

for ( i = 0;baselineBox[boxNo] + i*Range <= boxH;i++ )
{
jumlahBoxV = i + 1;
}

ClosingPriceBoxSebelumnya = C[startBar-1 + ( boxNo-1 )*jumlahBarDiBox];//harga penutupan di ujung kanan box sebelumnya.

//Cari garis bawah terdekat dengan ClosingPriceBoxSebelumnya

for ( i = 0;( baselineBox[boxNo-1] + i*range ) <= ClosingPriceBoxSebelumnya ;i++ )
{
y1 = baselineBox[BoxNo-1] + i * range;
}

//hitung garis bawah terdekat dengan boxL
for ( i = 0;( baselineBox[boxNo] + i*range ) <= boxL;i++ )
{
y2 = baselineBox[boxNo] + i * range;
}


//printf( "\nClosingPriceBoxSebelumnya=" + ClosingPriceBoxSebelumnya );

//printf( "\ny1=" + y1 );

//printf( "\ny2=" + y2 );

//buat Plot di box-box di depan

for ( j = 1;j <= jumlahBoxV;j++ )
{
if ( ( baselineBox[boxNo] + j*range ) > boxL ) //buat plot hanya kalau dekat dengan bar
{
x0 = -jumlahBarDiBox + startBar + boxNo * jumlahBarDiBox;
x1 = startBar + boxNo * jumlahBarDiBox;
y = baselineBox[boxNo] + ( j - 1 ) * range;

garisBawah = LineArray( x0, y, x1 - 1 , y, 0 );
garisAtas = LineArray( x0, y + range, x1 - 1 , y + range, 0 );

if ( displayBoxLine == 1 )
{
garisKiriBawah = LineArray( x0 - 1, y + range / 2, x0, y, 0 );
garisKiriAtas = LineArray( x0 - 1, y + range / 2, x0, y + range, 0 );
garisKananBawah = LineArray( x1 - 1, y , x1, y + range / 2, 0 );
garisKananAtas = LineArray( x1 - 1, y + range, x1, y + range / 2, 0 );


Plot( garisBawah, "", LineColor, styleNoLabel );
Plot( garisatas, "", LineColor );
Plot( garisKiriBawah, "", LineColor, styleNoLabel );
Plot( garisKiriAtas, "", LineColor, styleNoLabel );
Plot( garisKananBawah, "", LineColor, styleNoLabel );
Plot( garisKananAtas, "", LineColor, styleNoLabel );
} //end if displayBoxLine


if ( displayBoxColor == 1 )
{
ColorBoxBawah = startWarna( y1, y2, range );
PlotOHLC( Null, garisAtas, garisBawah, Null, "", ColorBoxBawah, styleCloud );
PlotText( textTrend( y1, y2, range ), x0 + jumlahBarDiBox / 3, y + Range / 2, colorBlack, colorYellow );
y2 = y2 + range; //rubah warna untuk box diatas box sekarang
} //end if displayBoxColor
} //end if dekat dengan bar
} //end for
} //end for


//sekarang plot khusus di box paling kanan. Like I said, messy :(
boxNo = jumlahBoxH; //no box yang paling kanan

//BoxL dan BoxH di box terakhir. Very-very messy. Try and error.
boxL = LastValue( LLV( Low, ( 1 + Offset - jumlahBarDiBox * ( jumlahBoxH - 1 ) ) ) ); //nilai minimum harga di box terakhir

boxH = LastValue( HHV( High, ( 1 + Offset - jumlahBarDiBox * ( jumlahBoxH - 1 ) ) ) );//nilai maksimum harga di box terakhir

//printf( "\nmundur berapa periode di bar terakhir=" + ( 1 + ( Offset - jumlahBarDiBox*( ( jumlahBoxH - 1 ) ) ) ) );

//printf( "\nboxL=" + boxL );

//printf( "\nboxH=" + boxH );

//hitung jumlahBoxV
for ( i = 0;baselineBox[boxNo] + i*Range <= boxH;i++ )
{
jumlahBoxV = i + 1;
}

ClosingPriceBoxSebelumnya = C[startBar-1 + ( boxNo-1 )*jumlahBarDiBox];//harga penutupan di ujung kanan box sebelumnya.

//Cari garis bawah terdekat dengan ClosingPriceBoxSebelumnya

for ( i = 0;( baselineBox[boxNo-1] + i*range ) <= ClosingPriceBoxSebelumnya ;i++ )
{
y1 = baselineBox[BoxNo-1] + i * range;
}

//hitung garis bawah terdekat dengan boxL
for ( i = 0;( baselineBox[boxNo] + i*range ) <= boxL;i++ )
{
y2 = baselineBox[boxNo] + i * range;
}

//printf( "\nClosingPriceBoxSebelumnya=" + ClosingPriceBoxSebelumnya );

//printf( "\ny1=" + y1 );

//printf( "\ny2=" + y2 );
//printf( "\nboxNo=" + boxNo );

//buat plot box paling kanan

for ( j = 1;j <= jumlahBoxV;j++ )
{
if ( ( baselineBox[boxNo] + j*range ) > boxL ) //buat plot hanya kalau dekat dengan bar
{
x0 = -jumlahBarDiBox + startBar + boxNo * jumlahBarDiBox;
x1 = startBar + boxNo * jumlahBarDiBox;
y = baselineBox[boxNo] + ( j - 1 ) * range;
garisBawah = LineArray( x0, y, x1 - 1, y, 0 );
garisAtas = LineArray( x0, y + range, x1 - 1, y + range, 0 );
displace = jumlahBarDiBox - ( LastBar - x0 ) - 1;
//printf( "\ndisplace=" + displace );

if ( displayBoxLine == 1 )
{
garisKiriBawah = LineArray( x0 - 1, y + range / 2, x0, y, 0 );
garisKiriAtas = LineArray( x0 - 1, y + range / 2, x0, y + range, 0 );
garisKananBawah = LineArray( x1 - 1 , y , x1, y + range / 2, 0 );
garisKananAtas = LineArray( x1 - 1 , y + range, x1, y + range / 2, 0 );
Plot( Ref( garisbawah, displace ), "", LineColor, styleLine + styleNoLabel , 0, 0, displace );//garis bawah box
Plot( Ref( garisAtas, displace ), "", LineColor, styleLine , 0, 0, displace );//garis atas box
Plot( garisKiriBawah, "", LineColor, styleNoLabel );
Plot( garisKiriAtas, "", LineColor, styleNoLabel );
Plot( garisKananBawah, "", LineColor, styleNoLabel , 0, 0, displace );
Plot( garisKananAtas, "", LineColor, styleNoLabel , 0, 0, displace );
}

if ( displayBoxColor == 1 )
{
ColorBoxBawah = startWarna( y1, y2, range );//
PlotOHLC( Null, Ref( garisbawah, displace ), Ref( garisAtas, displace ), Null, "", ColorBoxBawah, styleCloud + styleNoLabel, 0, 0, displace );
PlotText( textTrend( y1, y2, range ), x0 + jumlahBarDiBox / 3, y + Range / 2, colorBlack, colorYellow );
y2 = y2 + range; //rubah warna untuk box diatas box sekarang
}
}//end if
}//end for


stringTitleOri = StrFormat( "{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +
WriteVal( V, 1.0 ) + " {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ) ;

stringVierBox = WriteIf( jumlahBarDiBox != StrToNum( strJumlahBarDiBox ) OR
startBar != StrToNum( strStartBar ) OR
displayBoxLine != StrToNum( strdisplayBoxLine ) OR
displayBoxColor != StrToNum( strDisplayBoxColor ) OR
Linecolor != StrToNum( strLineColor ) OR
ColorStartBox != StrToNum( strColorStartBox ),
EncodeColor( colorRed ) + "VierBox " + Name() + " belum disimpan." +
"\nUntuk menyimpan VierBox ini, masuk ke menu Parameters dan klik SAVE." +
"\nUntuk memanggil VierBox yang telah disimpan, masuk ke menu Parameters dan klik RESET ALL.",
EncodeColor( colorBlue ) + "VierBox " + Name() + " sudah disimpan" );


Title = stringVierBox + "\n\n" + EncodeColor( colorBlack ) + stringTitleOri;

if ( save == 1 )
{
Output_file = Name() + ".txt";
Output_folder = "vierbox";
fmkdir( Output_folder );
fh = fopen( Output_folder + "\\" + Output_file, "w" );
fputs( NumToStr( startBar, 1.0, False ) + "," + NumToStr( jumlahBarDiBox, 1.0, False ) + "," +
NumToStr( displayBoxLine, 1.0, False ) + "," + NumToStr( displayBoxColor, 1.0, False ) + "," +
NumToStr( Linecolor, 1.0, False ) + "," + NumToStr( ColorStartBox, 1.0, False ) + "," , fh );
fclose( fh );
} //end if

} //end if displayVierBox


_SECTION_END();
 

Similar threads