Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 485
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Поменял баланс на средства - всё равно с тестером не сходится - в тестере значение больше. 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.
Запись файла за день как раз актуальней - так как максимальная просадка достигается, как правило, не в момент закрытия ордера,а целью является вычисление среднего размера средств, необходимых для работы советника.
Вопрос - учитывает ли тестер своп?
Произвел расчет в экселе (счет центовый), получил странный результат
№ П.П. Data Type Lot Price MaxHigh MaxEqDrd
1 2014.06.12 09:52 sell 0,1 1,6824 0,16824 1,7179 -3,55
2 2014.06.12 15:18 sell 0,2 1,6831 0,33662 1,7179 -6,96
3 2014.06.12 17:52 sell 0,3 1,6836 0,50508 1,7179 -10,29
4 2014.06.12 19:10 sell 0,5 1,6839 0,84195 1,7179 -17,00
5 2014.06.12 23:00 sell 0,8 1,6845 1,3476 1,7179 -26,72
6 2014.06.16 09:59 sell 1,3 1,6985 2,20805 1,7179 -25,22
7 2014.06.19 09:58 sell 2,1 1,7017 3,57357 1,7179 -34,02
8 2014.06.19 11:21 sell 3,4 1,7018 5,78612 1,7179 -54,74
9 2014.06.19 20:40 sell 5,5 1,7033 9,36815 1,7179 -80,30
10 2014.06.19 22:12 sell 8,9 1,7036 15,16204 1,7179 -127,27
11 2014.06.20 05:10 sell 14,4 1,7047 24,54768 1,7179 -190,08
12 2014.06.20 05:22 sell 23,3 1,7049 39,72417 1,7179 -302,90
13 2014.06.26 12:38 sell 37,7 1,7030 64,2031 1,7179 -561,73
14 2014.06.26 15:18 sell 61,0 1,7033 103,9013 1,7179 -890,60
15 2014.06.27 06:51 sell 98,7 1,7050 168,2835 1,7179 -1273,23
16 2014.06.30 17:37 sell 100,0 1,7079 170,79 1,7179 -1000,00
17 2014.06.30 17:37 sell 59,7 1,7079 101,96163 1,7179 -597,00
18 2014.07.01 09:03 sell 100,0 1,7100 171 1,7179 -790,00
19 2014.07.01 09:03 sell 100,0 1,7100 171 1,7179 -790,00
20 2014.07.01 09:03 sell 58,4 1,7100 99,864 1,7179 -461,36
21 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
22 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
23 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
24 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
25 2014.07.01 11:30 sell 18,1 1,7110 30,9691 1,7179 -124,89
26 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
27 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
28 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
29 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
30 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
31 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
32 2014.07.02 02:33 sell 76,5 1,7145 131,15925 1,7179 -260,10
33 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
34 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
35 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
36 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
37 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
38 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
39 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
40 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
41 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
42 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
43 2014.07.02 11:32 sell 94,6 1,7176 162,48496 1,7179 -28,38
Итого: 2865,5 4909,88611 -12756,34
Средняя цена открытия -> 1,7134
High 04.07.2014 1,7179
Просадка в пунктах -> 0,0045
Просадка в валюте -> 12756,34
Просадка согласно коду -> 13823,00
Просадка согласно отчету тестера -> 23669,03
TP - > 1,7084
Прибыль в пунктах -> 0,0050
Прибыль по расчету - > 14465,91
Прибыль по отчету - > 13915,05
Каким образом просадка не сходится - особенно с отчетом тестера? До этого закрытых позиций не было!
Так выглядит ситуация на чарте