Попробуйте вот так :
int День=0;bool Флаг=1; int start() {//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ if(День!=Day() || !Флаг)return(0); День=Day(); //....................... //если в результате вычислений принимаем решение сегодня ещё поторговать //то Флаг=1, иначе Флаг=0; //....................... return(0); }//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
Спасибо за помощь, Ваш вариант, если не ошибаюсь, подойдет для эксперта, который сам, по некоторым условиям выставляет ордера. Но я, к сожалению, вчера не догадался уточнить, что торговля идет вручную, а эксперт только следит за величиной просадки относительно максимального баланса (что-то типа трейлинг-стопа по балансу). И, когда просадка превысит заданную величину, эксперт должен закрыть открытые ордера и удалить отложенные (это я смог написать), но и не дать торговать в этот день (вот с этим-то я и не справился). Идеальным вариантом было бы, чтоб эксперт после закрытия и удаления ордеров самостоятельно закрыл терминал или, на худой конец, запрещал открытие ордеров с рынка. Подскажите, такое в принципе возможно?
Может быть, найти ответ вам помогут аналоги вот на этой страничке
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); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Мой хороший друг-скальпер попросил написать для него эксперта, выполняющего следующие функции:
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);
}
//+------------------------------------------------------------------+