Заработай до
50000$
на приглашении друзей
получить StartUp Bonus
от ИнстаФорекс
Вложений не требуется!
Начни торговлю
без вложений и риска
С новым STARTUP бонусом 1000$
Получи бонус
55%
от ИнстаФорекс
на каждое пополнение
Ответить в теме
Страница 1 из 2
1 Последняя ◄╝

Показаны сообщения: с 1 по 20 из 26

Тема: MQL5 Помогите найти косяк в советнике

 Перейти в классический вид темы
  1. линк#1
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Всем привет и заранее спасибо за помощь. Советник с мартином, вроде все правильно написано, компилируется без проблем, нет ни одной ошибки или предупреждения. Однако почему-то при тестировании на истории советник не может выставить Тейк профит. В журнале ошибка 10036 при выставлении тейк профита. Сто раз пересмотрел весь код, но не могу найти ошибку. Может глаз уже "замылился".
    paperclip Вложения


  2. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

    <a href="https://www.instaforex.com/ru/forexcopy_system">Форекс портал</a>
     
  3. ТОП сообщений
    2018-09-01   20:15
    Лучший ответ #1
    Накопленные выплаты 12004 RUB

    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Вставь принты в соответствующие места кода и посмотри, что на самом деле уходит в OrderSend(), а не то что ты думаешь.
    Типы подправишь в зависимости от данных.
    Когда проверишь, потом закомментируешь.
    .
    Сегодня вставил принты. Смотрю журнал - советник выставляет ордер, правильно рассчитывает ТП от его цены, пытается модифицировать правильный ордер, но не может (позиция не существует) да как так? Он опять берет эту открытую позицию, рассчитывает ТП для нее, пытается модифицировать, но её опять не существует.
    Вложение 2129479

    Вложение
    Превью
    2018-08-30   21:36
    Лучший ответ #2
    Накопленные выплаты 55303 RUB

    Цитата Сообщение от Kapec Посмотреть сообщение

    Вставь принты в соответствующие места кода и посмотри, что на самом деле уходит в OrderSend(), а не то что ты думаешь.
    //---
    Print ("PositionSelect(_Symbol) =" + IntegerToString( PositionSelect(_Symbol)));
    //---
    Print ( "OpenPrice =" + DoubleToString(OpenPrice, _Digits) );
    //---
    Print ( "oldOpenPrice =" + DoubleToString( oldOpenPrice, _Digits) );
    //---
    Print ("Request.symbol =" + Request.symbol);
    Print ("Request.action =" + Request.action);
    Print ("Request.sl =" + Request.sl);
    Print ("Request.deviation = " + Request.deviation);
    //---
    Print( "Request.tp = " + Request.tp);
    //---
    //---
    Print ("Result.retcode = " + Result.retcode);
    Print ("Result.retcode_external" + Result.retcode_external);
    Print ("Result.ask = " + Result.ask);
    Print ("Result.bid = " + Result.bid);
    Print ("Result.deal = " + Result.deal);
    Print ("Result.order = " + Result.order);
    Print ("Result.price = " + Result.price);
    Print ("Result.request_id = " + Result.request_id);
    Print ("Result.volume = " + Result.volume);
    //---
    Типы подправишь в зависимости от данных.
    Когда проверишь, потом закомментируешь.
    И вот такую конструкцию, я бы не использовал: "if (!OrderSend(Request, Result)){...}", по нескольким причинам,
    первая это выполнение на каждом тике OrderSend при проверке условия, вторая - отсутствие возможности нормально проверить ошибку, и соответственно правильно на неё отреагировать.
    В общем надо бы код править, опять же ИХМО.

    2018-09-08   15:39
    Лучший ответ #3
    Накопленные выплаты 55303 RUB

    Цитата Сообщение от Kapec Посмотреть сообщение
    К истокам я вернулся ещё до того как здесь на форуме попросил помощи. Скачал по ссылке, просмотрел код, запустил тест - не ставит ТП. Переписал код вручную из видео, закоментил код по шагам, запустил тест - не ставит ТП. А в видео то ставит ТП и советник работает корректно. Как так?
    По шагам проверил код, проштудировал справочник по mql5. Всё правильно, но не работает. Хочу для собственного понимания разобраться где ошибка в коде, но не получилось и потому попросил помощи.
    ЗЫ. Я и не надеюсь что 20 кило кода принесут прибыль. Тем более код мартина.
    А разницу в неттинговой и хэджинговой системе, как учитывает?
    Просто при неттинге, в рынке только одна поза должна быть, а в хэджинге много, соответственно механизм учёта позиций разный.
    Ну и идентификация режима.
    Классы конечно в помощь, но вопрос, чтобы в "оригинале" работало.
    Код достаточно свежий, но я написал, что присутствует ощущение, что что-то важное именно в логике пропустили.
    А! Ну или метаквотовцы накосячили.
    Не сова чисто обучающая, отсель и выводы.

    2018-09-06   18:56
    Лучший ответ #4
    Накопленные выплаты 33292 RUB

    Цитата Сообщение от Kapec Посмотреть сообщение
    советник пытается модифицировать ту позицию которую необходимо, но не может. А почему?
    В структуре запроса явно указываете тикет той позиции, которую нужно модифицировать. Какой тип учета позиций на счете?
    Возможно так поможет
    MQL код:
              Request.position = PositionGetInteger(POSITION_TICKET);

    2018-08-25   20:27
    Лучший ответ #5
    Накопленные выплаты 55303 RUB

    Цитата Сообщение от Kapec Посмотреть сообщение
    Всем привет и заранее спасибо за помощь. Советник с мартином, вроде все правильно написано, компилируется без проблем, нет ни одной ошибки или предупреждения. Однако почему-то при тестировании на истории советник не может выставить Тейк профит. В журнале ошибка 10036 при выставлении тейк профита. Сто раз пересмотрел весь код, но не могу найти ошибку. Может глаз уже "замылился".
    А mq5, вместо ex5 слабо подогнать, или тоже глаз "замылился"?
    А по ошибке, так ты закрываешь уже закрытую позицию.
    Обновляй список открытых позиций корректно и вовремя.

    2018-08-31   18:11
    Лучший ответ #6
    Накопленные выплаты 55303 RUB

    Цитата Сообщение от Kapec Посмотреть сообщение
    Хорошо. Сейчас принты вставлю посмотрю что получится. А какую конструкцию Вы бы использовали вместо "if (!OrderSend(Request, Result)){...}"?
    Где бы OrderSend(), не был операндом в условном операторе.
    Или просто вызывался, выполнялся, в случае полного соответствия всех необходимых параметров,
    а после него вызывал бы GetLastError(), и анализировал его значение, или "запоминал" значение GetLastError() для последующего анализа и действия по нему, а так же смотрел, что при этом находится в Result.retcode и в связке, там же смотрел, что и как.

  4. линк#2
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,631
    Накопленные выплаты (Подробнее):
    55303 RUB
    Поставил лайков:
    277
    Получено лайков:  620
    в 561 сообщениях
    38%
    Цитата Сообщение от Kapec Посмотреть сообщение
    Всем привет и заранее спасибо за помощь. Советник с мартином, вроде все правильно написано, компилируется без проблем, нет ни одной ошибки или предупреждения. Однако почему-то при тестировании на истории советник не может выставить Тейк профит. В журнале ошибка 10036 при выставлении тейк профита. Сто раз пересмотрел весь код, но не могу найти ошибку. Может глаз уже "замылился".
    А mq5, вместо ex5 слабо подогнать, или тоже глаз "замылился"?

    А по ошибке, так ты закрываешь уже закрытую позицию.
    Обновляй список открытых позиций корректно и вовремя.

    Последний раз редактировалось MonyaMaker; 25.08.2018 в 20:45.

  5. post_thanks Получено лайков: 2

    Kapec (28.08.2018), Незарегистрированный (1 пользователь)

  6. линк#3
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    А ведь и правда ошибочно ex5 зацепил. Прикрепил mq5.
    paperclip Вложения


  7. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  8. линк#4
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    А mq5, вместо ex5 слабо подогнать, или тоже глаз "замылился"?

    А по ошибке, так ты закрываешь уже закрытую позицию.
    Обновляй список открытых позиций корректно и вовремя.
    Ещё раз пересмотрел, так и не нашел ошибку. По закрытию позиции - позицию я и не закрываю, а выставляю тейк профит. Советник выставляет первую позицию, тут же пытается выставить на неё ТП, но уже не получается, уже ошибка вылазит.


  9. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  10. линк#5
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,631
    Накопленные выплаты (Подробнее):
    55303 RUB
    Поставил лайков:
    277
    Получено лайков:  620
    в 561 сообщениях
    38%
    Цитата Сообщение от Kapec Посмотреть сообщение
    Ещё раз пересмотрел, так и не нашел ошибку. По закрытию позиции - позицию я и не закрываю, а выставляю тейк профит. Советник выставляет первую позицию, тут же пытается выставить на неё ТП, но уже не получается, уже ошибка вылазит.
    Не вникая в детали.
    Не знаю что ты ищешь, какую именно ошибку, но у тебя модификация SLTP существует в единственном месте и при единственном условии, "if (NewPosition)".
    А ты , то твоим словам, модифицируешь уже открытую позицию.
    Логично было бы перед модификацией выбрать нужную позицию.
    Поэтому начни поиск ошибки с того, какой именно ордер ты всё таки модифицируешь.


  11. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

  12. линк#6
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Не вникая в детали.
    Не знаю что ты ищешь, какую именно ошибку, но у тебя модификация SLTP существует в единственном месте и при единственном условии, "if (NewPosition)".
    А ты , то твоим словам, модифицируешь уже открытую позицию.
    Логично было бы перед модификацией выбрать нужную позицию.
    Поэтому начни поиск ошибки с того, какой именно ордер ты всё таки модифицируешь.
    Вникните пожалуйста.
    Вот фрагмент кода:
    MQL код:
    OrderPrice =  PositionGetDouble(POSITION_PRICE_OPEN);

    if (OrderPrice == 0)
    return;

    if (OrderPrice == oldOpenPrice)
    return;

    Request.symbol = _Symbol;
    Request.action = TRADE_ACTION_SLTP;
    Request.sl = 0;
    Request.deviation = Slippage;

    if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
    {
    Request.tp = ND(OrderPrice + iTP * _Point);
    }

    if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
    {
    Request.tp = ND(OrderPrice - iTP * _Point);
    }

    if (!OrderSend(Request, Result))
    {
    Print("Не удалось установить TakeProfit, код ошибки ", Result.retcode);
    return;
    }

    oldOpenPrice = OrderPrice;
    NewPosition = false;
    }

    Мы берем открытую позицию и пытаемся её модифицировать.


  13. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

  14. линк#7
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,631
    Накопленные выплаты (Подробнее):
    55303 RUB
    Поставил лайков:
    277
    Получено лайков:  620
    в 561 сообщениях
    38%
    Цитата Сообщение от Kapec Посмотреть сообщение

    Вставь принты в соответствующие места кода и посмотри, что на самом деле уходит в OrderSend(), а не то что ты думаешь.

    //---
    Print ("PositionSelect(_Symbol) =" + IntegerToString( PositionSelect(_Symbol)));
    //---
    Print ( "OpenPrice =" + DoubleToString(OpenPrice, _Digits) );
    //---
    Print ( "oldOpenPrice =" + DoubleToString( oldOpenPrice, _Digits) );
    //---
    Print ("Request.symbol =" + Request.symbol);
    Print ("Request.action =" + Request.action);
    Print ("Request.sl =" + Request.sl);
    Print ("Request.deviation = " + Request.deviation);
    //---
    Print( "Request.tp = " + Request.tp);
    //---

    //---
    Print ("Result.retcode = " + Result.retcode);
    Print ("Result.retcode_external" + Result.retcode_external);
    Print ("Result.ask = " + Result.ask);
    Print ("Result.bid = " + Result.bid);
    Print ("Result.deal = " + Result.deal);
    Print ("Result.order = " + Result.order);
    Print ("Result.price = " + Result.price);
    Print ("Result.request_id = " + Result.request_id);
    Print ("Result.volume = " + Result.volume);
    //---
    Типы подправишь в зависимости от данных.
    Когда проверишь, потом закомментируешь.

    И вот такую конструкцию, я бы не использовал: "if (!OrderSend(Request, Result)){...}", по нескольким причинам,
    первая это выполнение на каждом тике OrderSend при проверке условия, вторая - отсутствие возможности нормально проверить ошибку, и соответственно правильно на неё отреагировать.
    В общем надо бы код править, опять же ИХМО.

    Последний раз редактировалось MonyaMaker; 30.08.2018 в 21:44.

  15. post_thanks Получено лайков: 3

    Незарегистрированный (3 пользователя)

  16. линк#8
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Вставь принты в соответствующие места кода и посмотри, что на самом деле уходит в OrderSend(), а не то что ты думаешь.



    Типы подправишь в зависимости от данных.
    Когда проверишь, потом закомментируешь.

    И вот такую конструкцию, я бы не использовал: "if (!OrderSend(Request, Result)){...}", по нескольким причинам,
    первая это выполнение на каждом тике OrderSend при проверке условия, вторая - отсутствие возможности нормально проверить ошибку, и соответственно правильно на неё отреагировать.
    В общем надо бы код править, опять же ИХМО.
    Хорошо. Сейчас принты вставлю посмотрю что получится. А какую конструкцию Вы бы использовали вместо "if (!OrderSend(Request, Result)){...}"?


  17. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

  18. линк#9
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,631
    Накопленные выплаты (Подробнее):
    55303 RUB
    Поставил лайков:
    277
    Получено лайков:  620
    в 561 сообщениях
    38%
    Цитата Сообщение от Kapec Посмотреть сообщение
    Хорошо. Сейчас принты вставлю посмотрю что получится. А какую конструкцию Вы бы использовали вместо "if (!OrderSend(Request, Result)){...}"?
    Где бы OrderSend(), не был операндом в условном операторе.
    Или просто вызывался, выполнялся, в случае полного соответствия всех необходимых параметров,
    а после него вызывал бы GetLastError(), и анализировал его значение, или "запоминал" значение GetLastError() для последующего анализа и действия по нему, а так же смотрел, что при этом находится в Result.retcode и в связке, там же смотрел, что и как.


  19. post_thanks Получено лайков: 2

    Kapec (31.08.2018), Незарегистрированный (1 пользователь)

  20. линк#10
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Вставь принты в соответствующие места кода и посмотри, что на самом деле уходит в OrderSend(), а не то что ты думаешь.
    Типы подправишь в зависимости от данных.
    Когда проверишь, потом закомментируешь.
    .
    Сегодня вставил принты. Смотрю журнал - советник выставляет ордер, правильно рассчитывает ТП от его цены, пытается модифицировать правильный ордер, но не может (позиция не существует) да как так? Он опять берет эту открытую позицию, рассчитывает ТП для нее, пытается модифицировать, но её опять не существует.

    Название: Снимок.JPG
Просмотров: 337

Размер: 65.3 КБ


  21. post_thanks Получено лайков: 4

    Незарегистрированный (4 пользователя)

  22. линк#11
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,631
    Накопленные выплаты (Подробнее):
    55303 RUB
    Поставил лайков:
    277
    Получено лайков:  620
    в 561 сообщениях
    38%
    Цитата Сообщение от Kapec Посмотреть сообщение
    Сегодня вставил принты. Смотрю журнал - советник выставляет ордер, правильно рассчитывает ТП от его цены, пытается модифицировать правильный ордер, но не может (позиция не существует) да как так? Он опять берет эту открытую позицию, рассчитывает ТП для нее, пытается модифицировать, но её опять не существует.
    Вложение 2129479
    Считает правильно, но то что модифицировать надо, выбирает не правильно.


  23. линк#12
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Считает правильно, но то что модифицировать надо, выбирает не правильно.
    Filed modify #2 - это же попытка модификации ордера с тикетом 2? Тикет 1 в тестера это пополнение депозита. В момент модификации в тестере всего одна открытая позиция. Что ещё там может выбрать советник если Вы говорите что он выбирает не правильно?


  24. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

  25. линк#13
    Кандидат форумных наук
    Скромняжка
     
    Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Аватар для Tekora
    Регистрация:
    26.06.2011
    Сообщений:
    1,756
    Накопленные выплаты (Подробнее):
    33292 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  532
    в 424 сообщениях
    30%
    Kapec, а пользоваться объектами стандартной библиотеки не пробовали?
    MQL код:
    #include 

    либо же при модификации указывать в структуре номер позиции
    MQL код:
                   request.position=position_ticket;   // тикет позиции

    Последний раз редактировалось Tekora; 06.09.2018 в 16:03.

  26. линк#14
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от Tekora Посмотреть сообщение
    Kapec, а пользоваться объектами стандартной библиотеки не пробовали?
    MQL код:
    #include 

    либо же при модификации указывать в структуре номер позиции
    MQL код:
                   request.position=position_ticket;   // тикет позиции
    Tekora, о существовании Trade.mqh я в курсе хочу разобраться с request. Выше постом я привел скрин из журнала тестирования советника, согласно журнала ведь советник пытается модифицировать ту позицию которую необходимо, но не может. А почему?


  27. линк#15
    Кандидат форумных наук
    Скромняжка
     
    Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Аватар для Tekora
    Регистрация:
    26.06.2011
    Сообщений:
    1,756
    Накопленные выплаты (Подробнее):
    33292 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  532
    в 424 сообщениях
    30%
    Цитата Сообщение от Kapec Посмотреть сообщение
    советник пытается модифицировать ту позицию которую необходимо, но не может. А почему?
    В структуре запроса явно указываете тикет той позиции, которую нужно модифицировать. Какой тип учета позиций на счете?
    Возможно так поможет
    MQL код:
              Request.position = PositionGetInteger(POSITION_TICKET);

    Последний раз редактировалось Tekora; 06.09.2018 в 19:09.

  28. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  29. линк#16
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от Tekora Посмотреть сообщение
    В структуре запроса явно указываете тикет той позиции, которую нужно модифицировать. Какой тип учета позиций на счете?
    Возможно так поможет
    MQL код:
              Request.position = PositionGetInteger(POSITION_TICKET);
    Спасибо, добавил Request.position в трех местах
    MQL код:
     if (!CanBuy && !CanSell)//если нет продаж и покупок
    {
    NewLot = NormalizeDouble(Lots * MathPow(Multiplier, Total), 2);//открываем новый лот

    [COLOR="red"]Request.position = PositionGetInteger(POSITION_TICKET); [/COLOR]
    Request.action = TRADE_ACTION_DEAL; // тип торговой операции
    Print ("Request.action =" + Request.action);
    Request.symbol = _Symbol; //символ
    Request.volume = NewLot; //лот
    Print ("Result.volume = " + Result.volume);
    Request.sl = 0; //стоп-лосс
    Request.tp = 0; //тейк-профит
    Print( "Request.tp = " + Request.tp);
    Request.deviation = Slippage; //проскальзывание
    Request.type_filling = ORDER_FILLING_FOK; //ордер исполняется исключительно в указанном объеме
    Request.magic = Magic; //мэйджик номер

    if (!SymbolInfoTick(_Symbol, LastPrices)) //если не получили последние цены
    {
    Print("Не удалось получить последние цены.");
    return;
    }


    if (CopyBuffer(handle, 0, 0, 2, MA) <= 0)
    return;

    ArraySetAsSeries(MA, true);//установим флажок объекту массива машки

    if (MA[0] < MA[1])//если текущая цена меньше цены от предыдущей свечи то
    {
    Request.price = ND(LastPrices.bid);//продаем по цене открытия
    Request.type = ORDER_TYPE_SELL; //тип ордера sell

    if (!OrderSend(Request, Result))//если не удалось открыть ордер
    {
    Print("Не удалось открыть ордер на продажу, код ошибки: ", Result.retcode);
    return;
    }

    NewPosition = true;//у нас есть новая позиция, устанавливаем флаг
    }
    else//иначе входим в покупки
    {
    Request.price = ND(LastPrices.ask); //покупаем по цене открытия
    Request.type = ORDER_TYPE_BUY; //тип ордера BUY
    if (!OrderSend(Request, Result))
    {
    Print("Не удалось открыть ордер на покупку, код ошибки: ", Result.retcode);
    return;
    }
    } //if (MA[0] < MA[1])
    } // if (!CanBuy && !CanSell)

    CanTrade = false;
    } //if (!HasPosition && CanTrade)

    if (HasPosition && CanTrade)//если есть позиция и можем торговать, то
    {
    NewLot = NormalizeDouble(Lots * MathPow(Multiplier, Total), 2);//рассчитываем объем

    [COLOR="red"] Request.position = PositionGetInteger(POSITION_TICKET); [/COLOR]
    Request.action = TRADE_ACTION_DEAL; // тип торговой операции
    Request.symbol = _Symbol; //выбираем символ
    Request.volume = NewLot; //выбираем объем позиции(равен лот умноженный на множитель)
    Request.sl = 0; //стоп-лосс
    Request.tp = iTP; //тейк-профит
    Request.deviation = Slippage; //проскальзывание
    Request.type_filling = ORDER_FILLING_FOK;//ордер исполняется исключительно в указанном объеме
    Request.magic = Magic; //мэйджик номер


    if (!SymbolInfoTick(_Symbol, LastPrices)) //если не удалось получить последние цены
    {
    Print("Не удалось получить последние цены.");
    return;
    }

    if (CanSell)//если есть продажи
    {
    Request.price = ND(LastPrices.bid);//нормализуем цену
    Request.type = ORDER_TYPE_SELL; //открываем ордер на продажу
    if (!OrderSend(Request, Result))
    {
    Print("Не удалось открыть ордер на продажу, код ошибки ", Result.retcode);
    return;
    }

    CanTrade = false;//торговля запрещена
    NewPosition = true;//новая позиция разрешена
    }
    else if (CanBuy)// если есть покупки
    {
    Request.price = ND(LastPrices.ask); //нормализуем цену
    Request.type = ORDER_TYPE_BUY;//открываем ордер на покупку
    if (!OrderSend(Request, Result))
    {
    Print("Не удалось открыть ордер на покупку, код ошибки ", Result.retcode);
    return;
    }

    CanTrade = false;
    NewPosition = true;
    }
    }

    if (NewPosition)//если есть новая позиция
    {
    if (!PositionSelect(_Symbol))//если не удалось выбрать позицию
    {
    Print("Позиция не найдена!");
    return;
    }

    OrderPrice = PositionGetDouble(POSITION_PRICE_OPEN);//получим цену открытия
    {
    Print ( "OrderPrice =" + DoubleToString(OrderPrice, _Digits) );
    }
    if (OrderPrice == 0)
    return;

    if (OrderPrice == oldOpenPrice)
    return;
    [COLOR="red"]Request.position = PositionGetInteger(POSITION_TICKET); [/COLOR]
    Request.symbol = _Symbol;
    Print("Request.symbol="+Request.symbol);
    Request.action = TRADE_ACTION_SLTP;
    Request.deviation = Slippage;
    if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)//проверяем тип ордера, если это Бай
    {
    Request.tp = ND(OrderPrice + iTP * _Point);
    Print( "Request.tp = " + Request.tp);

    }

    if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)//проверяем тип ордера, если это Селл
    {
    Request.tp = ND(OrderPrice - iTP * _Point);
    Print( "Request.tp = " + Request.tp);

    }

    if (!OrderSend(Request, Result))
    {
    Print("Не удалось установить TakeProfit, код ошибки ", Result.retcode);
    return;
    }

    oldOpenPrice = OrderPrice;
    {
    Print ( "oldOpenPrice =" + DoubleToString( oldOpenPrice, _Digits) );
    }
    NewPosition = false;
    }

    }

    Теперь тейк-профит выставляет, но не может почему-то открыть новый ордер при достижении заданного шага.
    При попытке открытия ордера - ошибка 10014 - неверный объём. Объём следующей позиции рассчитывается правильно.


  30. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  31. линк#17
    Кандидат форумных наук
    Скромняжка
     
    Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Аватар для Tekora
    Регистрация:
    26.06.2011
    Сообщений:
    1,756
    Накопленные выплаты (Подробнее):
    33292 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  532
    в 424 сообщениях
    30%
    Цитата Сообщение от Kapec Посмотреть сообщение

    Зачем в трех местах? При отправке запроса на открытие указывать тикет позиции не надо. Проще использовать готовые торговые классы и не парить себе и другим голову, ИМХО. Либо же перейти в процедурному программированию и вынести в отдельную функцию открытие, закрытие, модификации позиций/ордеров.


  32. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

  33. линк#18
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,631
    Накопленные выплаты (Подробнее):
    55303 RUB
    Поставил лайков:
    277
    Получено лайков:  620
    в 561 сообщениях
    38%
    Kapec, А где нибудь этот код работал и на это можно было посмотреть? И при этом работал, так как предполагалось?
    А то похоже, что не стыковка с выбором первой открытой позиции и её модификацией, это только начало большого пути по коренной переделке логики управления ордерами в данном советнике.


  34. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

  35. линк#19
    Кандидат форумных наук
    no
     
    Mihey85 приемлемый уровень репутации Mihey85 приемлемый уровень репутации Аватар для Mihey85
    Регистрация:
    15.08.2014
    Пол:
    Мужчина
    Сообщений:
    1,401
    Накопленные выплаты (Подробнее):
    20894 RUB
    Поставил лайков:
    231
    Получено лайков:  211
    в 199 сообщениях
    15%
    Если уровень стоп ордера либо лимита находится слишком близко к рынку, то возникает необходимость его отодвинуть на минимальное количество пунктов. Согласно документации для этого существует функция SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL). Но она всегда возвращает 0! Я решил обойти данное безобразие и когда SymbolInfoInteger вернет 0, подставлять значение спреда.

    MQL код:

    double getTradeStopLevel(){
    int stopLevel;
    if((stopLevel = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL)) <= 0)
    stopLevel = iSpread(symbol, timeframe, 0);
    if(stopLevel <= 0){
    errMsgExt("Incorrect getMinStopLevel() result!")
    }
    return stopLevel * getPoint();
    }


    Но, как выяснилось, значение спреда тоже подходит не всегда. И в результате после коррекции цены значением данной функции вылетает что-то на подобии этого: "failed buy limit 0.01 EURJPY at 125.340 sl: 125.140 tp: 125.824 [Invalid price]".

    Как получить нормальный Stop Level, чтобы цены открытия отложенных ордеров корректировались правильно и подобных ошибок не возникало?


  36. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

    ForexCopy
  37. линк#20
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Накопленные выплаты (Подробнее):
    12004 RUB
    Поставил лайков:
    76
    Получено лайков:  220
    в 138 сообщениях
    58%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Kapec, А где нибудь этот код работал и на это можно было посмотреть? И при этом работал, так как предполагалось?
    А то похоже, что не стыковка с выбором первой открытой позиции и её модификацией, это только начало большого пути по коренной переделке логики управления ордерами в данном советнике.
    Работал, как ни странно. Но как я не понимаю. Весь код я закомментировал. Всё проверил не однократно, но косяк не могу найти. Конечно играет роль что я никогда раньше не имел дела со структурами Request, но всё же.... документацию на эту тему неоднократно перечитал, но вот как-то так не получается.


  38. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)


Страница 1 из 2
1 Последняя ◄╝

Подписанные на тему (1)

Открыть

Похожие темы

  1. Помогите убрать в советнике Стоп Лосс
    от Ivan drug в разделе MQL-программирование, АТС
    Replies: 13
    Последнее сообщение: 19.03.2020, 17:39
  2. Помогите найти функцию MQL5
    от TheStereo в разделе MQL-программирование, АТС
    Replies: 5
    Последнее сообщение: 22.04.2018, 00:33
  3. Помогите найти подозреваемого!
    от Domovoi11 в разделе Свободное общение
    Replies: 5
    Последнее сообщение: 11.08.2013, 14:41
  4. Помогите найти ребенка!
    от Loky в разделе Свободное общение
    Replies: 1
    Последнее сообщение: 04.11.2012, 15:43
  5. Помогите найти Снегурочку!
    от Дед Мороз в разделе Свободное общение
    Replies: 221
    Последнее сообщение: 09.01.2012, 10:56