Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 250

 

Если по простому, чтобы быстро проверить, то типа такого:

   double profit = 0;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
           {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if(OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                  if(profit>max)
                    { 
                    cnt=OrdersTicket();
                    break;
                    }                  
                 }
              }
           }
        }
     }

Как правило, ордера идут по времени друг за другом, но это не гарантировано. Поэтому, по-хорошему, хронологию нужно проверять. Но для экспериментов и так сойдёт.

 
Aleksei Stepanenko #:

Если по простому, чтобы быстро проверить, то типа такого:

Как правило, ордера идут по времени друг за другом, но это не гарантировано. Поэтому, по-хорошему, хронологию нужно проверять. Но для экспериментов и так сойдёт.По

Согласен, время не гарантировано, поэтому и перебирать хочу все закрытые ордера в сторону увеличения по тикету. Знаю тикет ордера, и пробую от него считать, но что то пошло не так) Как правильно будет?

 
Aleksei Stepanenko #:

Если по простому, чтобы быстро проверить, то типа такого:

Как правило, ордера идут по времени друг за другом, но это не гарантировано. Поэтому, по-хорошему, хронологию нужно проверять. Но для экспериментов и так сойдёт.

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

Aleksei Stepanenko #:

Если по простому, чтобы быстро проверить, то типа такого:

Как правило, ордера идут по времени друг за другом, но это не гарантировано. Поэтому, по-хорошему, хронологию нужно проверять. Но для экспериментов и так сойдёт.

А что, код Алексея тоже не правильно считает?

 
Valeriy Yastremskiy #:

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

А что, код Алексея тоже не правильно считает?

Не пробовал. Сейчас по пробую. Отпишу.

 
Aleksei Stepanenko #:

Если по простому, чтобы быстро проверить, то типа такого:

Как правило, ордера идут по времени друг за другом, но это не гарантировано. Поэтому, по-хорошему, хронологию нужно проверять. Но для экспериментов и так сойдёт.

Проверил, при компеляция много на что ругается, все исправил, кроме :

if(profit>max)

этой строчки, не совсем понимаю ее. Можете обьснить?

 
makssub #:
Задумка следящая, после набора определенного профита, поменять тикет

max - это и есть та граница профита, после которого меняется тикет. Его значение задаёте Вы.

 
Aleksei Stepanenko #:

max - это и есть та граница профита, после которого меняется тикет. Его значение задаёте Вы.

Задача другая, если правильно понимаю. Открываются 1, 2 и 3 ордера. Как формируются цены открытия не знаю. Закрывается ордер 3, суммарный профит равен профиту ордера 3. Т.е. нужно вычислить тикет ордера, открытого перед ордером 3 . Потом закрывается ордер 2. Нужно найти тикет ордера открытого перед ордером 2. Это ордер 1. Суммарный профит равен профиту 2 и 3 ордеров.

Зачем так, не понимаю, но вроде логика такая.)

 
Валерий, я не до конца понял логику по тем двум предложениям.
 
Aleksei Stepanenko #:
Валерий, я не до конца понял логику по тем двум предложениям.

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

Вопросы от начинающих MQL4 MT4 MetaTrader 4

makssub, 2021.09.01 16:38

int FindTicket()
   {
   int oldticket;
   int tick=0;
   ticket=0;
   
   
   for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return(tick); 
   }              
int TickF = FindTicket();
int CalculateProfitHistory() 
{
  double _point;
  int    i, _ototal = OrdersHistoryTotal(), _profit=0;
  for   (i = 0; i < OrdersHistoryTotal(); i++) 
  {
    if (OrderSelect(TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
      if (OrderSymbol() == Symbol())
      {
        if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0) 
           {
              if (StringFind(OrderSymbol(), "") < 0) 
                 _point = 0.0001; 
              else _point = 0.01;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
  return(_profit);
}

В первой функции нахожу тикет нужного ордера.  А вторая должна посчитать профит всех закрытых ордеров после этого тикета. Профит тех, что были до него, мне неинтересны. Вот вторая, считает криво. При открытие ордера вызывается эти 2 функции, и соответственно он должен быть равен 0, но он не равен.
PS воспользовался Вашим советом, отказался от массивов) 
12-й квадратик сверху)


 

Все додумал, и сделал по своему исходя из ваших подсказать)

Задача была следящая, при появление убыточного ордера перекрыть его другими ордерами с профитом.

Как было реализовано. Запоминался тикет ордера открытого после убыточного, это у была наша точка отчета. После нее начинаем считать профит убыточного ордера, профит  закрытых ордеров после него. Напомню первый ордер открыт и закрываем его при достижении прибыли.

if ( (CalculateProfitHistory() + FirstProfit() >= Profit) 

{

          CloseFirst();

         Print ("закрываем первый убыточный");

}


double CalculateProfitHistory() 
{
   double profit = 0;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for(i = ototal-1; i >=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderSymbol() == Symbol() && OrderCloseTime() > 0)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderMagicNumber() == Magic )
               {
                  if (Ticket !=0)
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return(profit);
}
Причина обращения: