PDA

Просмотр полной версии : Как получить объемы из индикатора Премиум в свой робот.



deniss
04.03.2019, 11:29
Коллеги,

очень часто появляются вопросы о том, как получить данные из индикатора Премиум в робот.

Учитывая, что индикатор Премиум работает в асинхронном режиме, то использование iCustom не приводит к успеху. Я сделал небольшой набросок того, как Вы можете получать объемы в робот.
Вам нужно перенести эту часть кода в свой советник

(Eng: there are too many questions regarding to how to get volumes to the expert from Premium indicators. Premium use asynchronous calls so using iCustom may be failed. Here small example how you can get volumes for your expert. You should implement to your expert)




#property strict

//+------------------------INCLUDE-----------------------------------+
#include <stdlib.mqh>

//+--------------- CLUSTERDELTA VOLUMEN DATA --------------------------+
#import "premium_mt4_v4x1.dll"
int InitDLL(int &);
string Receive_Information(int &, string);
int Send_Query(int &, string, string, int, string, string, string, string, string, string, int, string, string, string,int);
#import

datetime TIME_Array[]; // Array for TIME
double VOLUME_Array[]; // Array of Volumes, indexes of array are corelated to TIME_ARRAY
double DELTA_Array[]; // Array of Deltas, indexes of array are corelated to TIME_ARRAY
datetime last_loaded=0;
string indicator_client;
bool ReverseChart_SET=false; // not used in expert
int Seconds_Interval_To_Update_Volumes=10;

bool VOLUMES_INIT=false;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

int INIT_DLL_result;
InitDLL(INIT_DLL_result); // in the next version you dont have use this function
if(INIT_DLL_result==-1) { Print("Error during load Volumes DLL") ; return INIT_FAILED; }

// DO NOT CHANGE THIS CODE & DATA
do
{
indicator_client = "CDPA" + StringSubstr(DoubleToString(TimeLocal(),0),7,3)+""+DoubleToStr(MathAbs((MathRand()+3)%10),0);
} while (GlobalVariableCheck(indicator_client));
GlobalVariableTemp(indicator_client);
// =====================

