Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Как заработать на MQL5.community? Зайди и узнай!
ivan
505
ivan 2014.03.31 14:00 

Насколько я понимаю, событие drag&drop состоит из нескольких действий

1) кликнуть на объект 2) перетащить объект 3) отпустить мышку 4) (опция) кликнуть на объект, чтобы зафиксировать результат

По идее, обработка функцией OnChartEvent события с индентификатором CHARTEVENT_OBJECT_DRAG должна инициализироваться после исполнения всей последовательности событий, при это включать или нет 4-е действие в обработку должно быть опцией.

Но я вижу, что OnChartEvent срабатывает по каждому из событий, включая начальный клик. Но кроме того, после обработки события 1 возникает ошибка 4202 - "Object does not exist", и только после завершения всей цепочки ошибка пропадает.

Прилагаю код - это индикатор - он нарисует одну единственную линию и попробует считать координаты её опорных точек - попробуйте её посдвигать - результаты пишутся в файл OnChartEventCheck.csv - увидите ошибки 4202 при любом начальном клике на объект.

На вс.случай - MT4 Build 610, Windows 7.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property strict
#property copyright "qomment"
#property link      "https://www.mql5.com/ru/users/qomment"
#property indicator_chart_window  

#property indicator_buffers             0
#property indicator_minimum             0.0
#property indicator_maximum             0.0

int Handle;
bool Launched=0;
//--------------------------------------------------------------------
int OnInit(void)
  {
   Handle=FileOpen("OnChartEventCheck.csv",FILE_WRITE|FILE_SHARE_READ|FILE_CSV,'\t');
   FileWrite(Handle,"INIT_SUCCEEDED \n");
   return(INIT_SUCCEEDED);
  }
//--------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   if(!Launched)
     {
      bool obj=ObjectCreate("line",2,0,Time[100],High[100],Time[1],High[1]);
      FileWrite(Handle,"Object created=",obj,"\n");
      Launched=1;
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   FileWrite(Handle,"Deinit");
   FileClose(Handle);
   ObjectDelete("line");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                  )
  {
   if(id==CHARTEVENT_OBJECT_DRAG)
     {
         mygle(-1);//печать кода ошибки в файл
         
      if(sparam=="line")
        {
         //  считывание опорных точек линии и запись соответствующих номеров баров в файл
         
         long t0=ObjectGetInteger(ChartID(),sparam,OBJPROP_TIME,0); 
         mygle(0); //печать кода ошибки в файл
         long t1=ObjectGetInteger(ChartID(),sparam,OBJPROP_TIME,1); 
         mygle(1); //печать кода ошибки в файл

         int leftbar=iBarShift(NULL,0,t0,false);
         if(leftbar!=-1)
           {
            FileWrite(Handle,"leftbar=",leftbar);
           }

         int rightbar=iBarShift(NULL,0,t1,false);
         if(rightbar!=-1)
           {
            FileWrite(Handle,"righttbar=",rightbar);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int mygle(const int step)
  {

   int gle=GetLastError();
   if(gle!=0)
     {
      FileWrite(Handle,"Error =",gle," step=",step);
     }
   ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
ivan
505
ivan 2014.04.01 09:28  
.. разобрался - действительно, пока не закончится полный цикл drag&drop, терминал выдаёт ошибку Object does not exist - её надо блокировать, то есть не давать своей программе продолжать работу, пока ошибка не пропадёт - это будет означать, что пользователь завершил drag&drop. Несколько разочаровывает, что в хелпе mql4 ни о чём таком не упоминается, и void OnChartEvent() не содержит никаких controls для обработки этих ошибок.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий