← К каталогу
Исходный код · ID 646

sure hedging pipschart.mq4

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Это торговый советник для MetaTrader 4, написанный на языке MQL4. Советник работает на одном символе графика и использует отложенные ордера для построения сетки хеджирующих сделок. Основной обработчик start() вызывается на каждом тике и управляет открытием, модификацией и удалением ордеров.

Логика советника основана на последовательном открытии рыночных и отложенных ордеров. После открытия первой сделки советник выставляет отложенный ордер противоположного направления на заданном расстоянии. При срабатывании отложенного ордера выставляется следующий отложенный ордер с увеличенным лотом. Количество шагов сетки ограничено десятью уровнями, для каждого из которых можно задать своё расстояние. Объём сделок рассчитывается либо как фиксированный лот, либо пропорционально балансу счёта, с применением коэффициентов умножения для хеджирующих сделок.

Советник поддерживает настройку уровней стоп-лосс и тейк-профит, а также учитывает спред при расчёте уровней для ордеров на продажу. Предусмотрена возможность остановки торговли при достижении заданной дневной прибыли в валюте счёта или в процентах от баланса на начало дня. Для аккаунтов с рыночным исполнением (ECN/STP) можно включить режим, при котором стоп-лосс и тейк-профит устанавливаются после отправки ордера.

Советник содержит встроенную обработку ошибок торговых операций с повторными попытками отправки запросов и ведёт подробный лог в журнал эксперта. Все торговые операции выполняются только по текущему символу и идентифицируются по магическому номеру, начиная с заданного начального значения.

Настройки программы

НастройкаОписание
initial_deal Начальная сделка — Направление начальной сделки: 0 — покупка, 1 — продажа, любое другое значение — открытие новых сделок отключено.
stoploss Стоп-лосс — Уровень стоп-лосса в пунктах для всех сделок.
takeprofit Тейк-профит — Уровень тейк-профита в пунктах для всех сделок.
fixed_lot Фиксированный лот — Если больше 0, начальная сделка открывается этим фиксированным объёмом.
deposit_lot Лот от депозита — Если fixed_lot равен 0 и deposit_lot больше 0, начальная сделка открывается объёмом, равным балансу, делённому на deposit_lot.
martin_koeff1 Коэффициент Мартингейла 1 — Коэффициент умножения лота для первой хеджирующей сделки.
martin_koeff2 Коэффициент Мартингейла 2 — Коэффициент умножения лота для второй и последующих хеджирующих сделок.
enable_daily_profit Включить дневную прибыль — Включает остановку торговли при превышении заданной дневной прибыли. Учитывается прибыль по всем валютам.
daily_profit Дневная прибыль в валюте — Целевая дневная прибыль в валюте счёта. При достижении этой суммы торговля останавливается, если включена соответствующая опция.
daily_profit_percent Дневная прибыль в процентах — Целевая дневная прибыль в процентах от баланса на начало дня. При достижении этого значения торговля останавливается, если включена соответствующая опция.
distance0 Расстояние 0 — Если больше 0, задаёт расстояние в пунктах для выставления первой хеджирующей сделки. Если значение не задано, используется значение takeprofit.
distance1 Расстояние 1 — Если больше 0, задаёт расстояние в пунктах для выставления второй хеджирующей сделки.
distance2 Расстояние 2 — Если больше 0, задаёт расстояние в пунктах для выставления третьей хеджирующей сделки.
distance3 Расстояние 3 — Если больше 0, задаёт расстояние в пунктах для выставления четвёртой хеджирующей сделки.
distance4 Расстояние 4 — Если больше 0, задаёт расстояние в пунктах для выставления пятой хеджирующей сделки.
distance5 Расстояние 5 — Если больше 0, задаёт расстояние в пунктах для выставления шестой хеджирующей сделки.
distance6 Расстояние 6 — Если больше 0, задаёт расстояние в пунктах для выставления седьмой хеджирующей сделки.
distance7 Расстояние 7 — Если больше 0, задаёт расстояние в пунктах для выставления восьмой хеджирующей сделки.
distance8 Расстояние 8 — Если больше 0, задаёт расстояние в пунктах для выставления девятой хеджирующей сделки.
distance9 Расстояние 9 — Если больше 0, задаёт расстояние в пунктах для выставления десятой хеджирующей сделки.
normal_spread Нормальный спред — Значение в пунктах, которое вычитается из тейк-профита для ордеров на продажу и добавляется к стоп-лоссу для ордеров на продажу, чтобы учесть спред.
sep0 Разделитель — Строковый параметр, используемый как разделитель или метка в настройках советника.
params_digits Разрядность параметров — Если равно 4, стоп-лосс, тейк-профит и расстояния задаются в 4-значных пунктах; если равно 5 — в 5-значных пунктах.
initial_magic Начальный магический номер — Начальный магический номер для первой сделки. Для каждой последующей хеджирующей сделки номер увеличивается на 1.
market_execution Рыночное исполнение — Установите 1 для аккаунтов ECN и STP, чтобы стоп-лосс и тейк-профит устанавливались только после отправки ордера.
command_attempts Количество попыток отправки — Количество попыток одновременной отправки торгового запроса брокеру при возникновении ошибки.
max_slippage Максимальное проскальзывание — Максимально допустимое проскальзывание в пунктах между желаемой ценой и ценой исполнения ордера.
Получить полный код

Поиск по коду файла

#include <stderror.mqh>

#define sec_wait_context 10
#define max_errors 30
#define wait_error 1000
#define busysleep 100
#define EB_NEXTTRY 0
#define EB_WAITTRY 1
#define EB_TERMINATE 2
#define StoplevelAdd 0

extern int initial_deal = 0 ; // Arah kesepakatan awal: 0 - kesepakatan beli, 1 - kesepakatan jual, nilai lain - pembukaan baru dinonaktifkan
extern double stoploss = 60 ; // Stoploss untuk semua transaksi
extern double takeprofit = 30 ; //ambil untung untuk semua transaksi
extern double fixed_lot = 0.1 ; // Jika > 0, kesepakatan awal akan dibuka dengan lot ini
extern double deposit_lot = 0 ; //If fixed_lot is 0 and deposit_lot > 0, the initial deal will be opened with Balance Volume / deposit_lot lot
extern double martin_koeff1 = 3 ; // Pengganda lot untuk transaksi lindung nilai pertama
extern double martin_koeff2 = 2 ; //Lot multiplier for the second, third and subsequent hedging transactions
extern int enable_daily_profit = 0 ; //Enable option to stop trading if daily profit exceeds the following value (this considers profit for ALL currencies)
extern double daily_profit = 0 ; // Keuntungan harian dalam mata uang akun
extern double daily_profit_percent = 0 ; // Keuntungan harian sebagai persen ke Saldo awal hari
extern double distance0 = 30 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai pertama
extern double distance1 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-2
extern double distance2 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-3
extern double distance3 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-4
extern double distance4 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-5
extern double distance5 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-6
extern double distance6 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-7
extern double distance7 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-8
extern double distance8 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-9
extern double distance9 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-10
extern double normal_spread = 0 ; //This value in pips is subtracted from SELL takeprofit and added to SELL stoploss to account for spread
extern string sep0 = " common EA settings " ;
extern int params_digits = 4 ; //If = 4, then stoploss, takeprofit and distance are specified in 4-digit points, if = 5, then in 5-digit pips
extern int initial_magic = 123000 ; //Initial magic number for the first deal. Hedging transactions add 1 to this number
extern int market_execution = 0 ; //Set to 1 for ECN and STP accounts (stoploss and takeprofit are modified only after the order is sent)
extern int command_attempts = 5 ; // Jumlah upaya pengiriman permintaan broker secara simultan (jika terjadi kesalahan)
extern int max_slippage = 10 ; //Maximum slippage is the difference between the price desired by the trader when placing an order and the actual price at which the order is executed

int go = true ;
double point, d_stoplevel, d_freezelevel, d_buystop, d_sellstop, d_buytake, d_selltake ;
int errors = 0 ;
int lotsdigits ;

double dist [10] ;

int init()
{
      // код доступен только после оплаты
   }

int start()
{
      // код доступен только после оплаты
   }

int ErrorBlock (int err, int ms)
{
   string str = "" ;
   int res = EB_TERMINATE ;

   switch (err)
   {
      case ERR_NO_ERROR:
         str = "No error" ;

         break ;
      case ERR_NO_RESULT:
         str = "Unknown result" ;

         break ;
      case ERR_COMMON_ERROR:
         str = "Common error. Probably the signal was rejected by user or trade direction is denied in expert settings" ;

         break ;
      case ERR_INVALID_TRADE_PARAMETERS:
         str = "Wrong trade function parameters" ;

         break ;
      case ERR_SERVER_BUSY:
         str = "Server is busy. Waiting..." ;
         res = EB_WAITTRY ;

         break ;
      case ERR_OLD_VERSION:
         str = "Old version of client terminal" ;

         break ;
      case ERR_NO_CONNECTION:
         str = "No connection with trade server. Waiting..." ;
         res = EB_WAITTRY ;

         break ;
      case ERR_NOT_ENOUGH_RIGHTS:
         str = "Not enough rights" ;

         break ;   
      case ERR_TOO_MANY_REQUESTS:
      case ERR_TOO_FREQUENT_REQUESTS:
         str = "To many requests" ;

         break ;
      case ERR_MALFUNCTIONAL_TRADE:
         str = "Malfunctional trade" ;

         break ;
      case ERR_ACCOUNT_DISABLED:
         str = "The account is blocked" ;

         break ;
      case ERR_INVALID_ACCOUNT:
         str = "Invalid account" ;

         break ;
      case ERR_TRADE_TIMEOUT:
         str = "Trade timeout exceeded" ;
         res = EB_NEXTTRY ;

         break ;
      case ERR_INVALID_PRICE:
         str = "Wrong price" ;
         res = EB_NEXTTRY ;

         break ;
      case ERR_INVALID_STOPS:
         str = "Invalid stops" ;

         break ;
      case ERR_INVALID_TRADE_VOLUME:
         str = "Invalid trade volume" ;

         break ;
      case ERR_MARKET_CLOSED:
         str = "The market is closed" ;

         break ;
      case ERR_TRADE_DISABLED:
         str = "Trade is disabled" ;

         break ;
      case ERR_NOT_ENOUGH_MONEY:
         str = "Not enough money to complete operation" ;

         break ;
      case ERR_PRICE_CHANGED:
         str = "The price has changed, trying again" ;
         res = EB_NEXTTRY ;

         break ;
      case ERR_OFF_QUOTES:
         str = "The broker sent offquotes. Trying again" ;
         res = EB_NEXTTRY ;

         break ;
      case ERR_BROKER_BUSY:
         str = "The broker is budy. Waiting..." ;
         res = EB_WAITTRY ;

         break ;
      case ERR_REQUOTE:
         str = "The broker sent requote. Trying again" ;
         res = EB_WAITTRY ;

         break ;
      case ERR_ORDER_LOCKED:
         str = "The order is already processing" ;

         break ;
      case ERR_LONG_POSITIONS_ONLY_ALLOWED:
         str = "Only long positions allowed" ;

         break ;
      case ERR_TRADE_MODIFY_DENIED:
         str = "Modification is denied because the order is too close to the price" ;
         res = EB_WAITTRY ;

         break ;
      case ERR_TRADE_CONTEXT_BUSY: 
         if (_IsNotTradeContextBusy () >= 0)
         {
            res = EB_NEXTTRY ;
         }
         return (res) ;

      case ERR_TRADE_EXPIRATION_DENIED:
         str = "Expiration date usage is denied by the broker" ;

         break ;
      case ERR_TRADE_TOO_MANY_ORDERS:
         str = "Too many orders" ;

         break ;
      case ERR_TRADE_HEDGE_PROHIBITED:
         str = "Hedging is denied by broker" ;

         break ;
      case ERR_TRADE_PROHIBITED_BY_FIFO:
         str = "Cannot close a deal because FIFO order is violated" ;

         break ;
      case 4107:
         str = "Wrong price for OrderSend function" ;

         break ;      
      case 4051:
         str = "Wrong takeprofit for OrderModify function" ;
      default:

         str = "Unknown error ?" + DoubleToStr (err, 0) ;
   }  
   str = StringConcatenate (str, " (the request is processed by broker in ", DoubleToStr (GetTickCount () - ms, 0), " ms)") ;

   Print (str) ;
   return (res) ;
}

int _IsNotTradeContextBusy()
  {

	  if(IsTradeContextBusy())
	    {
		     int StartWaitingTime = GetTickCount();
		     Print("Trade context is busy. Waiting...");

		     while(true)
		       {

			        if(GetTickCount() - StartWaitingTime > sec_wait_context * 1000)
			          {
				           Print("Waiting limit exceeded (" + sec_wait_context + " sec.)!");
				           return(-2);
			          }

			        if(!IsTradeContextBusy())
			          {

				           return(0);
			          }

			        Sleep( busysleep );
		       }
	    }
	  else
	    {

		     return(1);
	    }
  }

int MarketModify (int tick, double stop, double take)
{
   if (! OrderSelect (tick, SELECT_BY_TICKET) || OrderType () >= 2 || OrderCloseTime () > 0)
   {
      Print ("Wrong ticket for MarketModify function") ;
      return (-3) ;  
   }
   double use_sl = 0, use_tp = 0 ;

   if (stop > 0)
   {
      if (OrderType () == OP_BUY)
      {
         use_sl = OrderOpenPrice () - stop ;
      }
      else
      {
         use_sl = OrderOpenPrice () + stop ;
      }
   }
   if (stop < 0)
   {
      use_sl = -stop ;
   }
   if (take > 0)
   {
      if (OrderType () == OP_BUY)
      {
         use_tp = OrderOpenPrice () + take ;
      }
      else
      {
         use_tp = OrderOpenPrice () - take ;
      }
   }
   if (take < 0)
   {
      use_tp = -take ;
   }
   if (MathAbs (OrderStopLoss () - use_sl) < Point && MathAbs (use_tp - OrderTakeProfit ()) < Point)
   {
      Print ("There was an attempt to modify market order without changes to TP and SL") ;
      return (-3) ;
   }

   int attempt = 1 ;
   bool result = false ;

   while (attempt <= command_attempts && ! result)
   {/*
      if ((OrderType () == OP_BUY && (MarketInfo (OrderSymbol (), MODE_BID) - use_sl < d_stoplevel || use_tp - MarketInfo (OrderSymbol (), MODE_BID) < d_stoplevel)) || 
          (OrderType () == OP_SELL && (use_sl - MarketInfo (OrderSymbol (), MODE_ASK) < d_stoplevel || MarketInfo (OrderSymbol (), MODE_ASK) - use_tp < d_stoplevel)))
      {
         Print ("Couldn''t modify order ", tick, " because of broker stops level") ;
         return (-2) ;
      }
      if ((OrderType () == OP_BUY && (MarketInfo (OrderSymbol (), MODE_BID) - use_sl < d_freezelevel || use_tp - MarketInfo (OrderSymbol (), MODE_BID) < d_freezelevel)) || 
          (OrderType () == OP_SELL && (use_sl - MarketInfo (OrderSymbol (), MODE_ASK) < d_freezelevel || MarketInfo (OrderSymbol (), MODE_ASK) - use_tp < d_freezelevel)))
      {
         Print ("Couldn''t modify order ", tick, " because its level is too close to the price") ;
         return (-2) ;
      }*/

      int ms = GetTickCount () ;

      Print ("Attempt #", attempt, " to modify market order ", tick, " to stoploss ", DoubleToStr (use_sl, Digits), " and takeprofit ", DoubleToStr (use_tp, Digits)) ;
      result = OrderModify (tick, OrderOpenPrice (), use_sl, use_tp, 0) ;

      if (! result)
      {
         errors ++ ;

         int err = GetLastError () ;

         switch (ErrorBlock (err, ms))
         {
            case 0: // continue

               break ;
            case 1: // wait and continue
               Sleep (wait_error) ;

               break ;
            case 2: // terminate
               return (-1) ;
         }
      }
      else
      {
         errors = 0 ;
         Print ("Order successfully modified in ", GetTickCount () - ms, " ms") ;
      }
      if (errors > max_errors)
      {
         Print ("Exceeded maximum errors count while trying to send trading command.") ;
         Print ("To continue you should restart terminal or the EA") ; 
         return (-1) ;
      }
      attempt ++ ;

      if (attempt > command_attempts && ! result)
      {
         return (-1) ;
      }      
   }      
   return (1) ;
}

int PendingSend (int type, double lots, double price, double stop, double take, int magic_number, string comm)
{
   if (type < 2 || type > 5)
   {
      Print ("Error in type of pending order!") ;
      return (-3) ;
   }
   bool price_err = false, sltp_err = false ;

   RefreshRates () ;
   double use_sl = 0, use_tp = 0 ;

   if (stop > 0 && stop < d_stoplevel)
   {
      Print ("Stoploss for sending pending order is lesser that stops level!") ;
      return (-3) ;
   }
   if (take > 0 && take < d_stoplevel)
   {
      Print ("Takeprofit for sending pending order is lesser that stops level!") ;
      return (-3) ;
   }
   switch (type)
   {
      case OP_BUYLIMIT:
         if (Ask - price < d_stoplevel)
         {
            price_err = true ;
         }
         if (stop != 0)
         {
            if (stop > 0)
            {
               use_sl = price - stop ;
            }           
            else
            {
               use_sl = -stop ;

               if (price - use_sl < d_stoplevel)
               {
                  Print ("Stoploss for sending pending order is lesser that stops level!") ;
                  return (-3) ;
               }
            }
         }
         if (take != 0)
         {
            if (take > 0)
            {
               use_tp = price + take ;
            }           
            else
            {
               use_tp = -take ;

               if (use_tp - price < d_stoplevel)
               {
         

Показано первые 50% кода (символов: 21436)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 143,60₽ ≈ $26.20