// Downloaded From https://www.WiseStockTrader.com /* 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