Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Часто выкладываешь исходный код? Узнай, как это делать правильно!
Nikolay Skrigan
246
Nikolay Skrigan 2015.10.18 15:39 

Добрый день.

Может кто поможет разобраться в чем ошибка в трех строчках кода.

Что нужно? Хочу научить робота распознавать цепочки плюсовых и минусовых трейдов и менять при этом торговую тактику и загрузку капитала. Интересно, что из этого получится.

Выделяется три режима.
1. Старт.
2. Трейд завершился с прибылью.
3. Трейд завершился с убытком.

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

if(MathRound(AccountBalance()) == InitialBalanse )
{ ABL=AccountBalance();
KMM=K0; }

if(AccountBalance() > ABL)
{ ABL=AccountBalance();
KMM=K1; }

if(AccountBalance() < ABL)
{ ABL=AccountBalance();
KMM=K2; }

//--- ABL — переменная. Последнее зафиксированное значение баланса.


Задумано следующее.
Есть три выделяемых события.

1. Старт, при котором закрытых сделок еще не было. 

Первый оператор if работает на старте. Сравнивается текущий баланс счета со стартовым.
Если текущий баланс равен стартовому, переменной ABL присваивается значение текущего баланса счета, а переменной KMM — значение K0 — признак стартового состояния.
Если сделок нет и баланс не изменился, все так и повторяется при каждом проходе кода, в второй и третий операторы if не работаю, поскольку условия в скобках не выполняются, а значит никакие действия этими операторами не производятся.

2. Если закрылась позиция и баланс вырос, то первый оператор уже не сработает, включается второй оператор if и выполняет следующие функции:
— переменной ABL присваивается новое значение — теущее значение выросшего баланса счета,
— переменной KMM — значение K1 — признак завершения прибыльной сделки.

Условие для третьего оператора в этом случае естественно не выполнено, поскольку выполнено для второго. Соттветственно никаких действий по условию третьего оператора не производится.

3. Если закрылась позиция и баланс уменьшился, то включается третий оператор if и выполняет следующие функции:
— переменной ABL присваивается значение баланса счета,
— переменной KMM — значение K2 — признак завершения убыточной сделки.

Все просто, как грабли, но не работает.
Первый оператор if срабатывает нормально, инициализируя дальнейшие вычисления. После первой сделки, как бы она ни завершилась, с ростом или с убытком, управление передается на второй оператор и дальше молотит с коэффициентом К2.
Сутки мучаю.
Со сложного кода с кучей условий довел до шести строчек, а ни хрена не работает.
Убиться аб стену....
Где тут может быть ошибка? Вроде все по логике чайника нормально...

Vasyl Nosal
18203
Vasyl Nosal 2015.10.18 18:52  

MathRound

Удали

Vitalie Postolache
11002
Vitalie Postolache 2015.10.18 20:39  
neophyte_2014:

Добрый день.

Может кто поможет разобраться в чем ошибка в трех строчках кода.

Что нужно? Хочу научить робота распознавать цепочки плюсовых и минусовых трейдов и менять при этом торговую тактику и загрузку капитала. Интересно, что из этого получится.

Выделяется три режима.
1. Старт.
2. Трейд завершился с прибылью.
3. Трейд завершился с убытком.

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

if(MathRound(AccountBalance()) == InitialBalanse )
{ ABL=AccountBalance();
KMM=K0; }

if(AccountBalance() > ABL)
{ ABL=AccountBalance();
KMM=K1; }

if(AccountBalance() < ABL)
{ ABL=AccountBalance();
KMM=K2; }

//--- ABL — переменная. Последнее зафиксированное значение баланса.
...
Где тут может быть ошибка? Вроде все по логике чайника нормально...

Где инициалицируется ABL? Есть подозрение, что в процессе работы её значение теряется.

Если советник закрывает сделки пакетом, лучше брать последние закрытые сделки эксперта (между которыми по времени закрытия интервал меньше минуты, например) и считать прибыль, положительная или отрицательная или, в зависимости от этого выбирать второй или третий вариант.

Такой способ работает только если на счёте действует один советник (как в тестере, например), иначе возникает путаница, придётся усложнять алгоритм, искать по разным символам и магикам.

Что касается первого варианта, лучше выяснить время ближайшего пополнения счёта и проверить, были ли сделки от этого времени и до текущего момента. И никаких MathRound() в таких проверках

alexandr111984
10
alexandr111984 2015.10.18 20:47  
Помогите, пожалуйста, написать индикатор. RSI и MACD. Мне нужно чтобы при заданных параметрах на графике появлялся сигнал на вход и выход, а если быть еще точнее мне нужно правильно написать вот эту строку: RSI_M_0=iRSI (Sym,PERIOD_M15,0,0,13,MODE_SMA,0,MODE_MAIN,  0), т.к. пишет ошибку :   'iRSI' - wrong parameters count
Vitalie Postolache
11002
Vitalie Postolache 2015.10.18 20:49  
suslin84:
Помогите, пожалуйста, написать индикатор. RSI и MACD. Мне нужно чтобы при заданных параметрах на графике появлялся сигнал на вход и выход, а если быть еще точнее мне нужно правильно написать вот эту строку: RSI_M_0=iRSI (Sym,PERIOD_M15,0,0,13,MODE_SMA,0,MODE_MAIN,  0), т.к. пишет ошибку :   'iRSI' - wrong parameters count

У RSI разве есть MODE_MAIN??? Да и остальные параметры не оттуда...

Всю жизнь было:

double  iRSI(
   string       symbol,           // имя символа
   int          timeframe,        // таймфрейм
   int          period,           // период
   int          applied_price,    // тип цены
   int          shift             // сдвиг
   );

alexandr111984
10
alexandr111984 2015.10.18 21:39  
evillive:

У RSI разве есть MODE_MAIN??? Да и остальные параметры не оттуда...

Всю жизнь было:

alexandr111984
10
alexandr111984 2015.10.18 21:40  
suslin84:
Спасибо! Но теперь так стало: 'iRSI' - function can be declared only in the global scope

Алексей Тарабанов
7220
Алексей Тарабанов 2015.10.18 22:04  
suslin84:
Спасибо! Но теперь так стало: 'iRSI' - function can be declared only in the global scope

Любая функция может быть объявлена только в глобальной области. 
Vasyl Nosal
18203
Vasyl Nosal 2015.10.19 08:11  
evillive:

Где инициалицируется ABL? Есть подозрение, что в процессе работы её значение теряется.

... 

И никаких MathRound() в таких проверках

Конечно теряется.

В инит баланс с копейками записывается.

Потом сравнивает с округлением, не сходится.

второе тоже не сходится

и третье не сходится 

Vitalie Postolache
11002
Vitalie Postolache 2015.10.19 09:34  
suslin84:
Спасибо! Но теперь так стало: 'iRSI' - function can be declared only in the global scope

Не нужно писать как в примере, с double, это пример из справочника. Стандартные функции, к которым относятся и индикаторы, не нужно объявлять в коде, их просто вызывают в нужном месте и присваивают возврат в переменную.

Примерно так:

RSI_M_0=iRSI(symbol,timeframe,period,price,shift);
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий