Вопросы от "чайника" - страница 53

 
Не путайте бесусловное и тупое (от незнания) пересоздание индикаторов на каждом тике с разумным (редким и по необходимости) созданием индикатора. В первом случае получаете стократный тормоз и утечку ресурсов, а во втором - идеальную работу.
 
Renat:
Не путайте бесусловное и тупое (от незнания) пересоздание индикаторов на каждом тике с разумным (редким и по необходимости) созданием индикатора. В первом случае получаете стократный тормоз и утечку ресурсов, а во втором - идеальную работу.

Я прекрасно понимаю что Karlson по незнанию сделал ошибку, так же понимаю и суть этой ошибки.

Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?

У меня есть решение, правда оно содержит длл, но вы же ратуете за чистый mql, вот и предложите решение на mql.

ЗЫ я уже упоминал об отглушении OnCalculate() и расчётах в событиях, но через событие можно передать три параметра. В моём решении тут на помощь приходит длл которая через лонг передаёт адрес массива с параметрами, в индикаторе по этому адресу получаются данные.

Если у вас есть решение на mql просто покажите пальцем, тут народ понятливый.

 
Urain:

Я прекрасно понимаю что Karlson по незнанию сделал ошибку, так же понимаю и суть этой ошибки.

Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?

Сколько разных индикаторов в реальности надо создать? Наверняка не больше 10, иначе будет просто бессмысленная трата ресурсов.

Так как изменений параметров конечно, то можно просто создать коллекцию из индикаторов, в которую нужный индикатор добавляется по необходимости. Если индикаторов заведомо меньше 10 и они имеют явный смысл (начальные, подтверждающие, корректирующие и тд), то можно создать именованные переменные хендлов с нужными параметрами.

 
Urain:

Но предложите разумную схему для решения его задачи. Человеку нужно использовать код записанный в индикаторе, но параметр(ы) этого кода определяются динамично перед каждым обращением к данным индикатора?

Задумался немного. Если параметр(ы) кода определяются динамично перед каждым обращением к данным индикатора, то почему бы процедуру определения таких параметров также не запихнуть в код индикатора? Иными словами, все, абсолютно все расчёты, - в индикатор.

Или есть ситуации, когда такой поход принципиально невозможен? 

 
Подскажите пожалуйста почему в таком простом индикаторе нулевой(первый с права) бар не просчитывается везде кроме недельного графа?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

Задумался немного. Если параметр(ы) кода определяются динамично перед каждым обращением к данным индикатора, то почему бы процедуру определения таких параметров также не запихнуть в код индикатора? Иными словами, все, абсолютно все расчёты, - в индикатор.

Или есть ситуации, когда такой поход принципиально невозможен? 

Есть такие ситуации, например когда параметры вычисляются другим(и) индикатором(и) и возвращаются советнику, а советник на основе например нейронки решает какую модель задействовать. Те заранее неизвестно какой из наборов параметров будет применён.

 
Expert:
Подскажите пожалуйста почему в таком простом индикаторе нулевой(первый с права) бар не просчитывается везде кроме недельного графа?


Ой) подставил сюда: SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); вместо e - rates_total и все заработало)
 
Expert:
Ой) подставил сюда: SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); вместо e - rates_total и все заработало)

Править ошибки человека с ником  Expert  ? это нужно в тему юмор.
 

Пробую собрать мультивалютник. Остановился пока на схеме, которую предложил Николай Косицин в своей статье "Создание эксперта, торгующего на разных инструментах". Столкнулся с проблемой, когда результаты отличаются, если запустить тест с разных инструментов, но на одних и тех же параметрах. Пробежался по форуму и нашёл, что многие пришли к тому, что этот вопрос можно решить при помощи функции OnTimer(). Андрей Хатимлянский посоветовал вот здесь

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

Я попробовал ловить момент образования бара на всех инструментах, но у меня не вышло добиться нужного результата.

Например:

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

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

В функции OnTick() схема, которую предложил Николай Косицин.

Например:

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


Функция isNewBar(Symbol,Timeframe) вызывается в функции, в которой исполняются торговые операции, то есть в TradePerformer(параметры).

Например: 

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


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

Подскажите, как правильно реализовать проверку нового бара в мультивалютном эксперте в представленной схеме.
 
Urain:
Править ошибки человека с ником  Expert  ? это нужно в тему юмор.
На этом форуме можно и нужно править ошибки в коде Expert-ов, вне зависимости от расы и таймфрейма :)
Причина обращения: