Проблема с проводным скользящим средним при создании советника...

 

что я делаю не так?

есть скриншот части кода, отвечающего за скользящую среднюю. Я заменил все переменные на значения, чтобы вы могли видеть настройки. другой скриншот показывает разницу в отрисовке MA и брошенного на график индикатора MA (вернее всех 4 типов).

Светло-голубой - это сглаженная МА, которая и близко не стоит с МА, сгенерированной в тестере.
Ближе всего к сгенерированной МА находится Simple, но она не совпадает с ней.

Что, черт возьми, происходит?

Файлы:
ma_problem1.png  154 kb
ma_problem2.png  80 kb
 
angreeee:

что я делаю не так?

есть скриншот части кода, отвечающего за скользящую среднюю. Я заменил все переменные на значения, чтобы вы могли видеть настройки. другой скриншот показывает разницу в рисовании MA и брошенного на график индикатора MA (вернее всех 4 типов).

Светло-голубой - это Smoothed, и он не близок к МА, сгенерированной в тестере.
Ближе всего к сгенерированной МА находится Simple, но она не совпадает с ней.

Что, черт возьми, происходит?

А какое значение вы получили? Я нигде не могу его увидеть.
 
angevoyageur:
А какое значение вы получили? Я нигде не могу его увидеть.

сравните 2 окна. одно слева - это MA, сгенерированная тестером стратегий. она проходит точно между сделками. справа у вас есть все типы MA370 (SMA, EMA, SSMA и LWMA), и ни один из них не совпадает с MA 370 слева. SSMA - это светло-голубая MA, которая нигде не приближается к MA, сгенерированной в бэк-тесте.

Прикрепляю еще один снимок экрана с добавленной строкой отладочного оповещения о текущем значении переменной "ma" (в журнале отображается последнее значение MA, а справа - последнее значение светло-голубой сглаженной МА 370, "брошенное" на график)

Я заметил, что MA на графике относятся к цене закрытия, в то время как в коде ma относится к цене открытия, но когда я менял скользящие средние на графике, это не изменило их визуально каким-либо существенным образом. Они по-прежнему выглядят так же, как на прилагаемом снимке экрана.

Файлы:
ma_problem3.png  142 kb
 
не то чтобы ea не работает. она работает хорошо, но когда я отлаживал ее, я заметил, что MA генерируется совершенно не так, как должно быть. Я знаю, что делаю что-то не так, но я все еще не знаю, что именно. Я прилагаю еще один скриншот настроек светло-голубой сглаженной МА, чтобы у вас была полная картина.
Файлы:
ma_problem4.png  66 kb
 
наиболее похожая МА, которую я нашел, это Smoothed MA 220, скриншот прилагается. Это не имеет никакого смысла, :( но, возможно, это какая-то подсказка...
Файлы:
ma_problem5.png  57 kb
 

Я выделил проблему в отдельный советник.

#property copyright   "Grzegorz Korycki"
#property version     "1.0"
#property description "MA TEST"


#include <Trade/Trade.mqh>

   #define  MAGICMA  20131002

double Bid;
double Ask;

   
double OnTester()
{
    double custommax = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
    return (custommax);
}

CTrade  trade;
   
void OnTick()
{
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Bid = last_tick.bid;
      Ask = last_tick.ask;
     }
   start();
}
  
int OnInit()
{
   trade.SetExpertMagicNumber(MAGICMA);
   int deviation=99;
   trade.SetDeviationInPoints(deviation);
   trade.SetAsyncMode(false);
   return(0);
}  
  
      
      
      
void trend1()
{

   int ma_temp;
   double ma_buffer[20];

   double ma;
   ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
   CopyBuffer(ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];
   
   Alert("ma=", ma);

}

      


void start()
{
   trend1();
}

Тестовая пара - GBP/NZD.
Файлы:
ma_test.mq5  2 kb
 

проблема становится все более и более странной. Когда я тестирую вышеупомянутый советник от 2012 года, он дает немного другие результаты для MA (в журнале журнала вы можете увидеть фактическое значение), чем когда я тестирую его от 2013 года. Ни один из них не близок к 370 SSMA, нанесенным на график.

Может быть, это что-то в моей инициализации, что заставляет советника вести себя подобным образом?

включая снимки экрана. Обратите внимание, что нарисованные линии находятся на разных уровнях при сравнении обоих скриншотов, и это один и тот же советник.

Файлы:
 

Похоже на основную ошибку: элементы не проиндексированы, как во временных рядах (обратный порядок).

Чтобы исправить это, нужно вызвать эту функцию...

ArraySetAsSeries(ma_buffer,true);
 
figurelli:

Похоже на основную ошибку: элементы не проиндексированы, как во временных рядах (обратный порядок).

Чтобы исправить это, вам нужно вызвать эту функцию...

Когда я добавляю ее, я получаю:

cannot be used for static allocated array       ma_test.mq5     50      4

но я использую только 1 кадр из этого массива. Это имеет значение? И почему такое предупреждение?

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

В документации сказано, что ее следует использовать только с константами:

[...]

const datetime &time[],

[...]

ArraySetAsSeries(time,true); 

а мой ma_buffer - переменный массив:

 double ma_buffer[20];
 
angreeee:

когда я добавляю его, я получаю:

но я использую только 1 кадр из этого массива. Это имеет значение? И почему такое предупреждение?

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

Вы правы, если вы копируете только один кадр, и это не является первопричиной (ваше объявление ma_buffer[20] отвлекло мое внимание на этот факт).

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

ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
 
figurelli:

Вы правы, если копируете только один кадр, и это не является первопричиной (ваше объявление ma_buffer[20] отвлекло мое внимание на этот факт).

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

Я изменил скрипт в соответствии с вашими рекомендациями, но проблема все еще сохраняется :(

теперь это выглядит так:

#property copyright   "Grzegorz Korycki"
#property version     "1.0"
#property description "MA TEST"


#include <Trade/Trade.mqh>

   #define  MAGICMA  20131002

double Bid;
double Ask;

   int ma_temp;
   double ma_buffer[20];

   
double OnTester()
{
    double custommax = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
    return (custommax);
}

   CTrade  trade;
   

   void OnTick()
  {
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Bid = last_tick.bid;
      Ask = last_tick.ask;
     }
   start();
  }
  
int OnInit()
  {
   trade.SetExpertMagicNumber(MAGICMA);
   int deviation=99;
   trade.SetDeviationInPoints(deviation);
   trade.SetAsyncMode(false);
   ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);


   return(0);
   }  
  
      
      
      
void trend1()
{

   double ma;
   CopyBuffer(ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];
   
   Alert("ma=", ma);
}

void start()
{
         trend1();

}

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

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

Причина обращения: