• Добро пожаловать на инвестиционный форум!

    Во всем многообразии инвестиций трудно разобраться. MMGP станет вашим надежным помощником и путеводителем в мире инвестиций. Только самые последние тренды, передовые технологии и новые возможности. 400 тысяч пользователей уже выбрали нас. Самые актуальные новости, проверенные стратегии и способы заработка. Сюда люди приходят поделиться своим опытом, найти и обсудить новые перспективы. 16 миллионов сообщений, оставленных нашими пользователями, содержат их бесценный опыт и знания. Присоединяйтесь и вы!

    Впрочем, для начала надо зарегистрироваться!
  • 🐑 Моисей водил бесплатно. А мы платим, хотя тоже планируем работать 40 лет! Принимай участие в партнеской программе MMGP
  • 📝 Знаешь буквы и умеешь их компоновать? Платим. Дорого. Бессрочная акция от MMGP: "ОПЛАТА ЗА СООБЩЕНИЯ"

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

Гарэгин Диноян

Интересующийся
Регистрация
15.11.2013
Сообщения
15
Реакции
0
Поинты
0.000
Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.
 

bvn

Новичок
Регистрация
17.06.2008
Сообщения
7,351
Реакции
2,723
Поинты
0.000
Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.

Код писать не буду, но могу попытаться прояснить логику.

Советник по-идее должен отслеживать текущую сделку (хранить ее тикет в переменной) SELECT_BY_TICKET и как только у нее появится время заркрытия проверить, OrderProfit() < 0 или нет.
 

EvgeTrofi

Интересующийся
Регистрация
23.12.2011
Сообщения
30
Реакции
8
Поинты
0.000
Можно поставить отложенный ордер BUY_LIMIT или SELL_LIMIT по цене StopLoss и советник не нужен
 
  • Like
Реакции: bvn

bvn

Новичок
Регистрация
17.06.2008
Сообщения
7,351
Реакции
2,723
Поинты
0.000
Можно поставить отложенный ордер BUY_LIMIT или SELL_LIMIT по цене StopLoss и советник не нужен
Тоже вариант, но в исходном варианте речь идет уже о роботе, который, вероятно, и открывает указанную сделку. Однако, лимит-ордер может этот же робот и выставлять.
 
Регистрация
10.04.2011
Сообщения
2,217
Реакции
1,182
Поинты
0.000
Собственно тема.. Хочу что б после стоп лосса мой робот открывал противоположную позицию... Помогите с кодом.
Здравствуйте.
Мне на блоге задавали вопрос, который включает и Ваш. Вот код. Выцепите из него блок работы с историей закрытых ордеров:
PHP:
//+------------------------------------------------------------------+
//|                                         Martingale - classic.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 = 21;
extern string s3 = "Уровень тейк-профита, пунктов";
extern double takeprofit = 84;
extern string s4 = "Уникальная метка для ордеров, открываемых только этим советником";
extern double MagicNumber = 600;
extern string s5 = "Максимальное отклонение от запрошенной цены, пунктов";
extern double slip = 3;
 
int init()
{
   return(0);
}
 
int deinit()
{
   return(0);
}
 
int start()
{ 
  //инициализация параметров
  bool flag = false;
  int ticket = 0;
  double lots = Lot;
  int old_order_type = -1;
 
  //ищем среди всех открытых ордеров открытый советником ордер 
  RefreshRates();
  for ( int trade = OrdersTotal() - 1; trade >= 0; trade-- ) 
  {
      //проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником.
      //ВНИМАНИЕ! MagicNumber - должен быть свой для каждого советника!
      if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
      {
            flag = true; //значение флага наличия ордера - ордер открыт
            break; //закончим поиск
      }        
  }
  //ордер советником открыт - выходим без действий, ожидая его закрытия по тейк профиту или стоп лоссу.
  if ( flag )
  {
      return (0);
  }
  //нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  flag = false;
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         if ( OrderProfit()>=0 ) lots = Lot;   //последний закрытый советником ордер был прибыльным или безубыточным, значит, следующий ордер открываем с начальным объемом
                    else lots = 2*OrderLots(); //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем удвоенным объемом
                old_order_type = OrderType(); //запоминаем тип ордера - прокупка или продажа.
                flag = true;
                break; //прекращаем поиск
     }
  }
  if ( !flag ) 
      old_order_type = OP_BUY; //в истории нет ордеров открытых этим советников, значит, стартуем с покупок
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, NormalizeDouble(lots,2),  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (1000); //задержка в одну секунду для обрабатки запроса торговым сервером брокера
      return (0);  
  }
  //если раньше продавали, то теперь покупаем
  if ( old_order_type == OP_SELL )
  {
      ticket = OrderSend(Symbol(), OP_BUY, NormalizeDouble(lots,2), NormalizeDouble(Ask, Digits), slip, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits), "Martingale-Buy", MagicNumber, 0, Green);
      Sleep (1000); //задержка в одну секунду для обрабатки запроса торговым сервером брокера
      return (0);  
  }               
  return (0);
Думаю, это то, что Вы искали :) (в смысле мартингейл)

Если захотите встроенный РМ, а не постоянный объем, то объявите дополнительную переменную
PHP:
extern int Risk=1; //риск на сделку, %
в самом начале функции start() напишите:
PHP:
Lot = NormalizeDouble (Risk*AccountEquity()/100000, 2); //расчет по средствам 
if ( Lot<0.01 ) Lot = 0.01;
 
Последнее редактирование:

Гарэгин Диноян

Интересующийся
Регистрация
15.11.2013
Сообщения
15
Реакции
0
Поинты
0.000
Мой робот при запуске покупал 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
Как это сделать что б работало хотя бы на стандартных счетах??
 
Регистрация
10.04.2011
Сообщения
2,217
Реакции
1,182
Поинты
0.000
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
Данная запись некорректна. Представьте, что на счете работают сразу несколько советников или дополнительно "приторговываете ручками".
Поэтому последний ордер в массиве закрытых ордеров надо искать именно тот, который был открыт данным советником, т.е. условие поиска должно иметь вид:
PHP:
flag = false;
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         if ( OrderProfit()>=0 ) lots = Lot;   //последний закрытый советником ордер был прибыльным или безубыточным, значит, следующий ордер открываем с начальным объемом
                    else lots = 2*OrderLots(); //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем удвоенным объемом
                old_order_type = OrderType(); //запоминаем тип ордера - прокупка или продажа.
                flag = true;
                break; //прекращаем поиск
     }
  }
То есть мы ищем именно тот последний ордер, который был открыт, а впоследствии закрыт (OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) именно данным советником (OrderMagicNumber() == MagicNumber), именно по данному инструменту (OrderSymbol() == Symbol())
OrderSend(Symbol(), OP_BUY, lots, Ask, 100, Ask-stoploss*Point, Ask+takeprofit*Point);
Данный код также неправильный. Уровни стоп лосс и тейк профит в Вашем случае при расчетах необходимо округлять на количество цифр после десятичной точки в цене текущего инструмента. Следующая ошибка: ордера открываются на покупку по цене Ask, а на продажу по цене Bid. Соответственно, уровень стоп лосс и тейк профит для первого случая рассчитываются от цены Bid, а для второго от цены Ask:
Т.е. эта строка в идеале должна иметь вид:
для покупок
OrderSend(Symbol(), OP_BUY, lots, Ask, 100, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits));
для продаж
OrderSend(Symbol(), OP_SELL, lots, Bid, 100, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits));
Ну, и проскальзывание в 100 пипсов - это, по-моему, чрезмерно (да еще при таких параметрах stoploss=100 takeprofit=500). Вы на новостях что ли торговать собрались с таким проскальзыванием (допустимое отклонение от запрошенной цены)? :)
 
Последнее редактирование:

Гарэгин Диноян

Интересующийся
Регистрация
15.11.2013
Сообщения
15
Реакции
0
Поинты
0.000
Довайте пока без magic... А то у меня и так мозг взрывается от натуги. С проскальзыванием тоже потом разберусь.. Как мне до кучи собрать код чтоб он при запуске покупал 0.01 лот. а после срабатывания стопа переворачивался?
 
Регистрация
10.04.2011
Сообщения
2,217
Реакции
1,182
Поинты
0.000
Вот Вам сова. Но вообще, нужно и самому хоть как-то изучать программирование, если, действительно, хотите вникнуть.
PHP:
//+------------------------------------------------------------------+
//|                                     Для Гарэгин Диноян(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() - 1; trade >= 0; trade-- ) 
  {
      //проверяем есть ли среди всех открытых ордеров именно тот ордер, который открыт данным советником.
      if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
      {
          //если есть незакрытый ордер - выходим
          return (0);        
      }
  }
  //нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }
  //если раньше продавали, то теперь покупаем
  if ( old_order_type == OP_SELL )
  {
      ticket = OrderSend(Symbol(), OP_BUY, Lot, NormalizeDouble(Ask, Digits), slip, NormalizeDouble(Bid-stoploss*Point, Digits), NormalizeDouble(Bid+takeprofit*Point, Digits), "Martingale-Buy", MagicNumber, 0, Green);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }               
}
Алгоритм ее работы:
1. Стартует с покупок
2. Если ловит стоп, то продает.
3. После профита оставляет позицию неизменной. Теоретически, сова может зарабатывать, дожидаясь, сливая, попутного тренда.
Советник будет, скорее всего, сливатором, за счет того, что кроме параметров профита и лоса зависим от точки старта. Пробуйте оптимизировать на истории, а потом запустите с оптимальными параметрами, сдвинув, например, дату старта на неделю-две, месяц, год внутрь самой истории. Увидите совсем другой результат (сливной). То есть проблема этой совы очевидна.
 
Последнее редактирование:

capitalistas

ТОП-МАСТЕР
Регистрация
04.05.2010
Сообщения
5,673
Реакции
1,514
Поинты
0.000
На каждом тике проверяем, если открытых позиций нет и последняя сделка в истории была закрыта по стоп-лоссу, то открываем что надо
 
Регистрация
10.04.2011
Сообщения
2,217
Реакции
1,182
Поинты
0.000

sergey19898

Новичок
Регистрация
24.02.2014
Сообщения
1
Реакции
0
Поинты
0.000
Добрый вечер, подскажите пожалуйста, как проделать примерно тоже самое, но с добавлением индикатора, а то не могу разобрать, вставляю индикатор и тогда советник работает не так как хотел...и есть еще одна проблема в выложенном здесь советнике, он с каждым стоплоссом увеличивает лот, и потом его не понижает, а только удваивает, пока полностью не сольет средства, заранее спасибо!

добавлено через 5 минут
Вот наброски ))):

extern double Lots = 0.1;
extern int Magic = 345;
extern int Slippage = 5;
extern int StopLoss = 40;
extern int TakeProfit = 20;

extern int MaPeriod = 20; // Переменные Период усреднения для вычисления индикатора
extern int MaShift = 1; // Переменные Сдвиг индикатора относительно ценового графика.
bool flag = false;
int old_order_type = -1;

double maprice, SL, TP;
int tameprev;

int init()
{
if(Digits == 3 || Digits == 5)
{
StopLoss *= 10;
Slippage *= 10;
TakeProfit *= 10;
}
return(0);
}

int deinit()
{

return(0);
}

int start()
{




if(tameprev == Time[0]) return(0);
tameprev = Time[0];



maprice = iMA(Symbol(), 0, MaPeriod, MaShift, MODE_SMMA, PRICE_CLOSE, 1);

SL = NormalizeDouble(Bid - StopLoss*Point, Digits);
TP = NormalizeDouble(Bid + TakeProfit*Point, Digits);
if(CountBuy() + CountSell() == 0 && Ask > maprice)
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, "Покупка", Magic, 0, Red);

SL = NormalizeDouble(Ask + StopLoss*Point, Digits);
TP = NormalizeDouble(Ask - TakeProfit*Point, Digits);
if(CountBuy() + CountSell() == 0 && Bid < maprice)
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, "Продажа", Magic, 0, Blue);




return (0);

}



//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
count++;
}
}

return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}

return(count);
}
 
Последнее редактирование:

luxor

Интересующийся
Регистрация
23.01.2011
Сообщения
19
Реакции
2
Поинты
0.000
Добрый вечер, подскажите пожалуйста, как проделать примерно тоже самое, но с добавлением индикатора, а то не могу разобрать, вставляю индикатор и тогда советник работает не так как хотел...и есть еще одна проблема в выложенном здесь советнике, он с каждым стоплоссом увеличивает лот, и потом его не понижает, а только удваивает, пока полностью не сольет средства, заранее спасибо!

добавлено через 5 минут
Вот наброски ))):

extern double Lots = 0.1;
extern int Magic = 345;
extern int Slippage = 5;
extern int StopLoss = 40;
extern int TakeProfit = 20;

extern int MaPeriod = 20; // Переменные Период усреднения для вычисления индикатора
extern int MaShift = 1; // Переменные Сдвиг индикатора относительно ценового графика.
bool flag = false;
int old_order_type = -1;

double maprice, SL, TP;
int tameprev;

int init()
{
if(Digits == 3 || Digits == 5)
{
StopLoss *= 10;
Slippage *= 10;
TakeProfit *= 10;
}
return(0);
}

int deinit()
{

return(0);
}

int start()
{




if(tameprev == Time[0]) return(0);
tameprev = Time[0];



maprice = iMA(Symbol(), 0, MaPeriod, MaShift, MODE_SMMA, PRICE_CLOSE, 1);

SL = NormalizeDouble(Bid - StopLoss*Point, Digits);
TP = NormalizeDouble(Bid + TakeProfit*Point, Digits);
if(CountBuy() + CountSell() == 0 && Ask > maprice)
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, "Покупка", Magic, 0, Red);

SL = NormalizeDouble(Ask + StopLoss*Point, Digits);
TP = NormalizeDouble(Ask - TakeProfit*Point, Digits);
if(CountBuy() + CountSell() == 0 && Bid < maprice)
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, "Продажа", Magic, 0, Blue);




return (0);

}



//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
count++;
}
}

return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}

return(count);
}

Здесь нет удвоения
 

Alyona_AG

Интересующийся
Регистрация
08.04.2010
Сообщения
99
Реакции
6
Поинты
0.000
Можно воспользоваться AutoGraf 4.

В нём уже реализован инструмент Торговый разворот - автоматически открывает противоположный ордер при закрытии ордера по стоп-лосс (или тейк-профит).
Также есть инструмент Торговый разворот по цене - автоматически закрывает ордер и открывает противоположный, если рынок достигает заданной цены.

Инструменты очень удобны в работе. На сайте есть подробное описание с картинками и видео.



Например, на рисунке показан инструмент "Торговый разворот по тейк-профит", установленный на ордер Sell.
Параметры инструмента:

Лоты = 1.3
SL = 10 (стоп-лосс)
TP = 5 (тейк-профит)

Если ордер Sell закроется по тейк-профит - автоматически откроется противоположный ордер Buy на 1.3 лота со стоп-лосс (на расстоянии 10 пунктов от цены Bid) и тейк-профит (на расстоянии 5 пунктов от цены Bid).
Параметры SL и TP можно установить равными нулю, тогда противоположный ордер откроется без стопов.
 

Вложения

  • About_turn_sl_tp.png
    About_turn_sl_tp.png
    3.9 KB · Просмотры: 226

coder777

Интересующийся
Регистрация
28.11.2015
Сообщения
4
Реакции
0
Поинты
0.000
Хорошая штука AutoGraf 4.
 
Сверху Снизу