AK-47 Scalper EA: Jouw Gids voor MetaTrader 5

Mike 2023.06.12 03:06 56 0 0
Bijlage

Welkom bij mijn blog! Vandaag gaan we het hebben over de AK-47 Scalper EA, een krachtige trading tool voor MetaTrader 5 die je kan helpen je handelsstrategieën te optimaliseren.

1. Invoeren van parameters

#define ExtBotName "AK-47 EA" // Bot Naam
#define Version "1.00"

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\OrderInfo.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)

input string EASettings = "---------------------------------------------"; // <EA Instellingen>
input int InpMagicNumber = 124656; // Magisch Nummer
input string MoneySettings = "---------------------------------------------"; // <Geld Instellingen>
input bool isVolume_Percent = true; // Sta Volume Percentage toe
input double InpRisk = 3; // Risico percentage van het saldo (%)
input string TradingSettings = "---------------------------------------------"; // <Trading Instellingen>
input double Inpuser_lot = 0.01; // Lots
input double InpSL_Pips = 3.5; // Stoploss (in Pips)
input double InpTP_Pips = 7; // TP (in Pips) (0 = Geen TP)
input int InpMax_slippage = 3; // Maximale slippage toelaatbaar
input double InpMax_spread = 5; // Maximale toegestane spread (in punten)
input string TimeSettings = "---------------------------------------------"; // <Tijd Instellingen>
input bool InpTimeFilter = true; // Trading Tijd Filter
input int InpStartHour = 2; // Start Uur
input int InpStartMinute = 30; // Start Minuten
input int InpEndHour = 21; // Eind Uur
input int InpEndMinute = 0; // Eind Minuten

2. Initialisatie van lokale variabelen

//--- Variabelen
int Pips2Points; // slippage 3 pips 3=punten 30=punten
double Pips2Double; // Stoploss 15 pips 0.015
bool isOrder = false;
int slippage;
long acSpread;
string strComment = "";

CPositionInfo m_position; // Trade positie object
CTrade m_trade; // Trading object
CSymbolInfo m_symbol; // Symbool info object
CAccountInfo m_account; // Account info wrapper
COrderInfo m_order; // Pending orders object

3. Hoofdcodes

a. Expert initialisatiefunctie

int OnInit() {

    // Detectie van 3 of 5 cijfers
    // Pip en punt
    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()))
        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. Expert tick functie

void OnTick() { if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) == false) { Comment("LazyBot\nTrading niet toegestaan."); return; } MqlDateTime structTime; TimeCurrent(structTime); structTime.sec = 0; // Starttijd instellen structTime.hour = InpStartHour; structTime.min = InpStartMinute; datetime timeStart = StructToTime(structTime); // Eindtijd instellen structTime.hour = InpEndHour; structTime.min = InpEndMinute; datetime timeEnd = StructToTime(structTime); acSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD); strComment = "\n" + ExtBotName + " - v." + (string)Version; strComment += "\nServer tijd = " + TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS) + " - " + DayOfWeekDescription(structTime.day_of_week); strComment += "\nTrading tijd = [" + (string)InpStartHour + "h" + (string)InpStartMinute + " --> " + (string)InpEndHour + "h" + (string)InpEndMinute + "]"; strComment += "\nHuidige Spread = " + (string)acSpread + " Punten"; Comment(strComment); // Waarden bijwerken UpdateOrders(); TrailingStop(); // Handelsvoorwaarden volgens de tijd if(InpTimeFilter) { if(TimeCurrent() >= timeStart && TimeCurrent() 

3.1 Bereken signaal om orders te verzenden

void OpenOrder() {
    
    ENUM_ORDER_TYPE OrdType = ORDER_TYPE_SELL;
    double TP = 0;
    double SL = 0;
    string comment = ExtBotName;
    
    // Bereken 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() && CheckVolumeValue(lot1) && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_SELL_STOP, OpenPrice) && CheckStopLoss(OpenPrice, SL, TP) && CheckMoneyForTrade(m_symbol.Name(), lot1, ORDER_TYPE_SELL)) {
            if(!m_trade.SellStop(lot1, OpenPrice, m_symbol.Name(), SL, TP, ORDER_TIME_GTC, 0, comment))
                Print(__FUNCTION__, "--> OrderSend error ", m_trade.ResultComment());
        }
    }
    else if(OrdType == ORDER_TYPE_BUY) {
        double OpenPrice = Ask + NormalizeDouble(InpSL_Pips / 2 * Pips2Double, _Digits);
        SL = Bid - NormalizeDouble(InpSL_Pips / 2 * Pips2Double, _Digits);
        
        if(CheckSpreadAllow() && CheckVolumeValue(lot1) && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_BUY_STOP, OpenPrice) && CheckStopLoss(OpenPrice, SL, TP) && CheckMoneyForTrade(m_symbol.Name(), lot1, ORDER_TYPE_BUY)) {
            if(!m_trade.BuyStop(lot1, OpenPrice, m_symbol.Name(), SL, TP, ORDER_TIME_GTC, 0, comment))
                Print(__FUNCTION__, "--> OrderSend error ", m_trade.ResultComment());
        }
    }
}

3.2 Bereken Volume

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); LotSize = n * Inpuser_lot; if(LotSize m_symbol.LotsMax()) LotSize = m_symbol.LotsMax(); if(LotSize 

3.3 EA heeft een functie "trailing Stop"

void TrailingStop() {
    double SL_in_Pip = 0;
    
    for(int i = PositionsTotal() - 1; i >= 0; i--) {
        if(m_position.SelectByIndex(i)) {
            if((m_position.Magic() == InpMagicNumber) && (m_position.Symbol() == m_symbol.Name())) {
                if(m_position.PositionType() == POSITION_TYPE_BUY) {
                    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__, "--> OrderModify error ", m_trade.ResultComment());
                            continue;
                        }
                    }
                } else if(m_position.PositionType() == POSITION_TYPE_SELL) {
                    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__, "--> OrderModify error ", m_trade.ResultComment());
                            continue;
                        }
                    }
                }
            }
        }
    }
    
    //-- Wijzig pending order
    for(int i = OrdersTotal() - 1; i >= 0; i--) {
        if(m_order.SelectByIndex(i)) {
            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  Modify PendingOrder error!", m_trade.ResultComment());
                            continue;
                        }
                    }
                } else if(m_order.OrderType() == ORDER_TYPE_SELL_STOP) {
                    SL_in_Pip = NormalizeDouble(m_order.StopLoss() - Ask, _Digits) / Pips2Double;
                    if(SL_in_Pip  Modify PendingOrder error!", m_trade.ResultComment());
                            continue;
                        }
                    }
                }
            }
        }
    }
}
Lijst
Reactie 0