как вписать условие: если стоп лосс то перевернуть позицию??

 
Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.
 
kpax:
Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.
Проще поставить вместо стоплосса стоповую отложку с двойным объёмом. Тогда поза сама перевернётся при срабатывании отложки.
 
При чём тут отложка?? Я пишу (точнее учусь) робота.
Мой робот при запуске покупал 0.01 евро/бакса со стопом 10п. и профитом 50п. После срабатывания стопа или профита опять покупал с теми же параметрами:

// Внешние параметры советника
extern int stoploss=100;
extern int takeprofit=500;
extern double lots=0.01;

void start() // Функция start советника вызывается терминалом при приходе каждого нового тика от сервера
{
   if(OrdersTotal()==0) // Если ордеров нет (либо это первый запуск, либо предыдущий ордер только что закрылся по СЛ или ТП)
   {
      OrderSend(Symbol(), OP_BUY, lots, Ask, 100, Ask-stoploss*Point, Ask+takeprofit*Point);
      /*
         Отправка ордера
         На инструменте Symbol
         Тип ордера - покупка (OP_BUY)
         Лотность ордера - внешний параметр lots
         Цена, по которой покупаем - текущая цена Ask
         Максимально допустимое проскальзывание - 100 пипсов
         Стоплосс ниже цены покупки (Ask) на stoploss (внешний параметр) пунктов (Point)
         Тейкпрофит выше цены покупки (Ask) на takeprofit (внешний параметр) пунктов (Point)
      */
   }
}

Потом я решил добавить условие что б при стоп лоссе позиция переворачивалась… Для этого нужно:
1. Найти последний закрытый ордер.
2. Если найден, выбрать его и извлечь параметры, а именно тип и прибыль.
3. Если есть параметры и прибыль ордера отрицательная, задать тип открываемого ордера противоположный типу закрытого.

int OrdType=OP_BUY;
//Если найден последний исторический ордер
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
//Если прибыль его отрицательная и ордер Buy типа
if(OrderProfit()<0 && OrderType()==OP_BUY)OrdType=OP_SELL;
}

Дальше, при открытии указывать тип не OP_BUY, а переменную OrdType
Как это сделать что б работало хотя бы на стандартных счетах??
 
Reshetov:
Проще поставить вместо стоплосса стоповую отложку с двойным объёмом. Тогда поза сама перевернётся при срабатывании отложки.

 

В случае, когда приходится платить комиссию брокеру за сделку и эта комиссия снимается при открытии позиии, такой подход удвоит её [комиссию].

 
Reshetov:
Проще поставить вместо стоплосса стоповую отложку с двойным объёмом. Тогда поза сама перевернётся при срабатывании отложки.
А при чём тут двойной объём?
 
kpax:
А при чём тут двойной объём?
Допустим у Вас позиция Buy по цене 1,2050 и её объем 0,01. Вы хотите выставить стоплосс на 1,2000 и объемом 0,01. Вместо выставления стоплосса вы выставляете отложенный ордер Sell stopp по цене 1,2050-спред объемом 0,02. Когда цена пойдет не в Вашу сторону и затронет отложенный ордер Sell stopp, то этот ордер сработает. Ваш Buy объемом 0,01 закроется и останется одна позиция Sell объемом 0,01.
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

на кой мне двойной лот с отложеным ордером? и что значит минус спрэд? а если он плавающий ??

Как мне до кучи собрать код чтоб он при запуске покупал 0.01 лот. а после срабатывания стопа переворачивался? 

 
kpax:

на кой мне двойной лот с отложеным ордером? и что значит минус спрэд? а если он плавающий ??

Как мне до кучи собрать код чтоб он при запуске покупал 0.01 лот. а после срабатывания стопа переворачивался? 

Стоп - это на самом деле отложенный ордер того же объёма и противоположного направления, просто от вас это скрывают :). А если объём будет двойной, то половина сработает как стоп и останется как раз противоположный ордер того же объёма. Если это не переворот, то что это по вашему? Вы может быть ещё не знаете что МТ5 работает с нетто-позицией?

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

Другое дело если вам нужно переворачиваться не в момент стопа, а позже.

 
Reshetov:
Проще поставить вместо стоплосса стоповую отложку с двойным объёмом. Тогда поза сама перевернётся при срабатывании отложки.

На самом деле это конечно не ответ а замена исходного вопроса на вопрос "как вписать условие: ставить отложку если отложки нет" :)

Исходный вариант будет экономнее по коду.

kpax , попробуйте так:

Когда ставите ордер первый раз, ставьте и флаг направления. Затем, если ордера нет, переворачиваете флаг и ставите ордер по новому значению флага.

Но при таком подходе проскальзывания будут больше.

 
kpax:

на кой мне двойной лот с отложеным ордером? и что значит минус спрэд? а если он плавающий ??

Как мне до кучи собрать код чтоб он при запуске покупал 0.01 лот. а после срабатывания стопа переворачивался? 

Без изучения документации ничего не получится. Чудес не бывает. Работа сама по себе не сделается.
 
//+------------------------------------------------------------------+
//|                                     Для Гарэгин Диноян(mmgp).mq4 |
//|                              Copyright © 2013, MoneyInNetwork.ru |
//|                                         http://moneyinnetwork.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, MoneyInNetwork.ru"
#property link      "http://moneyinnetwork.ru"
extern string s1 "Объем для первой сделки серии, лот";
extern double Lot 0.01;
extern string s2 "Уровень стоп-лосса, пипсов";
extern double stoploss 100;
extern string s3 "Уровень тейк-профита, пипсов";
extern double takeprofit 500;
extern string s4 "Уникальная метка для ордеров, открываемых только этим советником";
extern double MagicNumber 600;
extern string s5 "Максимальное отклонение от запрошенной цены, пипсов";
extern double slip 15;
 
int init()
{
   return(
0);
}
 
int deinit()
{
   return(
0);
}
 
int start()

  
//инициализация параметров
  
int ticket 0;
  
int old_order_type OP_SELL;
 
  
//ищем среди всех открытых ордеров открытый советником ордер 
  
RefreshRates();
  for ( 
int trade OrdersTotal() - 1trade >= 0trade-- ) 
  {
      
//проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником.
      
if ( OrderSelect(tradeSELECT_BY_POSMODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
      {
          
//если есть незакрытый ордер - выходим
          
return (0);        
      }
  }
  
//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  
for ( trade OrdersHistoryTotal() - 1trade >= 0trade-- ) 
  {
     if ( 
OrderSelect(tradeSELECT_BY_POSMODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         
old_order_type OrderType();
         if ( 
OrderProfit()<//последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         
{
                break; 
//прекращаем поиск
         
}
     }
  }
  
//если раньше покупали, то теперь продаем
  
if ( old_order_type == OP_BUY )
  {
      
ticket OrderSend(Symbol(), OP_SELLLot,  NormalizeDouble(BidDigits), slipNormalizeDouble(Ask+stoploss*PointDigits), NormalizeDouble(Ask-takeprofit*PointDigits), "Martingale-Sell"MagicNumber0Red);
      
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      
return (0);  
  }
  
//если раньше продавали, то теперь покупаем
  
if ( old_order_type == OP_SELL )
  {
      
ticket OrderSend(Symbol(), OP_BUYLotNormalizeDouble(AskDigits), slipNormalizeDouble(Bid-stoploss*PointDigits), NormalizeDouble(Bid+takeprofit*PointDigits), "Martingale-Buy"MagicNumber0Green);
      
Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      
return (0);  
  }               
}  
Причина обращения: