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

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

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

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


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

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

     
  3. ТОП сообщений
    2018-09-01   20:15
    Лучший ответ #1
    Накопленные выплаты 11618 RUB

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



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

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

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

    А разницу в неттинговой и хэджинговой системе, как учитывает? Просто при неттинге, в рынке только одна поза должна быть, а в хэджинге много, соответственно механизм учёта позиций разный. Ну и идентификация режима. Классы конечно в помощь, но вопрос, чтобы в "оригинале" работало. Код достаточно свежий, но я написал, что присутствует ощущение, что что-то важное именно в логике пропустили. А! Ну или метаквотовцы накосячили. Не сова чисто обучающая, отсель и выводы.

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

    В структуре запроса явно указываете тикет той позиции, которую нужно модифицировать. Какой тип учета позиций на счете? Возможно так поможет Request.position = PositionGetInteger(POSITION_TICKET);

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

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

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

    Где бы OrderSend(), не был операндом в условном операторе. Или просто вызывался, выполнялся, в случае полного соответствия всех необходимых параметров, а после него вызывал бы GetLastError(), и анализировал его значение, или "запоминал" значение GetLastError() для последующего анализа и действия по нему, а так же смотрел, что при этом находится в Result.retcode и в связке, там же смотрел, что и как.

  4. Линк #2 Свернуть пост
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,457
    Деньги за посты (Подробнее):
    44887 RUB
    Поставил лайков:
    262
    Получено лайков:  531
    в 483 сообщениях
    36%
    Цитата Сообщение от 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
    Деньги за посты (Подробнее):
    11618 RUB
    Поставил лайков:
    76
    Получено лайков:  219
    в 138 сообщениях
    58%
    А ведь и правда ошибочно ex5 зацепил. Прикрепил mq5.
    paperclip Вложения


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

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

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

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


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

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

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


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

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

  12. Линк #6 Свернуть пост
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Деньги за посты (Подробнее):
    11618 RUB
    Поставил лайков:
    76
    Получено лайков:  219
    в 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,457
    Деньги за посты (Подробнее):
    44887 RUB
    Поставил лайков:
    262
    Получено лайков:  531
    в 483 сообщениях
    36%
    Цитата Сообщение от 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
    Деньги за посты (Подробнее):
    11618 RUB
    Поставил лайков:
    76
    Получено лайков:  219
    в 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,457
    Деньги за посты (Подробнее):
    44887 RUB
    Поставил лайков:
    262
    Получено лайков:  531
    в 483 сообщениях
    36%
    Цитата Сообщение от 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
    Деньги за посты (Подробнее):
    11618 RUB
    Поставил лайков:
    76
    Получено лайков:  219
    в 138 сообщениях
    58%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Вставь принты в соответствующие места кода и посмотри, что на самом деле уходит в OrderSend(), а не то что ты думаешь.
    Типы подправишь в зависимости от данных.
    Когда проверишь, потом закомментируешь.
    .
    Сегодня вставил принты. Смотрю журнал - советник выставляет ордер, правильно рассчитывает ТП от его цены, пытается модифицировать правильный ордер, но не может (позиция не существует) да как так? Он опять берет эту открытую позицию, рассчитывает ТП для нее, пытается модифицировать, но её опять не существует.

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

Размер: 65.3 КБ


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

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

  22. Линк #11 Свернуть пост
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,457
    Деньги за посты (Подробнее):
    44887 RUB
    Поставил лайков:
    262
    Получено лайков:  531
    в 483 сообщениях
    36%
    Цитата Сообщение от Kapec Посмотреть сообщение
    Сегодня вставил принты. Смотрю журнал - советник выставляет ордер, правильно рассчитывает ТП от его цены, пытается модифицировать правильный ордер, но не может (позиция не существует) да как так? Он опять берет эту открытую позицию, рассчитывает ТП для нее, пытается модифицировать, но её опять не существует.
    Вложение 2129479
    Считает правильно, но то что модифицировать надо, выбирает не правильно.


  23. Линк #12 Свернуть пост
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Деньги за посты (Подробнее):
    11618 RUB
    Поставил лайков:
    76
    Получено лайков:  219
    в 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,755
    Деньги за посты (Подробнее):
    33277 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  529
    в 423 сообщениях
    30%
    Kapec, а пользоваться объектами стандартной библиотеки не пробовали?
    MQL код:
    #include 

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

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

  26. Линк #14 Свернуть пост
    Свой человек
    Все пучком
     
    Kapec приемлемый уровень репутации Kapec приемлемый уровень репутации Аватар для Kapec
    Регистрация:
    25.08.2018
    Пол:
    Мужчина
    Сообщений:
    378
    Деньги за посты (Подробнее):
    11618 RUB
    Поставил лайков:
    76
    Получено лайков:  219
    в 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,755
    Деньги за посты (Подробнее):
    33277 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  529
    в 423 сообщениях
    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
    Деньги за посты (Подробнее):
    11618 RUB
    Поставил лайков:
    76
    Получено лайков:  219
    в 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,755
    Деньги за посты (Подробнее):
    33277 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  529
    в 423 сообщениях
    30%
    Цитата Сообщение от Kapec Посмотреть сообщение

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


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

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

  33. Линк #18 Свернуть пост