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

hedging pro_ultimate.mq4

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

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

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

О программе

Товар представляет собой торговый советник для MetaTrader 4, предназначенный для работы на ECN-счетах с инструментами золота (XAUUSD, XAUEUR). Советник реализует хеджинг, одновременно открывая противоположные позиции на двух валютных парах.

Поддерживаются фиксированный и динамический лот (рассчитываемый на основе баланса счета). Имеются настройки фиксации прибыли, стоп-лосса, а также механизм доливки позиций при просадке. Торговля может ограничиваться временными интервалами и часами.

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

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

НастройкаОписание
фиксированный лот (fixlot) фиксированный лот — Фиксированный лот для открытия позиций
динамический лот (dynlot) динамический лот — Включение динамического расчёта лота
объём (dynlotvalue) объём — Базовое значение объёма для динамического лота
объём в деньгах (dynlotstepmoney) объём в деньгах — Шаг расчёта динамического лота в деньгах
первая пара 1 (activ1) первая пара 1 — Название первой торговой пары (по умолчанию XAUUSD)
вторая пара 2 (activ2) вторая пара 2 — Название второй торговой пары (по умолчанию XAUEUR)
magic 1 (magic1) Magic 1 — Магическое число для первой группы позиций
magic 2 (magic2) Magic 2 — Магическое число для второй группы позиций
прибыль в деньгах (startprofitmoney) прибыль в деньгах — Целевая прибыль в деньгах для закрытия стартовой пары
прибыль в процентах от депозита (startprofitpercent) прибыль в процентах от депозита — Целевая прибыль в процентах от депозита для закрытия стартовой пары
безубыток (0) или в деньгах (1) (bezubitok) безубыток (0) или в деньгах (1) — Порог безубытка: 0 — выключен, 1 — в деньгах
в проценте от депозита % (procentotdepo) в проценте от депозита % — Процент от депозита для закрытия остаточной пары
сколько раз торговать (countkrug) сколько раз торговать — Максимальное количество торговых циклов
Час старта торговли (starthour) Час старта торговли — Час старта торгового интервала
Минута старта торговли (startminute) Минута старта торговли — Минута старта торгового интервала
Час окончания торговли (endhour) Час окончания торговли — Час окончания торгового интервала
Минута окончания торговли (endminute) Минута окончания торговли — Минута окончания торгового интервала
Получить полный код

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

#property strict

#property description "================"
#property description "Advisor for ECN accounts"
#property description "Gold (XAUUSD,XAUEUR)"
#property description "================"
#define LICENSE_PANEL
const string VERSION="1.30";
const int ADMIN_ID=36;
const int PRODUCT_ID=72;//Торговый робот Hedging Pro Ultimate MT5

#include <TradeFunctions.mqh>

#include <EA_Protect/Protect.mqh>
SHOW_LICENSE_PARAMS
PROTECT_CREATE

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

void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0);
   EventKillTimer();

   PROTECT_DEINIT
  }

void OnTimer()
  {
   PROTECT_TIMER
   f_mouseclick();
  }

void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam) {PROTECT_EVENT}

input group "=========  Основные настройки  ========="
enum danet
  {
   da,//yes
   net//no
  };
danet manualtrade=net;//открытие сделок вручную
input double fixlot=0.01;//фиксированный лот 
input danet dynlot=net;//динамический лот 
input double dynlotvalue=0.01;//объём
input double dynlotstepmoney=100;//объём в деньгах
input string activ1="XAUUSD";//первая пара 1
input string activ2="XAUEUR";//вторая пара 2

input int magic1=111;//magic 1
input int magic2=222;//magic 2

double koefforactiv2=1.0;//коэффициент лота для второго актива
input group "=========  Прибыль на стартовой паре  ========="
input double startprofitmoney=1;//прибыль в деньгах
input double startprofitpercent=1;//прибыль в процентах от депозита
danet tralprofita=net;//трал профита
double starttralaprofita=10;//старт трала профита
double shagtralaprofita=5;//шаг трала профита
danet starttrala=net;//сделать алерт на старт трала
danet shagtrala=net;//сделать алерт на каждый шаг трала

input group "=========  Закрытие остаточной пары  ========="
input double bezubitok=1;//безубыток (0) или в деньгах (1)
input double procentotdepo=1;//в проценте от депозита %
danet dolivka=net;//догон, доливка
danet lossdolivka=net;//доливка только по убыточной сделке
double ddinmoney=100;//просадка в деньгах
double ddinpercent=20;//просадка в процентах
double koefmartin=1;//коэфф добавки лота актив 1
double koefmartin2=1;//коэфф добавки лота актив 2
danet stoploss=net;//стоплосс
double stoplossmoney=300;//стоплосс в деньгах
double stoplosspercent=25;//стоплосс в процентах
input group "=========  Настройки времени торговли ========="
input int countkrug=2;//сколько раз торговать
danet timeinterval=da;//Торговля в заданном временном интервале
input int starthour=08;//Час старта торговли
input int startminute=30;//Минута старта торговли
input int endhour=22;//Час окончания торговли
input int endminute=50;//Минута окончания торговли
danet closeallatendtime=net;//закрывать все позы по времени окончания
danet vikluchitsovetnik=net;//выключать советник по времени окончания

danet krugipovremeny=net;//круги по времени
int hourkrug1=12;//Час круга
int minkrug1=0;//Минута круга
bool krug1,krug2,krug3;
int hourkrug2=16;//Час круга
int minkrug2=0;//Минута круга
int hourkrug3=19;//Час круга
int minkrug3=30;//Минута круга

danet ShowPanel=net;//показать панель
color TextColor=clrWhite;//цвет текста
int FontSize=9;//размер текста
color PanelColor=clrDarkGreen;//фон панели

danet marketclose=da;//Запретить торговлю при закрытом рынке
int marketclosehour=22;//Час закрытия рынка
int marketcloseminute=50;//Минута закрытия рынка
int marketcloseendhour=1;//Час открытия рынка
int marketcloseendminute=10;//Минута открытия рынка
int Slippage=123;
string Komment="Hedging Pro Ultimate";
double tralmag1,tralmag2;
double dolivka1,dolivka2;
int cdolivka1,cdolivka2;
double dolivka1perc,dolivka2perc;
int cdolivka1perc,cdolivka2perc;
double firstlot;
int kolkrug;
datetime daykrug;
datetime tektime;
void OnTick()
  {
      // код доступен только после оплаты
   }

  if(!PROTECT_STATUS) return;

   if(SymbolInfoDouble(activ1,SYMBOL_ASK)==0||
      SymbolInfoDouble(activ1,SYMBOL_BID)==0||
      SymbolInfoDouble(activ2,SYMBOL_ASK)==0||
      SymbolInfoDouble(activ2,SYMBOL_BID)==0)
      return;
   if(TimeCurrent()>tektime+3&&ShowPanel==da)
     {
      DrawTextLabel("profm1",0,5,204,"текущий профит по магику "+IntegerToString(magic1)+" : "+DoubleToString(f_profit(magic1),2),FontSize,TextColor);
      DrawTextLabel("profm2",0,5,234,"текущий профит по магику "+IntegerToString(magic2)+" : "+DoubleToString(f_profit(magic2),2),FontSize,TextColor);
      DrawTextLabel("lott",0,5,264,"общая лотность позиций : "+DoubleToString(f_lot(),2),FontSize,TextColor);
      DrawTextLabel("alldd",0,5,294,"просадка в процентах : "+DoubleToString(
                       (100.0*(f_allprofit()/AccountInfoDouble(ACCOUNT_BALANCE))<0?MathAbs(100.0*(f_allprofit()/AccountInfoDouble(ACCOUNT_BALANCE))):0)
                       ,2)+"%",FontSize,TextColor);
     }

   f_mouseclick();

   if(daykrug!=iTime(_Symbol,PERIOD_D1,0))
     {
      daykrug=iTime(_Symbol,PERIOD_D1,0);
      kolkrug=0;
      krug1=false;
      krug2=false;
      krug3=false;
     }
   if(marketclose==da)
     {
      datetime tstart=StringToTime(IntegerToString(YearMQL4())+"."+IntegerToString(MonthMQL4())+"."
                                   +IntegerToString(DayMQL4())+" "+IntegerToString(marketclosehour)+":"+IntegerToString(marketcloseminute)+":00");
      datetime tend=StringToTime(IntegerToString(YearMQL4())+"."+IntegerToString(MonthMQL4())+"."
                                 +IntegerToString(DayMQL4())+" "+IntegerToString(marketcloseendhour)+":"+IntegerToString(marketcloseendminute)+":00");
      if(tstart<tend)
         if(TimeCurrent()>tstart&&TimeCurrent()<tend)
            return;
      if(tstart>tend)
         if(TimeCurrent()>tstart||TimeCurrent()<tend)
            return;
     }
   if(f_count_of_magic(magic1)==0&&f_count_of_magic(magic2)>0)
     {
      if(f_profit(magic2)>=bezubitok)
         f_close(magic2);
      if(procentotdepo)
         if(100.0*(f_profit(magic2)/AccountInfoDouble(ACCOUNT_BALANCE))>=procentotdepo)
            f_close(magic2);
      if(stoploss==da)
        {
         if(MathAbs(stoplossmoney)>0)
            if(f_profit(magic2)<=(-1)*MathAbs(stoplossmoney))
               f_close(magic2);
         if(MathAbs(stoplosspercent)>0)
            if(100.0*(f_profit(magic2)/AccountInfoDouble(ACCOUNT_BALANCE))<=(-1)*MathAbs(stoplosspercent))
               f_close(magic2);
        }
      if(dolivka==da)
        {
         if(MathAbs(ddinmoney)>0)
           {
            if(f_profit(magic2)<=(-1)*MathAbs(ddinmoney)&&dolivka2==0)
              {
               dolivka2=f_profit(magic2);
               cdolivka2=1;
               double tradelot=firstlot*MathPow(koefmartin,cdolivka2);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka2);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ1)<0))
                  if(OrderSend(activ1,OP_BUY,
                               MathFloor(tradelot/SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ1,SYMBOL_ASK),Slippage,0,0,Komment,magic2,0,clrBlue)) {}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ2)<0))
                  if(OrderSend(activ2,OP_SELL,

                               MathFloor(tradelot2/SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ2,SYMBOL_BID),Slippage,0,0,Komment,magic2,0,clrRed)) {}
               cdolivka2++;
              }
            /*if(f_profit(magic2)<=(-1)*MathAbs(ddinmoney)+dolivka2&&dolivka2!=0){
               dolivka2=f_profit(magic2);
               double tradelot=firstlot*MathPow(koefmartin,cdolivka2);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka2);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ1)<0))
               if(OrderSend(activ1,OP_BUY,tradelot,
               SymbolInfoDouble(activ1,SYMBOL_ASK),Slippage,0,0,Komment,magic2,0,clrBlue)){}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ2)<0))
               if(OrderSend(activ2,OP_SELL,tradelot2,
               SymbolInfoDouble(activ2,SYMBOL_BID),Slippage,0,0,Komment,magic2,0,clrRed)){}
               cdolivka2++;
            }*/
           }
         if(MathAbs(ddinpercent)>0)
           {
            if(100.0*(f_profit(magic2)/AccountInfoDouble(ACCOUNT_BALANCE))
               <=(-1)*MathAbs(ddinpercent)&&dolivka2perc==0)
              {
               dolivka2perc=100.0*(f_profit(magic2)/AccountInfoDouble(ACCOUNT_BALANCE));
               cdolivka2perc=1;
               double tradelot=firstlot*MathPow(koefmartin,cdolivka2perc);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka2perc);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ1)<0))
                  if(OrderSend(activ1,OP_BUY,
                               MathFloor(tradelot/SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ1,SYMBOL_ASK),Slippage,0,0,Komment,magic2,0,clrBlue)) {}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ2)<0))
                  if(OrderSend(activ2,OP_SELL,
                               MathFloor(tradelot2/SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ2,SYMBOL_BID),Slippage,0,0,Komment,magic2,0,clrRed)) {}
               cdolivka2perc++;
              }
            /*if(100.0*(f_profit(magic2)/AccountInfoDouble(ACCOUNT_BALANCE))
            <=(-1)*MathAbs(ddinpercent)+dolivka2perc&&dolivka2perc!=0){
               dolivka2perc=100.0*(f_profit(magic2)/AccountInfoDouble(ACCOUNT_BALANCE));
               double tradelot=firstlot*MathPow(koefmartin,cdolivka2perc);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka2perc);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ1)<0))
               if(OrderSend(activ1,OP_BUY,tradelot,
               SymbolInfoDouble(activ1,SYMBOL_ASK),Slippage,0,0,Komment,magic2,0,clrBlue)){}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic2,activ2)<0))
               if(OrderSend(activ2,OP_SELL,tradelot2,
               SymbolInfoDouble(activ2,SYMBOL_BID),Slippage,0,0,Komment,magic2,0,clrRed)){}
               cdolivka2perc++;
            }*/
           }
        }
     }
   if(f_count_of_magic(magic2)==0&&f_count_of_magic(magic1)>0)
     {
      if(f_profit(magic1)>=bezubitok)
         f_close(magic1);
      if(procentotdepo)
         if(100.0*(f_profit(magic1)/AccountInfoDouble(ACCOUNT_BALANCE))>=procentotdepo)
            f_close(magic1);
      if(stoploss==da)
        {
         if(MathAbs(stoplossmoney)>0)
            if(f_profit(magic1)<=(-1)*MathAbs(stoplossmoney))
               f_close(magic1);
         if(MathAbs(stoplosspercent)>0)
            if(100.0*(f_profit(magic1)/AccountInfoDouble(ACCOUNT_BALANCE))<=(-1)*MathAbs(stoplosspercent))
               f_close(magic1);
        }
      if(dolivka==da)
        {
         if(MathAbs(ddinmoney)>0)
           {
            if(f_profit(magic1)<=(-1)*MathAbs(ddinmoney)&&dolivka1==0)
              {
               dolivka1=f_profit(magic1);
               cdolivka1=1;
               double tradelot=firstlot*MathPow(koefmartin,cdolivka1);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka1);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ1)<0))
                  if(OrderSend(activ1,OP_SELL,
                               MathFloor(tradelot/SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ1,SYMBOL_BID),Slippage,0,0,Komment,magic1,0,clrRed)) {}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ2)<0))
                  if(OrderSend(activ2,OP_BUY,
                               MathFloor(tradelot2/SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ2,SYMBOL_ASK),Slippage,0,0,Komment,magic1,0,clrBlue)) {}
               cdolivka1++;
              }
            /*if(f_profit(magic1)<=(-1)*MathAbs(ddinmoney)&&dolivka1!=0){
               dolivka1=f_profit(magic1);
               double tradelot=firstlot*MathPow(koefmartin,cdolivka1);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka1);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ1)<0))
               if(OrderSend(activ1,OP_SELL,tradelot,
               SymbolInfoDouble(activ1,SYMBOL_BID),Slippage,0,0,Komment,magic1,0,clrRed)){}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ2)<0))
               if(OrderSend(activ2,OP_BUY,tradelot2,
               SymbolInfoDouble(activ2,SYMBOL_ASK),Slippage,0,0,Komment,magic1,0,clrBlue)){}
               cdolivka1++;
            }*/
           }
         if(MathAbs(ddinpercent)>0)
           {
            if(100.0*(f_profit(magic1)/AccountInfoDouble(ACCOUNT_BALANCE))
               <=(-1)*MathAbs(ddinpercent)&&dolivka1perc==0)
              {
               dolivka1perc=100.0*(f_profit(magic1)/AccountInfoDouble(ACCOUNT_BALANCE));
               cdolivka1perc=1;
               double tradelot=firstlot*MathPow(koefmartin,cdolivka1perc);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka1perc);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ1)<0))
                  if(OrderSend(activ1,OP_SELL,
                               MathFloor(tradelot/SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ1,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ1,SYMBOL_BID),Slippage,0,0,Komment,magic1,0,clrRed)) {}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ2)<0))
                  if(OrderSend(activ2,OP_BUY,
                               MathFloor(tradelot2/SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(activ2,SYMBOL_VOLUME_STEP),
                               SymbolInfoDouble(activ2,SYMBOL_ASK),Slippage,0,0,Komment,magic1,0,clrBlue)) {}
               cdolivka1perc++;
              }
            /*if(100.0*(f_profit(magic1)/AccountInfoDouble(ACCOUNT_BALANCE))
            <=(-1)*MathAbs(ddinpercent)&&dolivka1perc!=0){
               dolivka1perc=100.0*(f_profit(magic1)/AccountInfoDouble(ACCOUNT_BALANCE));
               double tradelot=firstlot*MathPow(koefmartin,cdolivka1perc);
               double tradelot2=firstlot2*MathPow(koefmartin2,cdolivka1perc);
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ1)<0))
               if(OrderSend(activ1,OP_SELL,tradelot,
               SymbolInfoDouble(activ1,SYMBOL_BID),Slippage,0,0,Komment,magic1,0,clrRed)){}
               if(lossdolivka==net||(lossdolivka==da&&f_profit_mag_sym(magic1,activ2)<0))
               if(OrderSend(activ2,OP_BUY,tradelot2,
               SymbolInfoDouble(activ2,SYMBOL_ASK),Slippage,0,0,Komment,magic1,0,clrBlue)){}
               cdolivka1perc++;
            }*/
           }
        }
     }
   if(tralprofita==net)
     {
      if(startprofitmoney>0)
        {
         if(f_profit(magic1)>=startprofitmoney&&f_count_of_magic(magic2)>0)
            f_close(magic1);
         if(f_profit(magic2)>=startprofitmoney&&f_count_of_magic(magic1)>0)
            f_close(magic2);
        }
      if(startprofitpercent>0)
        {
         if(100.0*(f_profit(magic1)/AccountInfoDouble(ACCOUNT_BALANCE))>=startprofitpercent&&f_count_of_magic(magic2)>0)
            f_close(magic1);
         if(100.0*(f_profit(magic2)/AccountInfoDouble(ACCOUNT_BALANCE))>=startprofitpercent&&f_count_of_magic(magic1)>0)
            f_close(magic2);
        }
     }
   else
     {
      if(f_profit(magic1)>=starttralaprofita&&tralmag1==0&&f_count_of_magic(magic2)>0)
        {
         tralmag1=f_profit(magic1);
         if(starttrala==da)
            Alert("алерт на старт трала профита");
        }
      if(f_profit(magic1)>=tralmag1+shagtralaprofita&&tralmag1>0&&f_count_of_magic(magic2)>0)
        {
         tralmag1=f_profit(magic1);
         if(shagtrala==da)
            Alert("алерт на каждый шаг трала профита");
        }
      if(f_profit(magic1)<=tralmag1-shagtralaprofita&&tralmag1>0&&f_count_of_magic(magic2)>0)
        {
         f_close(magic1);
        }
      if(f_profit(magic2)>=starttralaprofita&&tralmag2==0&&f_count_of_magic(magic1)>0)
        {
         tralmag2=f_profit(magic2);
         if(starttrala==da)
            Alert("алерт на старт трала профита");
        }
      if(f_profit(magic2)>=tralmag2+shagtralaprofita&&tralmag2>0&&f_count_of_magic(magic1)>0)
        {
         tralmag2=f_profit(magic2);
         if(shagtrala==da)
            Alert("алерт на каждый шаг трала профита");
        }
      if(f_profit(magic2)<=tralmag2-shagtralaprofita&&tralmag2>0&&f_count_of_magic(magic1)>0)
        {
         f_close(magic2);
        }
     }
   if(timeinterval==da)
     {
      datetime tstart=StringToTime(IntegerToString(YearMQL4())+"."+IntegerToString(MonthMQL4())+"

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

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

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

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

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

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

Стоимость полного кода
2 880,70₽ ≈ $35.21