neophyte
neophyte личный блог
18 октября 2015, 17:50

Я наверное самый тупой на смартлабе?

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


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

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

Я наверное самый тупой на смартлабе? 

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

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

93 Комментария
  • Александр НеПушкин
    18 октября 2015, 17:57
    Жалко, что робот перешёл дорогу. То ждал от Вас прогнозных комментариев по инструментам, а теперь эти рассуждения самим с собой.
      • Александр НеПушкин
        19 октября 2015, 14:06
        Николай Скриган, дык я уже и не жду, коли робот косит шаравэшки, на кой Вам теперь аналитика?
          • Александр НеПушкин
            19 октября 2015, 14:56
            Николай Скриган, у ты! я то думал, запустил и лежи на печи!
  • Вестников (Витковский)
    18 октября 2015, 17:59
    Ты — умный. Я вообще не понял — что ты написал.
    • TraderGroup.ru
      18 октября 2015, 19:38
      Вестников, )))) значит ты претендуешь на это пост?
  • Sep38Rus
    18 октября 2015, 18:01
    баланс с чем сравнивает? точка от счета.
  • Translator
    18 октября 2015, 18:02
    Я так понимаю, между приведенными операторами сравнения есть еще какие-то операторы?
    Через Print попробуйте вывести значения в журнал и посмотрите, чему они равны.
      • Translator
        18 октября 2015, 18:10
        Николай Скриган, Да, что-то вроде этого. Принты можно нумеровать, чтобы знать, когда что выводится.
  • Costa
    18 октября 2015, 18:04
    так зайдите на форум www.mql5.com/ru/forum и задайте вопрос, там хоть адекватный ответ будет
      • VladMih
        18 октября 2015, 18:12
        Николай Скриган, всё зависит от того, как спросите. Если и там начнете умничать про тупых и умных — конечно получите по полной программе и на любом из языков… непрограммирования )
        Можете зайти на форум ТСЛаба, если на «мыколе» вас обижают )
          • VladMih
            18 октября 2015, 20:32
            Николай Скриган, видимо написали на «мыколе», а язык-то не мыкуэлевский.
            Я же советовал на ТСЛабе спросить.
              • VladMih
                19 октября 2015, 01:02
                Николай Скриган, дааа??? Я его не узнал! )))
                А чего ж удалили?
                Видимо нарушили правила форума, не туда запостили.
      • White Collar
        18 октября 2015, 23:45
        Николай Скриган, несколько раз обращался за помощью на форум, отвечали нормально
  • Сравнивает то с ABL
    почему?
      • Николай Скриган, я понимаю, я имею ввиду ABL в данном случае равна предыдущему значению)
  • Reconnaissance
    18 октября 2015, 18:37
    Что-то у тебя функция AccountBalance() слишком часто вызывается. Вызови ее один раз в переменную CurrentBalance.

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

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

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

    Если не работает, то ошибка либо в назначении переменных (глобальные, локальные), либо после компиляции ты смотришь результат не в той папке (запускаешь все время один и тот же сбойный вариант, поэтому не работает).
      • Mr. Bean
        18 октября 2015, 18:51
        Николай Скриган, можно вообще ABL=AccountBalance() вынести за IF
          • Mr. Bean
            18 октября 2015, 19:36
            Николай Скриган, вроде должно работать. попробуйте AccountBalance() в переменную до проверки выводить:

            ab=AccountBalance()
            if(MathRound(ab) == InitialBalanse )
            KMM=K0;
            if(ab > ABL)
            KMM=K1;
            if(ab < ABL)
            KMM=К2;
            ABL=AccountBalance();
              • Mr. Bean
                18 октября 2015, 20:29
                Николай Скриган, ну в логике тут ошибок нет. ищите в другом месте. возможно AccountBalance() неверно возвращает значение. надо дебажить, без всего кода мало что понятно
                • Mr. Bean, 99% в этом ошибка
          • Mr. Bean
            18 октября 2015, 19:40
            Николай Скриган, в конце тоже:
            ABL=ab;
    • dagh
      18 октября 2015, 18:52
      Reconnaissance, это вопросы оптимизации, проблма у него не в этом.
      По хорошему все последующие if операторы надо сменить на elseif чтоб лишний раз поток не гонять.
        • dagh
          18 октября 2015, 20:06
          Николай Скриган, а я и не говорил что надо оптимизацию делать. Это работа крайняя.
          Нашлась ошибка-то?
  • ves2010
    18 октября 2015, 18:42
    язык то какой… имхо не ассемблер точно
      • VladMih
        18 октября 2015, 18:50
        Николай Скриган, ну, он же не матом! )
    • VladMih
      18 октября 2015, 18:49
      ves2010, так «ИМХО» или «точно»? ))
      Насколько я НЕ разбираюсь — это что-то Си-шное.
  • Mr. Bean
    18 октября 2015, 18:50
    в чем ошибка то?
  • dagh
    18 октября 2015, 18:50
    Нужна начальная инициализация всех переменных. Включая ABL

    После того, как прошел блок обработки сделки и изменились данные хорошо бы через окно отладчика проверить их (переменных) содержимое.
      • dagh
        18 октября 2015, 23:03
        Николай Скриган, отлично! Работал программистом на С++ в аутсорсе, правда это было лет 15 назад. Опыт не пропьешь. :)
  • bocha
    18 октября 2015, 18:59
    (3*if) -> case
    и при отладке ошибка станет ясной
      • bocha
        18 октября 2015, 19:15
        Николай Скриган, MathRound пробовали убрать?
        При инициализации InitialBalanse=AccountBalance()
        или в первом операторе написать так: ABL=MathRound(AccountBalance())
          • bocha
            18 октября 2015, 20:10
            Николай Скриган,

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

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

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

            У Вас из-за округления срабатывает сначала (1) и сразу(3). В дальнейшем, если сделок нет, все время срабатывает (1)+(3)
            Перепишите (1) в виде:

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

            Тогда при отсутствии сделок все время будет (1), что явный прогресс )))
  • Русский Иван (LOSSBOY)
    18 октября 2015, 19:45
    ДА
  • Владимир Пермь
    18 октября 2015, 19:59
    Я ничего не понимаю в программировании, но кажется у Вас синтаксис нарушен в первой строчке InitialBalanSe, а должно быть InitialBalanCe...
    Сильно палками не бейте, если херню спорол или она не влияет на работоспособность:)
  • Ви Олег
    18 октября 2015, 20:10
    а что если проблема инициализации данных, те проблема инкапсуляции?
  • Vitty
    18 октября 2015, 20:18
    > if(MathRound(AccountBalance()) == InitialBalanse )

    уже неправильно. прелести плавающей арифметики.
    у программистов 1/3 + 4/3 совсем не равны 5/3. не верите? скомпилируйте проверьте.MathRound не поможет

    правильно
    if(Abs(AccountBalance() — InitialBalanse) < 0.0001 ) // к примеру

    дальше. на > < проверили, а если == ?

    ну это сходу

      • Vitty
        18 октября 2015, 20:43
        Николай Скриган, ну тогда целиком код давайте, а не кусочек
      • Mr. Bean
        18 октября 2015, 22:10
        Николай Скриган, так надо было приведение типов тогда делать а не округлять. к тому же в финансовых расчетах старайтесь по минимуму использовать числа с плавающей точкой.
  • crazyFakir
    18 октября 2015, 21:11
    отбрось свои сомнения
  • Ви Олег
    18 октября 2015, 21:31
    при облегчении кода получилось нечто вроде
    • Mr. Bean
      18 октября 2015, 22:17
      Ви Олег, не ну у вас разные числа в каждом ифе
  • baza
    18 октября 2015, 22:26
    double a, InitialBalanse;

    int start()
    {
    a = NormalizeDouble( AccountBalance(), 0 );

    if( a == InitialBalanse )
    {
    KMM=K0; }

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

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

    ABL=a;

    }

    у меня без NormalizeDouble нормально сравнивать не хотело
  • Wisard
    18 октября 2015, 22:42
    Не знаю, что это за язык, поэтому напишу псевдокодом, как бы сделал я: убрал бы вообще вариант K0, если он используется только один раз. K1 значит увеличение лота, K2 — уменьшение.

    // где-то в начале программы

    // задаем начальную ситуацию
    balancePrevious = 1000.0;

    // где-то после сделки

    // берем текущий баланс
    balanceCurrent = AccountBalance();

    // определяем ситуацию
    KMM = (balanceCurrent > balancePrevious)? K1: K2;

    // переписываем баланс
    balancePrevious = balanceCurrent;
  • Оленевод Бельдыев
    18 октября 2015, 23:32
    В MQL5 Со «стаканом» и лентой работать можно? Они там пристутствуют?
  • dagh
    19 октября 2015, 03:41
    ну что? можно уже лопату-то приобрести? :)
  • Михаил Иванов
    19 октября 2015, 08:32
    не знаю, написали это уже выше или нет, но вот так
    >AccountBalance()) == InitialBalanse
    делать не надо, надо
    Math.Abs(AccountBalance()) — InitialBalanse) < SOME_CONST

    это и решарпер подсказывает.
      • Михаил Иванов
        19 октября 2015, 10:50
        Николай Скриган, я посоветовал как сделать эту операцию менее глючной. убирать — не советовал :)
        операцию == следует применять по сути ко всему, кроме double и float из-за вечных косяков в округлении вроде 0.1249999999999 или 0.125000000001

        ставьте константу <= 0 и все
          • Михаил Иванов
            19 октября 2015, 12:57
            Николай Скриган, ну, если InitialBalanse тоже округлен, то все в порядке :)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн