Остался один вопрос, как можно понять для чего значение IN_RADIUS берется по модулю при нормализации данных:
double _dimension=fabs(IN_RADIUS)*((Low(StartIndex()+w+Index)-Low(StartIndex()+w+Index+1))-(High(StartIndex()+w+Index)-High(StartIndex()+w+Index+1)))/fmax(m_symbol.Point(),fmax(High(StartIndex()+w+Index),High(StartIndex()+w+Index+1))-fmin(Low(StartIndex()+w+Index),Low(StartIndex()+w+Index+1)));
ведь радиус кластера, константа и имеет положительное значение.
Возможно это ошибка и по модулю нужно брать весь числитель?
Собрал эксперта, но два параметра Stop Loss и Take Profit не такие как на скриншоте в статье:
В результате ни одной сделки...
Что-то не так делаю?
И как вместо ATR прикрутить другой индикатор, например MACD ?
Собрал эксперта, но два параметра Stop Loss и Take Profit не такие как на скриншоте в статье:
В результате ни одной сделки...
Что-то не так делаю?
И как вместо ATR прикрутить другой индикатор, например MACD ?
Прикрутить, можно так:
bool CSignalMACD::InitMACD(CIndicators *indicators) { //--- add object to collection if(!indicators.Add(GetPointer(m_MACD))) { printf(__FUNCTION__+": error adding object"); return(false); } //--- initialize object if(!m_MACD.Create(m_symbol.Name(),m_period,m_period_fast,m_period_slow,m_period_signal,m_applied)) { printf(__FUNCTION__+": error initializing object"); return(false); } //--- ok return(true); }
так же в protected:
protected: CiMACD m_MACD; // object-oscillator //--- adjusted parameters int m_period_fast; // the "period of fast EMA" parameter of the oscillator int m_period_slow; // the "period of slow EMA" parameter of the oscillator int m_period_signal; // the "period of averaging of difference" parameter of the oscillator ENUM_APPLIED_PRICE m_applied; // the "price series" parameter of the oscillator
и еще в public:
void PeriodFast(int value) { m_period_fast=value; } void PeriodSlow(int value) { m_period_slow=value; } void PeriodSignal(int value) { m_period_signal=value; } void Applied(ENUM_APPLIED_PRICE value) { m_applied=value;
и снова в protected:
protected: //--- method of initialization of the oscillator bool InitMACD(CIndicators *indicators); //--- methods of getting data double Main(int ind) { return(m_MACD.Main(ind)); } double Signal(int ind) { return(m_MACD.Signal(ind)); }
и наконец:
bool CSignalKM::OpenLongParams(double &price,double &sl,double &tp,datetime &expiration) { CExpertSignal *general=(m_general!=-1) ? m_filters.At(m_general) : NULL; //--- if(general==NULL) { m_MACD.Refresh(-1); //--- if a base price is not specified explicitly, take the current market price double base_price=(m_base_price==0.0) ? m_symbol.Ask() : m_base_price; //--- price overload that sets entry price to be based on MACD price =base_price; double _range=m_MACD.Main(StartIndex())+((m_symbol.StopsLevel()+m_symbol.FreezeLevel())*m_symbol.Point()); //
Только в чем смысл?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Возможности Мастера MQL5, которые вам нужно знать (Часть 02): Карты Кохонена:
Современный трейдер почти всегда сознательно или бессознательно находится в поиске новых идей. Он постоянно пробует новые стратегии, модифицирует их и отбрасывает те, что не оправдали себя. Этот исследовательский процесс требует много времени и сопряжен с ошибками. В этой серии статей я постараюсь доказать, что Мастер MQL5 является настоящей опорой трейдера. Благодаря Мастеру, трейдер экономит время при реализации своих идей. Кроме того, снижается вероятность ошибок, возникающих при дублировании кода. Вместо того чтобы тратить время на оформление кода, трейдеры претворяют в жизнь свою торговую философию.
Распространенное заблуждение относительно карт Кохонена заключается в том, что функторные данные обязательно должны представлять собой двухмерное изображение наподобие представленного ниже.
Такая интерпретация имеет право на существование, но в применении к трейдингу функтор может (а, возможно, и должен) иметь одно измерение. Таким образом, вместо того, чтобы сводить наши многомерные данные к двухмерной карте, мы нанесем их на одну линию. Карты Кохонена по определению предназначены для уменьшения размерности. В этой статье я хочу воспользоваться этой особенностью и поднять ее на новый уровень. Карты Кохонена отличаются от обычных нейронных сетей как количеством слоев, так и лежащим в их основе алгоритмом. Это однослойный набор нейронов, обычно выполненный в виде линейной двухмерной сетки. Все нейроны этого слоя, который мы называем функтором, подключаются к исходным данным, но не друг к другу. Это означает, что нейроны не зависят от веса друг друга напрямую и обновляются только при изменении исходных данных. Слой функторных данных представляет собой "карту", которая самоорганизуется на каждой итерации обучения в зависимости от исходных данных. Таким образом, после обучения каждый нейрон имеет размер с поправкой на вес в функторном слое, и это позволяет вычислить евклидово расстояние между любыми двумя такими нейронами.
Автор: Stephen Njuki