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

 
Благодарю всех ответивших.
 
Aleksandr Slavskii #:

В справке уже есть. https://www.mql5.com/ru/docs/basis/types/integer

я имел в виду откуда вопрошающий взял такой прототип OnCalculate, а не что вообще появился тип int32_t

 
Maxim Kuznetsov #:

я имел в виду откуда вопрошающий взял такой прототип OnCalculate, а не что вообще появился тип int32_t

Визард сгенерировал

 
Vladislav Boyko #:

Визард сгенерировал

и действительно...это свежачок, в последнем билде

до визардов добрались шаловливые ручки :-) теперь и это поломают

 
Maxim Kuznetsov #:

и действительно...это свежачок, в последнем билде

до визардов добрались шаловливые ручки :-) теперь и это поломают

Поражаюсь уровню буллинга. Ощущение, что терминал пишете Вы, а кто-то другой его ломает...

 
Artyom Trishkin #:

Поражаюсь уровню буллинга. Ощущение, что терминал пишете Вы, а кто-то другой его ломает...

Просто периодически возникает ощущение, что терминал пишут ради писания терминала.
 
Artyom Trishkin #:

Поражаюсь уровню буллинга. Ощущение, что терминал пишете Вы, а кто-то другой его ломает...

А Вы думаете, ломает его Максим Кузнецов?
 
Здравствуйте. У меня вопрос к профессионалам или техподдержке (если это баг)...

У меня есть робот на MT5, который работает сессиями с пачками рыночных позиций.
В очередном апдейте я хочу его научить, чтобы он учитывал историю закрытых сделок не только непосредственно закрытых им самим (по Magic_ID), но и закрытых вручную (при условии, что робот их открывал).
Общая блок схема:
1. При изменении истории сделок робот собирает первичную информацию по сделкам закрытия (DEAL_ENTRY_OUT) с начала своей сессии.
2. С помощью DEAL_POSITION_ID получаем тикет открывающей сделки.
3. С помощью DEAL_MAGIC получаем Magic_ID открывающей сделки
4. Если Magic_ID открывающей позиции равен заданному в настройках, то считаем закрывающую сделку нашей и фиксируем сведения о ней.
5. Отрисовываем метки открытия и закрытия позиции и линию жизни позиции. (Это удобно, когда на одной паре стоит несколько роботов, чтобы графически видеть нужную часть истории). 

По этой блок-схеме я сделал инклюд. На тестере работает как задумано. В журнал пишет:
Журнал на тестете

Но на реале как надо не работает. Путем последовательно исключения выяснил, что DEAL_MAGIC не считывает у сделки открытия.
И условие if(deal_id_in != id_Orders){continue;}   // если ID входящей сделки не наш, выбираем следующий ордер  (строка 94)//. Дальше не пускает.
Журнал на реале.

Прошу вас указать в чем причина и как её победить? 
Код инклюда прилагаю.

P.S. Логи на рисунках как видно разные. Это потому что на реале до конечного лога не добираемся, то я раскоментил строку 92, чтобы было видно докуда доходим.

//+------------------------------------------------------------------+
//|                                                  DataHistory.mqh |
//|                                                            Ваш % |
//|                                                vashprocent@bk.ru |
//+------------------------------------------------------------------+
#property strict

  int      HistoryCountOrders;     //последнее известное количество ордеров в истории 
  double   BalanceHistory,         //баланс В $ по закрытым ордерам  
           LotsHistory;            //объем лота по всем закрытым ордерам с начала сессии

//=================================================================================================
struct HistoryOrders        // структура массива с данными по истории ордеров
{
   int               Deal_type_out[];              // тип сделки закрытия 
   datetime          Close_time[];                 // время закрытия позиции 
   double            Close_price[];                // цена закрытия позиции
   double            Close_lot[];                  // лот закрытия
   ulong             Deal_ticket_out[];            // тикет сделки закрытия
   long              ID_deal_out[];                // ID сделки закрытия (если 0 - значит вручную)
   
   int               Deal_type_in[];               // тип сделки открытия 
   datetime          Open_time[];                  // время открытия позиции
   double            Open_price[];                 // цена открытия
   double            Open_lot[];                   // лот открытия
   ulong             Deal_ticket_in[];             // тикет сделки открытия
   long              ID_deal_in[];                 // ID сделки открытия
 
}; HistoryOrders ActualHistoryOrders;
// ActualHistoryOrders.Deal_type_out[1]=

//+------------------------------------------------------------------+
//| Обработка ордеров в истории сессии                               |
//+------------------------------------------------------------------+
void DataHistory(datetime startTimeSessin, int id_Orders)
{
   int   totalPos;                           // кол-во закрытыхпозиций за время сессии
   
      if(!HistorySelect(startTimeSessin, TimeCurrent())){    // запрашиваем историю сделок с начала сессии до настоящего момента
         Print("HistorySelect() failed. Error ", GetLastError());
         return;
      }
      totalPos=HistoryDealsTotal();                                           // запоминаем текущее количество ордеров в истории
      Print("DataHistory: Кол-во сделок в истории сессии ",totalPos);
      
      BalanceHistory=0;                                                       // обнуляем баланс по закрытым позициям
      LotsHistory=0;                                                          // обнуляем сумму лотов по всем закрытым позициям с начала сессии
      HistoryCountOrders=0;                                                   // кол-во закрытых позиций за это время  
      ArrayResize(ActualHistoryOrders.Deal_type_out,  totalPos, 1);           // задаем изначальные размеры массивов истории сделок
      ArrayResize(ActualHistoryOrders.Close_time,     totalPos, 1);
      ArrayResize(ActualHistoryOrders.Close_price,    totalPos, 1);
      ArrayResize(ActualHistoryOrders.Close_lot,      totalPos, 1);                 
      ArrayResize(ActualHistoryOrders.Deal_ticket_out,totalPos, 1);
      ArrayResize(ActualHistoryOrders.ID_deal_out,    totalPos, 1);      
      ArrayResize(ActualHistoryOrders.Deal_type_in,   totalPos, 1);
      ArrayResize(ActualHistoryOrders.Open_time,      totalPos, 1);
      ArrayResize(ActualHistoryOrders.Open_price,     totalPos, 1);
      ArrayResize(ActualHistoryOrders.Open_lot,       totalPos, 1);      
      ArrayResize(ActualHistoryOrders.Deal_ticket_in, totalPos, 1);
      ArrayResize(ActualHistoryOrders.ID_deal_in,     totalPos, 1);
                                    
      ArrayInitialize(ActualHistoryOrders.Deal_type_out, -1);                 // обнуляем данные по типам сделок закрытия
      ArrayInitialize(ActualHistoryOrders.Close_time,    -1);
      ArrayInitialize(ActualHistoryOrders.Close_price,   -1);
      ArrayInitialize(ActualHistoryOrders.Close_lot,     -1);
      ArrayInitialize(ActualHistoryOrders.Deal_ticket_out,-1);
      ArrayInitialize(ActualHistoryOrders.ID_deal_out,   -1);
      ArrayInitialize(ActualHistoryOrders.Deal_type_in,  -1);
      ArrayInitialize(ActualHistoryOrders.Open_time,     -1);
      ArrayInitialize(ActualHistoryOrders.Open_price,    -1);
      ArrayInitialize(ActualHistoryOrders.Open_lot,      -1);
      ArrayInitialize(ActualHistoryOrders.Deal_ticket_in,-1);
      ArrayInitialize(ActualHistoryOrders.ID_deal_in,    -1);      
       

    //--- СКАНИРУЕМ ИСТОРИЮ СДЕЛОК ---       
      for(int i=0; i<totalPos; i++){                                                      // перебираем все закрытые позиции
         ulong deal_ticket = HistoryDealGetTicket(i);                                     // фиксируем тикет сделки
         //Print("DataHistory: deal_ticket=",deal_ticket);
         if(deal_ticket==0) continue;                                                     // если тикет нулевой, то пропускаем этот ордер
         if(HistoryDealGetString(deal_ticket,DEAL_SYMBOL) !=_Symbol){continue;}           // если символ не наш, выбираем следующий ордер       
         //Print("DataHistory: _Symbol=",_Symbol);         
         long deal_type = HistoryDealGetInteger(deal_ticket, DEAL_TYPE);                  // считываем тип сделки          
         if(!(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)){continue;}          // если сделка была НЕ рыночный BUY или SELL, то пропускаем этот ордер
         //Print("DataHistory: deal_type=",deal_type);           
         //Print("DataHistory: deal_entry=",HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)); 
         if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)                // если направление сделки - это выход из рынка
         {  
            //Print("DataHistory: deal_entry=",HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)); 
            ulong deal_ticket_in = HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID);    // получаем тикет cделки открытия    
            int deal_id_in = (int)HistoryDealGetInteger(deal_ticket_in,DEAL_MAGIC);             // получаем ID cделки открытия 
            Print("DataHistory: deal_ticket_out=",(string)deal_ticket," deal_type_out=",(string)deal_type," deal_ticket_in=",(string)deal_ticket_in," deal_id_in=",(string)deal_id_in);            

            if(deal_id_in != id_Orders){continue;}                                          // если ID входящей сделки не наш, выбираем следующий ордер            
            long deal_id_out = HistoryDealGetInteger(deal_ticket_in, DEAL_MAGIC);                    // получаем ID cделки закрытия               
            //Print("DataHistory: deal_ticket=",(string)deal_ticket," deal_type=",(string)deal_type," deal_ticket_in=",deal_ticket_in," deal_id_in=",deal_id_in," deal_id_out=",deal_id_out);
            {
               HistoryCountOrders++;                                                      // число наших закрытых позиций
               
             //--- собираем сведения о каждой закрытой сделке ---
               ActualHistoryOrders.Deal_ticket_out [HistoryCountOrders-1]=(ulong)deal_ticket;                                                               // фиксируем тикет сделки закрытия
               ActualHistoryOrders.Deal_type_out   [HistoryCountOrders-1]=(int)deal_type;                                                                   // тип сделки закрытия 
               ActualHistoryOrders.Close_time      [HistoryCountOrders-1]=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);                           // время сделки закрытия 
               ActualHistoryOrders.Close_price     [HistoryCountOrders-1]=(double)NormalizeDouble(HistoryDealGetDouble(deal_ticket,DEAL_PRICE),_Digits);    // цена сделки закрытия 
               ActualHistoryOrders.Close_lot       [HistoryCountOrders-1]=(double)NormalizeDouble(HistoryDealGetDouble(deal_ticket,DEAL_VOLUME),2);         // лот сделки закрытия
               ActualHistoryOrders.ID_deal_out     [HistoryCountOrders-1]=(int)deal_id_out;                                                                 // id сделки закрытия               
               
               ActualHistoryOrders.Deal_ticket_in  [HistoryCountOrders-1]=(ulong)deal_ticket_in;                                                            // тикет сделки открытия  
               ActualHistoryOrders.Deal_type_in    [HistoryCountOrders-1]=(int)(deal_type==DEAL_TYPE_SELL? 0 : 1);                                          // тип сделки открытия 
               ActualHistoryOrders.Open_time       [HistoryCountOrders-1]=(datetime)HistoryDealGetInteger(deal_ticket_in,DEAL_TIME);                        // время открытия позиции
               ActualHistoryOrders.Open_price      [HistoryCountOrders-1]=(double)NormalizeDouble(HistoryDealGetDouble(deal_ticket_in,DEAL_PRICE),_Digits); // цена открытия
               ActualHistoryOrders.Open_lot        [HistoryCountOrders-1]=(double)NormalizeDouble(HistoryDealGetDouble(deal_ticket_in,DEAL_VOLUME),2);      // лот открытия
               ActualHistoryOrders.ID_deal_in      [HistoryCountOrders-1]=(int)deal_id_in;                                                                  // id сделки открытия
            }
         }  // конец условия if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
      }     // конец цикла for(int hi=total; hi>=0; hi--){ //перебираем все закрытые ордера
    //----------        
      if(HistoryCountOrders>0){                                                            // если есть закрытые сделки в истории
         ArrayResize(ActualHistoryOrders.Deal_type_out,  HistoryCountOrders, 1);           // задаем новые размеры массивов истории сделок
         ArrayResize(ActualHistoryOrders.Close_time,     HistoryCountOrders, 1);
         ArrayResize(ActualHistoryOrders.Close_price,    HistoryCountOrders, 1);
         ArrayResize(ActualHistoryOrders.Close_lot,      HistoryCountOrders, 1);                 
         ArrayResize(ActualHistoryOrders.Deal_ticket_out,HistoryCountOrders, 1);
         ArrayResize(ActualHistoryOrders.ID_deal_out,    HistoryCountOrders, 1);        
         ArrayResize(ActualHistoryOrders.Deal_type_in,   HistoryCountOrders, 1);
         ArrayResize(ActualHistoryOrders.Open_time,      HistoryCountOrders, 1);
         ArrayResize(ActualHistoryOrders.Open_price,     HistoryCountOrders, 1);
         ArrayResize(ActualHistoryOrders.Open_lot,       HistoryCountOrders, 1);      
         ArrayResize(ActualHistoryOrders.Deal_ticket_in, HistoryCountOrders, 1);
         ArrayResize(ActualHistoryOrders.ID_deal_in,     HistoryCountOrders, 1);        
         
         for(int hi=0; hi<HistoryCountOrders; hi++){                                                              // перебираем все наши закрытые позиции
            LotsHistory+=NormalizeDouble(ActualHistoryOrders.Close_lot[hi],2);                                    // подсчитываем общий объем лота закрытых ордеров
            BalanceHistory+= HistoryDealGetDouble(ActualHistoryOrders.Deal_ticket_out[hi],DEAL_PROFIT)            // подсчет баланса по закрытым ордерам с начала сессии
                            +HistoryDealGetDouble(ActualHistoryOrders.Deal_ticket_out[hi],DEAL_COMMISSION)*2      // предполагается, что если брокер берет комиссию, 
                            +HistoryDealGetDouble(ActualHistoryOrders.Deal_ticket_out[hi],DEAL_SWAP);             // то он делит её пополам (за открытие и за закрытие сделки)              
          
            Print("DataHistory: Deal_ticket_out=",(string)ActualHistoryOrders.Deal_ticket_out[hi],", Deal_type_out=",(string)ActualHistoryOrders.Deal_type_out[hi],", ID_deal_out=",ActualHistoryOrders.ID_deal_out[hi],
                             ", Deal_ticket_in =",(string)ActualHistoryOrders.Deal_ticket_in[hi], ", Deal_type_in =",(string)ActualHistoryOrders.Deal_type_in[hi], ", ID_deal_in =",ActualHistoryOrders.ID_deal_in[hi] );
          
          //--- рисуем знак открытия, если его нет
          //ObjectOrderSend(deal_type_in,                         op_lot,                           op_price,                           deal_ticket_in);                             
 // закоментировал, потому что это в другом инклюде          ObjectOrderSend(ActualHistoryOrders.Deal_type_in[hi], ActualHistoryOrders.Open_lot[hi], ActualHistoryOrders.Open_price[hi], ActualHistoryOrders.Deal_ticket_in[hi]);   
          
          //--- рисуем знак закрытия и линию жизни позиции 
          //ObjectOrderDelete(int in_type,                          ulong in_ticket,                        double in_price,                    datetime in_time,                  double out_price,                    datetime out_time                 )         
 //  закоментировал, потому что это в другом инклюде          ObjectOrderDelete(ActualHistoryOrders.Deal_type_in[hi], ActualHistoryOrders.Deal_ticket_in[hi], ActualHistoryOrders.Open_price[hi], ActualHistoryOrders.Open_time[hi], ActualHistoryOrders.Close_price[hi], ActualHistoryOrders.Close_time[hi]);
                  
         }
     //----------
      //int index_open_time=ArrayMinimum(ActualHistoryOrders.Open_time,0);                                                 // смотрим индекс ячейки с самым ранним временем открытия позиции       
      //if(MathAbs((int)GlobalVariableGet(StartTimeSessin)-(int)ActualHistoryOrders.Open_time[index_open_time])>=1)        // если время в ГП StartTimeSessin отличается от времени из истории на 1сек и более
      //{  
      //   Print("DataHistory: Время начала сессии скорректировано по историческим данным с "+(string)((datetime)GlobalVariableGet(StartTimeSessin))+" на "+(string)(ActualHistoryOrders.Open_time[index_open_time]-1)); 
      //   GlobalVariableSet(StartTimeSessin, (double)(ActualHistoryOrders.Open_time[index_open_time]-1));                                     // корректируем время начала сессии по историческим данным      
      //}
      Print("DataHistory: Кол-во закрытых сделок в истории сессии HistoryCountOrders = ",HistoryCountOrders,". BalanceHistory = ",DoubleToString(BalanceHistory,2),". LotsHistory = ",DoubleToString(LotsHistory,2));
   }
}
//======================================================================== 


Файлы:
DataHistory.mqh  29 kb
 
lynxntech #:

чтобы жизнь медом не казалась, еще больше взорвать мозг не профессиональным программистам


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

Если вы профессиональный программист - то вы не должны считать что "нейросеть это просто спасение", по крайней мере в том виде в котором они представлены сейчас. Это Google 2.0 в лучшем случае, доверять ему решение задач по программированию или математике пока не стоит, я уже много раз ловил его на простых ошибках которые школьники со средними оценками не допустили бы

 
Alexandr Sokolov #:

Если вы профессиональный программист - то вы не должны считать что "нейросеть это просто спасение", по крайней мере в том виде в котором они представлены сейчас. Это Google 2.0 в лучшем случае, доверять ему решение задач по программированию или математике пока не стоит, я уже много раз ловил его на простых ошибках которые школьники со средними оценками не допустили бы

в какой из них ты это прочитал