Учёба. Классы. Нужна помощь. - страница 32

 
//+------------------------------------------------------------------+
//| Обработчик событий на графиках                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Идентификатор события
                  const long &lparam,   // Параметр события типа long
                  const double &dparam, // Параметр события типа double
                  const string &sparam) // Параметр события типа string
  {
//--- Если это пользовательское событие
   if(id>=CHARTEVENT_CUSTOM) // Цикл событий по символам
     {
      const int number=id-CHARTEVENT_CUSTOM; //приведем в нормальный вид номер символа 0-7
        {
         //Print(TimeToString(TimeCurrent(),TIME_SECONDS)," -> id=",id-CHARTEVENT_CUSTOM," "+Symbols[number]+" (str.",__LINE__,")");
         //--- проверка времени для открытия позиции
         if(time_mode.GetTimeMode(TimeCurrent())==TRADE_ON)
           {
            //--- Проверяет сигналы и торгует по ним
            CheckSignalsAndTrade(number); //передается имя символа
            return;
           }
        }
     }
  }
 
Georgiy Merts #:

Да лааадно... Всё, что там написано - никак "в три строки"  не уместить! 

Это достаточно большой класс, с возможностями пошире, чем просто определение момента нового бара. 

Жорж надеюсь ты так шутишь тут))

 
lynxntech #:

Жорж надеюсь ты так шутишь тут))

Почему же? 

Навскидку - я из программы хочу знать - по первому тику какого именно таймфрейма совершается обработка ? Как из твоих "трёх строк" мне это получить? 

Или, скажем, как мне узнать, когда последний раз твои "три сточки" сработали, причём не по текущему символу и таймфрейму, а по другому? 

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

 
Georgiy Merts #:

Насколько я понимаю, бары приходят на все символы одновременно. Тики - да, могут быть разными. Если на EURUSD требуется первый тик в баре именно на GBPUSD - то надо с каждым тиком запоминать цену GBPUSD, и разрешать обработку только если изменилась именно эта цена. 

Ну, по крайней мере, я бы сделал так. 

На каждый символ и каждый ТФ свой объект и проверка только по этому символу и ТФ.

 
Alexey Viktorov #:

На каждый символ и каждый ТФ свой объект и проверка только по этому символу и ТФ.

Да, можно и так. 

Зависит от того, насколько "плотно" мы работает с данными по другому символу и таймфрейму. Если нам просто надо определять время тика, исходя из другого символа и таймфрейма - то, по-моему, городить дополнительный класс неразумно. 

А вот если нам надо не только определять приход тика, но и получать другую информацию, как-то её обрабатывать - то, разумнее использовать несколько объектов. 

Тут вопрос в "мере". Хороший пример - если мы делаем текстовый редактор - нужно ли делать каждую букву отдельным объектом? Зависит от того, насколько серьёзно мы хотим работать с буквами. Если каждая буква у нас будет иметь возможность каких-то индивидуальных отличий, изменений, настроек - то, да, каждая буква должна быть объектом. Однако, если мы пишем редактор типа Блокнота - то разумнее буквы объединять в объект "Строка", и уже именно с этими объектами работать. 

 
lynxntech #:

Посмотри внимательно код этого шпиона.

Там есть строки

   TimeCurrent(time);

дальше 

   if(time.min%2 ==0 && (flag_event & CHARTEVENT_NEWBAR_M2)!=0)  EventCustom(CHARTEVENT_NEWBAR_M2,price_current);
   if(time.min%3 ==0 && (flag_event & CHARTEVENT_NEWBAR_M3)!=0)  EventCustom(CHARTEVENT_NEWBAR_M3,price_current); 
   if(time.min%4 ==0 && (flag_event & CHARTEVENT_NEWBAR_M4)!=0)  EventCustom(CHARTEVENT_NEWBAR_M4,price_current);      
   if(time.min%5 ==0 && (flag_event & CHARTEVENT_NEWBAR_M5)!=0)  EventCustom(CHARTEVENT_NEWBAR_M5,price_current);     

То-есть,

если кратно 2 минутам

если кратно 3 минутам

4м или 5ти и далее…

Но ведь время TimeCurrent() это последнее известное время по символу… По символу на котором установлен советник.

Соответственно эта еб———ула никак не может гарантировать первый тик нового бара. Случается всякое. Считается самым «шустрым» инструментом EURUSD но никто не гарантирует, что GBPUSD не получит тиков пока EURUSD спит чуток.

А если это так, то и городить такой огород нет никакого смысла.

Жаль потраченного времени на разбор этого алгоритма… Всё это чушь…

 
Alexey Viktorov #:

Посмотри внимательно код этого шпиона.


Алексей, такого непробиваемого я еще не видел тут, где ты такое нашел в индикаторе шпионе???

там все что нужно сделать создать хендл с нужным ТФ


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

Константин Груздев там нагородил конечно, и статьи если читать того времени по этой теме, там есть нюансы

но все что нужно это просто получать с индикатора просто новый тик

 

вот подписка на индикатор, в ончартивент смтрим собатиыя, начинаются они вроде от 9000

индикатор подписаться в цикле должен на - 9001 и т.д по символам

эти id потом смотрите

 for(int s=0; s<TRADE_SYMBOLS; s++)
     {
      //--- Если торговля по этому символу разрешена
      if(Symbols[s]!="")
        {
         //---iSpy--------------------------------------------------
         spy_Handles[s]=iCustom(Symbols[s],PERIOD_M1,"_iSpy.ex5",ChartID(),s);
         if(spy_Handles[s]==INVALID_HANDLE)
            Alert("Не удалось установить агента на "+Symbols[s]);
         else
            Print(EXPERT_NAME,": Инициализация ["+Symbols[s]+": "+TimeframeToString(Period())
                  +"]["+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]");
 
lynxntech #:

Алексей, такого непробиваемого я еще не видел тут, где ты такое нашел в индикаторе шпионе???

там все что нужно сделать создать хендл с нужным ТФ


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

Константин Груздев там нагородил конечно, и статьи если читать того времени по этой теме, там есть нюансы

но все что нужно это просто получать с индикатора просто новый тик

lynxntech #:

вот подписка на индикатор, в ончартивент смтрим собатиыя, начинаются они вроде от 9000

индикатор подписаться в цикле должен на - 9001 и т.д по символам

эти id потом смотрите

А кому оно надо? Ну подписался на индикатор, но получил тик с индикатора. А гарантий, что это именно первый тик нового бара нет от слова абсолютно. Причину я назвал в предыдущем сообщении.

Этот способ получения равнозначен получения 

        MqlTick mqlTick;
        SymbolInfoTick("имя_символа", mqlTick);

Но сработает это либо по таймеру, либо по тику графика на котором стоит этот советник.

А непробиваемый я исключительно потому, что умею читать код и анализировать последствия.

 
Оформил базового советника в виде класса. Создал в новом советнике несколько экземпляров этого класса. Читаемость кода улучшилась в разы. Убедился: использование классов иногда очень удобно для сложного кода. Спасибо всем, кто поучаствовал. С вашей подачи надобность, с которой я открывал эту ветку форума достигнута.