Cercasi piattaforma con volume profile

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico

Moderatore: Dainesi

Cercasi piattaforma con volume profile

Messaggioda Praytothemonitor » 06/01/2017, 16:50

Buongiorno a tutti.

Dopo gg e gg di ricerca su questo forum leggendo vecchi post e cercando molto in merito, ho deciso di chiedere dato che non sono riuscito a trovare nulla di interessante.

Sto cercando una piatta che dia il volume profile della singola candela.
Market delta tipo vecchio per intenderci, quella nuova, dopo i cambiamenti che ci son stati è diventata :no:
Ho Cluster delta ma graficamente non è la stessa cosa e poi se si vuole avere più chart aperte diventa laborioso continuare col mouse a trascinare le candele quando cambi tf. Per non parlare che mancano uj ucad ecc ecc.
Ha gli indicatori mi mt4 del volumprofile ma li ha massimo sull'orario e sinceramente non è che siano poi molto precisi.

Da vecchi post ho scaricato da qua: http://ninjatrader.com/Forex_Data_Confirmation ma sinceramente non avendola mai usata non trovo nulla di quel che cerco.

Da qua: http://www.globalfutures.com/platforms/index.asp sto cercando anche altre soluzioni

In sintesi chiedo: qualcuno usa qualcosa di analogo per vedere pvp e volum prof sulle candele singole?

Grazie e buone cose.
K.
Praytothemonitor
 
Messaggi: 160
Iscritto il: 11/06/2014, 19:14

Pubblicità

Pubblicità
 

Re: Cercansi piattaforma con volume profile

Messaggioda rdf » 07/01/2017, 12:41

Ciao,

non so se hai provato tradingview, forse ha quello che cerchi.
Nell'immagine che vedi se usi fixed range del volume profile puoi selezionare il numero di candele su cui tracciare il VP.
Puoi provare per 30gg la versione pro senza costi

Ciao
Allegati
vp.png
vp.png (52.27 KiB) Osservato 157 volte
rdf
 
Messaggi: 121
Iscritto il: 14/05/2014, 17:38

Re: Cercasi piattaforma con volume profile

Messaggioda Praytothemonitor » 10/01/2017, 10:44

Grazie rdf.
K.
Praytothemonitor
 
Messaggi: 160
Iscritto il: 11/06/2014, 19:14

Re: Cercasi piattaforma con volume profile

Messaggioda Praytothemonitor » 17/01/2017, 18:27

Nessun altro ha qualche consiglio da darmi?
Praytothemonitor
 
Messaggi: 160
Iscritto il: 11/06/2014, 19:14

Re: Cercasi piattaforma con volume profile

Messaggioda Praytothemonitor » 16/02/2017, 15:58

Ho trovato su FF questo indi: highvolumebar_verticalhistogram
L'ho confrontato col volum prof di clusterdelta con indicatore per mt4
I picchi e le relative lunghezze sono molto molto simili.
Hanno però lo stesso problema, non riesco a metterlo sulla singola candela, questo indi ne fa uno ogni gg.
Ma essendo un indicatore per mt4 che non so da dove prenda i dati (sempre che lo faccia) chiedo se qualcuno mi può cortesemente dare un aiuto per capire se è possibile modificarlo.
A sinistra l'indi di FF a destra quello di clusterdelta.

Grazie e buon trading.
K.
Allegati
Cattura indicatori a confronto.JPG
Cattura indicatori a confronto.JPG (79.19 KiB) Osservato 30 volte
Praytothemonitor
 
Messaggi: 160
Iscritto il: 11/06/2014, 19:14

Re: Cercasi piattaforma con volume profile

Messaggioda Praytothemonitor » 16/02/2017, 15:59

#define MAX_DAY_VOLATILITY 2000

// Íàñòðîå÷íûå ïàðàìåòðû èíäèêàòîðà
extern color i_supportColor = C'79, 123, 153';
extern color i_resistanceColor = C'134, 53, 53';
extern color i_indefiniteColor = DarkGray;

extern int i_indBarsCount = 5000;


