Selamat datang, rakan-rakan trader! Hari ini kita akan membincangkan tentang AK-47 Scalper EA, sebuah sistem trading yang direka khusus untuk MetaTrader 5. Sistem ini menggunakan algoritma yang canggih untuk membantu anda mendapatkan keuntungan dalam trading. Mari kita lihat dengan lebih mendalam mengenai ciri-ciri dan cara mengkonfigurasi EA ini.
1. Parameter Input
#define ExtBotName "AK-47 EA"// Nama Bot#define Version "1.00"// Import kelas inputal#include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> #include <Trade\OrderInfo.mqh> //--- memperkenalkan pembolehubah yang telah ditetapkan untuk kebolehbacaan kod #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID) //--- parameter inputinputstring EASettings = "---------------------------------------------"; //-------- <EA Settings> --------inputint InpMagicNumber = 124656; //Nombor Ajaibinputstring MoneySettings = "---------------------------------------------"; //-------- <Money Settings> --------inputbool isVolume_Percent = true; //Benarkan Peratusan Volumeinputdouble InpRisk = 3; //Peratus Risiko dari Baki (%)inputstring TradingSettings = "---------------------------------------------"; //-------- <Trading Settings> --------inputdouble Inpuser_lot = 0.01; //Lotinputdouble InpSL_Pips = 3.5 //Stoploss (dalam Pips)inputdouble InpTP_Pips = 7 //TP (dalam Pips) (0 = Tiada TP)inputint InpMax_slippage = 3 //Slippage maksimum yang dibenarkan Pips.inputdouble InpMax_spread = 5 //Spread maksimum yang dibenarkan (dalam Point) (0 = mengambang)inputstring TimeSettings = "---------------------------------------------"; //-------- <Trading Time Settings> --------inputbool InpTimeFilter = true; //Penapis Waktu Tradinginputint InpStartHour = 2; //Jam Mulainputint InpStartMinute = 30 //Minit Mulainputint InpEndHour = 21 //Jam Tamatinputint InpEndMinute = 0 //Minit Tamat
2. Inisialisasi Pembolehubah Tempatan
//--- Pembolehubahint Pips2Points; // slippage 3 pips 3=points 30=pointsdouble Pips2Double; // Stoploss 15 pips 0.015 0.0150bool isOrder = false; int slippage; long acSpread; string strComment = ""; CPositionInfo m_position; // objek posisi perdagangan CTrade m_trade; // objek perdagangan CSymbolInfo m_symbol; // objek info simbol CAccountInfo m_account; // pembalut info akaun COrderInfo m_order; // objek pesanan yang tertunda
3. Kod Utama
a/ Fungsi Inisialisasi Expert
//+------------------------------------------------------------------+//| Fungsi inisialisasi Expert |//+------------------------------------------------------------------+intOnInit() { //Pengesanan 3 atau 5 digit //Pip dan point if(_Digits % 2 == 1) { Pips2Double = _Point*10; Pips2Points = 10; slippage = 10* InpMax_slippage; } else { Pips2Double = _Point; Pips2Points = 1; slippage = InpMax_slippage; } if(!m_symbol.Name(Symbol())) // menetapkan nama simbol return(INIT_FAILED); RefreshRates(); //--- m_trade.SetExpertMagicNumber(InpMagicNumber); m_trade.SetMarginMode(); m_trade.SetTypeFillingBySymbol(m_symbol.Name()); m_trade.SetDeviationInPoints(slippage); //--- return(INIT_SUCCEEDED); }
b/ Fungsi Tick Expert
//+------------------------------------------------------------------+//| Fungsi tick Expert |//+------------------------------------------------------------------+voidOnTick() { if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) == false) { Comment("LazyBot\nPerdagangan tidak dibenarkan."); return; } MqlDateTime structTime; TimeCurrent(structTime); structTime.sec = 0; //Tetapkan waktu mula structTime.hour = InpStartHour; structTime.min = InpStartMinute; datetime timeStart = StructToTime(structTime); //Tetapkan waktu tamat structTime.hour = InpEndHour; structTime.min = InpEndMinute; datetime timeEnd = StructToTime(structTime); acSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD); strComment = "\n" + ExtBotName + " - v." + (string)Version; strComment += "\nMasa pelayan = " + TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS) + " - " + DayOfWeekDescription(structTime.day_of_week); strComment += "\nWaktu perdagangan = [" + (string)InpStartHour + "j" + (string)InpStartMinute + " --> " + (string)InpEndHour + "j" + (string)InpEndMinute + "]"; strComment += "\nSpread Semasa = " + (string)acSpread + " Poin"; Comment(strComment); //Kemas kini Nilai UpdateOrders(); TrailingStop(); //Syarat perdagangan mengikut sesi if(InpTimeFilter) { if(TimeCurrent() >= timeStart && TimeCurrent() < timeEnd) { if(!isOrder) OpenOrder(); } } else { if(!isOrder) OpenOrder(); } } //---Akhir fungsi
3.1 Mengira isyarat untuk menghantar pesanan
//+------------------------------------------------------------------+//| MENGIRA ISYARAT DAN HANTAR PESANAN |//+------------------------------------------------------------------+void OpenOrder(){ ENUM_ORDER_TYPE OrdType = ORDER_TYPE_SELL;//-1; double TP = 0; double SL = 0; string comment = ExtBotName; //Mengira Lots double lot1 = CalculateVolume(); if(OrdType == ORDER_TYPE_SELL) { double OpenPrice = Bid - NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits); TP = OpenPrice - NormalizeDouble(InpTP_Pips * Pips2Double, _Digits); SL = Ask + NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits); if(CheckSpreadAllow() //Periksa Spread && CheckVolumeValue(lot1) //Periksa volume && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_SELL_STOP, OpenPrice) //Periksa Jarak dari openPrice ke Bid && CheckStopLoss(OpenPrice, SL, TP) //Periksa Jarak dari SL, TP ke OpenPrice && CheckMoneyForTrade(m_symbol.Name(), lot1, ORDER_TYPE_SELL)) //Periksa Baki ketika arahan dibenarkan { if(!m_trade.SellStop(lot1, OpenPrice, m_symbol.Name(), SL, TP, ORDER_TIME_GTC, 0, comment)) Print(__FUNCTION__,"--> Kesalahan OrderSend ", m_trade.ResultComment()); } } elseif(OrdType == ORDER_TYPE_BUY) { double OpenPrice = Ask + NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits); SL = Bid - NormalizeDouble(InpSL_Pips/2 * Pips2Double, _Digits); if(CheckSpreadAllow() //Periksa Spread && CheckVolumeValue(lot1) //Periksa volume && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_BUY_STOP, OpenPrice) //Periksa Jarak dari openPrice ke Bid && CheckStopLoss(OpenPrice, SL, TP) //Periksa Jarak dari SL, TP ke OpenPrice && CheckMoneyForTrade(m_symbol.Name(), lot1, ORDER_TYPE_BUY)) //Periksa Baki ketika arahan dibenarkan { if(!m_trade.BuyStop(lot1, OpenPrice, m_symbol.Name(), SL, TP, ORDER_TIME_GTC, 0, comment))// gunakan "ORDER_TIME_GTC" apabila tarikh tamat = 0 Print(__FUNCTION__,"--> Kesalahan OrderSend ", m_trade.ResultComment()); } } }
3.2 Mengira Volume
//+------------------------------------------------------------------+//| MENGIRA VOLUME |//+------------------------------------------------------------------+// Kami mendefinisikan fungsi untuk mengira saiz posisi dan mengembalikan lot untuk pesanan.double CalculateVolume() { double LotSize = 0; if(isVolume_Percent == false) { LotSize = Inpuser_lot; } else { LotSize = (InpRisk) * m_account.FreeMargin(); LotSize = LotSize /100000; double n = MathFloor(LotSize/Inpuser_lot); //Comment((string)n); LotSize = n * Inpuser_lot; if(LotSize < Inpuser_lot) LotSize = Inpuser_lot; if(LotSize > m_symbol.LotsMax()) LotSize = m_symbol.LotsMax(); if(LotSize < m_symbol.LotsMin()) LotSize = m_symbol.LotsMin(); } //--- return(LotSize); }3.3 EA mempunyai fungsi "trailing Stop", SL akan berubah setiap kali harga berubah (turun)
//+------------------------------------------------------------------+//| TRAILING STOP |//+------------------------------------------------------------------+void TrailingStop() { double SL_in_Pip = 0; for(int i = PositionsTotal() - 1; i >= 0; i--) { if(m_position.SelectByIndex(i)) { // memilih pesanan mengikut indeks untuk akses seterusnya kepada sifatnya if((m_position.Magic() == InpMagicNumber) && (m_position.Symbol() == m_symbol.Name())) { // Untuk pesanan Buy if(m_position.PositionType() == POSITION_TYPE_BUY) { //--Mengira SL apabila harga berubah SL_in_Pip = NormalizeDouble(Bid - m_position.StopLoss(), _Digits) / Pips2Double; if(SL_in_Pip > InpSL_Pips) { double newSL = NormalizeDouble(Bid - InpSL_Pips * Pips2Double, _Digits); if(!m_trade.PositionModify(m_position.Ticket(), newSL, m_position.TakeProfit())) { Print(__FUNCTION__,"--> Kesalahan OrderModify ", m_trade.ResultComment()); continue } } } //Untuk Pesanan Jual elseif(m_position.PositionType() == POSITION_TYPE_SELL) { //--Mengira SL apabila harga berubah SL_in_Pip =NormalizeDouble(m_position.StopLoss() - Bid, _Digits) / Pips2Double; if(SL_in_Pip > InpSL_Pips){ double newSL = NormalizeDouble(Bid + (InpSL_Pips) * Pips2Double, _Digits); if(!m_trade.PositionModify(m_position.Ticket(), newSL, m_position.TakeProfit())) { Print(__FUNCTION__,"--> Kesalahan OrderModify ", m_trade.ResultComment()); //continue; } } } } } //--- Mengubah pesanan tertunda for(int i=OrdersTotal()-1; i>=0; i--) {// mengembalikan jumlah pesanan semasa if(m_order.SelectByIndex(i)) { // memilih pesanan tertunda mengikut indeks untuk akses seterusnya kepada sifatnya if(m_order.Symbol() == m_symbol.Name() && m_order.Magic()==InpMagicNumber) { if(m_order.OrderType() == ORDER_TYPE_BUY_STOP) { SL_in_Pip = NormalizeDouble(Bid - m_order.StopLoss(), _Digits) / Pips2Double; if(SL_in_Pip < InpSL_Pips/2) { double newOP = NormalizeDouble(Bid + (InpSL_Pips/2) * Pips2Double, _Digits); double newTP = NormalizeDouble(newOP + InpTP_Pips * Pips2Double, _Digits); double newSL = NormalizeDouble(Bid - (InpSL_Pips/2) * Pips2Double, _Digits); if(!m_trade.OrderModify(m_order.Ticket(), newOP, newSL, newTP, ORDER_TIME_GTC,0)) { Print(__FUNCTION__,"--> Kesalahan Modify PendingOrder!", m_trade.ResultComment()); continue //continue; elseif(m_order.OrderType() == ORDER_TYPE_SELL_STOP) { SL_in_Pip = NormalizeDouble(m_order.StopLoss() - Ask, _Digits) / Pips2Double; if(SL_in_Pip < InpSL_Pips/2){ double newOP = NormalizeDouble(Ask - (InpSL_Pips/2) * Pips2Double, _Digits); double newTP = NormalizeDouble(newOP - InpTP_Pips * Pips2Double, _Digits); double newSL = NormalizeDouble(Ask + (InpSL_Pips/2) * Pips2Double, _Digits); if(!m_trade.OrderModify(m_order.Ticket(), newOP, newSL, newTP, ORDER_TIME_GTC,0)) { Print(__FUNCTION__,"--> Kesalahan Modify PendingOrder!", m_trade.ResultComment()); //continue; //continue; } }

Komen 0