Защита советника от непредвиденных ситуаций - страница 2

 
Alexsandr San:

Вот устанавливаете на соседний График - и у Вас защита!!!

есть ещё смешная защита - все ТейкПрофит должны быть виртуальны, хотя они вроде как лимитки. То есть отрабатываться на стороне терминала. Именно для этого нужен быстрый отклик и скорость работы

Сервера при спорных ситуациях (гепы, прыжки спреда, иногда проскальзывание/фаза-луны) тейк оформят не в вашу пользу. 

 
Maxim Kuznetsov:

есть ещё смешная защита - все ТейкПрофит должны быть виртуальны, хотя они вроде как лимитки. То есть отрабатываться на стороне терминала. Именно для этого нужен быстрый отклик и скорость работы

Сервера при спорных ситуациях (гепы, прыжки спреда, иногда проскальзывание/фаза-луны) тейк оформят не в вашу пользу. 

не знаю о чём ВЫ ? меня в полнее устраивает, все быстро закрывает.

если Вы про отложенные ордера - могу дописать функцию, если надо? 

 
Alexsandr San:

Вот что бы, ещё и отложенные ордера удаляло.

внешним советником/скриптом/тулзом это дело не поправить. Это только внутри изначальной логики алгоритмов.

Простейшая практика (если отображать на сервер) - задирать Тейк в канун новостей и на линии перемены дат. Тут вроде бы понятно смысл объяснён ??

 
Maxim Kuznetsov:

внешним советником/скриптом/тулзом это дело не поправить. Это только внутри изначальной логики алгоритмов.

Простейшая практика (если отображать на сервер) - задирать Тейк в канун новостей и на линии перемены дат. Тут вроде бы понятно смысл объяснён ??

Вы наверное с другой планеты - или я, или Вы на какой то другой Бирже(Форекс)?

------------------------------------

Человек написал защитить свои средства, это один из способов как можно защитить, если его советник начнёт шалить.

Выставить Убыток, который не так жалко потерять. уже с помощью этого советника. хотя можно этот код прописать в одном советнике.   

 
Alexsandr San:

Вы наверное с другой планеты - или я, или Вы на какой то другой Бирже(Форекс)?

не, я тут и про то же  :-) 

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

 
Maxim Kuznetsov:

не, я тут и про то же  :-) 

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

Это всё лишнее . я всё испытываю в реальном времени.

--------------------------------------------

Вот так код, будет покороче


//+------------------------------------------------------------------+
//|                                         profit loss deferred.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#define InpMagic 192999245
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position; // trade position object
CTrade         m_trade;    // trading object
CSymbolInfo    m_symbol;   // symbol info object
//---
input string Template      = "ADX";     // Имя шаблона(without '.tpl')
//---input double TargetProfit  = 999999.99; // Прибыль
//---input double TargetLoss    = 999999.99; // Убыток
input double TargetProfit  = 999999.99; // Баланс + Прибыль(прибавить к балансу)
input double TargetLoss    = 0;         // Баланс - Убыток(отнять от баланса)
//---
ENUM_TIMEFRAMES TimeFrame; // Change TimeFrame - Current = dont changed
int    ticks_to_close=1;   // количество тиков до снятия эксперта
uint   SLEEPTIME=1;        // Время паузы между повторами в секундах
ulong  ExtSlippage=10;     // Slippage
double m_adjusted_point;   // point value adjusted for 3 or 5 points
uint   RTOTAL=4;           // Число повторов при неудачных сделках
uint   Deviation_=10;      // Отклонение цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);;
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(ExtSlippage);
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(ProfitTarget())
     {
      return;
     }
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool ProfitTarget(void)
  {
   bool res=false;
//---   if(AccountInfoDouble(ACCOUNT_PROFIT)<-TargetLoss ||
//---      AccountInfoDouble(ACCOUNT_PROFIT)>=TargetProfit)
   if(AccountInfoDouble(ACCOUNT_EQUITY)<=TargetLoss ||
      AccountInfoDouble(ACCOUNT_EQUITY)>=TargetProfit)
     {
      DeletePending();
      CloseAllProfit();
      CloseAllLoss();
      CloseAll();
      Sleep(SLEEPTIME*1000);
      CloseAllProfit();
      CloseAllLoss();
      Sleep(SLEEPTIME*1000);
      DeletePending();
      CloseAll();
      ExpertRemoves();
      DeleteChart();
      PlaySound("expert.wav");
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void CloseAll(void)
  {
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         ClosePosition(m_position.Symbol()); // close a position by the specified symbo
        }
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void CloseAllProfit(void)
  {
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         if(m_position.Commission()+m_position.Swap()+m_position.Profit()>0.0)
            ClosePosition(m_position.Symbol()); // close a position by the specified symbo
        }
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void CloseAllLoss(void)
  {
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         if(m_position.Commission()+m_position.Swap()+m_position.Profit()<0.0)
            ClosePosition(m_position.Symbol());  // close a position by the specified symbo
        }
  }
//+------------------------------------------------------------------+
//| Close selected position                                          |
//+------------------------------------------------------------------+
void ClosePosition(const string symbol)
  {
   if(InitTrade(symbol))
      m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbo
   PlaySound("ok.wav");
  }
//+------------------------------------------------------------------+
//| Init trade object                                                |
//+------------------------------------------------------------------+
bool InitTrade(const string symbol)
  {
   if(!m_symbol.Name(symbol)) // sets symbol name
      return(false);
//---
   if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else
      if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_IOC))
         m_trade.SetTypeFilling(ORDER_FILLING_IOC);
      else
         m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   return(true);
//---
  }
//+------------------------------------------------------------------+
//| Checks if the specified filling mode is allowed                  |
//+------------------------------------------------------------------+
bool IsFillingTypeAllowed(string symbol,int fill_type)
  {
//--- Obtain the value of the property that describes allowed filling modes
   int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Return true, if mode fill_type is allowed
   return((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void ExpertRemoves(void)
  {
   static int tick_counter=0;
//---
   tick_counter++;
   Comment("\nДо выгрузки эксперта ",__FILE__," осталось ",
           (ticks_to_close-tick_counter)," тиков ");
//--- до
   if(tick_counter>=ticks_to_close)
     {
      ExpertRemove();
      Print(TimeCurrent(),": ",__FUNCTION__," эксперт будет выгружен");
     }
   Print("tick_counter = ",tick_counter);
//---
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void DeleteChart(void)
  {
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   bool errTemplate;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(TimeFrame!=PERIOD_CURRENT)
        {
         ChartSetSymbolPeriod(prevChart,ChartSymbol(prevChart),TimeFrame);
        }
      errTemplate=ChartApplyTemplate(prevChart,Template+".tpl");
      if(!errTemplate)
        {
         Print("Error ",ChartSymbol(prevChart),"-> ",GetLastError());
        }
      if(currChart<0)
         break;
      Print(i,ChartSymbol(currChart)," ID =",currChart);
      prevChart=currChart;
      i++;
     }
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void DeletePending()
  {
   Print("Сработала функция закрываем все выставленные ордера");
//----
   for(uint count=0; count<=RTOTAL && !IsStopped(); count++)
     {
      //---- закрываем все выставленные ордера по текущему символу
      int total=OrdersTotal();
      if(!total)
         return; // все ордера закрыты
      for(int pos=total-1; pos>=0; pos--)
        {
         ulong ticket=ulong(OrderGetTicket(pos));
         if(!OrderSelect(ticket))
            continue;
         string symbol=OrderGetString(ORDER_SYMBOL);
         bool _Close=true;
         OrderCloseByTicket(_Close,symbol,ticket,Deviation_);
        }
      if(!OrdersTotal())
         break;
      Sleep(SLEEPTIME*1000);
     }
//----
  }
//+------------------------------------------------------------------+
//| Закрываем длинную позицию                                        |
//+------------------------------------------------------------------+
bool OrderCloseByTicket
(
   bool &Signal,         // флаг разрешения на сделку
   const string symbol,  // торговая пара сделки
   ulong ticket,         // тикет
   uint deviation        // слиппаж
)
  {
//----
   if(!Signal)
      return(true);

//---- Объявление структур торгового запроса и результата торгового запроса
   MqlTradeRequest request;
   MqlTradeResult result;
//---- Объявление структуры результата проверки торгового запроса
   MqlTradeCheckResult check;

//---- обнуление структур
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);

//---- Инициализация структуры торгового запроса MqlTradeRequest для удаления отложенного ордера
   request.action=TRADE_ACTION_REMOVE;
   request.deviation=deviation;
   request.order=ticket;
//----
   string comment="";
   string ordertype=EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE)));
   StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Удаляем отложенный ",ordertype," ордер по ",symbol," с тикетом ",string(ticket)," ============ >>>");
   Print(comment);
//---- Отправка приказа на закрывание позиции на торговый сервер
   if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE)
     {
      Print(__FUNCTION__,"(): Невозможно удалить ",ordertype," ордер с тикетом ",string(ticket),"!");
      Print(__FUNCTION__,"(): OrderSend(): ",m_trade.ResultComment());
      return(false);
     }
   else
      if(result.retcode==TRADE_RETCODE_DONE)
        {
         Signal=false;
         comment="";
         StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Отложенный ",ordertype," ордер по ",symbol," с тикетом ",string(ticket)," удалён ============ >>>");
         Print(comment);
         PlaySound("ok.wav");
        }
      else
        {
         Print(__FUNCTION__,"(): Невозможно удалить ",ordertype," ордер с тикетом ",string(ticket),"!");
         Print(__FUNCTION__,"(): OrderSend(): ",m_trade.ResultComment());
         return(false);
        }
//----
   return(true);
  }
//+------------------------------------------------------------------+
 

раз уж я такой добрый, ещё пара советов "как защитить хорошее от всякого плохого" :

1. не торгуйте на линии перемены дат (и вообще где предвидите "расширение и дёргание" спреда). Если Тейк или Стоп (или отложка) близки к цене, то лучше сделку закрыть (локировать, если хедж) и как всё уляжется переоткрыть. Эдакий ваш персональный клининг, лучше делать его самому чем его произведут за вас

2. не ловиться на рекламу "узких спредов до 0(отрицательных)". Чтобы понять почему так, посмотрите опять-же на пляски ночного спреда, там это видно в масштабе. 

PS/ в ММ учтите что на сделку вы отдаёте больше чем 1 спред.