EventSetTimer(1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
GlobalVariableDel(indicator_client);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert time function |
//+------------------------------------------------------------------+
void OnTimer()
{
// DO NOT FORGET TO USE EventSetTimer(1); in Init
// IF YOU DO NOT LIKE USE onTimer() YUO SHOULD MOVE THIS CODE TO onTick()

static int Load_Frequency=0;
// do not update faster than one time per 5 seconds
if(Seconds_Interval_To_Update_Volumes<5) { Seconds_Interval_To_Update_Volumes=5; }

VOLUMES_GetData();
if (Load_Frequency % Seconds_Interval_To_Update_Volumes == 0)
{
Load_Frequency=0;
VOLUMES_SetData();
}
Load_Frequency++;
if (VOLUMES_INIT) { Print (Time[0]," ",VOLUME_by_index(0)); } // <-- for testing purposes
// VOLUMES_INIT is a signal that we have first package of volumes
}


int ArrayBsearchCorrect(datetime &array[], double value,
int count = WHOLE_ARRAY, int start = 0,
int direction = MODE_ASCEND)
{
if(ArraySize(array)==0) return(-1);
int i = ArrayBsearch(array, (datetime)value, count, start, direction);
if (value != array[i])
{
i = -1;
}
return (i);
}

void SortDictionary(datetime &keys[], double &values[], double &values2[],
int sortDirection = MODE_ASCEND)
{
datetime keyCopy[];
double valueCopy[];
double valueCopy2[];
ArrayCopy(keyCopy, keys);
ArrayCopy(valueCopy, values);
ArrayCopy(valueCopy2, values2);
ArraySort(keys, WHOLE_ARRAY, 0, sortDirection);
for (int i = 0; i < MathMin(ArraySize(keys), ArraySize(values)); i++)
{
values[ArrayBsearch(keys, keyCopy[i])] = valueCopy[i];
values2[ArrayBsearch(keys, keyCopy[i])] = valueCopy2[i];
}
}


int VOLUMES_SetData()
{

int k=0,i;

string ExtraData="AUTO";
string MetaTrader_GMT="AUTO";
string ver="4.0";
int Days_in_History=1;
datetime Custom_Start_time=D'2017.01.01 00:00';
datetime Custom_End_time=D'2017.01.01 00:00';

i = Send_Query(k,indicator_client, Symbol(), Period(), TimeToStr(TimeCurrent()), TimeToStr(Time[0]), ExtraData, TimeToStr(last_loaded),MetaTrader_GMT,ver,Days_in_ History,TimeToStr(Custom_Start_time),TimeToStr(Cus tom_End_time),AccountCompany(),AccountNumber());

if (i < 0) { Alert ("Error during query registration"); return -1; }
return 1;
}

int VOLUMES_GetData()
{

string response="";
int length=0;
int valid=0;
int len=0,td_index;
int i=0;
double index;
int iBase=0;
double ask_value=0, bid_value=0;
string result[];
string bardata[];
string MessageFromServer;

// get query from dLL
response = Receive_Information(length, indicator_client);
if (length==0) { return 0; }

if(StringLen(response)>1)
{
len=StringSplit(response,StringGetCharacter("\n",0),result);
if(!len) { return 0; }
MessageFromServer=result[0];

for(i=1;i<len;i++)
{
if(StringLen(result[i])==0) continue;
StringSplit(result[i],StringGetCharacter(";",0),bardata);
td_index=ArraySize(TIME_Array);
index = (double)StrToTime(bardata[0]);
ask_value= StringToDouble(bardata[1]);
bid_value= StringToDouble(bardata[2])*(ReverseChart_SET?-1:1);


if(index==0) continue;
iBase = ArrayBsearchCorrect(TIME_Array, index );
if (iBase >= 0) { td_index=iBase; }
if(td_index>=ArraySize(TIME_Array))
{
ArrayResize(TIME_Array, td_index+1);
ArrayResize(VOLUME_Array, td_index+1);
ArrayResize(DELTA_Array, td_index+1);
}
else { if((VOLUME_Array[td_index])>(ask_value) && td_index>=ArraySize(TIME_Array)-2) { ask_value=VOLUME_Array[td_index]; bid_value=DELTA_Array[td_index];} }

TIME_Array[td_index] = (datetime)index;
VOLUME_Array[td_index] = ask_value;
DELTA_Array[td_index] = bid_value;

}
valid=ArraySize(TIME_Array);

if (valid>0)
{
SortDictionary(TIME_Array,VOLUME_Array,DELTA_Array );
int lastindex = ArraySize(TIME_Array);
last_loaded=TIME_Array[lastindex-1];
if(last_loaded>Time[0])last_loaded=Time[0];
VOLUMES_INIT=true;
}

}
return (1);
}


int VOLUME_by_index(int ix, bool BrokehHour=true)
{
if(ArraySize(TIME_Array)<2) return 0;
if(ArraySize(Time)<=ix) return 0;

int iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] );

if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 1*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 2*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 3*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 4*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M15 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 5*60 ); } // 5 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_H1 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 30*60 ); } // 35 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H1 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 35*60 ); } // 35 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H4 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 60*60 ); } // 60 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H4 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] + 60*60 ); } // 60 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H4 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] + 2*60*60 ); } // 120 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_W1 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] + 24*60*60); } // 35 Min BrokenHour / ES


if (iBase >= 0)
{
return (int)VOLUME_Array[iBase];
}

return 0;
}

deniss
04.03.2019, 11:39
Фактически за получение объемов отвечает этот кусок кода:


void OnTimer()
{
static int Load_Frequency=0;
if(Seconds_Interval_To_Update_Volumes<5) { Seconds_Interval_To_Update_Volumes=5; }

VOLUMES_GetData();
if (Load_Frequency % Seconds_Interval_To_Update_Volumes == 0)
{
Load_Frequency=0;
VOLUMES_SetData();
}
Load_Frequency++;
}


Функция Volumes_SetData() через каждый интервал, заданный в параметре Seconds_Interval_To_Update_Volumes в секундах дает запрос на DLL на получение данных по текущему инструменту.

Volume_GetData постоянно опрашивает DLL на предмет того, были ли уже получены данные по прошлому запросу. Пока данные не получены, все последующие запросы будут игнорироваться внутри DLL.
После получения первого набора данных переменная VOLUMES_INIT становится true

