AK-47 स्कैल्पर EA - मेटाट्रेडर 5 के लिए बेहतरीन एक्सपर्ट एडवाइजर

Mike 2023.06.12 03:06 31 0 0
संलग्नक

क्या आप मेटाट्रेडर 5 पर ट्रेडिंग के लिए एक बेहतरीन एक्सपर्ट एडवाइजर (EA) की तलाश कर रहे हैं? तो आपका इंतज़ार खत्म हुआ! आज हम बात करेंगे AK-47 स्कैल्पर EA के बारे में, जो आपके ट्रेडिंग अनुभव को और भी बेहतर बना सकता है।

1. इनपुट पैरामीटर

#define ExtBotName "AK-47 EA"//बॉट का नाम
#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 सेटिंग्स> --------
input int      InpMagicNumber    = 124656;   //मैजिक नंबर
input string  MoneySettings      = "---------------------------------------------"; //-------- <पैसे की सेटिंग्स> --------
input bool     isVolume_Percent  = true;     //वॉल्यूम प्रतिशत की अनुमति दें
input double   InpRisk           = 3;        //बैलेंस का जोखिम प्रतिशत (%)
input string  TradingSettings    = "---------------------------------------------"; //-------- <ट्रेडिंग सेटिंग्स> --------
input double   Inpuser_lot       = 0.01;     //लॉट्स
input double   InpSL_Pips        = 3.5;      //स्टॉपलॉस (पिप्स में)
input double   InpTP_Pips        = 7;        //टीपी (पिप्स में) (0 = कोई टीपी नहीं)
input int      InpMax_slippage   = 3;        //अधिकतम स्लिपेज की अनुमति (पिप्स में)
input double   InpMax_spread     = 5;        //अधिकतम अनुमति दी गई स्प्रेड (पॉइंट में) (0 = फ्लोटिंग)
input string   TimeSettings      = "---------------------------------------------"; //-------- <ट्रेडिंग टाइम सेटिंग्स> --------
input bool     InpTimeFilter     = true;     //ट्रेडिंग टाइम फ़िल्टर
input int      InpStartHour      = 2;        //शुरू करने का घंटा
input int      InpStartMinute    = 30;       //शुरू करने का मिनट
input int      InpEndHour        = 21;       //समाप्त करने का घंटा
input int      InpEndMinute      = 0        //समाप्त करने का मिनट

2. स्थानीय वेरिएबल्स का प्रारंभ

//--- वेरिएबल्स
int      Pips2Points;    // स्लिपेज  3 पिप्स    3=पॉइंट्स    30=पॉइंट्स
double   Pips2Double;    // स्टॉपलॉस 15 पिप्स    0.015      0.0150
bool     isOrder = false;
int      slippage;
long     acSpread;
string   strComment = "";

CPositionInfo  m_position;                   // ट्रेड पोजीशन ऑब्जेक्ट
CTrade         m_trade;                      // ट्रेडिंग ऑब्जेक्ट
CSymbolInfo    m_symbol;                     // प्रतीक जानकारी ऑब्जेक्ट
CAccountInfo   m_account;                    // खाता जानकारी रैपर
COrderInfo     m_order;                      // पेंडिंग ऑर्डर्स ऑब्जेक्ट

3. मुख्य कोड

a/ एक्सपर्ट प्रारंभिककरण फ़ंक्शन

//+------------------------------------------------------------------+
//| एक्सपर्ट प्रारंभिककरण फ़ंक्शन                                   |
//+------------------------------------------------------------------+
int OnInit() {

   //3 या 5 डिजिट पहचान
   //पिप और पॉइंट
   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/ एक्सपर्ट टिक फ़ंक्शन

//+------------------------------------------------------------------+
//| एक्सपर्ट टिक फ़ंक्शन                                             |
//+------------------------------------------------------------------+
void OnTick() {

   if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) == false) {
      Comment("LazyBot\nTrade not allowed.");
      return;
   }
     
   MqlDateTime structTime;
   TimeCurrent(structTime);
   structTime.sec = 0;
   
   //शुरू करने का समय सेट करें
   structTime.hour = InpStartHour;
   structTime.min = InpStartMinute;       
   datetime timeStart = StructToTime(structTime);
   
   //समाप्त करने का समय सेट करें
   structTime.hour = InpEndHour;
   structTime.min = InpEndMinute;
   datetime timeEnd = StructToTime(structTime);
   
   acSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
   
   
   strComment = "\n" + ExtBotName + " - v." + (string)Version;
   strComment += "\nSever time = " + TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS) + " - " + DayOfWeekDescription(structTime.day_of_week);
   strComment += "\nTrading time = [" + (string)InpStartHour + "h" + (string)InpStartMinute + " --> " +  (string)InpEndHour + "h" + (string)InpEndMinute + "]";
   
   strComment += "\nCurrent Spread = " + (string)acSpread + " Points";
   
   Comment(strComment);
   
   //अपडेट मान
   UpdateOrders();
   
   TrailingStop();
      
   //माय फेज के अनुसार ट्रेडिंग की स्थिति
   if(InpTimeFilter) {
      if(TimeCurrent() >= timeStart && TimeCurrent() < timeEnd) {
         if(!isOrder) OpenOrder();
      }
   }
   else {
      if(!isOrder) OpenOrder();
   }
   
} //---समाप्त फ़ंक्शन

3.1 ऑर्डर भेजने के लिए सिग्नल की गणना करें

//+------------------------------------------------------------------+
//| सिग्नल की गणना करें और ऑर्डर भेजें                                  |
//+------------------------------------------------------------------+
void OpenOrder(){
   
   ENUM_ORDER_TYPE OrdType = ORDER_TYPE_SELL;//-1;
  
   double TP = 0;
   double SL = 0;
   string comment = ExtBotName;
   
   //लॉट्स की गणना करें
   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)                           //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)                           //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))// उपयोग करें "ORDER_TIME_GTC" जब समाप्ति तिथि = 0
         Print(__FUNCTION__,"--> OrderSend error ", m_trade.ResultComment());
      }
   }
   
}

3.2 वॉल्यूम की गणना करें

//+------------------------------------------------------------------+
//| वॉल्यूम की गणना करें                                                 |
//+------------------------------------------------------------------+
// हम स्थिति का आकार की गणना करने के लिए फ़ंक्शन को परिभाषित करते हैं और ऑर्डर के लिए लॉट लौटाते हैं।
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 में "ट्रेलिंग स्टॉप" फ़ंक्शन है

SL हर बार मूल्य परिवर्तन (नीचे) होने पर बदल जाएगा।

//+------------------------------------------------------------------+
//| ट्रेलिंग स्टॉप                                                    |
//+------------------------------------------------------------------+
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 की गणना करें
               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 की गणना करें
               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;  
              }
               }
            }
            }
      } 
   }
   //--- पेंडिंग ऑर्डर को संशोधित करें  
   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 < 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__,"--> 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 < 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__,"--> Modify PendingOrder error!", m_trade.ResultComment());
                     //continue;  
                  }
              }
      } 
      } 
    }
  }
  }
  }

अब आप जानते हैं कि AK-47 स्कैल्पर EA का उपयोग कैसे करें और इसके द्वारा प्रदान की गई सुविधाओं का लाभ कैसे उठाएं। अपने ट्रेडिंग अनुभव को बेहतर बनाने के लिए आज ही इसे आजमाएं!

सूची
टिप्पणी 0