Strategi Breakout dengan Fungsi Pembantu untuk Cabaran Prop Firm

Mike 2024.05.11 12:45 16 0 0
Lampiran

Hai semua,

Kali ini, saya ingin berkongsi kemas kini tentang Strategi Breakout yang Mudah dan Berkesan. Dalam kod ini, saya telah menambah beberapa fungsi pembantu untuk cabaran prop firm.

Secara umumnya, untuk lulus cabaran prop firm, anda perlu memenuhi tiga kriteria utama:

  • Target keuntungan
  • Tidak melanggar had kerugian harian maksimum
  • Tidak melanggar had kerugian maksimum

Dalam kod ini, saya telah menyertakan dua fungsi untuk memeriksa "Target keuntungan" dan "Hampir melanggar had kerugian harian maksimum" bagi menutup semua posisi dan menghapus semua pesanan tertunda secara automatik. Untuk "had kerugian maksimum", ia bergantung kepada strategi dan pengurusan risiko anda, jadi ia tidak akan dinyatakan dalam Skrip MQL5 ini.

//+------------------------------------------------------------------+
//| Fungsi Pembantu Prop Firm                                       |
//+------------------------------------------------------------------+

// Hapus semua pesanan tertunda dan tutup semua posisi
void ClearAll(string message)
{
   Comment(message);
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      ulong orderTicket = OrderGetTicket(i);
      if (OrderSelect(orderTicket)) 
      {
         trade.OrderDelete(orderTicket);
      }
   }

   for (int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong posTicket = PositionGetTicket(i);
      trade.PositionClose(posTicket);
   }
}

// Periksa jika kita telah mencapai target keuntungan
bool isPassed()
{
   return AccountInfoDouble(ACCOUNT_EQUITY) > PASS_CRITERIA;
}

// Periksa jika kita hampir melanggar had kerugian harian maksimum
bool isDailyLimit()
{
   MqlDateTime date_time;
   TimeToStruct(TimeCurrent(), date_time);
   int current_day = date_time.day, current_month = date_time.mon, current_year = date_time.year;
   
   // Baki semasa
   double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);
   
   // Dapatkan PL perdagangan yang ditutup hari ini
   HistorySelect(0, TimeCurrent());
   int orders = HistoryDealsTotal();
   
   double PL = 0.0;
   for (int i = orders - 1; i >= 0; i--)
   {
      ulong ticket=HistoryDealGetTicket(i);
      if(ticket==0)
      {
         Print("HistoryDealGetTicket gagal, tiada rekod perdagangan");
         break;
      }
      double profit = HistoryDealGetDouble(ticket,DEAL_PROFIT);
      if (profit != 0)
      {
         // Dapatkan waktu transaksi
         MqlDateTime deal_time;
         TimeToStruct(HistoryDealGetInteger(ticket, DEAL_TIME), deal_time);
         // Periksa waktu transaksi
         if (deal_time.day == current_day && deal_time.mon == current_month && deal_time.year == current_year)
         {
            PL += profit;
         }
         else
            break;
      }
   }
   double starting_balance = current_balance - PL;
   double current_equity   = AccountInfoDouble(ACCOUNT_EQUITY);
   return current_equity < starting_balance - DAILY_LOSS_LIMIT;
}

Parameter yang perlu kita nyatakan adalah:

input string dd = "-------------CABARAN PROP FIRM-----------------";
input bool   isChallenge = false;
input double PASS_CRITERIA = 110100;
input double DAILY_LOSS_LIMIT = 4500;

Saya harap anda mendapati nilai dalam skrip ini.


Senarai
Komen 0