" получить начальный и конечный баланс неделя/месяц , но с начала истории. " на
"получить начальный/конечный от сего дня и насколько хватит"
просто цикл в другую сторону. Всё такое эдакое про балансы так считать лучше - от современности в прошлое
PS/ И "при нехватке истории" (это по D1 то) не надо бросать всё...надо сделать паузу и переповторить.. и в самом начале до того как бежать циклом - дёрнуть iBarShift на самую "дальнюю дату" (оно может и сфейлить, но где-то внутри начнёт подкачивать)
PPS/ загвоздка в истории и в MT4, где она может быть неполная...её просто не дают до конца, зависит от того что пользователь натыркал во вкладке.. - в 4-ке (да и в 5 стоит того ) лучше сохранять свою историю самому и отдельно. Так-то всё просто - собрать все записи про закрытия ордеров и пополнения/снятия, отсоритривать по дате и накапливаемая сумма есть искомый баланс, то есть можно получить на любую/произвольную дату.
Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.
Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.
Сейчас вопрос больше в том, как сделать это:
к примеру, ты-же этим и занимаешься :-) без истории то что хочешь не решить
образно, в терминах SQL:
SELECT time, sum(profit+swap+commision) as prirost FROM orders ORDER BY time DESC
даст табличку прироста баланса. Чтобы получить абсолютные значения надо из текущего баланса их вычитать. На конкретную дату - просто найти диапазон в табличке куда эта дата попадает. Даты начала/конца недель и месяцев определить по календарю
PS/ (грустный сорказм) в mt4/5 должно быть некое подобие "gregorian" - функции календаря, "первый понедельник месяца и тому подобное" . Как это нету ? "на несчастном острове нет календаря..."
Что-то подсказывает, что пошёл не по тому пути ...
Нужно получить начальный и конечный баланс неделя/месяц, но с начала истории.
Если это хотелки заказчика, то это точно неверная логика. Смысл может быть только в нужных для анализа участках. И считать конечно от сегодня вглубь. А с начала истории график есть штатный. Его возможно тоже можно расковырять приблизительно по датам.
#property copyright"Copyright 2023"#property indicator_chart_window// Параметры индикатора--------------------------------------------------------------------------+externcolor ADR_Color = clrWhite;
externint Font_Size = 10;
externint DisplayCorner = 1;
externstring font2 = FONT_ITALIC;
externbool ExcludeSundayData= true; // set to "false" to INCLUDE Sunday bar in the calculation//---------------------------------------------------------------------------------------------+int x=10;
int y=10;
int LastBars0=0;
int Todays_Range; // current days range High to Low int n=1; // Used to loop back x daysint m=1;
staticint adr1,adr5,adr30,adr180,adry1; // stores ADR calcsstring text; // double PipValue=0.0001;
double DailyPips; // used to hold the daily move in pips double Daily_Range=0.0; // Used to Total up the Daily Rangesdouble Daily_Range1=0.0;
//+---------------------------------------------------------------------------------------------+//| Инициализация индикатора |//+---------------------------------------------------------------------------------------------+int init()
{
//Установим пипсы для 4- или 5-значных/дробных расчетов в пунктахif(Digits==2 || Digits==3) PipValue=PipValue*100; // Для пар с JPYif(Digits== 4 || Digits == 5) PipValue = PipValue;
// Создание и размещение надписей на экране-----------------------------------------------------+// Average Daily Range ("ADR180" Label)ObjectCreate("xADR0",OBJ_LABEL,0,0,0);
ObjectSet("xADR0",OBJPROP_CORNER,DisplayCorner);
ObjectSet("xADR0",OBJPROP_XDISTANCE,x);
ObjectSet("xADR0",OBJPROP_YDISTANCE,y+20); //20 шагов вниз от верхней границы экрана// Average Daily Range ("ADR30" Label)ObjectCreate("xADR1",OBJ_LABEL,0,0,0);
ObjectSet("xADR1",OBJPROP_CORNER,DisplayCorner);
ObjectSet("xADR1",OBJPROP_XDISTANCE,x);
ObjectSet("xADR1",OBJPROP_YDISTANCE,y+35); //35 шагов вниз от верхней границы экрана// Average Daily Range ("ADR5" Label)ObjectCreate("xADR2",OBJ_LABEL,0,0,0);
ObjectSet("xADR2",OBJPROP_CORNER,DisplayCorner);
ObjectSet("xADR2",OBJPROP_XDISTANCE,x);
ObjectSet("xADR2",OBJPROP_YDISTANCE,y+50); //50 шагов вниз от верхней границы экрана// Average Daily Range ("Today" Label)ObjectCreate("xADR3",OBJ_LABEL,0,0,0);
ObjectSet("xADR3",OBJPROP_CORNER,DisplayCorner);
ObjectSet("xADR3",OBJPROP_XDISTANCE,x);
ObjectSet("xADR3",OBJPROP_YDISTANCE,y+65); //65 шагов вниз от верхней границы экрана// Average Daily Range ("Today" Label)ObjectCreate("xADRY1",OBJ_LABEL,0,0,0);
ObjectSet("xADRY1",OBJPROP_CORNER,DisplayCorner);
ObjectSet("xADRY1",OBJPROP_XDISTANCE,x);
ObjectSet("xADRY1",OBJPROP_YDISTANCE,y+80); //65 шагов вниз от верхней границы экранаreturn(0);
}
//+--------------------------------------------------------------------------------------+//| Удаление индикатора |//+--------------------------------------------------------------------------------------+int deinit()
{
if(ObjectFind("xADR0")==0) ObjectDelete("xADR0");// only delete it if it existsif(ObjectFind("xADR1") == 0 ) ObjectDelete("xADR1");
if(ObjectFind("xADR2") == 0 ) ObjectDelete("xADR2");
if(ObjectFind("xADR3") == 0 ) ObjectDelete("xADR3");
if(ObjectFind("xADR4") == 0 ) ObjectDelete("xADR4");
if(ObjectFind("xADR5") == 0 ) ObjectDelete("xADR5");
if(ObjectFind("xADRY1") == 0 ) ObjectDelete("xADRY1");
return(0);
}
//+--------------------------------------------------------------------------------------+//| Запуск индикатора |//+--------------------------------------------------------------------------------------+int start()
{
int Bars0=Bars;
//---------------------------------------------------------------------------------------+// Расчёт ADR на 5,30,180 дней |//---------------------------------------------------------------------------------------+ if(Bars0>LastBars0)
{
for(int i=1;i<=180;i++) // Цикл из 180 дневных сессий
{
while(ExcludeSundayData && TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,n))==0) n++; // If TimeDayOfWeek returns 0 add 1 to n to skip Sunday
Daily_Range=Daily_Range+(iHigh(Symbol(),PERIOD_D1,n)-iLow(Symbol(),PERIOD_D1,n))/PipValue;
if(i==1) adr1 =MathRound(Daily_Range);
if(i==5) adr5 =MathRound(Daily_Range/5);
if(i==30) adr30=MathRound(Daily_Range/30);
if(i==180) adr180=MathRound(Daily_Range/180);
n++;
}
// Выводим даные за 5,30,180 дней на монитор---------------------------------------------+
text="ADR(180) = "+adr180;
ObjectSetText("xADR0",text,Font_Size,font2,ADR_Color); // "ADR180" Label
text="ADR(30) = "+adr30;
ObjectSetText("xADR1",text,Font_Size,font2,ADR_Color); // "ADR30" Label
text="ADR(5) = "+adr5;
ObjectSetText("xADR2",text,Font_Size,font2,ADR_Color); // "ADR5" Label
text="ADRY(1) = "+adry1;
ObjectSetText("xADRY1",text,Font_Size,font2,ADR_Color); // "ADRY1" Label
LastBars0=Bars0;
}
//---------------------------------------------------------------------------------------+// Расчёт текущего ADR на сегодняшний день +//---------------------------------------------------------------------------------------+ double Todays_Low = iLow (Symbol(),PERIOD_D1,0);
double Todays_High = iHigh(Symbol(),PERIOD_D1,0);
Todays_Range = MathRound((Todays_High - Todays_Low)/PipValue );
// Вывод на экран значения "Today"-------------------------------------------------------+
text="Today = "+Todays_Range;
ObjectSetText("xADR3",text,Font_Size,font2,ADR_Color);
if(iClose(Symbol(),PERIOD_D1,0)>iOpen(Symbol(),PERIOD_D1,0)) DailyPips=(iClose(Symbol(),PERIOD_D1,0)-iOpen(Symbol(),PERIOD_D1,0))/PipValue;
elseif(iOpen(Symbol(),PERIOD_D1,0)>iClose(Symbol(),PERIOD_D1,0)) DailyPips=(iOpen(Symbol(),PERIOD_D1,0)-iClose(Symbol(),PERIOD_D1,0))/PipValue;
return(0);
}
n - задается в начале (желтым)
если n=1 это "вчера", то n++ это вера +один день всперед(т.е. сегодня), или это "вчера" + "позавчера" + "2 дня назад" и т.д.?
переверни задачу и она решится :-)
" получить начальный и конечный баланс неделя/месяц , но с начала истории. " на
"получить начальный/конечный от сего дня и насколько хватит"
просто цикл в другую сторону. Всё такое эдакое про балансы так считать лучше - от современности в прошлое
PS/ И "при нехватке истории" (это по D1 то) не надо бросать всё...надо сделать паузу и переповторить.. и в самом начале до того как бежать циклом - дёрнуть iBarShift на самую "дальнюю дату" (оно может и сфейлить, но где-то внутри начнёт подкачивать)
PPS/ загвоздка в истории и в MT4, где она может быть неполная...её просто не дают до конца, зависит от того что пользователь натыркал во вкладке.. - в 4-ке (да и в 5 стоит того ) лучше сохранять свою историю самому и отдельно. Так-то всё просто - собрать все записи про закрытия ордеров и пополнения/снятия, отсоритривать по дате и накапливаемая сумма есть искомый баланс, то есть можно получить на любую/произвольную дату.
Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.
Сейчас вопрос больше в том, как сделать это:
Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.
Сейчас вопрос больше в том, как сделать это:
к примеру, ты-же этим и занимаешься :-) без истории то что хочешь не решить
образно, в терминах SQL:
SELECT time, sum(profit+swap+commision) as prirost FROM orders ORDER BY time DESC
даст табличку прироста баланса. Чтобы получить абсолютные значения надо из текущего баланса их вычитать. На конкретную дату - просто найти диапазон в табличке куда эта дата попадает. Даты начала/конца недель и месяцев определить по календарю
PS/ (грустный сорказм) в mt4/5 должно быть некое подобие "gregorian" - функции календаря, "первый понедельник месяца и тому подобное" . Как это нету ? "на несчастном острове нет календаря..."
Не совсем так, сбор статистики
Что-то подсказывает, что пошёл не по тому пути ...
Нужно получить начальный и конечный баланс неделя/месяц, но с начала истории.
Если это хотелки заказчика, то это точно неверная логика. Смысл может быть только в нужных для анализа участках. И считать конечно от сегодня вглубь. А с начала истории график есть штатный. Его возможно тоже можно расковырять приблизительно по датам.
Сбором истории никто заниматься не будет - пустое и затратное дело, и к тому-же - не нужное. Но суть не в том.
Сейчас вопрос больше в том, как сделать это:
Посмотри Кимовский i-Profit
возможно там найдется решение.
Добрый день, подскажите пожалуйста, этот цикл перебирает дневные Хай/Лоу, от текущего дня назад?
i=1 это в данном цикле какой день? сегодняшний или первый 180 дней назад?
Из кода не видно как i связан с n
Из кода не видно как i связан с n
n - задается в начале (желтым)
если n=1 это "вчера", то n++ это вера +один день всперед(т.е. сегодня), или это "вчера" + "позавчера" + "2 дня назад" и т.д.?Тяжелый код какой-то. Получается что при i=1, n=1, то есть i=1 - это вчера
получается n++ это к "вчера" прибавляется "позавчера"?