Осциллятор Equity средствами MQL5 - страница 2

 
DV2010: но почему  изменяющееся значение Equity не отображается на Индикаторе, хотя изменяющиеся значения (проверено!) в массив Индикатора записываются?

Ничего там не записывается, цикл не вызывается. Проверьте сами.
 

В том-то и дело, что цикл вызывается по всем тикам!

Вот, смотрите сами! Специально вставил вывод в тело цикла:

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[]){
   for (int i = prev_calculated; i <= rates_total-1; ++i){
      Print("Equity - OnCalculate - Cycle: prev_calculated=",prev_calculated,"   rates_total=",rates_total);
      Print("Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=", AccountInfoDouble(ACCOUNT_EQUITY));
      Values[i] = AccountInfoDouble(ACCOUNT_EQUITY);
   }
   return rates_total;
}

А вот - концовка результата: 

2011.01.20 13:58:56     Core 1  OnTester result 0
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9949.299999999999
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: prev_calculated=6418   rates_total=6419
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionOpen: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #12 buy 0.15 EURUSD at 1.33593 done (based on order #12)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionClose: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #11 buy 0.15 EURUSD at 1.33593 done (based on order #11)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9929.65
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: prev_calculated=6417   rates_total=6418
 
DV2010:

В том-то и дело, что цикл вызывается по всем тикам!

Вот, смотрите сами! Специально вставил вывод в тело цикла:

А вот - концовка результата: 

 

Причем здесь тестирование? Запустите индикатор на графике и все увидите. Только не забудьте внести мои правки.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

Тестирование здесь при том, что мне необходимо видеть изменение Equity внутри тестируемого периода на истории.

Правки Ваши внес, Индикатор запускал и в режиме тестирования и путем перетаскивания на новый график.

Индикатор работает как на всем периоде вплоть до текущих котировок, так и на любых таймфреймах (или что именно значит "все увидите"?)

Тем не менее значение Equity остается постоянным, хотя вывод в журнал показывает, что оно меняется.

( Иначе как еще можно понять работает цикл или нет, как не через Print? )

...На всякий случай привожу "скелет" эксперта с вставленным индикатором:

#property copyright "Copyright 2010, Pavlov Sergei"
#property link      ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;

int Equity1=0;
void OnInit(){
   Equity1 = iCustom(NULL,0,"Equity",
                          5,          // Период
                          0,          // Смещение
                          MODE_SMA,   // Метод рассчета
                          PRICE_CLOSE // считаем по ценам закрытия)
                          );
   Expert1.Init();
}
void OnTick(){
   Expert1.OnTick();
}
void OnDeinit(const int reason){
   Expert1.Deinit();
}
 
DV2010:

Тестирование здесь при том, что мне необходимо видеть изменение Equity внутри тестируемого периода на истории.

Правки Ваши внес, Индикатор запускал и в режиме тестирования и путем перетаскивания на новый график.

И индикатор работает как на всем периоде вплоть до текущих котировок, так и на любых таймфреймах (или что именно значит "все увидите"?)

Тем не менее значение Equity остается постоянным, хотя вывод в журнал показывает, что оно меняется.

( Иначе как еще можно понять работает цикл или нет, как не через Print? )

...На всякий случай привожу "скелет" эксперта с вставленным индикатором:

Нет смысла вставлять неправильный индикатор в советник, от этого он не станет лучше. Вы так и не проверили мой вариант?
 

Может я ошибаюсь, но не сравниваете ли Вы показ индикатора на графике после завершения тестирования с произведенными расчетами во время тестирования?

Дело в том, что результаты (расчетные массивы) кастомного индикатора из тестера никак не переносятся на график, а просто запускается указанных индикатор на новый расчет на графике.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

Запустите этот индикатор на минутном графике (при наличии открытой позиции) и минут через 10-15 получите подобную картинку.


Код:

//+------------------------------------------------------------------+
//|                                             Equity_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double Values[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Values,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,100);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Values,false);
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {


   Print("prev_calculated=",prev_calculated,"   rates_total=",rates_total);
   int limit=prev_calculated;
   if(limit>0) limit--;

//---Блок заполнения Индикатора и журнала сообщений значениями
   for(int i=limit; i<rates_total;++i)
     {
      Values[i]=AccountInfoDouble(ACCOUNT_EQUITY);
     }
   return rates_total;
  }
//+------------------------------------------------------------------+
 

Рош, я уже спрашивал вас, в чем мой индикатор неправильный, и писал вам о том, как именно проверял  в том числе и ваш вариант. И старался объяснить я Вам это максимально подробно, в то время, как Вы писали лишь коротко о том, что “цикл не работает” и “увидите все сами”.

...Renat, показ индикатора на графике после завершения тестирования, как я понимаю, происходит именно на основании произведенных во время тестирования расчетов и заполнения массива индикатора. Но что значит, что результата из тестера на график кастомного индикатора из тестера не переносятся?

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

Мне казалось, что соответствие между массивом значений индикатора, который заполняется в OnCalculated и значениями индикатора на графике является однозначным, иначе каким образом значения Индикатора инициализировать?

Трудно понять… Вроде бы – тривиальная задача, но бьюсь над ней уже несколько дней, причем трудно найти человека, который смог бы хотя бы намекнуть на то, как она может быть по-другому решена на истории и решается ли вообще.

Еще раз, как понимаю это я (поправьте меня, если я ошибаюсь, если не затруднит).

1.     В тестере я указываю период тестирования и выбираю эксперт с присоединенным к нему моим индикатором.

2.     Первый вызов OnCalculated вызывается с параметрами prev_calculated =0 и rates_total=номеру тика(бара), соответствующего началу тестирования. В рамках этого периода значение баланса остается на начальном и постоянном уровне.

3.     Последующие вызовы OnCalculated по барам в рамках периода тестирования происходят по каждому отдельному бару, и здесь можно инициализировать массив значений индикатора теми данными, которые меняются (например, продублировать цену, что у меня, как я писал получалось, но тогда почему нельзя вместо изменяющихся цен инициализировать изменяющимися значениями Equity?)

И вообще, вот Вы – профи. Решается эта, надеюсь по смыслу простая задача, или MetaTrader’у до таких “высот” еще расти и расти? :)))

Свой простое видение решения этой задачи я предложил, но работать оно отказывается.

Тогда как ее можно реализовать - график Equity под графиком цен по результатам тестирования на истории?

 
Отвечу вам одно, пока не появиться режим визуализации решить вашу задачу не так просто. Есть одно решение, это записывать данные эквити в файл при тесте. потом данные из этого файла записать в буфер индикатора тем самым построить график эквити.
 

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

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

Действительно же критичной динамика Equity становится на продолжительной истории с сотнями и даже тысячами сделок, однако График в тестере простое сопоставление этой динамики с динамикой цен не обеспечивает в принципе (если, конечно, MetaQuote не считает главным для программистов беглый отсев уже готовых экспертов без анализа отдельных серий слабых и сильных позиций).