На биржах это так, цена обновляется только на основе сделок. С форексом тут конечно намного туманнее, тк прозрачных стандартов нет, но традиционно крупные диллеры обновляют цены либо по своим серверам (тот же А*пр* вообще стакан строит), а мелкие транслируют поставщиков ликвидности, и на ЕСН- счетах тоже всегда типи от поставщиков.
Напряг я свою мышцу немного и родилось несколько мыслей насчет этих таинственных идентификаторов, если я неправ то поправите.
Обьем, хоть тиковый хоть реальный хранятся в массивах volume[] и tick_volume[] , обновляется при вызове функции OnCalculate в индикаторе и MqlRates в советнике. То есть при каждом тике. учитывая порядок нумерации, можно вытащить обьемы из этих массивов.
VOLUME_TICK и VOLUME_REAL это просто идентификаторы, которые выносятся в интерфейс настроек индикатора. То есть если юзер выбирает тиковый обьем, то из OnCalculate вытаскивается тиковый обьем и т.д.
Сложно, запутанно и долго... вот сижу и думаю, стоит ли мне заморачиваться с этой 5 версией, или 4 ограничится?! на этом же на всем нужно еще и роботов писать, как то. А тут такие замуты на пустом месте.
Умозаключения сделал на основе анализа индикатора VOLUME в метатрейдере. Можете у себя открыть и поюзать.
//+------------------------------------------------------------------+//| Volumes.mq5 |//| Copyright 2009, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2009, MetaQuotes Software Corp."#property link"http://www.mql5.com"//---- indicator settings#property indicator_separate_window#property indicator_buffers2#property indicator_plots1#property indicator_type1 DRAW_COLOR_HISTOGRAM#property indicator_color1 Green,Red
#property indicator_style1 0#property indicator_width1 1#property indicator_minimum0.0//--- input datainputENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes /////////вот мы видем внешний параметр индикатора, кторорый может быть и VOLUME_REAL но по умолчанию VOLUME_TICK//---- indicator buffersdouble ExtVolumesBuffer[];
double ExtColorsBuffer[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
//---- buffers SetIndexBuffer(0,ExtVolumesBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtColorsBuffer,INDICATOR_COLOR_INDEX);
//---- name for DataWindow and indicator subwindow labelIndicatorSetString(INDICATOR_SHORTNAME,"Volumes");
//---- indicator digitsIndicatorSetInteger(INDICATOR_DIGITS,0);
//----
}
//+------------------------------------------------------------------+//| Volumes |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---check for rates totalif(rates_total<2)
return(0);
//--- starting work CopyRatesint start=prev_calculated-1;
//--- correct positionif(start<1) start=1;
//--- main cycleif(InpVolumeType==VOLUME_TICK) \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\в этом месте идет проверка, какой параметр выбран и какой обьем нужно использовать индикатору.
CalculateVolume(start,rates_total,tick_volume);
else
CalculateVolume(start,rates_total,volume);
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void CalculateVolume(constint nPosition,
constint nRatesCount,
constlong &SrcBuffer[])
{
ExtVolumesBuffer[0]=(double)SrcBuffer[0];
ExtColorsBuffer[0]=0.0;
//---for(int i=nPosition;i<nRatesCount && !IsStopped();i++)
{
//--- get some data from src buffer ////////////////// а дальше идет блок который я еще не могу переварить, кто знает подскажите!double dCurrVolume=(double)SrcBuffer[i];
double dPrevVolume=(double)SrcBuffer[i-1];
//--- calculate indicator
ExtVolumesBuffer[i]=dCurrVolume;
if(dCurrVolume>dPrevVolume)
ExtColorsBuffer[i]=0.0;
else
ExtColorsBuffer[i]=1.0;
}
//---
}
//+------------------------------------------------------------------+
Насколько я понимаю нотация следующая:
VOLUME_TICK - количество заключенных сделок на данной свече (сделка = тику, т.е. атомарному обновлению цены на площадке)
VOLUME_REAL - объем в контрактах (лотах) всех заключенных сделок на данной свече (если по тикам - то объем в контрактах данного тика).
Вы переворачивали массив ArraySetAsSeries
Данные будут одинаковы
Спасибо за совет! в принципе я сам думал что нужно порядок нумерации изменить. Сейчас попробую.
Насколько я понимаю нотация следующая:
VOLUME_TICK - количество заключенных сделок на данной свече (сделка = тику, т.е. атомарному обновлению цены на площадке)
Это очень смелое утверждение, что сделка равна атомарному обновлению цены.
Между этими величинами сильная корреляция, однако, это далеко не одно и то же.
Обьем, хоть тиковый хоть реальный хранятся в массивах volume[] и tick_volume[] , обновляется при вызове функции OnCalculate в индикаторе и MqlRates в советнике. То есть при каждом тике. учитывая порядок нумерации, можно вытащить обьемы из этих массивов.
VOLUME_TICK и VOLUME_REAL это просто идентификаторы, которые выносятся в интерфейс настроек индикатора. То есть если юзер выбирает тиковый обьем, то из OnCalculate вытаскивается тиковый обьем и т.д.
Сложно, запутанно и долго... вот сижу и думаю, стоит ли мне заморачиваться с этой 5 версией, или 4 ограничится?! на этом же на всем нужно еще и роботов писать, как то. А тут такие замуты на пустом месте.
Умозаключения сделал на основе анализа индикатора VOLUME в метатрейдере. Можете у себя открыть и поюзать.
Пожалуйста, вставляйте код в сообщение правильно: Правильно вставляем код на форуме