Umumnya semua fungsi secara default baik di mql4 maupun di mql5 sudah disiapkan pihak metaquote sebagai developer.
Kadang saya pribadi merasa bahwa fungsi tersebut masih bisa dipersingkat lagi, itupun melalui beberapa trial dan error, yang saya bagikan dibawah ini beberapa tips ala saya pribadi.
Pertimbangan saya adalah untuk memperpendek penulisan coding yang secara tehnis besar atau kecil mempengaruhi beratnya indikator/ EA/ script ketika dijalankan di chart.
Cara yang saya terapkan untuk
meperingan Indikator, EA, dan Script
sebagai berikut :
- Mendisable fungsi yang tidak sedang dipanggil
Misal pada indikator yang kita buat ada fungsi enable/ disable fungsinya, nah disini saya buat fungsi tsb disable juga jika fungsi tersebut sedang tidak kita tampilkan
Contoh :
Jika fungsi SMA yang ketika di parameter input sedang kita disable maka saya juga disable fungsi buffer SMA tersebut
Parameter input SMA disable input bool Show_SMA = false
pada fungsi OnCalculate saya disable juga seperti berikut
if(Show_SMA) Buffer_SMA[i] = iMA(_Symbol,_Period,inpPer,0,MODE_SMA,PRICE_CLOSE,i); else Buffer_SMA[i] = EMPTY_VALUE; atau bisa juga dengan coding spt ini Buffer_SMA[i] = Show_SMA?iMA(_Symbol,_Period,inpPer,0,MODE_SMA,PRICE_CLOSE,i):EMPTY_VALUE;
- Sedikit memodif fungsi dalam penulisan coding obyek
Misal :
untuk membuat object biasanya ditemui fungsi seperti dibawah ini
fungsi untuk perubahan titik peletakan objectbool RectanglePointChange(const long chart_ID=0, // chart's ID const string name="Rectangle", // rectangle name const int point_index=0, // anchor point index datetime time=0, // anchor point time coordinate double price=0){ // anchor point price coordinate if(!time) time=TimeCurrent(); if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); ResetLastError(); if(!ObjectMove(chart_ID,name,point_index,time,price)){ Print(__FUNCTION__,": failed to move the anchor point! Error code = ",GetLastError()); return(false); } return(true); }
fungsi untuk menghapusbool RectangleDelete(const long chart_ID=0, // chart's ID const string name="Rectangle"){// rectangle name ResetLastError(); if(!ObjectDelete(chart_ID,name)){ Print(__FUNCTION__,": failed to delete rectangle! Error code = ",GetLastError()); return(false); } return(true); }
fungsi jika nilai titik objek kosongvoid ChangeRectangleEmptyPoints(datetime &time1,double &price1, datetime &time2,double &price2){ if(!time1) time1=TimeCurrent(); if(!price1) price1=SymbolInfoDouble(Symbol(),SYMBOL_BID); if(!time2){ datetime temp[10]; CopyTime(Symbol(),Period(),time1,10,temp); time2=temp[0]; } if(!price2) price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT); }
dan yang terakhir fungsi untuk membuat obyeknyabool RectangleCreate(const long chart_ID=0, // chart's ID const string name="Rectangle", // rectangle name const int sub_window=0, // subwindow index datetime time1=0, // first point time double price1=0, // first point price datetime time2=0, // second point time double price2=0, // second point price const color clr=clrRed, // rectangle color const ENUM_LINE_STYLE style=STYLE_SOLID, // style of rectangle lines const int width=1, // width of rectangle lines const bool fill=false, // filling rectangle with color const bool back=false, // in the background const bool selection=true, // highlight to move const bool hidden=true, // hidden in the object list const long z_order=0){ // priority for mouse click ChangeRectangleEmptyPoints(time1,price1,time2,price2); ResetLastError(); if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2)){ Print(__FUNCTION__, ": failed to create a rectangle! Error code = ",GetLastError()); return(false); } ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); return(true); }
saya bypass (istilah saya sendiri hehehehehe) spt dibawah inivoid Sett(bool Action){ ResetLastError(); if(!Action){ Print(__FUNCTION__,": failed to draw = ",GetLastError()); return; } }
bool RectangleCreate(const long chart_ID, // chart's ID const string name, // rectangle name datetime time1, // first point time double price1, // first point price datetime time2, // second point time double price2, // second point price const color clr=clrRed, // rectangle color const int width=1, // width of rectangle lines const ENUM_LINE_STYLE style=STYLE_SOLID, // style of rectangle lines const bool fill=true, // filling rectangle with color const bool back=true, // in the background const bool selection=false, // highlight to move const bool hidden=true, // hidden in the object list const long z_order=0){ // priority for mouse click ResetLastError(); string Name=iName+name; if(ObjectFind(Name)==WRONG_VALUE) ObjectCreate(chart_ID,Name,OBJ_RECTANGLE,0,0,0,0,0); ObjectSetInteger(chart_ID,Name,OBJPROP_TIME1,time1); ObjectSetDouble(chart_ID,Name,OBJPROP_PRICE1,price1); ObjectSetInteger(chart_ID,Name,OBJPROP_TIME2,time2); ObjectSetDouble(chart_ID,Name,OBJPROP_PRICE2,price2); ObjectSetInteger(chart_ID,Name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,Name,OBJPROP_WIDTH,width); ObjectSetInteger(chart_ID,Name,OBJPROP_STYLE,style); ObjectSetInteger(chart_ID,Name,OBJPROP_FILL,fill); ObjectSetInteger(chart_ID,Name,OBJPROP_BACK,back); ObjectSetInteger(chart_ID,Name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,Name,OBJPROP_SELECTED,selection); ObjectSetInteger(chart_ID,Name,OBJPROP_HIDDEN,hidden); ObjectSetInteger(chart_ID,Name,OBJPROP_ZORDER,z_order); return(true); }
Contoh pemanggilan fungsi pembuatan rectangleSett(drawRect(0,"NAMA_OBYEKNYA",inpTime1,inpPrice1,inpTime2,inpPrice2,inpColor));
untuk fungsi delete obyeknya saya buat sendiri agar sesuai dengan id obyek global agar ketika indikator dihapus dari chart tidak menyisakan obyek lagi atau jika fungsinya di disable berikut fungsi delete obyeknyavoid delObj(){ int obj_total=ObjectsTotal();//Total Obyek for(int i=obj_total; i>=0; i--){ string name = ObjectName(i);//Filter sesuai nama obyeknya if(StringFind(name,iName,0)!= -1) ObjectDelete(name);//filter untuk menghapus hanya yang sesuai dengan nama indikatornya } }
Contoh pemanggilan pada fungsi yg akan diletakkan (pada fungsi deinit atau fungsi init) : delObj();
Jangan lupa untuk mendeklarasikan variabel iName sebagai idnya
Selamat siang admin
BalasHapusSaya Okta dari broker ForexMart.
Kami tertarik untuk menawarkan kerjasama afiliasi kepada anda. Bolehkah saya meminta nomor kontak untuk membicarakan ini lebih lanjut? Atau anda juga bisa menghubungi saya melalui 08111622285 / okta@forexmart.com
Terima kasih
Okta
Business Development
Selamat siang
HapusNo kontak saya kirim ke email (okta@forexmart.com)
Terima kasih :))