Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2397

 

Добрый день!

Возникла некоторая загвоздка, помогите решить задачу.

Задача простая: подсчёт, ТОЛЬКО ПОСЛЕДНИХ, УБЫТОЧНЫХ, ЗАКРЫТЫХ позиций из ИСТОРИИ СДЕЛОК.  


В чём загвоздка:  Переменная наращивается  на одну еденицу КАЖДЫЙ ТИК, пока в истории висист убыточный ордер.  

Как мне сделать чтобы переменная nRSL увеличивалась на одну еденицу, каждый закрытый убыточный ордер, а не каждый тик?

Вот код:

double pos=OrderProfit();
int static nRSL=0; //  переменная для посчёта убыточных ордеров
 
for(int i=0; i<OrdersHistoryTotal(); i++)   //создаю цикл
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true) continue; // выбираю последний ордер
}

if (pos<0) // если этот ордер закрыт c убытком
{
nRSL++; // то наращивать переменную на одну еденицу КАЖДЫЙ ЗАКРЫТЫЙ ОРДЕР
}
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Alexey Belyakov, 2024.04.27 13:30

Добрый день!

Возникла некоторая загвоздка, помогите решить задачу.

Задача простая: подсчёт, ТОЛЬКО ПОСЛЕДНИХ, УБЫТОЧНЫХ, ЗАКРЫТЫХ позиций из ИСТОРИИ СДЕЛОК.  


В чём загвоздка:  Переменная наращивается  на одну еденицу КАЖДЫЙ ТИК, пока в истории висист убыточный ордер.  

Как мне сделать чтобы переменная nRSL увеличивалась на одну еденицу, каждый закрытый убыточный ордер, а не каждый тик?

Вот код:

double pos=OrderProfit();
int static nRSL=0; //  переменная для посчёта убыточных ордеров
 
for(int i=0; i<OrdersHistoryTotal(); i++)   //создаю цикл
{// Цикл открыт
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true) continue; // выбираю последний ордер
}// Цикл закрыт

if (pos<0) // если этот ордер закрыт c убытком От цикла никак не зависит
{
nRSL++; // то наращивать переменную на одну еденицу КАЖДЫЙ ЗАКРЫТЫЙ ОРДЕР
}
Смотрите мои комментарии в вашем коде.
 
Alexey Viktorov #:
Смотрите мои комментарии в вашем коде.

Мне тоже так вначале показалось, что "не зависит". Однако, если мы уберём цикл "for" и условие "if(выбор посл. ордера)", то есть уберём первые два цикла, а оставим только if (pos<0), то переменная "pos" считать ничего не будет, будет вечно ноль.(соотв. выведя в комментарий переменную "pos").

Не будет считать потому что ордер не выбран. OrderProfit - работает только, когда ордер выбран. (OrderSelect)...

А следовательно, значит, каким-то образом, он залазит за "countinue" .....

Такой вариант.... (уберём закрытие цикла 
continue; 

Результат - nRSL висит в нуле, ничего не считает.

int pos=OrderProfit();
int static nRSL=0;

for(int i=0; i<OrdersHistoryTotal(); i++)   //создаю цикл
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
{
if (pos<0) 
{
nRSL++;
}
}
} 
 
Alexey Belyakov #:

Мне тоже так вначале показалось, что "не зависит". Однако, если мы уберём цикл "for" и условие "if(выбор посл. ордера)", то есть уберём первые два цикла, а оставим только if (pos<0), то переменная "pos" считать ничего не будет, будет вечно ноль.(соотв. выведя в комментарий переменную "pos").

Не будет считать потому что ордер не выбран. OrderProfit - работает только, когда ордер выбран. (OrderSelect)...

А следовательно, значит, каким-то образом, он залазит за "countinue" .....

Такой вариант.... (уберём закрытие цикла 

Результат - nRSL висит в нуле, ничего не считает.

Примерно так должно быть

int nRSL=0; //  переменная для подсчёта убыточных ордеров
 
for(int i=0; i<OrdersHistoryTotal(); i++)   //создаю цикл
 {// Цикл открыт
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))  // выбираю ордер
  {
   double pos=OrderProfit(); // Сюда можно добавить комиссию и своп по ордеру.
   if (pos<0) // если этот ордер закрыт c убытком
   nRSL++; // то наращивать переменную на одну единицу КАЖДЫЙ ЗАКРЫТЫЙ ОРДЕР
  }
 }// Цикл закрыт
 
Alex8888888888 #:

Добрый день!

Я не знаю зачем Вам цикл в советнике.

Я бы сделал так

bool buy=false,sell=false;
datetime newbar_b=0,newbar_s=0;
//---
   if(newbar_b!=Time[0])
     {
      Tupf=iFractals(Symbol(),0,MODE_UPPER,3);
      if(Tupf>0) buy=true;
      newbar_b=Time[0];
     }
   if(newbar_s!=Time[0])
     {
      Tlowf=iFractals(Symbol(),0,MODE_LOWER,3);
      if(Tlowf>0) sell=true;
      newbar_s=Time[0];
     }
//+------------------------------------------------------------------+

   if(Ask>Tupf+10*_Point && Tupf!=Upf&&Tupf>fast_ma_0&&fast_ma_0>slow_ma_0)
     {
      double StL=NormalizeDouble(Tlowf,_Digits);
            
      int ticket=OrderSend(NULL,OP_BUY,Cclots,Ask,Slippage,StL0,Bid+Tprof*_Point,NULL,Magik,0,clrBlue);
      if(ticket<0)
        {
         Print("OrderSend error #",GetLastError());
        }
      else {buy=false; Print("Ask=",Ask,"Upf=",Upf," StL=",StL); Upf=Tupf;}
     }
 
Galim_V #:
%

Спасибо за ответ. Но, что то не разобрался, можно более развернуто? Если я туплю уж сорри.

Если что пишу MQL4.

Вот последняя строчка у меня и не идет (((

      int Time0 = 65*60;
      string Time3 = TimeToStr(Time0,TIME_MINUTES);
      string Time2 = TimeToStr(TimeCurrent(),TIME_MINUTES);
      string Time1 = Time2 + Time3;
 
Alexey Viktorov #:

Примерно так должно быть

Приогромное спасибо!!! Именно так! Правильно  работает!

Не додумался я до этого варианта. Массу вариантов испробывал.

 
Maksim Burov #:

Спасибо за ответ. Но, что то не разобрался, можно более развернуто? Если я туплю уж сорри.

Если что пишу MQL4.

Вот последняя строчка у меня и не идет (((

У вас есть время каждого дня в секундах

TimeCurrent()%(3600*24)

далее переводите значения заданные в переменных

input string tim_open="10:55";
input datetime open=D'1970.01.01 23:55:00';

в секунды

datetime dtime=StrToTime(tim_open)%(3600*24),
         dtm=open%(3600*24);

теперь можно сравнивать на > или < и задавать любой интервал. Если вам нужно точечно проверять в интервале времени, ниже пример из учебника Ковалева

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10;          // Время закрытия ордеров
bool Flag_Time=false;                  // Флаг, сообщения ещё не было 
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   int    Cur_Hour=Hour();             // Серверное время в часах
   double Cur_Min =Minute();           // Серверное время в минутах
   double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
   Alert(Cur_time);
   if (Cur_time>=Time_Cls)             // Если наступило время события
      Executor();                      //.. то выполняем задуманное
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 3 --
int Executor()                         // Пользовательская функция
  {
   if (Flag_Time==false)               // Если ещё не было сообщения..
     {                                 // .. то сообщаем (1 раз)
      Alert("Время важных новостей. Закройте ордера.");
      Flag_Time=true;                  // Теперь сообщение уже было
     }
   return;                             // Выход из польз. функции
  }
PS. Но контролировать изменения значений свопа лучше, на мой взгляд, если записывать его в файл. 
 
Здравствуйте, подскажите пожалуйста, при загрузке тиковой истории в MT5, загружается единая история тиков для данного инструмента, или для того сервера/счёта (например demo) на котором в момент загрузки работает терминал?
 
avs-47 #:
Здравствуйте, подскажите пожалуйста, при загрузке тиковой истории в MT5, загружается единая история тиков для данного инструмента, или для того сервера/счёта (например demo) на котором в момент загрузки работает терминал?
Здравствуйте, загружается всегда история того сервера, к которому в данный момент подключен MetaTrader. 
Причина обращения: