Вопрос специалистам.

 

Добрый день.

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

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

Выделяется три режима.
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.
Сутки мучаю.
Со сложного кода с кучей условий довел до шести строчек, а ни хрена не работает.
Убиться аб стену....
Где тут может быть ошибка? Вроде все по логике чайника нормально...

 

MathRound

Удали

 
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() в таких проверках

 
Помогите, пожалуйста, написать индикатор. RSI и MACD. Мне нужно чтобы при заданных параметрах на графике появлялся сигнал на вход и выход, а если быть еще точнее мне нужно правильно написать вот эту строку: RSI_M_0=iRSI (Sym,PERIOD_M15,0,0,13,MODE_SMA,0,MODE_MAIN,  0), т.к. пишет ошибку :   'iRSI' - wrong parameters count
 
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             // сдвиг
   );

 
evillive:

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

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

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

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

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

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

... 

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

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

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

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

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

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

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

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

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

RSI_M_0=iRSI(symbol,timeframe,period,price,shift);