Если Вам нужно протестировать только историю, то достаточно сделать SetData и периодически вызывать GetData пока, VOLUMES_INIT не станет true.
Лучше всего это делать где-то в onTick(),

if(!VOLUMES_INIT) { VOLUMES_GetData(); }
else
{
анализ объемов

}

я сразу хочу отметить, что конструкция while(!VOLUMES_INIT) { VOLUMES_GetData(); } - может привести терминал в неизвестное состояние. Надо тестировать.

Rusmag
15.03.2019, 13:35
Подскажите таким образом данные объема можно получить только из индикатора Премиум? Или аналогичным образом объемы можно получить из индикатора Стандарт?

deniss
17.03.2019, 10:00
Подскажите таким образом данные объема можно получить только из индикатора Премиум? Или аналогичным образом объемы можно получить из индикатора Стандарт?

Я скоро добавлю для индикатора Стандарт индикаторы с подключением DLL

Для индикаторов стандарт можно пользоваться базовым iCustom

daolien@mail.ru
18.06.2019, 22:39
Подскажите, можно ли получить исторические данные по конкретному бару с ClusterDelta Premium Delta 4.1 через скрипт подобным методом?

deniss
19.06.2019, 08:54
Подскажите, можно ли получить исторические данные по конкретному бару с ClusterDelta Premium Delta 4.1 через скрипт подобным методом?

Да, добавьте функцию:



int DELTA_by_index(int ix, bool BrokehHour=true)
{
if(ArraySize(TIME_Array)<2) return 0;
if(ArraySize(Time)<=ix) return 0;

int iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] );

if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 1*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 2*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 3*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M5 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 4*60 ); } // 1 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_M15 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 5*60 ); } // 5 Min BrokenHour
if (iBase < 0 && Period() >= PERIOD_H1 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 30*60 ); } // 35 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H1 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 35*60 ); } // 35 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H4 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] - 60*60 ); } // 60 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H4 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] + 60*60 ); } // 60 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_H4 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] + 2*60*60 ); } // 120 Min BrokenHour / ES
if (iBase < 0 && Period() >= PERIOD_W1 && BrokehHour) { iBase = ArrayBsearchCorrect(TIME_Array, Time[ix] + 24*60*60); } // 35 Min BrokenHour / ES


if (iBase >= 0)
{
return (int)DELTA_Array[iBase];
}

return 0;
}

daolien@mail.ru
19.06.2019, 10:53
У меня проблема в том, что в скрипте нельзя реализовать потиковые функции, какие используются в советниках и индикаторах. Поэтому функция для получения данных, которая должна исполняться потиково у меня просто void, исполняется 1 раз при работе скрипта и выглядит просто вот так:
void CheckVOLUMES ()
{
VOLUMES_SetData();
VOLUMES_GetData();
if (VOLUMES_INIT) {Alert(Time[3]," ",DELTA_by_index(3));} // <-- for testing purposes
// VOLUMES_INIT is a signal that we have first package of volumes
}
Конструкции while, for для получения данных входят в бесконечную петлю или вызывают краш (зависит от задержки в 5 сек). VOLUMES_INIT всегда возвращает false. Вопросы: как должна выглядеть функция получения данных для скрипта, если нельзя использовать в нем потиковые функции? Где прописывать параметр под поиск конкретного бара в истории? Я предположил, что это указывается в массиве Time[], и во всех функциях описанных Вами меняю Time[0] на нужное мне число, для эксперимента Time[3].

daolien@mail.ru
19.06.2019, 11:00
Также вызов функции инициализации dll, которая должна быть в OnInit (у меня это другая функция) открывает окно настроек индикатора при работе скрипта, в котором нужно выставить галочку на использование функций с dll, что не совсем удобно.

deniss
19.06.2019, 12:30
Также вызов функции инициализации dll, которая должна быть в OnInit (у меня это другая функция) открывает окно настроек индикатора при работе скрипта, в котором нужно выставить галочку на использование функций с dll, что не совсем удобно.

Настройки терминала - закладка "советники", - поставьте там галочку чтобы не ставить ее каждый раз.

deniss
19.06.2019, 12:34
У меня проблема в том, что в скрипте нельзя реализовать потиковые функции, какие используются в советниках и индикаторах. Поэтому функция для получения данных, которая должна исполняться потиково у меня просто void, исполняется 1 раз при работе скрипта и выглядит просто вот так:
void CheckVOLUMES ()
{
VOLUMES_SetData();
VOLUMES_GetData();
if (VOLUMES_INIT) {Alert(Time[3]," ",DELTA_by_index(3));} // <-- for testing purposes
// VOLUMES_INIT is a signal that we have first package of volumes
}
Конструкции while, for для получения данных входят в бесконечную петлю или вызывают краш (зависит от задержки в 5 сек). VOLUMES_INIT всегда возвращает false. Вопросы: как должна выглядеть функция получения данных для скрипта, если нельзя использовать в нем потиковые функции? Где прописывать параметр под поиск конкретного бара в истории? Я предположил, что это указывается в массиве Time[], и во всех функциях описанных Вами меняю Time[0] на нужное мне число, для эксперимента Time[3].

Volumes_SetData - дает задачу для DLL скачать данные для данного индикатора

Volumes_GetData - опрашивает DLL на предмет того, скачаны ли данные из предыдущего запроса, и если скачаны установит volumes_init в значение True. Volumes_GetData действует асинхронно, то есть после _SetData надо опрашивать DLL каждые 100-200 милисекунд на предмет получения данных. Сами данные в индикатор не появятся, - только через функцию опроса DLL (Volumes_GetData). Формально Вы можете это делать потиково.

Делать потиково SetData не нужно.

p.s. для отсылки и опроса данных Вы должны обязательно установить indicator_client

indicator_client - состоит из букв CDPA и четыре цифры которые дают уникальный идентификатор индикатора. Теоретически, при известном идентификаторе, можно SetData делать в одном индикаторарое, а получать данные в другом.

// DO NOT CHANGE THIS CODE & DATA
do
{
indicator_client = "CDPA" + StringSubstr(DoubleToString(TimeLocal(),0),7,3)+""+DoubleToStr(MathAbs((MathRand()+3)%10),0);
} while (GlobalVariableCheck(indicator_client));
GlobalVariableTemp(indicator_client);

daolien@mail.ru
19.06.2019, 17:54
Вот такая конструкция while работает стабильно:
void CheckVOLUMES ()
{
int t;
int RequestNum = 10;

VOLUMES_SetData();
while(t<RequestNum && !VOLUMES_INIT)
{
Sleep(200);
VOLUMES_GetData();
}
if (VOLUMES_INIT) {Alert(Time[3]," ",DELTA_by_index(3));} // <-- for testing purposes
// VOLUMES_INIT is a signal that we have first package of volumes
}
На всякий случай число запросов ограничено переменной. Данные получены четко по 3 бару! Пока полет нормальный, буду дальше творить. Спасибо большое Deniss!

deniss
22.06.2019, 09:10
Вот такая конструкция while работает стабильно:
void CheckVOLUMES ()
{
int t;
int RequestNum = 10;

VOLUMES_SetData();
while(t<RequestNum && !VOLUMES_INIT)
{
Sleep(200);
VOLUMES_GetData();
}
if (VOLUMES_INIT) {Alert(Time[3]," ",DELTA_by_index(3));} // <-- for testing purposes
// VOLUMES_INIT is a signal that we have first package of volumes
}
На всякий случай число запросов ограничено переменной. Данные получены четко по 3 бару! Пока полет нормальный, буду дальше творить. Спасибо большое Deniss!

Будьте внимательны с функцией Sleep - она не всегда работает. Лучше отслеживать по таймеру самостоятельно.

alexzt
03.03.2020, 18:58
Всем доброго времени суток. Подскажите можно ли таким образом получить значения объема в свой индикатор, интересует больше история. Заранее спасибо.

deniss
04.03.2020, 12:32
Всем доброго времени суток. Подскажите можно ли таким образом получить значения объема в свой индикатор, интересует больше история. Заранее спасибо.

Можно получить, записать в файл и потом подтягивать из файла.

Bream
19.09.2020, 05:36
Do you have the code in mt5? i tried to load it but the code errors

Nikolass
28.12.2020, 03:10
Добрый вечер. Программист я так себе(((. Не совсем понимаю , как достать эти объемы (к примеру в другой индикатор) . Использую код который вы дали. Вставил шапку

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1
#property indicator_style1 0

Вместо OnTick() вставил int OnCalculate(...) и SetIndexBuffer (0,VOLUME_Array);

В результате индикатор рисует Объемы задом наперед. Попробовал в int ArrayBsearchCorrect() и void SortDictionary() изменить параметр MODE_ASCEND на MODE_DESCEND.
Направление отрисовки стало совпадать, но в местах отсутствия данных по объему (с 12 до часу ночи) Индикатор выдает всё "одним пучком" - без пробелов, берет данные с предыдущего дня. НО это пол беды , в режиме тестирования всегда "0". Почему так.. не понимаю??? Подскажите , люди добрые :dash:

deniss
28.12.2020, 13:16
Добрый вечер. Программист я так себе(((. Не совсем понимаю , как достать эти объемы (к примеру в другой индикатор) . Использую код который вы дали. Вставил шапку


Чтобы достать обьемы нужно взять весь код и перенести в свой индикатор.

В данном случае VOLUME_Array нужен для того, чтобы по времени найти нужный объем, и к гистограмме этот массив не подойдет.
Создайте другую таймсерию и тогда уже по каждому бару ищите обьем (на основании времени) из VOLUME_Array и заносите его в таймсерию.

zloystudent
05.03.2021, 08:25
Здравствуйте, а не могли бы привести код для mt5, чтобы была возможность через icustom цеплять объемы

deniss
05.03.2021, 11:20
Здравствуйте, а не могли бы привести код для mt5, чтобы была возможность через icustom цеплять объемы

Через iCustom не получится, так как вызовы асинхронные. Лучше всего вставлять кусок кода себе.

zloystudent
05.03.2021, 20:26
Через iCustom не получится, так как вызовы асинхронные. Лучше всего вставлять кусок кода себе.
Немного не так выразился) фиг с ним с icustom, есть ли вариант кода для реализации всего этого непотребства на mt5?)

deniss
05.03.2021, 23:14
Немного не так выразился) фиг с ним с icustom, есть ли вариант кода для реализации всего этого непотребства на mt5?)

ну так индикаторы для MT5 в исходном коде даются - можно взять готовый кусок, если с MQL дружите. Просто реально МТ5 практически никто не пользуется.

daolien@mail.ru
03.05.2021, 11:13
Приветствую. настроил получение ваших данных в своего советника. перенес код с индюка askbid 4.1. не копировал только участки кода где происходит отрисовка данных из массивов в окне индикатора, потому что меня интересуют просто массивы с данными TimeData, VolumeData, DeltaData. функции также посадил на таймер. в GetData() все происходит корректно, строка response приходит заполненной и в соответствии с настройкой дней в истории (Days_in_History). но почему то это происходит только при первом "чистом" запуске советника. при смене Days_in_History на другое значение или при смене таймфрейма при уже запущенном советнике response получается коротеньким, состоящим всего из 6 строк по самым новым барам, то есть без истории. причем в этом случае в response отсутствует первая строка, которая потом при парсинге в GetData() становиться строкой MessageFromServer. сможете помочь?

daolien@mail.ru
03.05.2021, 11:49
подписка у меня премиум. код тоже брал с премиум индюка

deniss
03.05.2021, 13:11
Приветствую. настроил получение ваших данных в своего советника. перенес код с индюка askbid 4.1. не копировал только участки кода где происходит отрисовка данных из массивов в окне индикатора, потому что меня интересуют просто массивы с данными TimeData, VolumeData, DeltaData. функции также посадил на таймер. в GetData() все происходит корректно, строка response приходит заполненной и в соответствии с настройкой дней в истории (Days_in_History). но почему то это происходит только при первом "чистом" запуске советника. при смене Days_in_History на другое значение или при смене таймфрейма при уже запущенном советнике response получается коротеньким, состоящим всего из 6 строк по самым новым барам, то есть без истории. причем в этом случае в response отсутствует первая строка, которая потом при парсинге в GetData() становиться строкой MessageFromServer. сможете помочь?

i = Send_Query(k,clusterdelta_client, Symbol(), Period(), TimeToStr(TimeCurrent()), TimeToStr(Time[0]), Instrument, TimeToStr(last_loaded), MetaTrader_GMT, ver, Days_in_History, TimeToStr(Custom_Start_time), TimeToStr(Custom_End_time), AccountCompany(), AccountNumber());

Первое - версия индикатора в вызове Send_Query является критичной с точки зрения того, что будет в ответе.
Думаю, что для Вас ver="4.1" или ver="5.2" будет достаточным.

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

daolien@mail.ru
04.05.2021, 11:10
Баг устранен. Помог сброс переменной Last_loaded. Спасибо

daolien@mail.ru
04.05.2021, 11:18
еще интересует каким образом ваши индикаторы открывают доступ к данным. я ведь даже CD_Authorizer не включаю. мы с товарищем торгуем на одном счете. у него будет доступ к данным с его машины если мой советник будет работать у него, но на том же счете?

deniss
05.05.2021, 09:24
еще интересует каким образом ваши индикаторы открывают доступ к данным. я ведь даже CD_Authorizer не включаю. мы с товарищем торгуем на одном счете. у него будет доступ к данным с его машины если мой советник будет работать у него, но на том же счете?

Рано или поздно один из советников останется без данных из-за превышения допустимых айпи адресов. По этому рекомендую каждому иметь свой доступ.

Shulenin@live.ru
04.10.2021, 15:46
При выполнении скрипта как советника пишет:

Cannot call 'premium_mt4_v4x1.dll::InitDLL', 'premium_mt4_v4x1.dll' is not loaded

в пакете premium нет такой библиотеки, подскажите где взять или на что заменить?

deniss
04.10.2021, 22:36
При выполнении скрипта как советника пишет:

Cannot call 'premium_mt4_v4x1.dll::InitDLL', 'premium_mt4_v4x1.dll' is not loaded

в пакете premium нет такой библиотеки, подскажите где взять или на что заменить?

Если подключите DLL v5x2 то вызов InitDLL можете закомментировать или скачайте оригинальную библиотеку с зоны Download из архива ClusterDelta Premium Sources, v4x1 (советую все таки подключить новую)

voron_026
22.01.2022, 23:04
Если подключите DLL v5x2 то вызов InitDLL можете закомментировать или скачайте оригинальную библиотеку с зоны Download из архива ClusterDelta Premium Sources, v4x1 (советую все таки подключить новую)

Здравствуйте. Как называется библиотека v5x2, которую нужно подключить для использования индикаторов в советнике?
Я так понимаю нужно в этой части кода внести изменения

//+--------------- CLUSTERDELTA VOLUMEN DATA --------------------------+
#import "premium_mt4_v4x1.dll"
//int InitDLL(int &);
string Receive_Information(int &, string);
int Send_Query(int &, string, string, int, string, string, string, string, string, string, int, string, string, string,int);
#import

Дело в том, что в скаченном архиве нет библиотеки premium_mt4_v5x2.dll

Вопрос 2. За что отвечает функция InitDLL, что ее нужно закомментировать?
Вопрос 3. Заголовочный файл тоже нужно редактировать?

voron_026
23.01.2022, 09:11
deniss скажите пожалуйста в какой переменной или массиве хранятся данные по объемам, с которыми я могу работать. И за что отвечает массив DELTA_Array[]?
Дело в том, что мне также нужны данные по дельтам и кумулятивке
Спасибо.

deniss
24.01.2022, 14:42
deniss скажите пожалуйста в какой переменной или массиве хранятся данные по объемам, с которыми я могу работать. И за что отвечает массив DELTA_Array[]?
Дело в том, что мне также нужны данные по дельтам и кумулятивке
Спасибо.

VOLUME_Array - данные по объему
DELTA_Array - данные по дельте

последовательное складывание данных из Delta_array - даст массив кумулятивной дельты

Arpedjio
03.06.2022, 07:48
Здравствуйте. Подскажите, как правильно добавить функцию "VOLUME_by_index(int ix, bool BrokehHour=true)"? Где разместить и что указать в параметрах?
Нужно получить историю побарно за выбранный промежуток времени.