воскресенье, 18 октября 2015 г.

Перенес пост со смартлаба: "Я наверное самый тупой..."

P.S. Господа. Все спасибо за обсуждение. Оно было конструктивным и полезным. Из множества мнений я выцепил возможный источник проблем и убрал его. Все работает, как часы.
Графики с результатами в конце публикации.

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

Тока не надо смеяться, но я наверное самый тупой программист на смартлабе, потому что сутки не могу разобраться в чем ошибка в трех строчках кода.



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



//////////////
Как я уже сказал выше, проблема решена. Цель - резать объем на серии убытков и восстанавливать, когда начинается серия прибылей.
Цель достигнута.
Грубый тест после достижения работоспособности программы:
Исходный вариант:


Вариант с дополнительным модулем:



Игры разума с ММ дают выигрыш в прибыли примерно в два раза на фиксированном размере лота.
А если объем увеличивать с ростом баланса,

И еще один вариант, тоже грубый, с АвтоММ:



Всем Удачи!!!

SWT-метод. Теория и практика применения
Параметры волн SWT-метода

Комментариев нет:

Отправить комментарий