Наверное не совсем правильно было сказано. Действительно на неттинговых счетах открытые позиции суммируются. Но если интересует только такой учёт позиций как в МТ4 то обязательным условием является hadge счёт.
Всё остальное, магик, перебор позиций и ордеров, определение советником открыт или руками\другим советником, всё решается на раз.
Да, суммируются. Но это же не значит, что невозможно получить информацию о нужном ордере и реализовать верный учет и закрытие нужного ордера в заданный момент?
логически я это понимаю, но неужели вся информация при неттинге об открытых/закрытых сделках удаляется отовсюду, что ее невозможно ни откуда получить и закрыть только ту часть суммарной позиции, которая принадлежит данному советнику? Кроме того, я понимаю, что он схлопывает несколько позиций в одну, но тогда что происходит с ценой открытия в момент добавления позиции?
Artyom Kuraev: логически я это понимаю, но неужели вся информация при неттинге об открытых/закрытых сделках удаляется отовсюду, что ее невозможно ни откуда получить и закрыть только ту часть суммарной позиции, которая принадлежит данному советнику? ...
Из торговой истории можно конечно получить сделки и анализировать их. Здесь вопрос - а нужно ли?
Artyom Kuraev: ... Кроме того, я понимаю, что он схлопывает несколько позиций в одну, но тогда что происходит с ценой открытия в момент добавления позиции?
В неттинге получается итоговая средняя цена, которая зависит от того какая цена и какой объём был у позиции и каким объёмом Вы добавляете. Лучше всего в таком случае Вам вручную поторговать на неттинге. Или лучше так: если Вы привыкли работать с ордерной системой в старом терминале, тогда в заданиях для MetaTrader 5 чётко указывайте, что нужен робот ДЛЯ хеджинговой системы.
Есть массив символов открытых графиков, их может быть до 30шт. Проблема в том, что при синхронном переключении таймфреймов нет истории, и пока она грузиться, "падает" индикатор
Есть массив символов открытых графиков, их может быть до 30шт. Проблема в том, что при синхронном переключении таймфреймов нет истории, и пока она грузиться, "падает" индикатор
Я мучился с этим скриптом... Нихрена не помогает. Хотя может я что-то не так сделал, или были тараканы в билде, после моих мучений было много претензий (не моих) к этому билду.
Есть массив символов открытых графиков, их может быть до 30шт. Проблема в том, что при синхронном переключении таймфреймов нет истории, и пока она грузиться, "падает" индикатор
Такая конструкция не работает
Для большей ясности, прилагаю видео
Спасибо!
Попробуйте через минутный таймер циклом поддерживать синхронизацию всех нужных символов/таймфреймов (Bars( symbol, timeframe );)
Следующая важная проверка — проверка типа программы, из которой вызывается функция. Напомним, что отправка запроса на обновление таймсерии с тем же периодом, что и у индикатора, вызывающего обновление, крайне нежелательна. Нежелательность запроса данных по тому же символу-периоду, что и у индикатора обусловлена тем, что обновление исторических данных производится в том же потоке, в котором работает индикатор. Поэтому велика вероятность клинча. Для проверки используем функциюMQL5InfoInteger()с модификаторомMQL5_PROGRAM_TYPE.
Нужно получить точные данные четырёх вершин. Оказывается первую, самую необходимую вершину iCustom даёт неверно. Отстаёт от графического изображения, три следующих даёт верно. Подобное уже было найдено - https://www.mql5.com/ru/forum/100123
Я уже по всякому пытался, даже накидал отдельный советник только для проверки данных ЗигЗага. Смотрите сами, может я где-то ошибся? Просто установите и включите визуализацию по ценам открытия. Получите это-
//+------------------------------------------------------------------+//| data_ZigZag.mq5 |//| Copyright 2017, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2017, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"inputstring data_Zig_Zag_IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;
inputint ExtDepth=12;
inputint ExtDeviation=5;
inputint ExtBackstep =3;
inputint n_zz=100;//n_zz =100; double pd_1,pd_2,pd_3,pd_4;
int pn_1,pn_2,pn_3,pn_4;
int zz_Handle;
double zz_buf[];
datetime time[];
string this_sym;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---
this_sym=Symbol();
//+------------------------------------------------------------------+//--- сохраним текущий символ графика для дальнейшей работы советника именно на этом символе
zz_Handle=iCustom(this_sym,0,"Examples\\Zigzag",
ExtDepth,
ExtDeviation,
ExtBackstep
);
Print(__FUNCTION__,"__LINE__",__LINE__," . . . . . ",
"zz_Handle = ",zz_Handle," error = ",GetLastError());
//--- проверяем наличие хендла индикатораif(zz_Handle==INVALID_HANDLE)
{
//--- хендл не получен, выводим сообщение в лог об ошибке, завершаем работу с ошибкойPrint(__FUNCTION__,"__LINE__",__LINE__," ----- ",
"Не удалось получить хендл индикатора zz_Handle"," error = ",GetLastError());
return(-1);
}
//--- добавляем индикатор на ценовой графикChartIndicatorAdd(ChartID(),0,zz_Handle);
//--- устанавливаем индексацию для массива zz_buf как в таймсерииArraySetAsSeries(zz_buf,true);
ArraySetAsSeries(time,true);
//---//+------------------------------------------------------------------+return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
IndicatorRelease(zz_Handle);
ArrayFree(zz_buf);
ArrayFree(time);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//+------------------------------------------------------------------+int zz_copy=0;
//--- копируем данные из индикаторного массива в динамический массив
zz_copy=CopyBuffer(zz_Handle,0,0,n_zz,zz_buf);
//--- если есть ошибки, то выводим сообщение в лог об ошибке и выходим из функцииif(zz_copy<0)
{
Print("Не удалось скопировать данные из индикаторного буфера zz_buf. error = ",
GetLastError()); return;
}
//+------------------------------------------------------------------+
pd_1 =0;
pd_2 =0;
pd_3 =0;
pd_4 =0;
pn_1 =0;
pn_2 =0;
pn_3 =0;
pn_4 =0;
int zz_q=ArraySize(zz_buf);
int q=0;
for(q=0; q<zz_q; q++)
{
if(zz_buf[q]!=0 && zz_buf[q]!=EMPTY_VALUE)
{
if(pd_1==0) { pn_1=q; pd_1=zz_buf[q]; }
elseif(pd_2==0) { pn_2=q; pd_2=zz_buf[q]; }
elseif(pd_3==0) { pn_3=q; pd_3=zz_buf[q]; }
elseif(pd_4==0) { pn_4=q; pd_4=zz_buf[q]; }
}
if(pn_4>0)break;
}
//+------------------------------------------------------------------+CopyTime(this_sym,Period(),0,n_zz,time);
//+------------------------------------------------------------------+ObjectDelete(0,"name1");
string name1="name1";
if(!ObjectCreate(0,name1,OBJ_ARROW_UP,0,time[pn_1],pd_1))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name1,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+ObjectDelete(0,"name2");
string name2="name2";
if(!ObjectCreate(0,name2,OBJ_ARROW_UP,0,time[pn_2],pd_2))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name2,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+ObjectDelete(0,"name3");
string name3="name3";
if(!ObjectCreate(0,name3,OBJ_ARROW_UP,0,time[pn_3],pd_3))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name3,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+ObjectDelete(0,"name4");
string name4="name4";
if(!ObjectCreate(0,name4,OBJ_ARROW_UP,0,time[pn_4],pd_4))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name4,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+///*if(pd_1!=0 && pd_2!=0 && pd_3!=0 && pd_4!=0)
Alert(__FUNCTION__,"__LINE__",__LINE__,
" q =",q,
" pd_1 =",pd_1,
" pd_2 =",pd_2,
" pd_3 =",pd_3,
" pd_4 =",pd_4,
" pn_1 =",pn_1,
" pn_2 =",pn_2,
" pn_3 =",pn_3,
" pn_4 =",pn_4,
" TimeCurrent()=",TimeCurrent()
);
//*///+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
Наверное не совсем правильно было сказано. Действительно на неттинговых счетах открытые позиции суммируются. Но если интересует только такой учёт позиций как в МТ4 то обязательным условием является hadge счёт.
Всё остальное, магик, перебор позиций и ордеров, определение советником открыт или руками\другим советником, всё решается на раз.
... - ответ: "идите нафиг, раз не знаете, что вам нужно".
Абсолютно адекватный и правильный ответ. И это будет до тех пока Вы не поймёте в чём разница между неттинговым счётом и хедж.
Даю 99% что Вам лень читать (В MetaTrader 5 добавлена хеджинговая система учета позиций), поэтому просто попробуйте переписать своё задание с учётом того, что:
позиция Buy EURUSD 0.01 лот
позиция Buy EURUSD 0.01 лот
позиция Buy EURUSD 0.01 лот
позиция Buy EURUSD 0.01 лот
позиция Sell EURUSD 0.01 лот
Абсолютно адекватный и правильный ответ. И это будет до тех пока Вы не поймёте в чём разница между неттинговым счётом и хедж.
Даю 99% что Вам лень читать (В MetaTrader 5 добавлена хеджинговая система учета позиций), поэтому просто попробуйте переписать своё задание с учётом того, что:
позиция Buy EURUSD 0.01 лот
позиция Buy EURUSD 0.01 лот
позиция Buy EURUSD 0.01 лот
позиция Buy EURUSD 0.01 лот
позиция Sell EURUSD 0.01 лот
логически я это понимаю, но неужели вся информация при неттинге об открытых/закрытых сделках удаляется отовсюду, что ее невозможно ни откуда получить и закрыть только ту часть суммарной позиции, которая принадлежит данному советнику? ...
Из торговой истории можно конечно получить сделки и анализировать их. Здесь вопрос - а нужно ли?
... Кроме того, я понимаю, что он схлопывает несколько позиций в одну, но тогда что происходит с ценой открытия в момент добавления позиции?
В неттинге получается итоговая средняя цена, которая зависит от того какая цена и какой объём был у позиции и каким объёмом Вы добавляете. Лучше всего в таком случае Вам вручную поторговать на неттинге. Или лучше так: если Вы привыкли работать с ордерной системой в старом терминале, тогда в заданиях для MetaTrader 5 чётко указывайте, что нужен робот ДЛЯ хеджинговой системы.
Помогите с подгрузкой истории, пожалуйста.
Есть массив символов открытых графиков, их может быть до 30шт. Проблема в том, что при синхронном переключении таймфреймов нет истории, и пока она грузиться, "падает" индикатор
Такая конструкция не работает
Для большей ясности, прилагаю видео
Спасибо!
Помогите с подгрузкой истории, пожалуйста.
Есть массив символов открытых графиков, их может быть до 30шт. Проблема в том, что при синхронном переключении таймфреймов нет истории, и пока она грузиться, "падает" индикатор
Такая конструкция не работает
Для большей ясности, прилагаю видео
Спасибо!
Виталий посмотри тут https://www.mql5.com/ru/docs/series/timeseries_access#synchronized, там есть пример скрипта для подгрузки истории, может поможет
Виталий посмотри тут https://www.mql5.com/ru/docs/series/timeseries_access#synchronized, там есть пример скрипта для подгрузки истории, может поможет
Помогите с подгрузкой истории, пожалуйста.
Есть массив символов открытых графиков, их может быть до 30шт. Проблема в том, что при синхронном переключении таймфреймов нет истории, и пока она грузиться, "падает" индикатор
Такая конструкция не работает
Для большей ясности, прилагаю видео
Спасибо!
Виталий посмотри тут https://www.mql5.com/ru/docs/series/timeseries_access#synchronized, там есть пример скрипта для подгрузки истории, может поможет
Спасибо, попробую с ней разобраться.
Сейчас уже возникает вопрос:
Следующая важная проверка — проверка типа программы, из которой вызывается функция. Напомним, что отправка запроса на обновление таймсерии с тем же периодом, что и у индикатора, вызывающего обновление, крайне нежелательна. Нежелательность запроса данных по тому же символу-периоду, что и у индикатора обусловлена тем, что обновление исторических данных производится в том же потоке, в котором работает индикатор. Поэтому велика вероятность клинча. Для проверки используем функциюMQL5InfoInteger()с модификаторомMQL5_PROGRAM_TYPE.
if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
return(-4);
У меня ведь это должно работать в индикаторе.
Господа, мучаюсь с ЗигЗагом.
Нужно получить точные данные четырёх вершин. Оказывается первую, самую необходимую вершину iCustom даёт неверно. Отстаёт от графического изображения, три следующих даёт верно. Подобное уже было найдено - https://www.mql5.com/ru/forum/100123
Я уже по всякому пытался, даже накидал отдельный советник только для проверки данных ЗигЗага. Смотрите сами, может я где-то ошибся? Просто установите и включите визуализацию по ценам открытия. Получите это-
Как получить точные данные?