Скачать MetaTrader 5

Вопрос к специалистам по MQL:Как подать сигнал на открытие позиции,после срабатывания take profit по одному из предыдущих ордеров?Количество ордеров неограничено.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
eStadio
164
eStadio 2007.03.05 16:05 
Вопрос к специалистам по MQL:Как подать сигнал на открытие позиции, после срабатывания take profit по одному из предыдущих ордеров?Количество ордеров неограничено.
Igor Kim
2740
Igor Kim 2007.03.05 16:18  
estadio писал (а):
Вопрос к специалистам по MQL:Как подать сигнал на открытие позиции, после срабатывания take profit по одному из предыдущих ордеров?Количество ордеров неограничено.
Вы можете воспользоваться моей функцией:
//+----------------------------------------------------------------------------+
//|  Возвращает флаг закрытия последней позиции по тейку.                      |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sym="", int op=-1, int mn=-1) {
  datetime oct;
  double   ocp, otp;
  int      dg, i, j=-1, k=HistoryTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oct<OrderCloseTime()) {
                oct=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sym, MODE_DIGITS);
    if (dg==0) if (StringFind(sym, "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
Пример использования:
if (isCloseLastPosByTake()) {
  // подать сигнал на открытие позиции
}
eStadio
164
eStadio 2007.03.06 06:05  
KimIV:
estadio писал (а):
Вопрос к специалистам по MQL:Как подать сигнал на открытие позиции, после срабатывания take profit по одному из предыдущих ордеров?Количество ордеров неограничено.
Вы можете воспользоваться моей функцией:
//+----------------------------------------------------------------------------+
//|  Возвращает флаг закрытия последней позиции по тейку.                      |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sym="", int op=-1, int mn=-1) {
  datetime oct;
  double   ocp, otp;
  int      dg, i, j=-1, k=HistoryTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oct<OrderCloseTime()) {
                oct=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sym, MODE_DIGITS);
    if (dg==0) if (StringFind(sym, "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
Пример использования:
if (isCloseLastPosByTake()) {
  // подать сигнал на открытие позиции
}

Спасибо,KimIv!!! А если по тейку закроется не последняя открытая позиция,а одна из последних?Функция даст сигнал?
Igor Kim
2740
Igor Kim 2007.03.06 06:54  
estadio писал (а):
А если по тейку закроется не последняя открытая позиция,а одна из последних?Функция даст сигнал?
Функция не определяет очерёдность открытия позиций. Она определяет очерёдность закрытия позиций. Находит последнюю закрытую и проверяет по тейку она закрылась или нет. Если по тейку, то возвращает True.
eStadio
164
eStadio 2007.03.06 17:14  
KimIV:
estadio писал (а):
А если по тейку закроется не последняя открытая позиция,а одна из последних?Функция даст сигнал?
Функция не определяет очерёдность открытия позиций. Она определяет очерёдность закрытия позиций. Находит последнюю закрытую и проверяет по тейку она закрылась или нет. Если по тейку, то возвращает True.
Отлично!Еще раз спасибо!Сейчас буду рызбираться.
P.S. вы не будете против если еще буду обращатся к вам,т.к. только недавно начал изучать MQL и не все еще понятно?


***********************
Включил условие(функцию) в код эксперта. Сигнал к открытию дает. Однако открывает не две позиции,как требуется,а сразу несколько, пока не кончатся средства. В чем может быть проблема? С другим условием открывал только две.
if (isCloseLastPosByTake()) {
  // подать сигнал на открытие позиции
 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Points,0,0,Blue);
 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Points,0,0,Red); 
  /*открытие  позиций в обе стороны*/
if(GetLastError()==0)Print("Orders opened : ",OrderOpenPrice());
/*проверка на код возврата об ошибке последней операции (функция GetLastError()), если код 0, то печатаем в лог цену открытия позиции */
return(0);
}
return(0);
}
Igor Kim
2740
Igor Kim 2007.03.06 19:51  
estadio писал (а):
Однако открывает не две позиции,как требуется,а сразу несколько, пока не кончатся средства. В чем может быть проблема?
Нужно добавить что-нибудь, контролирующее количество открытых позиций.
А что за условие у Вас раньше было?
Сергей Ковалев
2607
Сергей Ковалев 2007.03.06 21:00  
estadio писал (а):
Вопрос к специалистам по MQL:Как подать сигнал на открытие позиции, после срабатывания take profit по одному из предыдущих ордеров?Количество ордеров неограничено.

Технически это сделать несложно. Но делать так - не правильно.
История игрового счёта не должна приниматься во внимание при формировании критериев для совершения торговых операций (равно, как и накопленная прибыль или убыток по открытому ордеру при решении о его закрытии).
Мы уже немного говорили раньше на эту тему: 'Торговая стратегия необходимого биржевого арбитража'

Общая идея такая: ордер должен быть открыть тогда, когда сработал критерий открытия. Для того, чтобы не наоткрывать лишних ордеров, в программе должен быть налажен учёт ордеров. В идеале в терминале должен быть либо один рыночный ордер либо ни одного. Об учёте ордеров можно почитать здесь: Учёт ордеров в большой программе.
eStadio
164
eStadio 2007.03.07 15:56  
to KimIV и SK
Там было условие срабатывать при прохождении опред. уровня, но я отказался от него. А сейчас смысл такой:
1. Открывается два противоположных ордера с take profit 50.
2.Когда один из них срабатывает открываются еще два противоположных ордера( take опять 50).Незакрытый ордер из пункта остается открытым.
3.И опять, как только один из тейков срабатывает, два противополож ордера.

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

Вопрос: как же ограничиться каждый раз только двумя ордерами?

Принимается любая критика по поводу самой стратегии,может я что не учел.


Сергей Ковалев
2607
Сергей Ковалев 2007.03.07 16:25  
estadio писал (а):
to KimIV и SK
Вопрос: как же ограничиться каждый раз только двумя ордерами?


Очень просто: проанализировать количество рыночных ордеров.
Если он уже есть, то больше такого не открывать.
eStadio
164
eStadio 2007.03.08 00:05  
SK. писал (а):
estadio писал (а):
to KimIV и SK
Вопрос: как же ограничиться каждый раз только двумя ордерами?


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

Ochen' prosto dl'a vas, no poka ne dl'a men'a. Razbirayus' s yazykom tol'ko nedel'u i ne vse eshe ponyatno. Esle ne trudno, pokazhite kak eto realizuetsya v kode.Zaranee spasibo. ..

Izvinyayus' za translit! Pishu s nerusificirovannogo notebook'a...
eStadio
164
eStadio 2007.03.11 10:39  
SK. писал (а):
estadio писал (а):
to KimIV и SK
Вопрос: как же ограничиться каждый раз только двумя ордерами?


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

Ay!!! Otvette pozhaluista!
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий