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

 
Valeriy Yastremskiy #:

Вставляйте код правильно, альт S или по иконке, подсказка код.

А зачем вам массив SaveTick?

Вы используете только 2 элемента массива. Замените их на глобальные или статик переменные, если объявляете в функции. 

Не разумно для 2х переменных использовать массив.

И судя по всему, вы вызываете массивы до вызова функции FindTicket() в которой задается размер массива  SaveTick. И происходит выход за пределы массива.

Спасибо. разобрался.
Подскажите в чем ошибка, мне кажется не правильно считает функция


***
 
makssub #:

Спасибо. разобрался.
Подскажите в чем ошибка, мне кажется не правильно считает функция


Код правильно вставляйте, это 13-й квадратик сверху окна ответа.

А вы можете словами написать, что делает функция построчно. 

Судя по всему конечно не правильно.

И непонятно, где и как переменной  Tick присваивается тикет ордера.  И зачем проверки на магик и тип ордера по такому условия 
_magic < 0 || OrderMagicNumber() == _magic
Если функция вызывается с магиком меньше нуля или магик равек магик номеру выбранного ордера мы запрашиваем размер пункта и если он равен нулю мы ищем пустое значение в символе инструмента ордера... ну и далее.

Да и помните, ордер селект заполняет структуру данных ордера и хранит ее. И только после следующего ордер селект с другим номером или тикетом ордера данные в этой структуре поменяются.

Т.е. ОрдерСенд не заполняет структуру данных ордера, но возвращает тикет ордера или минус 1. А структура ордера заполняется только ОрдерСелект. И потом из этой структуры можно получить данные этого ордера.

 
Valeriy Yastremskiy #:

Код правильно вставляйте, это 13-й квадратик сверху окна ответа.

А вы можете словами написать, что делает функция построчно. 

Судя по всему конечно не правильно.

И непонятно, где и как переменной  Tick присваивается тикет ордера.  И зачем проверки на магик и тип ордера по такому условия 
_magic < 0 || OrderMagicNumber() == _magic
Если функция вызывается с магиком меньше нуля или магик равек магик номеру выбранного ордера мы запрашиваем размер пункта и если он равен нулю мы ищем пустое значение в символе инструмента ордера... ну и далее.

Да и помните, ордер селект заполняет структуру данных ордера и хранит ее. И только после следующего ордер селект с другим номером или тикетом ордера данные в этой структуре поменяются.

Т.е. ОрдерСенд не заполняет структуру данных ордера, но возвращает тикет ордера или минус 1. А структура ордера заполняется только ОрдерСелект. И потом из этой структуры можно получить данные этого ордера.

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-й квадратик сверху)

 
makssub #:

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

В первой функции находится тикет с наибольшим номером, если тикеты возрастают с номерами))) На следующей итерации цикла тикет следующего по номеру ордера сравнивается с тикетом предыдущего ордера. Ордер селект заполняет структуры ордера, а ОрдерТикет получает из этой структуры значение тикета.

Построчно для себя напиши или проговори, что делает каждая строчка кода) Лучше напиши, так самому будет понятней.

Во второй функции ОрдерСелект по одному и тому же тикету будет заполнять структуру ордера одними и теми же данными ордера с тикетом ТикФ)

 
Valeriy Yastremskiy #:

В первой функции находится тикет с наибольшим номером, если тикеты возрастают с номерами))) На следующей итерации цикла тикет следующего по номеру ордера сравнивается с тикетом предыдущего ордера. Ордер селект заполняет структуры ордера, а ОрдерТикет получает из этой структуры значение тикета.

Построчно для себя напиши или проговори, что делает каждая строчка кода) Лучше напиши, так самому будет понятней.

Во второй функции ОрдерСелект по одному и тому же тикету будет заполнять структуру ордера одними и теми же данными ордера с тикетом ТикФ)

Проговаривал, но видно плохо с логикой в отношении данного языка. Подскажи Как определить тикет последнего открытого ордера?

И как посчитать профит всех закрытых ордеров идущих после него?

 
makssub #:

Проговаривал, но видно плохо с логикой в отношении данного языка. Подскажи Как определить тикет последнего открытого ордера?

И как посчитать профит всех закрытых ордеров идущих после него?

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

 if(OrderSelect(Ticket, SELECT_BY_TICKET)==true) // Если выбор рыночного ордера произошел успешно
        {
         if(OrderCloseTime()==0)              // Если наш рыночный ордер не закрыт           {
            
            //           Alert("Наш рыночный ордер жив, Модифицируем его если нужно ");
            if(Tral_Stop!=0 || Tral_Profit!=0)
          {     ModifyTral(); }
            return;
           }
         if(OrderCloseTime()!=0)              // Если наш рыночный ордер закрылся
         {
Alert("Our market order has closed. The Adviser's work is completed ",
                  " Swap = ", OrderSwap(), " Commission = ", OrderCommission(),"Profit/loss = ",OrderProfit());
         // ..... // получаем профит и считаем общий профит например
         }

И лучше проговаривать логику до конца. Так потом легче. Начинать лучше с необходимых данных, и их должно быть достаточно для решения)

У нас есть время открытия ордеров (не отложенных). Есть их тикеты. Есть у каждого рыночного ордера цена открытия, СЛ и ТП. И есть время закрытия ордеров. И после закрытия ордера заполняются поля Профит.

Вот из этих данных нужно сверстать логику.

Фраза закрытые ордера идущие после последнего открытого не определена совсем. Идти могут по номеру, по тикету и по времени.

 
Valeriy Yastremskiy #:

По времени открытия ордера. Оно должно быть самым большим) 

пишите правильно, но что то код получился несколько витиеватый )))

по моему как пишите так и делать:

int GetTicketLastOpenOrder()
{
   int ticket = -1;
   datetime t = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderType() <= OP_SELL && OrderOpenTime() > t)
      {
         ticket = OrderTicket();
         t = OrderOpenTime();
      }
   }
   return(ticket);
}


ЗЫ: OrderSelect() по номеру тикета будет намного дольше выполняться чем просто перебор по открытым ордерам

 
Igor Makanu #:

пишите правильно, но что то код получился несколько витиеватый )))

по моему как пишите так и делать:


ЗЫ: OrderSelect() по номеру тикета будет намного дольше выполняться чем просто перебор по открытым ордерам

Спасибо Игорь, просто когда не понимают сути, правильный код по чему-то сути не доносит, поэтому и прошу сформулировать не сложные алгоритмы словами))) 

 
Valeriy Yastremskiy #:

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

И лучше проговаривать логику до конца. Так потом легче. Начинать лучше с необходимых данных, и их должно быть достаточно для решения)

У нас есть время открытия ордеров (не отложенных). Есть их тикеты. Есть у каждого рыночного ордера цена открытия, СЛ и ТП. И есть время закрытия ордеров. И после закрытия ордера заполняются поля Профит.

Вот из этих данных нужно сверстать логику.

Фраза закрытые ордера идущие после последнего открытого не определена совсем. Идти могут по номеру, по тикету и по времени.

Спасибо большое за ответы. Часть из Ваших предложений я реализовал. 
Написал функция, находит нужный тик.
Написал функцию, которая считает профит всех закрытых ордеров после нужного ордер тика выбранной функции. Осталось одно поправить ее по вашим рекомендациям, добавить проверку по времени и так далее.

tpl = NormalizeDouble(Bid - ProfitLock*Point, Digits);
            ticket = OrderSend (Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, tpl, "",Magic, 0, Red);


double CalculateProfitHistory()
{
double order=0,op=0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
      {
      if(OrderSelect(Tick,SELECT_BY_TICKET,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
         {
            
            
            op += OrderProfit();
            order +=op;
            cnt++;
            
         }
      }
      }
   return(order);
  }

Только одно теперь меня смущает, а считает как то не так. Если ТР выходит 0.02 в результате теста, то она считает и пишет в Comment 0.1300. Подскажите, что с ней не так?

 
Помогите мне пожалуйста  https://www.mql5.com/ru/forum/160683/page1609.
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.09.02
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...