Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть VIII): События модификации ордеров и позиций" - страница 3

 
leonerd:

При поступлении тика, по которому устанавливается и одновременно активируется (триггерится) отложенный ордер (я тестировал с Buy Stop) ваш движок не регистрирует все события...

Приходит событие TRADE_EVENT_PENDING_ORDER_PLASED, но не TRADE_EVENT_PENDING_ORDER_ACTIVATED.

Код у меня примерно такой:

Сначала в цикле нахожу индекс старого (обработанного) события, а затем, начиная с него, перебираю все новые до конца. Так вот, в ситуации, когда по одному тику лимитный ордер установлен и стриггерен приходит одно событие об установке... Прокомментируйте, пожалуйста.

ProcessTradeEvents() вызываю в OnTick() следом за engine.OnTick(rates_data).

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

 
leonerd:

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

Да, кажется, это мои руки кривые...

 
leonerd:

Да, кажется, это мои руки кривые...

Да нет, это в библиотеке. Вернее, не именно в ней, а особенность записи истории ордеров в терминале. В более поздних версиях библиотеки эта особенность учтена и всё верно отслеживается. Попробуйте версии в районе 30-й - перед темой про индикаторы. Сейчас уже не вспомню где исправлено. Впрочем, в одной из последующих статей я писал про это - там и было исправление. 
 

Здравствуйте.

Я столкнулся с такой проблемой при тестировании TestDoEasyPart08.mq5 - не срабатывают StopLoss и TakeProfit. Хотя они выставляются - соответствующие линии на графике появляются, и сообщения в журнал приходят. Если включить TrailStop, то TakeProfit срабатывает, а StopLoss по-прежнему нет. В чём может быть причина?

P.S. На другом компьютере (ноутбуке) запускаю тот же код - работает всё нормально. Хотя там стоит такой же метатрейдер.

 
MQL_User #:

Здравствуйте.

Я столкнулся с такой проблемой при тестировании TestDoEasyPart08.mq5 - не срабатывают StopLoss и TakeProfit. Хотя они выставляются - соответствующие линии на графике появляются, и сообщения в журнал приходят. Если включить TrailStop, то TakeProfit срабатывает, а StopLoss по-прежнему нет. В чём может быть причина?

P.S. На другом компьютере (ноутбуке) запускаю тот же код - работает всё нормально. Хотя там стоит такой же метатрейдер.

Добрый вечер! Покажите для начала, хотя бы, те сообщения, которые в журнал приходят.

С уважением, Владимир.

 
MQL_User #:

Здравствуйте.

Я столкнулся с такой проблемой при тестировании TestDoEasyPart08.mq5 - не срабатывают StopLoss и TakeProfit. Хотя они выставляются - соответствующие линии на графике появляются, и сообщения в журнал приходят. Если включить TrailStop, то TakeProfit срабатывает, а StopLoss по-прежнему нет. В чём может быть причина?

P.S. На другом компьютере (ноутбуке) запускаю тот же код - работает всё нормально. Хотя там стоит такой же метатрейдер.

Если выставляются стоп (лимит)-ордера, то их срабатывание зависит не от программы, а от брокера. Приказ на выставление стоп (лимит)-ордеров отправляется на сервер программой, а их срабатывание зависит от брокера. Раз они выставляются (их линии отображены на графике), то со стороны программы нет ошибок. Скорее всего, цена не доходит до стоп(лимит)-ордеров.

 
MrBrooklin #:

Добрый вечер! Покажите для начала, хотя бы, те сообщения, которые в журнал приходят.

С уважением, Владимир.

MrBrooklin, Артём.

Я это в тестере стратегий делал (как я понимаю, брокер здесь ни при чём).

Сообщения такие:

2022.07.03 11:16:39.380    2022.01.03 07:00:00   instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380    2022.01.03 07:00:00   deal #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380    2022.01.03 07:00:00   deal performed [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380    2022.01.03 07:00:00   order performed buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011]

Но на другом компьютере (ноутбуке), на котором StopLoss и TakeProfit срабатывают корректно, сообщения такие:

2022.07.03 11:23:18.383    2022.01.03 07:00:12   instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383    2022.01.03 07:00:12   deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383    2022.01.03 07:00:12   deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383    2022.01.03 07:00:12   order performed buy 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514    2022.01.03 07:00:12   - Позиция открыта: 2022.01.03 07:00:12.490 -
2022.07.03 11:23:18.514    2022.01.03 07:00:12   @Si Открыт 0.10 Buy #2 [0.10 Market order Buy #2] по цене 81047, sl 80996, tp 81096, магик 123

Действительно, на две строчки больше..

Чтобы несколько упростить, я написал советник с таким нехитрым  кодом:

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
#import "user32.dll"
  int GetAsyncKeyState(int a0);
#import
bool ZPressed, ZPress = false;
bool APressed, APress = false;
CTrade trade;

int OnInit()  {   return(INIT_SUCCEEDED);  }

void OnDeinit(const int reason)  {  }

void OnTick()
  {
  //нажата кнопка "Z"
  if(MathAbs(GetAsyncKeyState(90))>1) ZPressed = ZPress = true;
  else ZPress = false;
  if(ZPressed && !ZPress)
    {
    ZPressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price - 30, tp = Price + 50;
    trade.Buy(1,Symbol(),0,sl,tp);
    printf("Buy"); 
    }
  //нажата кнопка "A"
  if(MathAbs(GetAsyncKeyState(65))>1) APressed = APress = true;
  else APress = false;
  if(APressed && !APress)
    {
    APressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price + 30, tp = Price - 50;
    trade.Sell(1,Symbol(),0,sl,tp);
    printf("Sell");    
    }
  }

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {  }
//+------------------------------------------------------------------+

Смысл в том, что при нажатии (а точнее при отжатии) клавиши "Z" открывается Buy, а при нажатии клавиши "A" открывается Sell.

Запустил его в тестере. Результат тот же - на настольном ПК StopLoss и TakeProfit не срабатывают, а на ноутбуке срабатывают, т.е. всё работает корректно.

Я также пробовал в тестере запускать код, ссылка на который приведена в конце этой статьи на ПК и на ноутбуке, и то же самое - на ПК не работает, на ноутбуке работает.

Т.е. напрашивается вывод, что либо есть какая-то настройка у тестера, которая разрешает срабатывание sl и tp (о которой я не знаю), либо сам тестер работает некорректно...

 
MQL_User #:

MrBrooklin, Артём.

Я это в тестере стратегий делал (как я понимаю, брокер здесь ни при чём).

Сообщения такие:

2022.07.03 11:16:39.380    2022.01.03 07:00:00   instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380    2022.01.03 07:00:00   deal #2 buy 0.1 @Si at 81011 done (based on order #2)
2022.07.03 11:16:39.380    2022.01.03 07:00:00   deal performed [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380    2022.01.03 07:00:00   order performed buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011]

Но на другом компьютере (ноутбуке), на котором StopLoss и TakeProfit срабатывают корректно, сообщения такие:

2022.07.03 11:23:18.383    2022.01.03 07:00:12   instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383    2022.01.03 07:00:12   deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383    2022.01.03 07:00:12   deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383    2022.01.03 07:00:12   order performed buy 0.1 at 81047 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514    2022.01.03 07:00:12   - Позиция открыта: 2022.01.03 07:00:12.490 -
2022.07.03 11:23:18.514    2022.01.03 07:00:12   @Si Открыт 0.10 Buy #2 [0.10 Market order Buy #2] по цене 81047, sl 80996, tp 81096, магик 123

Действительно, на две строчки больше..

Чтобы несколько упростить, я написал советник с таким нехитрым  кодом:

Смысл в том, что при нажатии (а точнее при отжатии) клавиши "Z" открывается Buy, а при нажатии клавиши "A" открывается Sell.

Запустил его в тестере. Результат тот же - на настольном ПК StopLoss и TakeProfit не срабатывают, а на ноутбуке срабатывают, т.е. всё работает корректно.

Я также пробовал в тестере запускать код, ссылка на который приведена в конце этой статьи на ПК и на ноутбуке, и то же самое - на ПК не работает, на ноутбуке работает.

Т.е. напрашивается вывод, что либо есть какая-то настройка у тестера, которая разрешает срабатывание sl и tp (о которой я не знаю), либо сам тестер работает некорректно...

Спред в тестере какой?
 

Спред в тестере равен 1. И на ПК и на ноутбуке. Символ @Si.

А разве это может как-то влиять?

Я думал, что может быть как-нибудь проскальзывание (slippage)  влияет и пробовал его менять. Но не помогает..

 
MQL_User #:

Спред в тестере равен 1. И на ПК и на ноутбуке. Символ @Si.

А разве это может как-то влиять?

Я думал, что может быть как-нибудь проскальзывание (slippage)  влияет и пробовал его менять. Но не помогает..

В одном из случаев цена явно не доходит до стоп-уровня

Причина обращения: