drona007
Евгений

 
Уровень 6

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2088



РЕКОМЕНДУЮ



Защитник депозита (сейф)

Доброго времени суток. Много всего перекопал и подходящего не нашёл. Поэтому прошу написать помощника для ручной торговли. Необходим советник, который будет подхватывать открытую сделку и закрывать половину объёма при достижении прибыли к стопу 1/1. Или указанный % от объёма ордера. Можно добавить ещё трал и безубыток. Но только работать начинают
после выполнения сейфа. Соответственно вкл/выкл.
  • +1
  • Просмотров: 2374
  • 14 апреля 2022, 11:38
  • drona007
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
14 апреля 2022
14 апреля 2022

Комментарии (23)

+
0
"… и закрывать половину объёма при достижении прибыли к стопу 1/1" — об этом подробнее
avatar

  13  verta81 Сообщений: 355

  • 15 апреля 2022, 16:51
+
0
Наверное имелось в виду ТП/СЛ или наоборот СЛ/ТП.
avatar

  16  ssg Сообщений: 817

  • 15 апреля 2022, 18:07
+
+1
Вот написал для Вас. Можете также встроить в любой советник.
Код простой и понятен интуитивно.

//+------------------------------------------------------------------+
//|       Закрытие части позиции по условию взятии части профита.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict

#define OP_FLAT          -1
#define TRADE_RETRY_COUNT 4 // номер определяет, сколько раз EA пытается отправить заказ.
#define TRADE_RETRY_WAIT  100 //Интервал сна в миллисекундах. 100 миллисекунд равны 0,1 секунды.

input double        Lots             = 0.02;      // Лот
input int           Slip             = 10;        // Проскальзование
static input int    Magic            = 1111;      // Magic
static input string ClosePart        = "     - = Настройка частичного закрытия ордеров = -";
input int           PartTakeProfit   = 300;       // Тейк частичного закрытия в пунктах
input double        PartCloseLots    = 0.01;      // Сколько закрывать
double posType       = OP_FLAT;
int    posTicket     = 0;
double posLots       = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   CloseOrderPart();
  }
//+------------------------------------------------------------------+
//| Проверка на условие закрытия PartTakeProfit и само закрытие поз  |
//+------------------------------------------------------------------+
void CloseOrderPart(){
   int cnt = OrdersTotal();
   for(int i=0; i<cnt; i++)
     {
      if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber()!=Magic)    continue;
      if(OrderType() == OP_BUY){
         if(Bid-OrderOpenPrice() > PartTakeProfit*Point)
           {
            ClosePosition();
           }
        }
      if(OrderType() == OP_SELL)
        {
         if(OrderOpenPrice()-Ask > PartTakeProfit*Point)
           {
            ClosePosition();
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Функция  частичного закрытия позиций размером PartCloseLots      |
//+------------------------------------------------------------------+
void ClosePosition(){
   for(int attempt=0; attempt<TRADE_RETRY_COUNT; attempt++){
      bool closed;
      int lastError=0;
      if(posLots==Lots)
        {
         double price=MarketInfo(Symbol(),posType==OP_BUY ? MODE_BID : MODE_ASK);
         closed=OrderClose(posTicket,PartCloseLots,price,Slip,clrYellow);
         lastError=GetLastError();
        }
      if(closed) // Позиция закрыта
         break; // Выходим из цикла
      if(lastError==4108) // Не верный номер тикета
         break; // Выходим из цикла
      Sleep(TRADE_RETRY_WAIT);
      Print("Close Position retry no: "+IntegerToString(attempt+2)); //
     }
  }
//+------------------------------------------------------------------+

avatar

  16  ssg Сообщений: 817

  • 15 апреля 2022, 18:05
+
+2
Минимум изменений и + виртуальные SL и ТР.

//+------------------------------------------------------------------+
//|       Закрытие части позиции по условию взятии части профита.mq4 |
//|                                      А также виртуальные SL и ТР |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict

input double        Lots             = 0.02;      // Лот
static input string ClosePart        = "     - = Настройка частичного закрытия ордеров = -";
input int           StopLoss         = 300;       // Стоп лосс
input int           TakeProfit       = 600;       // Тейк профит
input double        PartCloseLots    = 0.5;       // Сколько закрывать
input int           Slip             = 10;        // Проскальзование
static input int    Magic            = 1961;      // Magic
//---
int    posType       = -1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   CloseOrder();
}
//+------------------------------------------------------------------+
//| Проверка на условие закрытия PartTakeProfit и само закрытие поз  |
//+------------------------------------------------------------------+
void CloseOrder()
{
    int    ticket;
    double lot = 0;
    
    for(int i=0; i<OrdersTotal(); i++)
      {
      ticket = OrderTicket();
        
      if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber()!=Magic) continue;
      if(OrderType() == OP_BUY)
         {
         if(Bid - OrderOpenPrice() >= StopLoss*Point)   //часть ордера при TP=SL
            {
            lot = NormalizeDouble(MathCeil(OrderLots()*100*PartCloseLots)/100,2);
            ClosePosition(ticket,lot);
            }
         if(Bid - OrderOpenPrice() >= TakeProfit*Point) // весь ордер по ТР
            ClosePosition(ticket,OrderLots());
         if(OrderOpenPrice() - Bid >= StopLoss*Point)   // весь ордер по SL
            ClosePosition(ticket,OrderLots());
         }
      if(OrderType() == OP_SELL)
         {
         if(OrderOpenPrice() - Ask >= StopLoss*Point)   //часть ордера при TP=SL
            {
            lot = NormalizeDouble(MathCeil(OrderLots()*100*PartCloseLots)/100,2);
            ClosePosition(ticket,lot);
            }
         if(OrderOpenPrice() - Ask >= TakeProfit*Point) // весь ордер по ТР
            ClosePosition(ticket,OrderLots());
         if( Ask - OrderOpenPrice()  >= StopLoss*Point) // весь ордер по SL
            ClosePosition(ticket,OrderLots());
         }
       }
}
//+------------------------------------------------------------------+
//| Функция  закрытия позиций                                        |
//+------------------------------------------------------------------+
void ClosePosition(int tic, double lot)
{
   bool closed;
   int lastError=0;

   for(int i=0; i<5; i++)
      {
      double price=MarketInfo(Symbol(),posType==OP_BUY ? MODE_BID : MODE_ASK);
      closed=OrderClose(tic,lot,price,Slip,clrYellow);
      
      if(!closed)
         lastError=GetLastError();
      if(closed)          // Позиция закрыта
         break;           // Выходим из цикла
      if(lastError==4108) // Не верный номер тикета
         break;           // Выходим из цикла
      Sleep(100);
      Print("Close Position retry no: "+IntegerToString(i+2));
      }
}
//+------------------------------------------------------------------+

Редактирован: 16 апреля 2022, 00:35
avatar

  7  kvashnin007 Сообщений: 525 - Андрей

  • 16 апреля 2022, 00:32
+
0
От души, ребят. Спасибо большое*good* 
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 16 апреля 2022, 01:13
+
0
Евгений, я не волшебник, а только учусь.
Могу, наверное, немного скорректировать советник.
Скажите, Вам нужно чтобы советник тупо сокращал все ордера или например только ордера с MagicNumber, которые Вы хотите задать?
Редактирован: 16 апреля 2022, 20:42
avatar

  7  kvashnin007 Сообщений: 525 - Андрей

  • 16 апреля 2022, 20:41
+
0
Все. Любой ордер, который я открываю, выставляю стоп лосс. Советник его подхватывает и при достижении прибыли к стопу 1/1, то закрывает половину.
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 16 апреля 2022, 20:56
+
0
У ордера, открытого вручную, Магик 0.
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 18 апреля 2022, 09:17
+
+1
Надеюсь, это не было ругательством. Вы что, указываете MagicNumber?
Если Вам все подходит… Удачи Вам. Обращайтесь. Если смогу, помогу. Не забывайте только, что я пока сам учусь.
Да и заходите ко мне на блог.
kvashnin007.opentraders.ru/74118.html#comment162230
avatar

  7  kvashnin007 Сообщений: 525 - Андрей

  • 17 апреля 2022, 22:50
+
0
Да какие тут ругательства?) Мне от него только и нужно, чтобы он перехватывал сделку и закрывал половину объема при достижении тейка к стопу 1/1. А еще вопрос. Он сам будет определять объем или как указано в настройках?
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 17 апреля 2022, 23:02
+
0
ДАВАЙТЕ Я СДЕЛАЮ, ЧТОБЫ ОН ПОДХВАТЫВАЛ ордера с Magic, который Вы укажете в настройках, а если Вы поставите Magic=-1, то сов будет подхватывать любой из открытых ордеров валютной пары, на которую Вы кинули сова.
Можно при желании с выбором символов (пары) повыеживаться.
На счет размера лота ордера. Сейчас он закрывает 0.5 ордера.
Можно сделать, что бы он закрывал указанную часть ордера коэффициентом (укажете 0.3), можно просто указать, в размере, который Вы хотите закрыть. Например, укажите закрыть 0,02.
Но тогда Вы потеряете универсальность. И запутаетесь непосредственно в работе. Можно покумекать и совместить (например, если закрываемый лот Вы укажете «0») два варианта. Единственно, если вычисленный лот окажется меньше 0.01, закрывать 0.01 или 0.00 лота?
Помните, универсальность не всегда удобна.

Сформулируйте четко по пунктам, чего петь то будем, барин? Шутка.
Редактирован: 18 апреля 2022, 11:41
avatar

  7  kvashnin007 Сообщений: 525 - Андрей

  • 18 апреля 2022, 11:23
+
0
Ок. Я понял. Необходимо Чтобы советник подхватывал любой новый ордер. И при достижении стоп к профиту 1/1 закрывал половину объема, не важно на какой паре, открылся ордер=есть 1/1 стоп к профиту=советник закрыл половину и успокоился. Я понимаю, что половину от 0.01 он не закроет. От 0.03 тоже не закроет, тогда в таких случаях пусть закрывает в большую сторону 0.02 от 0.03. от 0.05 пусть 0.03 и т. д. В общем, если объем не разделить пополам, то пусть закрывает немного большую часть. Хотелось бы советника кинуть на торгуемые инструменты и забыть, зная что при открытии ордера и выставлении стопа он отработает сейф. Не заморачиваться с магиками и какую часть закрывать.
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 18 апреля 2022, 18:11
+
0
Смотрите.
Подхватывает любой открытый в терминале ордер.
Если у ордеров нет SL и (или) ТР, можете выставить виртуальные, но они (размер) будут одни для всех. Нужно ли это? А так выставляете их значение в (0).
Наверно вообще лучше убрать. Половинится ордер только по своему SL ордера.
Закрывает часть ордера, ориентируясь на SL ордера. Если там ноль, то ничего и не закроет.
Если размер лота выставлен больше нуля, то закрываться будет столько, сколько выставили.
Иначе закрывать будет ту часть лота, которую выставите. Стоит 0.5 — половина. Выставите 0.3 удалит треть лота. Округлит в большую сторону.

<code>//+------------------------------------------------------------------+
//|       Закрытие части позиции по условию взятии части профита.mq4 |
//|                                      А также виртуальные SL и ТР |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "2.00"
#property strict

input double        Lots             = 0.00;      // Лот
input int           StopLoss         = 0;         // Стоп лосс, 0 - отключен
input int           TakeProfit       = 0;         // Тейк профит, 0 - отключен
input double        PartCloseLots    = 0.5;       // Сколько закрывать
input int           Slip             = 30;        // Проскальзование
//---
int    posType       = -1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   CloseOrder();
}
//+------------------------------------------------------------------+
//| Проверка на условие закрытия PartTakeProfit и само закрытие поз  |
//+------------------------------------------------------------------+
void CloseOrder()
{
    int    ticket;
    double lot = 0;
    
    for(int i=0; i<OrdersTotal(); i++)
      {
      ticket = OrderTicket();
        
     if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)))
       {
       if(OrderType() == OP_BUY)
         {
         if(Bid >= OrderOpenPrice()*2  - OrderStopLoss())                //часть ордера при TP=SL
            {
            lot = Lots;
            if(Lots==0)
              lot = NormalizeDouble(MathCeil(OrderLots()*100*PartCloseLots)/100,2);
            ClosePosition(ticket,lot);
            }
         if(Bid - OrderOpenPrice() >= TakeProfit*Point && TakeProfit!=0) // весь ордер по ТР
            ClosePosition(ticket,OrderLots());
         if(OrderOpenPrice() - Bid >= StopLoss*Point && StopLoss!=0)     // весь ордер по SL
            ClosePosition(ticket,OrderLots());
         }
      if(OrderType() == OP_SELL)
         {
         if(Ask <= OrderOpenPrice()*2 - OrderStopLoss())                 //часть ордера при TP=SL
            {
            lot = Lots;
            if(Lots==0)
              lot = NormalizeDouble(MathCeil(OrderLots()*100*PartCloseLots)/100,2);
            ClosePosition(ticket,lot);
            }
         if(OrderOpenPrice() - Ask >= TakeProfit*Point && TakeProfit!=0) // весь ордер по ТР
            ClosePosition(ticket,OrderLots());
         if( Ask - OrderOpenPrice()  >= StopLoss*Point && StopLoss!=0)   // весь ордер по SL
            ClosePosition(ticket,OrderLots());
         }
       }
     }
}
//+------------------------------------------------------------------+
//| Функция  закрытия позиций                                        |
//+------------------------------------------------------------------+
void ClosePosition(int tic, double lot)
{
   bool closed;
   int lastError=0;

   for(int i=0; i<5; i++)
      {
      double price=MarketInfo(Symbol(),posType==OP_BUY ? MODE_BID : MODE_ASK);
      closed=OrderClose(tic,lot,price,Slip,clrYellow);
      
      if(!closed)
         lastError=GetLastError();
      if(closed)          // Позиция закрыта
         break;           // Выходим из цикла
      if(lastError==4108) // Не верный номер тикета
         break;           // Выходим из цикла
      Sleep(100);
      Print("Close Position retry no: "+IntegerToString(i+2));
      }
}
//+------------------------------------------------------------------+
</code>


Как-то так.

Если что не так, звоните.


Редактирован: 18 апреля 2022, 19:27
avatar

  7  kvashnin007 Сообщений: 525 - Андрей

  • 18 апреля 2022, 19:20
+
0
Этот советник, только для проверки других стратегий.
Как самостоятельный он не совсем годится.

Да, и бросать его можете на любую пару.
Редактирован: 18 апреля 2022, 19:25
avatar

  7  kvashnin007 Сообщений: 525 - Андрей

  • 18 апреля 2022, 19:23
+
0
В смысле? Если он будет закрывать половину, как от него требуется, то чем он не помощник?

Спасибо большое за Вашу работу и отзывчивость*good* 
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 18 апреля 2022, 19:25
+
0
Рассмотрите такой вариант:
На счете торгуют 2 советника по двум разным инструментам.
Вы решили применить этот советник только для одной пары.
Что будете делать?
А если на счете 7 советников и три из них мультивалютные" тогда что?
avatar

  16  ssg Сообщений: 817

  • 18 апреля 2022, 19:53
+
0
Вы бы топик сначала прочитали для чего это)) Помощник для РУЧНОЙ ТОРГОВЛИ!!! Речи о других советниках и не идет. С уважением.*hi* 
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 18 апреля 2022, 20:01
+
0
1.Вы бы сначала поглядели кто Вам первый код написал.
2.Вы бы сначала свою фразу перечитали:
Хотелось бы советника кинуть на торгуемые инструменты и забыть, зная что при открытии ордера и выставлении стопа он отработает сейф. Не заморачиваться с магиками и какую часть закрывать.

3.А уже потом бы делали замечания. С уважением.*hi* 
avatar

  16  ssg Сообщений: 817

  • 18 апреля 2022, 20:18
+
0
Я прошу прощения и спасибо за участие. Не обижайтесь. Под торгуемыми инструментами я имел в виду те активы, которые я торгую ручками. Ничего более. Спасибо Вам. Сохранил все 3 кода. Ваш так совсем универсальный. Не хочу выглядеть не благодарным. Просто друг друга не поняли. Я еще раз. Прошу прощения, если что не так.
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 18 апреля 2022, 20:24
+
0
*hi* 
avatar

  16  ssg Сообщений: 817

  • 18 апреля 2022, 20:39
+
0
*drinks* 
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 18 апреля 2022, 20:43
+
0
Рад, что получилось помочь.

На блог заходите.
Редактирован: 18 апреля 2022, 19:32
avatar

  7  kvashnin007 Сообщений: 525 - Андрей

  • 18 апреля 2022, 19:32
+
0
Зайду, спасибо.
avatar

  6  drona007 Автор Сообщений: 111 - Евгений

  • 18 апреля 2022, 19:34

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари