что я делаю не так?
есть скриншот части кода, отвечающего за скользящую среднюю. Я заменил все переменные на значения, чтобы вы могли видеть настройки. другой скриншот показывает разницу в рисовании MA и брошенного на график индикатора MA (вернее всех 4 типов).
Светло-голубой - это Smoothed, и он не близок к МА, сгенерированной в тестере.
Ближе всего к сгенерированной МА находится Simple, но она не совпадает с ней.
Что, черт возьми, происходит?
А какое значение вы получили? Я нигде не могу его увидеть.
сравните 2 окна. одно слева - это MA, сгенерированная тестером стратегий. она проходит точно между сделками. справа у вас есть все типы MA370 (SMA, EMA, SSMA и LWMA), и ни один из них не совпадает с MA 370 слева. SSMA - это светло-голубая MA, которая нигде не приближается к MA, сгенерированной в бэк-тесте.
Прикрепляю еще один снимок экрана с добавленной строкой отладочного оповещения о текущем значении переменной "ma" (в журнале отображается последнее значение MA, а справа - последнее значение светло-голубой сглаженной МА 370, "брошенное" на график)
Я заметил, что MA на графике относятся к цене закрытия, в то время как в коде ma относится к цене открытия, но когда я менял скользящие средние на графике, это не изменило их визуально каким-либо существенным образом. Они по-прежнему выглядят так же, как на прилагаемом снимке экрана.
Я выделил проблему в отдельный советник.
#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.
проблема становится все более и более странной. Когда я тестирую вышеупомянутый советник от 2012 года, он дает немного другие результаты для MA (в журнале журнала вы можете увидеть фактическое значение), чем когда я тестирую его от 2013 года. Ни один из них не близок к 370 SSMA, нанесенным на график.
Может быть, это что-то в моей инициализации, что заставляет советника вести себя подобным образом?
включая снимки экрана. Обратите внимание, что нарисованные линии находятся на разных уровнях при сравнении обоих скриншотов, и это один и тот же советник.
Похоже на основную ошибку: элементы не проиндексированы, как во временных рядах (обратный порядок).
Чтобы исправить это, нужно вызвать эту функцию...
ArraySetAsSeries(ma_buffer,true);
Похоже на основную ошибку: элементы не проиндексированы, как во временных рядах (обратный порядок).
Чтобы исправить это, вам нужно вызвать эту функцию...
Когда я добавляю ее, я получаю:
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];
когда я добавляю его, я получаю:
но я использую только 1 кадр из этого массива. Это имеет значение? И почему такое предупреждение?
После добавления этой строки ничего не изменилось (и предупреждение, и обратные тесты показывают, что добавление этой строки не имело никакого эффекта).
Вы правы, если вы копируете только один кадр, и это не является первопричиной (ваше объявление ma_buffer[20] отвлекло мое внимание на этот факт).
Однако я предлагаю вам перенести строку ниже в Init(), а хэндл в global, потому что это действительно источник проблем (после этого, пожалуйста, протестируйте его снова).
ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
Вы правы, если копируете только один кадр, и это не является первопричиной (ваше объявление 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, и я мог бы сравнить оба - протестировать его и изолировать ошибку. (если у кого-то есть несколько свободных минут).
Я собираюсь проверить через секунду и ответить, является ли проблема такой же на других парах или это только эта одна пара, так как это очень странно.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
что я делаю не так?
есть скриншот части кода, отвечающего за скользящую среднюю. Я заменил все переменные на значения, чтобы вы могли видеть настройки. другой скриншот показывает разницу в отрисовке MA и брошенного на график индикатора MA (вернее всех 4 типов).
Светло-голубой - это сглаженная МА, которая и близко не стоит с МА, сгенерированной в тестере.
Ближе всего к сгенерированной МА находится Simple, но она не совпадает с ней.
Что, черт возьми, происходит?