Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 485
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Помогите пожалуйста разобраться!
Мне нужно найти максимальную просадку на каждом (пусть будет) дне (запись в файл происходит раз в день) - терминал MT4.
Максимальная просадка - это расстояние на графике от пика до текущей просадки средств, а просадка средств это текущий убыток.
Я написал такой код
if(Analiz_Prosadki==true)
{
if(ContolSavaTXT==1)
{
ProfitNew=0;
ProfitMin=0;
ContolSavaTXT=0;
}
if(ContolSavaTXT==0)
{
ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
BalansNew==AccountInfoDouble(ACCOUNT_BALANCE); //Текузее значение баланса
if (BalansNew>BalansMax) BalansMax=BalansNew;
if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
}
ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin); // Пишем информацию в файл - функция возвращает 1
}
Но на каких то графиках показывает верно, а на каких нет - при этом визуально графики однотипны.
Видимо я допустил ошибку в коде или логике, но не могу понять какую.
На сколько я знаю, надо считать от пика Equity и до ямы Equity, а не от баланса, который очень смягчает картину просадок!
И пользуйтесь, пожалуйста, кнопкой SRC, в не какой-то другой, чтобы в ответе не повторялся Ваш код, загромождая сайт!
На сколько я знаю, надо считать от пика Equity и до ямы Equity, а не от баланса, который очень смягчает картину просадок!
И пользуйтесь, пожалуйста, кнопкой SRC, в не какой-то другой, чтобы в ответе не повторялся Ваш код, загромождая сайт!
Поменял баланс на средства - всё равно с тестером не сходится - в тестере значение больше. ACCOUNT_PROFIT - фактически дельта между балансом и средствами, может в этом дело... с другой стороны задача в том, что б узнать сколько денег надо для работы советника, и тут нет смысла учитывать максимум средств, как мне кажется...
Что такое SRC я не знаю, а поэтому и не использую.
Поменял баланс на средства - всё равно с тестером не сходится - в тестере значение больше. ACCOUNT_PROFIT - фактически дельта между балансом и средствами, может в этом дело... с другой стороны задача в том, что б узнать сколько денег надо для работы советника, и тут нет смысла учитывать максимум средств, как мне кажется...
Что такое SRC я не знаю, а поэтому и не использую.
Эта кнопка, расположенная слева от камеры видео (см. наверх), предназначена для встааки кода!
Насчёт Equity! Если заменили баланс на Equity, надо исключить ACCOUNT_PROFIT, т.к. Equity = баланс + профит. Но мы в терминале видим постоянно меняющиеся Equity, в отчёте тестера фиксируются Equity и просадки в моменты закрытий позиций, потому промежуточные высиженные просадки им не фиксируются. В результате картина более радостная в тестере, чем наяву. С недавнего времени принтую в тестере, в демо и на реале всю необходимую мне информацию на каждом действии советника, открытии, модификации, закрытия и пр., чтобы избегать туфты, которой не терплю ни от себя, ни от других! Но Вы уже это, наверно, заметили. ;)
Добрый вечер! Подскажите, пожалуйста, насчет класса CTrailingFixedPips из стандартной библиотеки, в чем смысл "следящего" уровня TakeProfit? Он ведь не будет никогда достигнут? Или я чего-то не понимаю или кода или смысла.
Из документации:
"Если отступ цены больше уровня Stop Loss, то предлагается установить новую цену Stop Loss позиции. Если условие модификации Stop Loss выполнено и уровень Take Profit не равен нулю, то предлагается установить новую цену Take Profit позиции. "
<Expert\Trailing\CTrailingFixedPips.mqh>
Добрый вечер! Подскажите, пожалуйста, насчет класса CTrailingFixedPips из стандартной библиотеки, в чем смысл "следящего" уровня TakeProfit? Он ведь не будет никогда достигнут? Или я чего-то не понимаю или кода или смысла.
Из документации:
"Если отступ цены больше уровня Stop Loss, то предлагается установить новую цену Stop Loss позиции. Если условие модификации Stop Loss выполнено и уровень Take Profit не равен нулю, то предлагается установить новую цену Take Profit позиции. "
<Expert\Trailing\CTrailingFixedPips.mqh>
Добрый вечер! Подскажите, пожалуйста, насчет класса CTrailingFixedPips из стандартной библиотеки, в чем смысл "следящего" уровня TakeProfit? Он ведь не будет никогда достигнут? Или я чего-то не понимаю или кода или смысла.
Из документации:
"Если отступ цены больше уровня Stop Loss, то предлагается установить новую цену Stop Loss позиции. Если условие модификации Stop Loss выполнено и уровень Take Profit не равен нулю, то предлагается установить новую цену Take Profit позиции. "
<Expert\Trailing\CTrailingFixedPips.mqh>
Эта кнопка, расположенная слева от камеры видео (см. наверх), предназначена для встааки кода!
Так для кода же есть стиль "Код" - выбирается из меню - его и использую.
Насчёт Equity! Если заменили баланс на Equity, надо исключить ACCOUNT_PROFIT, т.к. Equity = баланс + профит. Но мы в терминале видим постоянно меняющиеся Equity, в отчёте тестера фиксируются Equity и просадки в моменты закрытий позиций, потому промежуточные высиженные просадки им не фиксируются. В результате картина более радостная в тестере, чем наяву. С недавнего времени принтую в тестере, в демо и на реале всю необходимую мне информацию на каждом действии советника, открытии, модификации, закрытия и пр., чтобы избегать туфты, которой не терплю ни от себя, ни от других! Но Вы уже это, наверно, заметили. ;)
Если бы фиксация просадки в тестере для отчета была только в момент закрытия позиции, то при использовании одного ордера в рынке не было бы просадки, а это не так ;)
ACCOUNT_PROFIT=Средства-баланс , поэтому не вижу причины не использовать этот показатель в расчетах...
Помогите пожалуйста разобраться!
Мне нужно найти максимальную просадку на каждом (пусть будет) дне (запись в файл происходит раз в день) - терминал MT4.
Максимальная просадка - это расстояние на графике от пика до текущей просадки средств, а просадка средств это текущий убыток.
Я написал такой код
if(Analiz_Prosadki==true)
{
if(ContolSavaTXT==1)
{
ProfitNew=0;
ProfitMin=0;
ContolSavaTXT=0;
}
if(ContolSavaTXT==0)
{
ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
BalansNew==AccountInfoDouble(ACCOUNT_BALANCE); //Текузее значение баланса
if (BalansNew>BalansMax) BalansMax=BalansNew;
if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
}
ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin); // Пишем информацию в файл - функция возвращает 1
}
Но на каких то графиках показывает верно, а на каких нет - при этом визуально графики однотипны.
Видимо я допустил ошибку в коде или логике, но не могу понять какую.
Нашел ошибку в коде - лишний знак равенства надо так
BalansNew=AccountInfoDouble(ACCOUNT_BALANCE);
Однако и это меня не сильно приблизило к разгадке причины разницы потикового расчета и результата в тестере.
Проверил теорию Бориса с расчетам по эквити - так же результат - отрицательный.
if(Analiz_Prosadki==true)
{
if(ContolSavaTXT==1)
{
ProfitNew=0;
ContolSavaTXT=0;
}
if(ContolSavaTXT==0)
{
BalansNew=AccountInfoDouble(ACCOUNT_EQUITY); //Текущее значение баланса
if (BalansNew>BalansMax) BalansMax=BalansNew;
if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;
if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;
}
ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew); // Пишем информацию в файл - функция возвращает 1
}
Кстати, не ясно каким образом происходит рассинхронизация эквити и баланса в тестере на графике, если в торговле находится только один лот?
Нашел ошибку в коде - лишний знак равенства надо так
BalansNew=AccountInfoDouble(ACCOUNT_BALANCE);
Однако и это меня не сильно приблизило к разгадке причины разницы потикового расчета и результата в тестере.
Проверил теорию Бориса с расчетам по эквити - так же результат - отрицательный.
if(Analiz_Prosadki==true)
{
if(ContolSavaTXT==1)
{
ProfitNew=0;
ContolSavaTXT=0;
}
if(ContolSavaTXT==0)
{
BalansNew=AccountInfoDouble(ACCOUNT_EQUITY); //Текущее значение баланса
if (BalansNew>BalansMax) BalansMax=BalansNew;
if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;
if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;
}
ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew); // Пишем информацию в файл - функция возвращает 1
}
Кстати, не ясно каким образом происходит рассинхронизация эквити и баланса в тестере на графике, если в торговле находится только один лот?
Чтобы понять "каким образом происходит рассинхронизация эквити и баланса" надо понять что такое баланс и что такое эквити.
Баланс - зафиксированное количество средств на счёте.
Эквити - Текущее, переменное количество средств на счёте.
В тестере присутствует та-же функция которую ты сейчас пишешь и фиксирует просадку, но не так как тебе хотелось-бы.
В итоге: чтобы посчитать максимальную просадку надо объявить переменную для хранения этого значения либо static либо на уровне глобальных переменных и потом примерно так-же как в твоём коде эту переменную перезаписывать.
Вот что у тебя сейчас написано...
if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной
// но это не просадка, это максимальная прибыль
if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax; // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...
Надо сделать две переменные max и min и в них писать значения.
И мысли вслух: Лучше записывать в файл не за день, а при закрытии ордера и перезаписать переменные. В этот момент эквити равно балансу, а переменную в которую пишем max и min обнуляем.
Чтобы понять "каким образом происходит рассинхронизация эквити и баланса" надо понять что такое баланс и что такое эквити.
Баланс - зафиксированное количество средств на счёте.
Эквити - Текущее, переменное количество средств на счёте.
В тестере присутствует та-же функция которую ты сейчас пишешь и фиксирует просадку, но не так как тебе хотелось-бы.
В итоге: чтобы посчитать максимальную просадку надо объявить переменную для хранения этого значения либо static либо на уровне глобальных переменных и потом примерно так-же как в твоём коде эту переменную перезаписывать.
Вот что у тебя сейчас написано...
if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной
// но это не просадка, это максимальная прибыль
if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax; // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...
Надо сделать две переменные max и min и в них писать значения.
И мысли вслух: Лучше записывать в файл не за день, а при закрытии ордера и перезаписать переменные. В этот момент эквити равно балансу, а переменную в которую пишем max и min обнуляем.
Спасибо, что откликнулись на просьбу о помощи!
Глобальная переменная актуальна при реальной работе по рынку - мне нужна тестовая информация - поэтому и не заморачивался.
Касаемо что такое эквити и баланс - я конечно знаю, а вот как считается просадка - так и не удалось вычислить, из моих примеров кода видно, что я пробовал за максимум брать как баланс так и средства, аналогично и за минимум брал баланс и средства, но аналогичных результатов с тестером так и не удаётся получить - они примерно сходятся, но не точно.
Почему Вы считаете, что неравенство if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax; никогда не выполняется? Оно лишь не выполняется на том баре, когда достигнут новый максимум баланса (или эквити - всё равно не верно), но в этот момент я фиксирую просадку по прибыли ProfitMin=ProfitNew.
Запись файла за день как раз актуальней - так как максимальная просадка достигается, как правило, не в момент закрытия ордера,а целью является вычисление среднего размера средств, необходимых для работы советника.