Прошу совета знатоков

 

Мой хороший друг-скальпер попросил написать для него эксперта, выполняющего следующие функции:

1) Отслеживание относительной просадки (по умолчанию 5%) от максимального баланса (зарегистрированного с момента запуска эксперта);

2) В случае, если относительная просадка превысит 5%, эксперт должен закрыть все открытые сделки, удалить отложенные ордера и запретить торговлю до следующего календарного дня по терминальному времени.

Мой небольшой опыт в программировании позволил мне написать почти все, за исключением запрета на торговлю. Далее я выложу код этой разработки и, если кто-либо подскажет, как реализовать запрет на торговлю или обнаружит незамеченные мною ошибки, я буду весьма признателен.

Заранее спасибо.

//+------------------------------------------------------------------+
//| ex_LossLimit.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/"
int CheckDay;
double CheckMaxBalance;
//---- input parameters
extern double BalanceStopLoss=5.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
CheckMaxBalance=GlobalVariableGet("MaxBalance"); // Проверка значения последнего максимального баланса
CheckDay=GlobalVariableGet("DayOfOut"); // Проверка последнего дня аута
if (CheckMaxBalance==0) GlobalVariableSet("MaxBalance",AccountBalance()); // Только в первый раз
if (CheckDay==0) GlobalVariableSet("DayOfOut",DayOfYear()); // Только в первый раз
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
//int deinit()
// {
//----

//----
// return(0);
// }
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double BalanceLoss;
int i,j;
//----
if (CheckDay!=DayOfYear()) // Проверка на несовпадение текущего дня года с днем последнего аута
{
if (AccountBalance()>GlobalVariableGet("MaxBalance")) GlobalVariableSet("MaxBalance",AccountBalance());
BalanceLoss=100-(AccountEquity()*100/GlobalVariableGet("MaxBalance"));
if (BalanceLoss>BalanceStopLoss)
{
for (i=OrdersTotal()-1;i>=0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
j=OrderType();
switch (j)
{
case '0': OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);
break;
case '1': OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);
break;
default: OrderDelete(OrderTicket());
}
}
GlobalVariableSet("DayOfOut",CheckDay+1);
}
PlaySound("timeout.wav");
}
else //ЗАПРЕТ НА ТОРГОВЛЮ
//----
CheckMaxBalance=GlobalVariableGet("MaxBalance");
CheckDay=GlobalVariableGet("CurrentDay");
Comment(" Максимальный баланс = ",CheckMaxBalance,
" Текущий баланс = ",AccountBalance(),
" Текущая эквити = ",AccountEquity(),
" Текущая просадка = ",BalanceLoss,
" Всего ордеров = ",OrdersTotal(),
" День последнего аута ",CheckDay);
return(0);
}
//+------------------------------------------------------------------+

 

Попробуйте вот так :

int День=0;bool Флаг=1;
int start()
{//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
 if(День!=Day() || !Флаг)return(0);
 День=Day();
 //.......................
 //если в результате вычислений принимаем решение сегодня ещё поторговать
 //то Флаг=1, иначе Флаг=0;
 //....................... 
return(0);
}//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+


 
Urain писал(а) >>

Попробуйте вот так :

Спасибо за помощь, Ваш вариант, если не ошибаюсь, подойдет для эксперта, который сам, по некоторым условиям выставляет ордера. Но я, к сожалению, вчера не догадался уточнить, что торговля идет вручную, а эксперт только следит за величиной просадки относительно максимального баланса (что-то типа трейлинг-стопа по балансу). И, когда просадка превысит заданную величину, эксперт должен закрыть открытые ордера и удалить отложенные (это я смог написать), но и не дать торговать в этот день (вот с этим-то я и не справился). Идеальным вариантом было бы, чтоб эксперт после закрытия и удаления ордеров самостоятельно закрыл терминал или, на худой конец, запрещал открытие ордеров с рынка. Подскажите, такое в принципе возможно?

 

Может быть, найти ответ вам помогут  аналоги вот на этой страничке

http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=select&id=4

 

Возможно, поможет функция (проверьте код,  я на скорую руку модифицировал аналог И.Кима

вот отсюда 'Полезные функции от KimIV'

//Эта функция возвращает время закрытия последней закрытой
/// позиций. Отбор учитываемых позиций задаётся внешними
// параметрами:
//sy - Наименование рыночного инструмента. Если задать этот
// параметр, то функция учтёт позиции только заданного
// инструмента. Значение по умолчанию - "" означает любой
// рыночный инструмент. Значение NULL означает текущий
// инструмент. 
//op - Торговая операция, тип позиции.
// Допустимые значения: OP_BUY, OP_SELL или -1. 
//Значение по умолчанию -1 означает любую позицию. 
//mn - Идентификатор позиции, MagicNumber.
// Значение по умолчанию -1 означает любой идентификатор. 

//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает время закрытия последней закрытой позиций.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime TimeCloseLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(t);
}
 
PermAlex >>:

......чтоб эксперт после закрытия и удаления ордеров самостоятельно закрыл терминал или, на худой конец, запрещал открытие ордеров с рынка. Подскажите, такое в принципе возможно?

Скорее всего, такое невозможно реализовать программно...

 
rid писал(а) >>

Скорее всего, такое невозможно реализовать программно...

Спасибо всем, кто откликнулся.

Причина обращения: