Используете ли вы CExpert при создании роботов? - страница 24

 
СанСаныч Фоменко:

Да, это у вас полные и абсолютные фантазии.

Суровая реальность(бизнес) совершенно в противоположном направлении.


Если вернуться к математике. Математика не такая сложная, как кажется. И мы ее шаг за шагом отлично имплементируем в MetaTrader 5 с MQL5.

 
Renat Fatkhullin:

Да, это у вас полные и абсолютные фантазии.

Суровая реальность(бизнес) совершенно в противоположном направлении.


Если вернуться к математике. Математика не такая сложная, как кажется. И мы ее шаг за шагом отлично имплементируем в MetaTrader 5 с MQL5.

Спасибо за внимание.

Меня устраивает все как есть. Мне нужна определенность, а теперь она у меня имеется.

 
George Merts:

Лично мне не хватает только лишь указателей (или ссылок) на массив. Причем, только в одной ситуации - в функции OnCalculate() индикаторов, когда у нас получается, что либо надо "тянуть" через все фукнции все ссылки на массивы, либо сперва копировать данные в свой массив (на основе CArray, скажем), а потом, запрашивать в нужных местах указатели на них.

Остальное - в MQL все есть.

Или хотя бы возможность запускать OnCalculte() самостоятельно.  
 
Dmitry Fedoseev:
Или хотя бы возможность запускать OnCalculte() самостоятельно.  
Так это можно делать всегда.
 
fxsaber:
Так это можно делать всегда.
Как?
 
Dmitry Fedoseev:
Как?
Из подсмотренного, например, так
#define TIMESERIES(X) Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

int FullOnCalculate( const int Prev_Calculated = 0 )
{
  int Spread[];
  long RealVolume[];
  
  int Size = INT_MAX;
  
  #ifdef __MQL4__
    const int bars = ::Bars;
  #endif

  #ifdef __MQL5__
    const int bars = ::Bars(::Symbol(), ::Period());
  #endif

  TIMESERIES(Spread)
  TIMESERIES(RealVolume)
  
  #ifdef __MQL4__
    return(::OnCalculate(Size, Prev_Calculated, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
  #endif
  
  #ifdef __MQL5__
    datetime Time[];
    double Open[];
    double High[];
    double Low[];
    double Close[];
    long TickVolume[];

    TIMESERIES(Time)
    TIMESERIES(Open)
    TIMESERIES(High)
    TIMESERIES(Low)
    TIMESERIES(Close)
    TIMESERIES(TickVolume)
  
    return(::OnCalculate(Size, Prev_Calculated, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
  #endif
}
 
fxsaber:
Из подсмотренного, например, так

Вариант. Но возникает вопрос, перерисуется ли индикатор при таком вызове (на графике картинка изменится)? Есть смутное подозрение, что нет, придется ждать тика, поэтому смысл такого вызова пропадает. Но кто знает, пробовать надо.    

 
Dmitry Fedoseev:

Есть смутное подозрение, что нет

Точно нет. Спасал вроде как вызов ChartRedraw но работало точно не всегда.
 
fxsaber:
Из подсмотренного, например, так
Что-то я не совсем понял, как это поможет не тянуть через весь код переданные ссылки на массивы ?


Домустим, мы можем вызывать эту функцию самостоятельно - значит, на входе этой функции мы должны поставить проверку, кто ее вызвал. То ли терминал, то ли мы сами. Если терминал - мы получаем ссылки на массивы, и ??? Их же надо как-то сохранить ! А вызов этой функции самим экспертом - в чем смысл-то ?

И что-то у меня такое ощущение, что в приведенном фрагменте, таки, происходит копирование массивов - а этого как раз и хочется избежать.

 
Комбинатор:
Точно нет. Спасал вроде как вызов ChartRedraw но работало точно не всегда.

Работает всегда!

Calculate-событие отличается от всех остальных только тем, что по его окончании вызывается ChartRedraw. И больше ничем.

Например, если менять индикаторные буферы в OnChartEvent или OnTimer, то надо только добавить ChartRedraw. Если OnCalculate вызывается из OnCalculate - ChartRedraw делать не нужно. Если из OnChartEvent, OnTimer, OnInit, OnDeinit, OnBookEvent и т.д. - нужно.