Как реализовать ограничение количества открываемых ордеров? - страница 2

 
Добрый вечер всем, вернулся из отъезда и решил снова сесть за учебник :-) Возник вопрос, ответа пока не нашел на него, можно ли использовать в качестве условия уровни TP и SL? Например, если ордер закрылся удачно для нас, т.е. по TP, то перезапускаем цикл. Если ордер закрылся не в нашу пользу, т.е. SL, к примеру открываем ордер на других условиях, например другой финансовый инструмент, другие уровни SL, TP, другой объем лота или задержка в открытии ордера ну и т.п. Если у кого то есть под рукой пример, буду признателен, еще больше буду признателен если дадут объяснение для чайника или "ткнут носом" в книжку )))) Сейчас штудирую С. Ковалёва, может кто-нибудь еще что то посоветует? Все что удалось пока накопать, это скудное описание функций OrderStopLoss и OrderTakeProfit... Но я пока лишь пытаюсь осмыслить их описание, речи о том как можно использовать эти функции даже не идет :-D
 
Здесь функции

isCloseLastPosByStop()

isCloseLastPosByTake()

 
Slim_ekb:
Добрый вечер всем, вернулся из отъезда и решил снова сесть за учебник :-) Возник вопрос, ответа пока не нашел на него, можно ли использовать в качестве условия уровни TP и SL? Например, если ордер закрылся удачно для нас, т.е. по TP, то перезапускаем цикл. Если ордер закрылся не в нашу пользу, т.е. SL, к примеру открываем ордер на других условиях, например другой финансовый инструмент, другие уровни SL, TP, другой объем лота или задержка в открытии ордера ну и т.п. Если у кого то есть под рукой пример, буду признателен, еще больше буду признателен если дадут объяснение для чайника или "ткнут носом" в книжку )))) Сейчас штудирую С. Ковалёва, может кто-нибудь еще что то посоветует? Все что удалось пока накопать, это скудное описание функций OrderStopLoss и OrderTakeProfit... Но я пока лишь пытаюсь осмыслить их описание, речи о том как можно использовать эти функции даже не идет :-D


Как-то так

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if(isCloseLastPosByStop())             //закрытие последней позиции по стопу
      {
      // что-то делаем
      } 
   if(isCloseLastPosByTake())           //закрытие последней позиции по тейку.
      {
      //что-то делаем
      }
//----
   return(0);
  }
//+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
//
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
На скорую руку
 
khorosh:
Здесь функции


r772ra:


Как-то так

На скорую руку

Спасибо огромное, за оперативность, буду штудировать и грызть гранит далее
 

а так разве не работает

 if ( OrdersTotal() > maxord )  {

  бла-бла-бла

   } 
 
zoritch:

а так разве не работает


Не знаю, в учебнике вообще ничего не нашел по этой теме. У меня пока и с isCloseLastPosByStop(), isCloseLastPosByTake() не хочет работать :-( А на счет вашего варианта, если не сложно, по подробнее расскажите, как тут будет фигурировать условие закрытия ордеров по SL и TP и дальнейшая логика торговли?



 
khorosh:
Здесь функции

isCloseLastPosByStop()

isCloseLastPosByTake()


r772ra:


Как-то так

На скорую руку


Блин чего то не могу разобраться :-( Работает как угодно, но только не так как надо мне... Застопорилось все на двух вариантах:
1) Ордера начинают открываться подряд (я в качестве маркера использовал разные урони SL), так открывает сразу все ордера, не смортя на то, что использую ограничение ордеров с помощью BuyMaxTrades и SellMaxTrades по подсказке TEXX (на первой странице, за что ему еще раз спасибо);

2) Второй вариант, я после каждого условия попробовал вставить строку которая отвечает за проверку количества открытых лотов... Сначала все было нормально, но когда сработал SL, опять наоткрывалось 6, или около того, ордеров причем со всеми условиями...

Я понимаю, что видя код перед глазами было бы проще, но пока хочется разобраться самому, пусть и с подсказками ((( Кому не жалко времени, подтолкните в каком направлении копать?

 

Всем доброго времени суток! Хочу всех поздравить с прошедшими праздниками и пожелать, чтоб все невзгоды и проблемы остались в старом году, а в новом вам сопутствовали удача, успех, позитив и отличное настроение.

Я кучу времени убил, но так и не смог решить свою задачу, поэтому вновь обращаюсь к знающим людям, подскажите советом и помогите найти ошибки в моей "работе" (хотя бы самые грубые)

Суть моей задачи вроде проста, но решению никак не поддается:

Хотел написать эксперта с следующими характеристиками:

- Установка уровней SL и TP;
- Возможность задавать количество одновременно открытых ордеров;
- Различные варианты последующих операций в зависимости от того сработал SL или TP (в моем случае, если TP - от открывается новый ордер, если SL - то делается пауза в торговле и затем снова открывается ордер). Ну и естественно если делается пауза, то ордеров в этот момент никаких открываться не должно.

И если первые два пункта, мне, вроде как, удалось реализовать, с горем по полам, то вот с третьим я зашел в тупик.

По этой причине прошу взглянуть и подсказать где ошибка, советы по оптимизации и улучшению с радостью будут восприняты.

Заранее спасибо всем откликнувшимся :-)

//--- input parameters
extern int       dist_SL=15;
extern int       dist_TP=15;
extern double    Lot=0.1;
extern int       sleep=2;
extern int     MagicNumber=9999;
extern int       mn=9999;
extern int     SellMaxTrades= 1;    // Максимальное количество открытых ордеров Sell

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int CountSell()                                    // Ищем кол-во ордеров Sell
{
int count_sell=0;
for (int i = OrdersTotal()-1; i >=0; i--)  
    {                                                 
     OrderSelect(i,SELECT_BY_POS, MODE_TRADES);      
     if (OrderSymbol()!=Symbol()) continue;  
     if (OrderSymbol()==Symbol() && OrderType()==OP_SELL)
     if (OrderMagicNumber()==mn) count_sell++;
    }
 return(count_sell);
}
//+-------------------------------------------------------------------+

//-----------------------------------------------SL-------------------------------

//|  Параметры:                                                               
//|    sy - наименование инструмента   ( Наименование рыночного инструмента. Если задать этот параметр,
//|                                      то функция учтёт позиции только заданного инструмента.
//|                                      Значение по умолчанию - "" означает любой рыночный инструмент.
//|                                      NULL означает текущий инструмент
//|    op - операция                   (OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию)                  |
//|    mn - MagicNumber                (-1   - любой магик)                   
//+----------------------------------------------------------------------------+
 
  bool isCloseLastPosByStop(string sy="", int op=OP_SELL, int mn=9999) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(True);
}
//----------------------------------------TP---------------------------------

//|  Параметры:                                                               
//|    sy - наименование инструмента   ( Наименование рыночного инструмента. Если задать этот параметр,
//|                                      то функция учтёт позиции только заданного инструмента.
//|                                      Значение по умолчанию - "" означает любой рыночный инструмент.
//|                                      NULL означает текущий инструмент
//|    op - операция                   (OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию)                  |
//|    mn - MagicNumber                (-1   - любой магик)                   
//+----------------------------------------------------------------------------+

bool isCloseLastPosByTake(string sy="", int op=OP_BUY, int mn=9999) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(True);
}


int start ()                                    
  {
  string Symb2=Symbol();                               // Финанс. инструмент
  double bid=MarketInfo(Symbol(),MODE_BID);            // Запрос значения Bid
  double ask=MarketInfo(Symbol(),MODE_ASK);            // Запрос значения Ask
  double point=MarketInfo(Symbol(),MODE_POINT);        //Запрос Point
  double MinLos=Bid+dist_SL*Point;                
  double MaxPrf=Bid-dist_TP*Point;
               

   if (CountSell() < SellMaxTrades)                     // проверяем действительно ли кол-во открытых sell меньше максимального
  // Открытие SELL
      int ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,MinLos,MaxPrf,"",mn,0,CLR_NONE);
         if (isCloseLastPosByStop())             //закрытие последней позиции по стопу
            {
            Sleep (5000);
            ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,MinLos,MaxPrf+5,"",mn,0,CLR_NONE);
            }
            if (CountSell() < SellMaxTrades)                     // проверяем действительно ли кол-во открытых sell меньше максимального
            if (isCloseLastPosByTake())           //закрытие последней позиции по тейку.
            {
            ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,MinLos,MaxPrf,"",mn,0,CLR_NONE);
            }
            if (CountSell() < SellMaxTrades)                     // проверяем действительно ли кол-во открытых sell меньше максимального
               if (isCloseLastPosByStop())             //закрытие последней позиции по стопу
               {
               Sleep (5000);
               ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,MinLos,MaxPrf+10,"",mn,0,CLR_NONE);
               }
               if (CountSell() < SellMaxTrades)                     // проверяем действительно ли кол-во открытых sell меньше максимального
               if (isCloseLastPosByTake())           //закрытие последней позиции по тейку.
               {
               ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,3,MinLos,MaxPrf,"",mn,0,CLR_NONE);
               }
               if (CountSell() < SellMaxTrades)                     // проверяем действительно ли кол-во открытых sell меньше максимального

     
 
   Alert (GetLastError());                      // Сообщение об ошибке
  
 
 
 
  return;                                      // Выход из start()
  }
 
Slim_ekb:

Всем доброго времени суток! Хочу всех поздравить с прошедшими праздниками и пожелать, чтоб все невзгоды и проблемы остались в старом году, а в новом вам сопутствовали удача, успех, позитив и отличное настроение.

Я кучу времени убил, но так и не смог решить свою задачу, поэтому вновь обращаюсь к знающим людям, подскажите советом и помогите найти ошибки в моей "работе" (хотя бы самые грубые)

Суть моей задачи вроде проста, но решению никак не поддается:

Хотел написать эксперта с следующими характеристиками:

- Установка уровней SL и TP;
- Возможность задавать количество одновременно открытых ордеров;
- Различные варианты последующих операций в зависимости от того сработал SL или TP (в моем случае, если TP - от открывается новый ордер, если SL - то делается пауза в торговле и затем снова открывается ордер). Ну и естественно если делается пауза, то ордеров в этот момент никаких открываться не должно.

И если первые два пункта, мне, вроде как, удалось реализовать, с горем по полам, то вот с третьим я зашел в тупик.

По этой причине прошу взглянуть и подсказать где ошибка, советы по оптимизации и улучшению с радостью будут восприняты.

Заранее спасибо всем откликнувшимся :-)


Если вы хотите, чтобы у вас не открывалось сразу много много ордеров, то вы должны вводить какое то ограничение на их открытие, а не только ограничивать максимально допустимым количеством открытых ордеров.

Могут быть варианты:

1)наличие или отсутствие какого-то сигнала.

2) создание условий, чтобы на одном баре открывался один ордер.

3)вводом условия, что последний ордер был открыт ранее N баров назад.

4)вводом условия, что на дистанции Dist от рыночной цены отсутствуют ордера .

5)вводом условия, что рыночная цена выше цены открытия последнего ордера селл на величину Dist.

ну и масса других вариантов, в зависимости от того, что вам нужно.

 
khorosh:

Если вы хотите, чтобы у вас не открывалось сразу много много ордеров, то вы должны вводить какое то ограничение на их открытие, а не только ограничивать максимально допустимым количеством открытых ордеров.

Могут быть варианты:

1)наличие или отсутствие какого-то сигнала.

2) создание условий, чтобы на одном баре открывался один ордер.

3)вводом условия, что последний ордер был открыт ранее N баров назад.

4)вводом условия, что на дистанции Dist от рыночной цены отсутствуют ордера .

5)вводом условия, что рыночная цена выше цены открытия последнего ордера селл на величину Dist.

ну и масса других вариантов, в зависимости от того, что вам нужно.




Так в том то и дело, что нужно, чтоб в один момент времени отрыт был 1 ордер, а после срабатывания TP или SL, открывался снова только один. Из вашего совет пожалуй только условие с дистанцией от рыночной цены подойдет, но вот как это реализовать пока не сообразил, уж слижком блок базовых знаний у меня пока слаб :-( А вообще я полагал, что существуют методы просто ограничения количества открываемых ордеров, видимо как то не так понял, когда читал... Если будет время, не могли бы Вы мне помочь разобраться? А то просить кого то сделать, значит сам не разберусь, а хочется именно самому сделать :-[
Причина обращения: