Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1513

 

Сижу более часа и не могу решить ребус

Сломали терминал, или у меня проблема?


Не получает данные с любого другого таймфрема, только с указанного при создании МА

int OnInit()
{
  hMA1=iMA(Symbol(), PERIOD_H1, 5, 0, MODE_EMA, PRICE_CLOSE);
  if(hMA1<0) {
    Alert("ERROR handle MA");
    return(INIT_FAILED);
  }
  return(INIT_SUCCEEDED);
}
int hMA1=-1;
double buf[1];
--
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[])

{
  Print(  CopyBuffer(hMA1,0,10,1,buf),"=", buf[0]  );
 ...

--

Печать на любом другой таймфрейме

--

Печать на тайме Н1, проблем никаких


 

Что помогает получить данные от МА

Тиков нет - выходные, поэтому только так

--

А теперь возникает вопрос?

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

 

Сделал так

когда данные не получены, обновляем график

ChartSetSymbolPeriod(0,Symbol(),PERIOD_CURRENT);

Но это даже не костыльное решение, а полное дилетантство

Как сделать нормальное решение, и почему так получается?

Как получить данные с другого таймрейма не на следующих тиках, а на первом, как это получат родной таймфрейм, на котором создан индикатор?
 
Vitaly Muzichenko #:
Как получить данные с другого таймрейма не на следующих тиках, а на первом, как это получат родной таймфрейм, на котором создан индикатор?

Как сделать нормальное решение, и почему так получается?

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

 
Vitaly Muzichenko #:

Сделал так

когда данные не получены, обновляем график

Но это даже не костыльное решение, а полное дилетантство

Как сделать нормальное решение, и почему так получается?

Посмотрите вот такой вариант.

bool f = false;
/****************Custom indicator iteration function*****************/
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(!f)
  {
   f = true;
   return 0;
  }
 
Print(CopyBuffer(hMA1,0,10,1,buf),"=", buf[0]);
 return rates_total;
}/*****************************************************************/

Запускать синхронизацию, наверное будет дороже.

 
Alexey Viktorov #:

Посмотрите вот такой вариант.

Запускать синхронизацию, наверное будет дороже.

Спасибо, но вопрос о закрытом рынке - тиков нет, и OnCalculate срабатывает один раз при переключении таймфорейма

Я сделал так и это работает, но это не совсем нормальное условие

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(rates_total-prev_calculated==0)
    return(rates_total);
  int res=Start(rates_total); // если "0" - то данные от МА не получены
  if(fl && res==0) {
    ChartSetSymbolPeriod(0,Symbol(),PERIOD_CURRENT);
    ChartRedraw();
    fl=false;
    return(0);
  }
  return(rates_total);
}
 
Vitaly Muzichenko #:

Спасибо, но вопрос о закрытом рынке - тиков нет, и OnCalculate срабатывает один раз при переключении таймфорейма

Я сделал так и это работает, но это не совсем нормальное условие

Виталий, а может было бы полезней проверить?

 

Проверил.

Ваша конструкция идентична моей, но без ChartSetSymbolPeriod и проверки, что МА не вернула результат

Она начинает работать только вот так

bool f = false;
/****************Custom indicator iteration function*****************/
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(!f)
  {
   f = true;
   ChartSetSymbolPeriod(0,Symbol(),PERIOD_CURRENT); // только так работает
   return 0;
  }
 
Print(CopyBuffer(hMA1,0,10,1,buf),"=", buf[0]);
 return rates_total;
}/*****************************************************************/
 

по какому критерию мне надо проводить тестирование если я хочу получить наибольший доход и наибольшую прибыль с минимальными просадками?


мнекажется мне нужно выбрать "Максимум комплексного критерия", я так и сделал но что означает цифра 40 в результате желтого цвета,  при просадке в 26 процентов и прибыли 675

я так понимаю это коэфицент текущего от стартового капитала в процентах дохода?

 
AkaEdie #:

по какому критерию мне надо проводить тестирование если я хочу получить наибольший доход и наибольшую прибыль с минимальными просадками?

мнекажется мне нужно выбрать "Максимум комплексного критерия", 

Выбрать "Максимум пользовательского критерия"

В код советника добавить, что то типа такого.

double OnTester(void)
  {
   double ret = TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD);

   return(ret);
  }