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

Mike 2023.06.12 03:06 112 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)

//--- इनपुट पैरामीटरinputstring  EASettings         = "---------------------------------------------"; //-------- <EA सेटिंग्स> --------inputint      InpMagicNumber    = 124656;   //मैजिक नंबरinputstring  MoneySettings      = "---------------------------------------------"; //-------- <पैसे की सेटिंग्स> --------inputbool     isVolume_Percent  = true;     //वॉल्यूम प्रतिशत की अनुमति देंinputdouble   InpRisk           = 3;        //बैलेंस का जोखिम प्रतिशत (%)inputstring  TradingSettings    = "---------------------------------------------"; //-------- <ट्रेडिंग सेटिंग्स> --------inputdouble   Inpuser_lot       = 0.01;     //लॉट्सinputdouble   InpSL_Pips        = 3.5;      //स्टॉपलॉस (पिप्स में)inputdouble   InpTP_Pips        = 7;        //टीपी (पिप्स में) (0 = कोई टीपी नहीं)inputint      InpMax_slippage   = 3;        //अधिकतम स्लिपेज की अनुमति (पिप्स में)inputdouble   InpMax_spread     = 5;        //अधिकतम अनुमति दी गई स्प्रेड (पॉइंट में) (0 = फ्लोटिंग)inputstring   TimeSettings      = "---------------------------------------------"; //-------- <ट्रेडिंग टाइम सेटिंग्स> --------inputbool     InpTimeFilter     = true;     //ट्रेडिंग टाइम फ़िल्टरinputint      InpStartHour      = 2;        //शुरू करने का घंटाinputint      InpStartMinute    = 30;       //शुरू करने का मिनटinputint      InpEndHour        = 21;       //समाप्त करने का घंटाinputint      InpEndMinute      = 0        //समाप्त करने का मिनट

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

//--- वेरिएबल्सint      Pips2Points;    // स्लिपेज  3 पिप्स    3=पॉइंट्स    30=पॉइंट्सdouble   Pips2Double;    // स्टॉपलॉस 15 पिप्स    0.015      0.0150bool     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/ एक्सपर्ट प्रारंभिककरण फ़ंक्शन

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

   //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/ एक्सपर्ट टिक फ़ंक्शन

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

   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());
      }
   }
   elseif(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  
                  }
               }
            }

            //सेल ऑर्डर के लिए
            elseif(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  
                  }
              }
            }
      } 
      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__,"--> Modify PendingOrder error!", m_trade.ResultComment());
                     //continue;  
                  }
              }
      } 
      } 
    }
  }
  }
  }

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

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