// Ïðî÷èå ãëîáàëüíûå ïåðåìåííûå èíäèêàòîðà
bool g_activate, // Ïðèçíàê óñïåøíîé èíèöèàëèçàöèè..
// ..èíäèêàòîðà
g_init; // Ïåðåìåííàÿ äëÿ èíèöèàëèçàöèè..
// ..ñòàòè÷åñêèõ ïåðåìåííûõ âíóòðè..
// ..ôóíêöèé â ìîìåíò ïðîâåäåíèÿ..
// ..ïîâòîðíîé èíèöèàëèçàöèè
int g_volumesArray[MAX_DAY_VOLATILITY]; // Ìàññèâ äëÿ çàïèñè âåëè÷èí îáúåìîâ

datetime g_lastCheckedBar; // Âðåìÿ îòêðûòèÿ ïîñëåäíåãî..
// ..ïðîâåðåííîãî áàðà ÒÔ Ì1

#define PREFIX "HVBVH_" // Ïðåôèêñ ãðàôè÷åñêèõ îáúåêòîâ,..
// ..îòîáðàæàåìûõ èíäèêàòîðîì

#define SIGN_TREND_LINE "TR_LINE_" // Ïðèçíàê îáúåêòà "òðåíäîâàÿ ëèíèÿ"


#include <stderror.mqh>

//+-------------------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+-------------------------------------------------------------------------------------+
int init()
{
g_activate = false; // Èíäèêàòîð íå èíèöèàëèçèðîâàí
g_init = true;
g_lastCheckedBar = 0;

if (!TuningParameters()) // Íåâåðíî óêàçàííûå çíà÷åíèÿ..
return (-1); // ..íàñòðîå÷íûõ ïàðàìåòðîâ - ïðè÷èíà
// ..íåóäà÷íîé èíèöèàëèçàöèè

IsAllBarsAvailable(PERIOD_M1); // Çàïóñê ïîäêà÷êè äàííûõ ïî ÒÔ Ì1

g_activate = true; // Èíäèêàòîð óñïåøíî èíèöèàëèçèðîâàí
return(0);
}
//+-------------------------------------------------------------------------------------+
//| Ïðîâåðêà êîððåêòíîñòè íàñòðîå÷íûõ ïàðàìåòðîâ |
//+-------------------------------------------------------------------------------------+
bool TuningParameters()
{
string name = WindowExpertName();

if (Period() > PERIOD_H4)
{
Print(name, ": Èíäèêàòîð íå ðàáîòàåò íà òàéìôðåéìàõ âûøå, ÷åì H4.");
return (false);
}

int period = Period();
if (period == 0)
{
Alert(name, ": ôàòàëüíàÿ îøèáêà òåðìèíàëà - ïåðèîä 0 ìèíóò. Èíäèêàòîð îòêëþ÷åí.");
return (false);
}

if (Point == 0)
{
Alert(name, ": ôàòàëüíàÿ îøèáêà òåðìèíàëà - âåëè÷èíà ïóíêòà ðàâíà íóëþ. ",
"Èíäèêàòîð îòêëþ÷åí.");
return (false);
}

return (true);
}
//+-------------------------------------------------------------------------------------+
//| Ïðîâåðêà äîñòóïíîñòè áàðîâ óêàçàííîãî òàéìôðåéìà |
//+-------------------------------------------------------------------------------------+
bool IsAllBarsAvailable(int tf)
{
// Âû÷èñëåíèå èíäåêñà áàðà, ñ êîòîðîãî íåîáõîäèìî íà÷èíàòü ïðîâåðêó
if (g_lastCheckedBar == 0)
int lastBar = iBars(NULL, tf) - 1;
else
lastBar = iBarShift(NULL, tf, g_lastCheckedBar);

if (GetLastError() == ERR_HISTORY_WILL_UPDATED)
return (false);

// Ïðîâåðêà äîñòóïíîñòè áàðîâ
for (int i = lastBar - 1; i > 0; i--)
{
iTime(NULL, tf, i);
if (GetLastError() == ERR_HISTORY_WILL_UPDATED)
return (false);
}

// Âñå áàðû äîñòóïíû
g_lastCheckedBar = iTime(NULL, tf, 1);
return (true);
}
//+-------------------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+-------------------------------------------------------------------------------------+
int deinit()
{
DeleteAllObjects();
return(0);
}
//+-------------------------------------------------------------------------------------+
//| Óäàëåíèå âñåõ îáúåêòîâ, ñîçäàííûõ ïðîãðàììîé |
//+-------------------------------------------------------------------------------------+
void DeleteAllObjects()
{
for (int i = ObjectsTotal() - 1; i >= 0; i--)
if (StringSubstr(ObjectName(i), 0, StringLen(PREFIX)) == PREFIX)
ObjectDelete(ObjectName(i));
}
//+-------------------------------------------------------------------------------------+
//| Îïðåäåëåíèå èíäåêñà áàðà, ñ êîòîðîãî íåîáõîäèìî ïðîèçâîäèòü ïåðåðàñ÷åò |
//+-------------------------------------------------------------------------------------+
int GetRecalcIndex(int& total)
{
static int lastBarsCnt; // Îïðåäåëåíèå ïåðâîãî áàðà èñòîðèè,..
if (g_init) // ..íà êîòîðîì áóäóò äîñòóïíû..
{ // ..àäåêâàòíûå çíà÷åíèÿ
lastBarsCnt = 0;
g_init = false;
}
total = Bars - 2;


if (i_indBarsCount > 0 && i_indBarsCount < total)// Åñëè íå íóæíî ðàññ÷èòûâàòü âñþ..
total = i_indBarsCount; // ..èñòîðèþ, òî íà÷íåì ñ óêàçàííîãî..
// ..áàðà
if (lastBarsCnt < Bars - 1) // Êîë-âî ïîñ÷èòàííûõ áàðîâ - 0. Áóäóò
{ // ..óäàëåíû âñå ãðàôè÷åñêèå îáúåêòû
lastBarsCnt = Bars;
DeleteAllObjects();
return (total); // Åñëè âñÿ èñòîðèÿ - òî total
}

int newBarsCnt = Bars - lastBarsCnt;
lastBarsCnt = Bars;
return (newBarsCnt); // Íà÷èíàåì ñ íîâîãî áàðà
}
//+-------------------------------------------------------------------------------------+
//| Îòîáðàæåíèå òðåíäîâîé ëèíèè |
//+-------------------------------------------------------------------------------------+
void ShowTrendLine(int index, datetime leftTime, double leftPrice, datetime rightTime,
color clr)
{
string name = PREFIX + SIGN_TREND_LINE + leftTime + index;

if (ObjectFind(name) < 0)
{
ObjectCreate(name, OBJ_TREND, 0, leftTime, leftPrice, rightTime, leftPrice);
ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(name, OBJPROP_COLOR, clr);
ObjectSet(name, OBJPROP_BACK, true);
ObjectSet(name, OBJPROP_RAY, false);
return;
}

ObjectMove(name, 0, leftTime, leftPrice);
ObjectMove(name, 1, rightTime, leftPrice);
ObjectSet(name, OBJPROP_COLOR, clr);
}
//+-------------------------------------------------------------------------------------+
//| Îïðåäåëåíèå ýêñòðåìóìîâ óêàçàííîãî äíÿ è ïåðåðàñïðåäåëåíèå ìàññèâà îáúåìîâ ïðè.. |
//| ..íåîáõîäèìîñòè |
//+-------------------------------------------------------------------------------------+
int GetDayVolatility(int leftIndex, int rightIndex, int& volumesArray[],
double& minDayPrice)
{
int barsPerDay = leftIndex - rightIndex + 1;

minDayPrice = iLow(NULL, PERIOD_M1,
iLowest(NULL, PERIOD_M1, MODE_LOW, barsPerDay, rightIndex));
double maxDayPrice = iHigh(NULL, PERIOD_M1,
iHighest(NULL, PERIOD_M1, MODE_HIGH,
barsPerDay, rightIndex));

int dayVolatility = MathRound((maxDayPrice - minDayPrice + Point) / Point);
if (dayVolatility > MAX_DAY_VOLATILITY)
ArrayResize(volumesArray, dayVolatility);

ArrayInitialize(volumesArray, 0);
return (dayVolatility);
}
//+-------------------------------------------------------------------------------------+
//| Çàïèñü óðîâíåé îäíîé ñâå÷è â ìàññèâ îáúåìîâ |
//+-------------------------------------------------------------------------------------+
void SaveVolumes(double minBarPrice, double maxBarPrice, double minDayPrice,
double volume, int& volumesArray[], int& maxVolume,
double& maxVolumePrice)
{
for (double price = minBarPrice;
IsFirstMoreOrEqualThanSecond(maxBarPrice, price);
price += Point)
{
int indexOfArray = MathRound((price - minDayPrice) / Point);
volumesArray[indexOfArray] += volume;
if (maxVolume < volumesArray[indexOfArray])
{
maxVolume = volumesArray[indexOfArray];
maxVolumePrice = price;
}
}
}
//+-------------------------------------------------------------------------------------+
//| Ôîðìèðîâàíèå ìàññèâîâ îáúåìîâ è ñîîòâåòñòâóþùèõ èì èíäåêñîâ áàðîâ |
//+-------------------------------------------------------------------------------------+
void FormVolumesArray(int leftIndex, int rightIndex, int& volumesArray[],
int& dayVolatility, double& minDayPrice, int& maxVolume,
double& maxVolumePrice)
{
dayVolatility = GetDayVolatility(leftIndex, rightIndex, volumesArray, minDayPrice);
maxVolume = 0;

for (int i = leftIndex; i >= rightIndex; i--)
{
double minBarPrice = iLow(NULL, PERIOD_M1, i);
double maxBarPrice = iHigh(NULL, PERIOD_M1, i);
if (IsValuesEquals(minBarPrice, maxBarPrice))
continue;

int volume = iVolume(NULL, PERIOD_M1, i);
SaveVolumes(minBarPrice, maxBarPrice, minDayPrice, volume,
volumesArray, maxVolume, maxVolumePrice);
}
}
//+-------------------------------------------------------------------------------------+
//| Âû÷èñëåíèå èíäåêñîâ áàðîâ ìèíóòíîãî ÒÔ, îãðàíè÷èâàþùèõ äåíü ïåðåä óêàçàííûì âðåìåíåì|
//+-------------------------------------------------------------------------------------+
int GetIndexesOfDayRange(datetime timeOfNextDay, int& endDayBar, bool isNewDay)
{
endDayBar = 0;
if (isNewDay)
endDayBar = iBarShift(NULL, PERIOD_M1, timeOfNextDay) + 1;
int beginDayBar = endDayBar;
int total = iBars(NULL, PERIOD_M1);

while (TimeDayOfYear(iTime(NULL, PERIOD_M1, beginDayBar)) ==
TimeDayOfYear(iTime(NULL, PERIOD_M1, endDayBar))
&&
beginDayBar < total)
beginDayBar++;

return (beginDayBar - 1);
}
//+-------------------------------------------------------------------------------------+
//| Áîëüøå èëè ðàâíî ïåðâîå ÷èñëî, ÷åì âòîðîå? |
//+-------------------------------------------------------------------------------------+
bool IsFirstMoreOrEqualThanSecond(double first, double second)
{
return (first - second > - Point / 100);
}
//+-------------------------------------------------------------------------------------+
//| Ïåðâîå ÷èñëî áîëüøå ÷åì âòîðîå (first > second)? |
//+-------------------------------------------------------------------------------------+
bool IsFirstMoreThanSecond(double first, double second)
{
return (first - second > Point / 1000);
}
//+-------------------------------------------------------------------------------------+
//| Çíà÷åíèÿ ðàâíû? |
//+-------------------------------------------------------------------------------------+
bool IsValuesEquals(double first, double second)
{
return (MathAbs(first - second) < Point / 1000);
}
//+-------------------------------------------------------------------------------------+
//| Îïðåäåëåíèå öâåòà ãèñòîãðàììû |
//+-------------------------------------------------------------------------------------+
color GetHistogrammColor(double maxVolumePrice, int endDayBar)
{
double dayClosePrice = iClose(NULL, PERIOD_M1, endDayBar);

if (IsValuesEquals(maxVolumePrice, dayClosePrice))
return (i_indefiniteColor);

if (IsFirstMoreThanSecond(maxVolumePrice, dayClosePrice))
return (i_resistanceColor);

return (i_supportColor);
}
//+-------------------------------------------------------------------------------------+
//| Îòîáðàæåíèå íàéäåííûõ óðîâíåé |
//+-------------------------------------------------------------------------------------+
void ShowLevels(int dayVolatility, int& volumesArray[], double minDayPrice,
datetime dayBeginTime, int endDayBar, int maxVolume,
double maxVolumePrice)
{
// Îïðåäåëåíèå êîëè÷åñòâà ñåêóíä, ïðèõîäÿùåãîñÿ íà åäèíè÷íûé òèêîâûé îáúåì
double secondsInDay = MathMax(1,
iTime(NULL, PERIOD_M1, endDayBar) - dayBeginTime + 60);

double secondsPerVolume = secondsInDay / maxVolume;

// Îïðåäåëåíèå öâåòà ãèñòîãðàììû
color showColor = GetHistogrammColor(maxVolumePrice, endDayBar);

// Îòîáðàæåíèå ãèñòîãðàììû
for (int i = 0; i < dayVolatility; i++)
{
double price = minDayPrice + i * Point;
datetime volume = dayBeginTime + MathRound(secondsPerVolume * volumesArray[i]);
ShowTrendLine(i, dayBeginTime, price, volume, showColor);
}
}
//+-------------------------------------------------------------------------------------+
//| Îáðàáîòêà îäíîãî çàäàííîãî áàðà |
//+-------------------------------------------------------------------------------------+
void ProcessOneCandle(int index)
{
// Åñëè íåò ïåðåõîäà ÷åðåç íà÷àëî ñóòîê, òî ñâå÷à íå îáðàáàòûâàåòñÿ
datetime timeOfBar = Time[index];
datetime prevBarTime = Time[index + 1];
if (TimeDayOfYear(timeOfBar) == TimeDayOfYear(prevBarTime) && index != 0)
return;

// Íàõîæäåíèå áàðà è âðåìåíè íà÷àëà äíÿ
int endDayBar;
int beginDayBar = GetIndexesOfDayRange(timeOfBar, endDayBar, index != 0);
datetime dayBeginTime = iTime(NULL, PERIOD_M1, beginDayBar);

// Ôîðìèðîâàíèå ìàññèâà äàííûõ äëÿ ðàñ÷åòà ñòàòïàðàìåòðîâ íà èõ îñíîâå
double minDayPrice, maxVolumePrice;
int maxVolume, dayVolatility;
FormVolumesArray(beginDayBar, endDayBar, g_volumesArray,
dayVolatility, minDayPrice, maxVolume, maxVolumePrice);
if (maxVolume == 0)
return;

// Îòîáðàæåíèå óðîâíåé
ShowLevels(dayVolatility, g_volumesArray, minDayPrice,
dayBeginTime, endDayBar, maxVolume, maxVolumePrice);
}
//+-------------------------------------------------------------------------------------+
//| Îòîáðàæåíèå äàííûõ èíäèêàòîðà |
//+-------------------------------------------------------------------------------------+
void ShowIndicatorData(int limit, int total)
{
for (int i = limit; i >= 0; i--)
ProcessOneCandle(i);
}
//+-------------------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+-------------------------------------------------------------------------------------+
int start()
{
if (!g_activate) // Åñëè èíäèêàòîð íå ïðîøåë..
return (0); // ..èíèöèàëèçàöèþ, òî ðàáîòàòü îí..
// ..íå äîëæåí

if (!IsAllBarsAvailable(PERIOD_M1)) // Ïðîâåðêà ãîòîâíîñòè äàííûõ íà ÒÔ Ì1
return (0);

int total;
int limit = GetRecalcIndex(total); // Ñ êàêîãî áàðà íà÷èíàòü îáíîâëåíèå

ShowIndicatorData(limit, total); // Îòîáðàæåíèå äàííûõ èíäèêàòîðà

WindowRedraw();

return(0);
Praytothemonitor
 
Messaggi: 160
Iscritto il: 11/06/2014, 19:14


Torna a Metatrader - Expert Advisor - MQL

 


  • Discussioni correlate
    Risposte
    Visite
    Ultimo messaggio

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite