Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 82

 

Добрый день,

Вопрос по mql5 - подскажите как работать с триггерами stopLoss и takeProfit?

Отправляю ордер, модифицирую его, он исполняется и пропадает. Дальше возможности ему менять sl, tp нету - OrderSelect выпадает с ошибкой ордер не найден. Дальше срабатывает тригер и создается новый ордер, автоматически который реализует stopLoss / takeProfit. 

 
Forux: Вопрос по mql5 - подскажите как работать с триггерами stopLoss и takeProfit?

Отправляю ордер, модифицирую его, он исполняется и пропадает. Дальше возможности ему менять sl, tp нету - OrderSelect выпадает с ошибкой ордер не найден. Дальше срабатывает тригер и создается новый ордер, автоматически который реализует stopLoss / takeProfit. 

Идеология mql5 состоит в том, что после срабатывания ордера открывается (изменяется, закрывается) позиция по выбранному инструменту (символу). Поэтому после срабатывания ордера (если оно не привело к закрытию позиции) надо работать с позицией. Например, с помощью PositionSelect(). Для изменения же уровней stopLoss и takeProfit у позиции предусмотрен свой вариант торгового запроса.
 
Yedelkin:
Идеология mql5 состоит в том, что после срабатывания ордера открывается (изменяется, закрывается) позиция по выбранному инструменту (символу). Поэтому после срабатывания ордера (если оно не привело к закрытию позиции) надо работать с позицией. Например, с помощью PositionSelect(). Для изменения же уровней stopLoss и takeProfit у позиции предусмотрен свой вариант торгового запроса.

Тогда почему stopLoss не закрывает позицию?  

2013.01.16 10:33:50     Core 1  2010.05.03 00:01:21   order performed sell 0.10 at 1.33260 [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 10:33:50     Core 1  2010.05.03 00:01:21   deal performed [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 10:33:50     Core 1  2010.05.03 00:01:21   deal #3 sell 0.10 EURUSD at 1.33260 done (based on order #3)
2013.01.16 10:33:50     Core 1  2010.05.03 00:01:21   stop loss triggered buy 0.10 EURUSD 1.33310 sl: 1.33260 tp: 1.33360 [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 10:33:50     Core 1  2010.05.03 00:00:02   Cant select order 2 error 4754
2013.01.16 10:33:50     Core 1  2010.05.03 00:00:00   position modified [buy 0.10 EURUSD 1.33310 sl: 1.33260 tp: 1.33360]
2013.01.16 10:33:50     Core 1  2010.05.03 00:00:00    === add order === 2
2013.01.16 10:33:50     Core 1  2010.05.03 00:00:00   order performed buy 0.10 at 1.33310 [#2 buy 0.10 EURUSD at 1.33310]
2013.01.16 10:33:50     Core 1  2010.05.03 00:00:00   deal performed [#2 buy 0.10 EURUSD at 1.33310]
2013.01.16 10:33:50     Core 1  2010.05.03 00:00:00   deal #2 buy 0.10 EURUSD at 1.33310 done (based on order #2)
2013.01.16 10:33:50     Core 1  2010.05.03 00:00:00   exchange buy 0.10 EURUSD at 1.33310 (1.33290 / 1.33310 / 1.33290)

 Кроме того ее объем постоянно равен 0.10 лотам, да же после отыгрывания stop loss

 

Forux: Тогда почему stopLoss не закрывает позицию?  Кроме того ее объем постоянно равен 0.10 лотам, да же после отыгрывания stop loss 

А каким образом Вы определяете, что после срабатывания SL позиция не закрывается и что её объём остаётся прежним?
 
Yedelkin:
А каким образом Вы определяете, что после срабатывания SL позиция не закрывается и что её объём остаётся прежним?

PositionGetDouble(POSITION_VOLUME); 

2013.01.16 11:38:36     Core 1  disconnected
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:30   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:28   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:26   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:24   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:22   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:21   order performed sell 0.10 at 1.33260 [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:21   deal performed [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:21   deal #3 sell 0.10 EURUSD at 1.33260 done (based on order #3)
2013.01.16 11:38:34     Core 1  2010.05.03 00:01:21   stop loss triggered buy 0.10 EURUSD 1.33310 sl: 1.33260 tp: 1.33360 [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:11   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:09   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:06   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:04   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:02   PositionGetDouble(POSITION_VOLUME) = 0.1
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:00   position modified [buy 0.10 EURUSD 1.33310 sl: 1.33260 tp: 1.33360]
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:00    === add order === 2
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:00   order performed buy 0.10 at 1.33310 [#2 buy 0.10 EURUSD at 1.33310]
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:00   deal performed [#2 buy 0.10 EURUSD at 1.33310]
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:00   deal #2 buy 0.10 EURUSD at 1.33310 done (based on order #2)
2013.01.16 11:38:34     Core 1  2010.05.03 00:00:00   exchange buy 0.10 EURUSD at 1.33310 (1.33290 / 1.33310 / 1.33290)
2013.01.16 11:38:34     Core 1    magic=12345
 
А сведения о позиции обновляете,  как это предписано в Справочнике,  прежде чем в очередной раз использовать  PositionGetDouble(POSITION_VOLUME)?
 
Yedelkin:
А сведения о позиции обновляете,  как это предписано в Справочнике,  прежде чем в очередной раз использовать  PositionGetDouble(POSITION_VOLUME)?

Если я правильно понял что подразумевалось тогда да, делаю следующее: 

PositionSelect(_Symbol); // судя по справке обновляет кеш
Print("PositionGetDouble(POSITION_VOLUME) = " + PositionGetDouble(POSITION_VOLUME));
 
Forux: Если я правильно понял что подразумевалось тогда да, делаю следующее:  
Да, я про это говорил. Т.е. использование такой конструкции в течение 10 секунд всё равно возвращает ненулевой объём закрываемой по Sl позиции? В таком случае идеи к этому вопросу пока нет :(
 

А попробуйте вот так:

if(PositionSelect(_Symbol)) 
   Print("myPositionGetDouble(POSITION_VOLUME) == " + PositionGetDouble(POSITION_VOLUME));
else 
   Print("Сведения о позиции не обнаружены");
 
Yedelkin:

А попробуйте вот так:

Огромное спасибо :) 

2013.01.16 12:47:49     Core 1  disconnected
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:30   Сведения о позиции не обнаружены
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:28   Сведения о позиции не обнаружены
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:26   Сведения о позиции не обнаружены
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:24   Сведения о позиции не обнаружены
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:22   Сведения о позиции не обнаружены
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:21   order performed sell 0.10 at 1.33260 [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:21   deal performed [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:21   deal #3 sell 0.10 EURUSD at 1.33260 done (based on order #3)
2013.01.16 12:47:45     Core 1  2010.05.03 00:01:21   stop loss triggered buy 0.10 EURUSD 1.33310 sl: 1.33260 tp: 1.33360 [#3 sell 0.10 EURUSD at 1.33260]
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:11   myPositionGetDouble(POSITION_VOLUME) == 0.1
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:09   myPositionGetDouble(POSITION_VOLUME) == 0.1
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:06   myPositionGetDouble(POSITION_VOLUME) == 0.1
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:04   myPositionGetDouble(POSITION_VOLUME) == 0.1
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:02   myPositionGetDouble(POSITION_VOLUME) == 0.1
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:00   position modified [buy 0.10 EURUSD 1.33310 sl: 1.33260 tp: 1.33360]
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:00    === add order === 2
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:00   order performed buy 0.10 at 1.33310 [#2 buy 0.10 EURUSD at 1.33310]
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:00   deal performed [#2 buy 0.10 EURUSD at 1.33310]
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:00   deal #2 buy 0.10 EURUSD at 1.33310 done (based on order #2)
2013.01.16 12:47:45     Core 1  2010.05.03 00:00:00   exchange buy 0.10 EURUSD at 1.33310 (1.33290 / 1.33310 / 1.33290)
2013.01.16 12:47:45     Core 1    magic=12345

 

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