EA MT5: Pasang SL Sekali, Posisi Lain Otomatis Mengikuti
EA MT5 ini dibuat untuk memudahkan pengaturan Stop Loss (SL).
Cara kerjanya sangat sederhana. Jika terdapat beberapa posisi pada pair yang sama, cukup pasang SL secara manual pada salah satu posisi. EA akan membaca SL tersebut dan otomatis memasang SL yang sama pada posisi lainnya.
BUY dan SELL Sama-Sama Bisa
Fitur ini dapat digunakan untuk posisi BUY maupun SELL.
Contohnya, terdapat 3 posisi BUY. SL dipasang pada posisi pertama di harga 4353. EA akan otomatis memasang SL 4353 pada posisi BUY lainnya.
Begitu juga dengan posisi SELL. Jika SL dipasang pada salah satu posisi SELL, EA akan otomatis menerapkan SL tersebut pada posisi SELL lainnya.
Cara Kerja
- Buka beberapa posisi pada pair yang sama.
- Pasang SL secara manual pada salah satu posisi.
- EA mendeteksi perubahan SL.
- SL tersebut menjadi acuan.
- Posisi BUY atau SELL lainnya otomatis mengikuti.
Jadi, tidak perlu memasang SL satu per satu pada setiap posisi.
Intinya: pasang SL satu kali, posisi BUY atau SELL lainnya otomatis mengikuti.
//+------------------------------------------------------------------+ //| AutoSyncSL_MT5.mq5 | //| SL manual pada 1 posisi -> SL posisi lain otomatis ikut | //+------------------------------------------------------------------+ #property strict #property version "2.00" #includeCTrade trade; //================================================================== // INPUT //================================================================== input bool SyncSameSymbolOnly = true; // Hanya symbol yang sama input bool SyncSameTypeOnly = true; // BUY ke BUY, SELL ke SELL input bool IncludePositionsWithoutSL = true; input bool IncludePositionsWithSL = true; input int DeviationPoints = 20; //================================================================== // GLOBAL //================================================================== ulong LastMasterTicket = 0; double LastMasterSL = 0.0; datetime LastSyncTime = 0; //================================================================== // INIT //================================================================== int OnInit() { trade.SetAsyncMode(false); trade.SetDeviationInPoints(DeviationPoints); Print("=========================================="); Print("AUTO SYNC SL MT5 AKTIF"); Print("SL manual akan menjadi SL master."); Print("=========================================="); return(INIT_SUCCEEDED); } //================================================================== // DEINIT //================================================================== void OnDeinit(const int reason) { Print("AutoSyncSL berhenti."); } //================================================================== // TRADE TRANSACTION //================================================================== void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result ) { // Hanya proses perubahan deal/order/position if(trans.type != TRADE_TRANSACTION_DEAL_ADD && trans.type != TRADE_TRANSACTION_ORDER_ADD && trans.type != TRADE_TRANSACTION_POSITION) { return; } // Beri sedikit waktu agar posisi sudah ter-update Sleep(50); CheckAllPositions(); } //================================================================== // CEK SEMUA POSISI //================================================================== void CheckAllPositions() { int total = PositionsTotal(); for(int i = 0; i < total; i++) { ulong ticket = PositionGetTicket(i); if(ticket == 0) continue; if(!PositionSelectByTicket(ticket)) continue; string symbol = PositionGetString(POSITION_SYMBOL); double sl = PositionGetDouble(POSITION_SL); //============================================================== // Kita hanya mencari posisi yang mempunyai SL //============================================================== if(sl <= 0.0) continue; //============================================================== // Cek apakah SL ini adalah perubahan/master baru //============================================================== if(ticket != LastMasterTicket || !SamePrice(sl, LastMasterSL, symbol)) { LastMasterTicket = ticket; LastMasterSL = sl; Print("------------------------------------------"); Print("SL MASTER TERDETEKSI"); Print("Ticket : ", ticket); Print("Symbol : ", symbol); Print("SL : ", DoubleToString( sl, (int)SymbolInfoInteger( symbol, SYMBOL_DIGITS ) ) ); Print("------------------------------------------"); SyncSL(ticket, symbol, sl); return; } } } //================================================================== // SINKRONISASI SL //================================================================== void SyncSL( ulong masterTicket, string masterSymbol, double masterSL ) { if(!PositionSelectByTicket(masterTicket)) return; ENUM_POSITION_TYPE masterType = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE); int total = PositionsTotal(); for(int i = 0; i < total; i++) { ulong ticket = PositionGetTicket(i); if(ticket == 0) continue; // Jangan ubah posisi master if(ticket == masterTicket) continue; if(!PositionSelectByTicket(ticket)) continue; string symbol = PositionGetString(POSITION_SYMBOL); ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE); double oldSL = PositionGetDouble(POSITION_SL); double oldTP = PositionGetDouble(POSITION_TP); //============================================================== // SYMBOL HARUS SAMA //============================================================== if(SyncSameSymbolOnly) { if(symbol != masterSymbol) continue; } //============================================================== // TYPE HARUS SAMA // BUY -> BUY // SELL -> SELL //============================================================== if(SyncSameTypeOnly) { if(type != masterType) continue; } //============================================================== // POSISI TANPA SL //============================================================== if(oldSL == 0.0) { if(!IncludePositionsWithoutSL) continue; } //============================================================== // POSISI SUDAH PUNYA SL //============================================================== if(oldSL != 0.0) { if(!IncludePositionsWithSL) continue; } //============================================================== // NORMALISASI SL //============================================================== int digits = (int)SymbolInfoInteger( symbol, SYMBOL_DIGITS ); double newSL = NormalizeDouble( masterSL, digits ); //============================================================== // VALIDASI SL //============================================================== if(!CheckSLValid(symbol, type, newSL)) { Print("SL TIDAK VALID"); Print("Ticket : ", ticket); Print("Symbol : ", symbol); Print("SL : ", DoubleToString(newSL, digits)); continue; } //============================================================== // MODIFY POSITION //============================================================== ResetLastError(); bool modified = trade.PositionModify( ticket, newSL, oldTP ); if(modified) { Print("SL BERHASIL DISINKRONKAN"); Print("Ticket : ", ticket); Print("Symbol : ", symbol); Print("SL : ", DoubleToString(newSL, digits)); } else { Print("GAGAL MODIFY SL"); Print("Ticket : ", ticket); Print("Symbol : ", symbol); Print("Error : ", GetLastError()); Print("Retcode: ", trade.ResultRetcode()); Print("Desc : ", trade.ResultRetcodeDescription()); } } LastSyncTime = TimeCurrent(); } //================================================================== // VALIDASI SL //================================================================== bool CheckSLValid( string symbol, ENUM_POSITION_TYPE type, double sl ) { double bid = SymbolInfoDouble( symbol, SYMBOL_BID ); double ask = SymbolInfoDouble( symbol, SYMBOL_ASK ); double point = SymbolInfoDouble( symbol, SYMBOL_POINT ); int stopsLevel = (int)SymbolInfoInteger( symbol, SYMBOL_TRADE_STOPS_LEVEL ); int freezeLevel = (int)SymbolInfoInteger( symbol, SYMBOL_TRADE_FREEZE_LEVEL ); double minimumDistance = MathMax( stopsLevel, freezeLevel ) * point; //============================================================== // BUY // SL harus di bawah BID //============================================================== if(type == POSITION_TYPE_BUY) { if(sl >= bid) return false; if(minimumDistance > 0) { if((bid - sl) < minimumDistance) return false; } } //============================================================== // SELL // SL harus di atas ASK //============================================================== if(type == POSITION_TYPE_SELL) { if(sl <= ask) return false; if(minimumDistance > 0) { if((sl - ask) < minimumDistance) return false; } } return true; } //================================================================== // BANDINGKAN HARGA //================================================================== bool SamePrice( double price1, double price2, string symbol ) { double point = SymbolInfoDouble( symbol, SYMBOL_POINT ); if(MathAbs(price1 - price2) <= point) return true; return false; } //+------------------------------------------------------------------+
Penutup
Dengan EA MT5 ini, pengaturan Stop Loss (SL) menjadi lebih praktis dan cepat.
Cukup pasang SL pada satu posisi, kemudian posisi BUY maupun SELL lainnya akan otomatis mengikuti.
Pasang SL sekali, biarkan EA yang mengatur sisanya.

Gabung dalam percakapan