Above banners and links are advertisements only. We do not endorse or vouch for any advertisers
+ Reply to Thread
Results 1 to 8 of 8

Thread: Bagian 6 - Decision dan Looping

  1. #1
    Administrator
    Join Date
    Jun 2007
    Posts
    1,390

    Default Bagian 6 - Decision dan Looping

    Decision dan Looping

    Pada bagian ini kita akan membahas decision dan looping. Decision dan looping adalah inti dari sebuah program komputer. Sesuai atau tidaknya program komputer berjalan tergantung dari kebenaran anda menulis/menyusun perintah2 decision dan looping

    Begitu juga dengan EA, kalau salah dalam menyusun decision & looping, maka kinerjanya akan tidak sesuai yang kita kehendaki. Misalnya menurut kehendak kita, sekarang ini EA harusnya open buy, tapi ternyata dia malah diem aja... nah itu bisa jadi, walau tidak 100% pasti, kesalahannya terletak pada bagian ini.

    1. Decision/Branching

    1.1 IF - (ELSE)

    Decision berarti membagi alur program menjadi 2.
    Simplenya begini, u suruh temen u beliin nasi empal. U bilang, kalau harganya 5000 beliin 2 ya, kalau lebih mahal ya ga usah beli.
    Itu termasuk branching, karena dari 1, akan dipecah menjadi 2 opsi :
    opsi 1 : kalau harga 5000 beli 2
    opsi 2 : kalau harga diatas 5000, ga usah beli

    Sama juga seperti program. Program juga harus diperintah seperti itu, dikasih opsi berdasarkan kriteria2 tertentu.
    Contohnya dalam forex :

    Kalau candle ditutup bullish, maka buy
    Kalau candle ditutup bearish, maka sell
    Kalau candle close=open, maka tidak usah trade

    (bullish berarti close lebih tinggi dari open, dan sebaliknya)

    kalau dalam bahasa MQL4, maka penulisannya akan jadi seperti ini :

    Code:
          //diatas sudah 
          if (iClose(Symbol(),0,1)>iOpen(Symbol(),0,1) )
          {
             //open buy
          }
          else if (iClose(Symbol(),0,1)<iOpen(Symbol(),0,1) )
          {
             //open sell
          }
          else 
          {
             //ga trade
          }

    kurang lebih sama seperti kita nyuruh orang, cuman bahasa dan tata cara penulisannya saja yang beda.
    jika misalnya perlu 2 kondisi, semisal kalau candle nya terlalu panjang (lebih dari 50 pips), tidak trade, maka kita bisa menggunakan Operator Logical (Bagian 5 - Operator dan Ekspresi)

    contoh :

    Code:
          //diatas sudah 
          if (iClose(Symbol(),0,1)>iOpen(Symbol(),0,1) && iClose(Symbol(),0,1)-iOpen(Symbol(),0,1) < 50*Point )
          {
             //open buy
          }
          else if (iClose(Symbol(),0,1)<iOpen(Symbol(),0,1) && iOpen(Symbol(),0,1)-iClose(Symbol(),0,1) < 50*Point )
          {
             //open sell
          }
          else 
          {
             //ga trade
          }
    cukup jelas kan ya?
    gw cuman coba jelasin syntax2 & penulisannya saja kalau misalnya translasi dari bahasa manusia ke bahasa algoritma yang dimengerti komputer, bisa baca2 buku logika & algoritma... (di perpus kampus IT biasanya ada)

    1.2 SWITCH

    Switch fungsinya sama ama if, untuk branching juga. Bedanya switch digunakan untuk membandingkan hal2 yang sebanding, yang variabelnya sama.

    Misal, jika 1 EA punya 3 pilihan filtrasi harga (untuk memfilter false signal), maka bisa menggunakan switch.
    inputan 1 untuk filter menggunakan RSI, 2 untuk panjang candle, dst

    syntaxnya seperti ini :

    Code:
      switch(x)
      {
       case 'A':
          Print("CASE A");
          break;
       case 'B':
          Print("CASE B");
       case 'C':
          Print("CASE B or C");
          break;
       default:
          Print("NOT A, B or C");
          break;
      }
    perhatikan, bahwa setiap selesai operasi, harus diakhiri dengan break;
    kalau tidak, maka perintah di case selanjutnya akan dieksekusi juga.

    jadi misal pada code diatas, kalau x=B, maka yang keluar adalah CASE B, CASE B or C (yang dibawah case C juga dieksekusi, walau x bukan C)

    Code:
          switch(x)
          {
           case '1':
              bolehTrade=cekRSI();
              break;
           case '2':
              bolehTrade=cekCandle();
              break;
       
           default:
              Print("Unknown Option");
              break;
          }

    cekRSI(), cekCandle(), dan bolehTrade adalah boolean
    x=integer

    default adalah nilai jika x tidak memenuhi semua kriteria di case (kayak else nya statement If)

  2. #2
    Administrator
    Join Date
    Jun 2007
    Posts
    1,390

    Default

    2. Looping

    Selain branching/percabangan, looping juga merupakan jantung dari program komputer dan EA. Looping intinya mengulang. Dengan batasan2 tertentu, seperti mengulang sebanyak X kali, atau mengulang sepanjang kondisi x terpenuhi.

    Misal...

    "Ayo, push up 10x !"

    "Push up terussssss sampai saya bilang stop"...

    looping di EA ini paling sering digunakan untuk manajemen order (jika ordernya lebih dari 1, misal pakai strategi grid/martingale), membaca rentetan candle (misal untuk mengecek 3 candle terakhir), dan keperluan2 lainnya....
    tapi seinget gw yang paling sering ya 2 itu..


    2.1 For
    contoh syntax :

    Code:
    int j;
    
    for(j=0; j<5; j++)
    {
         Print(j);
    }
    klo di jalankan, maka akan keluar 0,1,2,3,4
    penjelasannya gini :

    for (inisialisasi index ; kondisi ; increment index)
    for itu butuh 1 variabel untuk index, dalam hal ini, kita pake j

    pertama2 j di nol kan dulu. kalau mau dimulai dari angka yang besar juga bisa...

    j<5 adalah kriteria dari looping tersebut, dimana itu harus terpenuhi, baru perintah yang di { } itu dijalankan.

    j++ ada increment untuk j (supaya index nya naik). Kalau misalnya j dimulai dari angka besar, ke 0, maka diganti jadi j-- (tiap putaran, j nya dikurangi 1 )

    contoh script simple untuk cek candle

    Code:
       bool allBullCandle=true;
       
       //untuk cek 3 candle terakhir
       for (int a=1;a<4;a++)
       {
          if (iClose(Symbol(),0,a) - iOpen(Symbol(),0,a)<0) //kalau range negatif, berarti close dibawah open
          {
             allBullCandle=false;
             break;
          }
       }
       
       if (allBullCandle) { Print("Bull"); } else { Print ("Tidak Bull"); }
    penjelasan

    allBullCandle bertipe boolean dideklarasikan terlebih dahulu.
    lalu for, dari 1 hingga lebih kecil dari 4 (which is 3), cek harga close candle a sebelum sekarang - harga open candle a sebelum sekarang ; kalau hasilnya dibawah 0 (berarti close lebih rendah), maka variabel allBullCandle langsung diisi nilai false. break berguna untuk menghentikan looping. (kalau ude ketemu 1 candle yang tidak bullish kan otomatis jadi tidak bull, jadi looping tidak perlu dilanjutkan)..

    2.2 While

    fungsinya sama persis dengan for, untuk mengulang
    bedanya, kalau kita tau persis berapa kali pengulangannya, kita bisa pake for.. tapi kalau masih ga jelas mau diulang berapa kali, maka kita pake while

    penggunaan while ini cukup jarang.... (jadi gw jelasin ntar'an aja ye )

    contoh syntax nya
    Code:
    while(k<n)
      {
       y=y*x;
       k++;
      }
    artinya, selama k lebih kecil dari n, maka jalankan 2 baris yang didalem { } nya itu....

    --------

    gw cuman coba jelasin syntax2nya aja, sekali lagi, untuk transform dari bahasa manusia ke bahasa programming, silakan baca2 buku algoritma & logika..

    oya, kalau pakai looping ini ati2 ye klo loop nya keliru, bisa2 space harddisk tiba2 abis karena ukuran log file yang jadi bergiga2

    lebih parah lagi kalau order berkali2 sampai marginnya abis...

  3. #3
    Junior Member
    Join Date
    Sep 2008
    Posts
    12

    Default

    Boss white_tiger & para master yg lain, saya mau tanya nih.
    Mohon bantuannya ya...

    Apa yg salah dengan kondisi berikut ini :
    if (Bid-OrderOpenPrice()==Point*10)
    {
    ........................
    }
    karena walaupun nilainya sdh sama/kondisi sdh memenuhi, tetapi tetap saja tidak
    bisa masuk ke dalam kondisi?

    Terimakasih.

  4. #4
    Junior Member
    Join Date
    Apr 2009
    Posts
    4

    Smile Scrip agar open order dan close order tidak terletak pada bar yang sama

    Mas saya mo tanya bagaimana ya buat scrip ea agar open order dengan close order tidak terletak pada bar yang sama

  5. #5
    Junior Member uphi's Avatar
    Join Date
    Jan 2009
    Posts
    11

    Default code buat LOOP EA

    bro white tiger,, newbie mo tnya...
    apa ya scriptsnya yg logiknya EA di jalankan 1 kali ato beberapa kali sesuai extern inputnya (maksudnya EA stop otomatis setelah trade(closed) sesuai yg d input)
    tq

  6. #6
    Junior Member fxsinyo's Avatar
    Join Date
    Jun 2009
    Posts
    14

    Default mofify banyak order pake for tapi gagall

    aku buat fungsi untuk menghilangkan take profit dr beberapa order.
    tp hasilnya yg brasil di modify cma order yg trakhir doank

    void Modify()
    {
    if(TakeProfit>0) TakeProfit=0;
    for(cnt=OrdersTotal();cnt>=0;cnt--)
    {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if(Symbol()==Symbol()&& OrderMagicNumber()==Magic)
    {
    if(OrderType()==OP_BUY)
    {
    if(TakeProfit>0)
    OrderModify(OrderTicket(),OrderOpenPrice(),0,0,0,C LR_NONE);
    }
    }
    }
    }

    mohon bantunnya, soalnya dah smalam suntuk ga ketemu jalan kluarnya nih

  7. #7
    Junior Member fxsinyo's Avatar
    Join Date
    Jun 2009
    Posts
    14

    Default

    Quote Originally Posted by willya View Post
    Boss white_tiger & para master yg lain, saya mau tanya nih.
    Mohon bantuannya ya...

    Apa yg salah dengan kondisi berikut ini :
    if (Bid-OrderOpenPrice()==Point*10)
    {
    ........................
    }
    karena walaupun nilainya sdh sama/kondisi sdh memenuhi, tetapi tetap saja tidak
    bisa masuk ke dalam kondisi?

    Terimakasih.
    cb masukan fungsi OrderOpenPrice() ke dlm variable
    misalnya

    OrderSend(......)
    OrderOpen=OrderOpenPrice();
    if (Bid-OrderOpen==Point*10)
    {
    ........................
    }

  8. #8
    Senior Member
    Join Date
    Aug 2008
    Posts
    466

    Default

    Quote Originally Posted by willya View Post
    Boss white_tiger & para master yg lain, saya mau tanya nih.
    Mohon bantuannya ya...

    Apa yg salah dengan kondisi berikut ini :
    if (Bid-OrderOpenPrice()==Point*10)
    {
    ........................
    }
    karena walaupun nilainya sdh sama/kondisi sdh memenuhi, tetapi tetap saja tidak
    bisa masuk ke dalam kondisi?

    Terimakasih.
    coba diubah jadi seperti ini
    Code:
    if (Bid-OrderOpenPrice()+1*Point >= Point*10 && Bid-OrderOpenPrice()-1*Point <= Point*10)
    Quote Originally Posted by hsunarso View Post
    Mas saya mo tanya bagaimana ya buat scrip ea agar open order dengan close order tidak terletak pada bar yang sama
    coba tambahakan filter berikut sebelum close posisi
    Code:
    if((OrderOpenPrice()+Period()*60)>CurTime()) return(0);
    Quote Originally Posted by uphi View Post
    bro white tiger,, newbie mo tnya...
    apa ya scriptsnya yg logiknya EA di jalankan 1 kali ato beberapa kali sesuai extern inputnya (maksudnya EA stop otomatis setelah trade(closed) sesuai yg d input)
    tq
    coba pakai fungsi for..
    example
    Code:
    int input=3;
    
    for(int i=0;i<input;i++)
       {
       //your EA Code
       }

    Quote Originally Posted by fxsinyo View Post
    aku buat fungsi untuk menghilangkan take profit dr beberapa order.
    tp hasilnya yg brasil di modify cma order yg trakhir doank

    void Modify()
    {
    if(TakeProfit>0) TakeProfit=0;
    for(cnt=OrdersTotal();cnt>=0;cnt--)
    {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if(Symbol()==Symbol()&& OrderMagicNumber()==Magic)
    {
    if(OrderType()==OP_BUY)
    {
    if(TakeProfit>0)
    OrderModify(OrderTicket(),OrderOpenPrice(),0,0,0,C LR_NONE);
    }
    }
    }
    }

    mohon bantunnya, soalnya dah smalam suntuk ga ketemu jalan kluarnya nih
    Bisa ga disertakan full scriptnya. kalau ga bisa coba hilangkan
    Code:
    TakeProfit=0;

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts