06 Mei 2019

Tips membuat ringan Indikator, EA, dan Script



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 :
  1. 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;
    
  2. Sedikit memodif fungsi dalam penulisan coding obyek Misal : untuk membuat object biasanya ditemui fungsi seperti dibawah ini
    fungsi untuk perubahan titik peletakan object
    bool 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 menghapus
    bool 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 kosong
    void 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 obyeknya
    bool 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 ini
    void 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 rectangle
    Sett(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 obyeknya
    void 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
Tips ala BySU diatas salah satu cara saya yang gunakan untuk mengurangi pemakaian memori berlebih, mohon maaf jika secara tekhnis kurang tepat karena trik diatas hasil dari trial error saya pribadi

2 komentar:

  1. Selamat siang admin
    Saya 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

    BalasHapus
    Balasan
    1. Selamat siang
      No kontak saya kirim ke email (okta@forexmart.com)

      Terima kasih :))

      Hapus