Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 13
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
У меня здесь возник такой нюанс: Я взял этот код (спасибо Alekseu Fedotov):
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
И теперь ставлю проверку:
И здесь вся загвоздка, т.к. изначально NumberOfBarCloseLastPos будет иметь значение "-1". А соответственно первый ордер никогда не откроется.
Что можно сделать в такой ситуации? Или я не правильно что-то понял?
У меня здесь возник такой нюанс: Я взял этот код (спасибо Alekseu Fedotov):
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
...
return(iBarShift(sy, tf, t, True));
}
В этой ситуации можно попробовать if(УСЛОВИЕ && NumberOfBarCloseLastPos()>-2), или подумать
У меня здесь возник такой нюанс: Я взял этот код (спасибо Alekseu Fedotov):
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
И теперь ставлю проверку:
И здесь вся загвоздка, т.к. изначально NumberOfBarCloseLastPos будет иметь значение "-1". А соответственно первый ордер никогда не откроется.
Что можно сделать в такой ситуации? Или я не правильно что-то понял?
Ну, я бы так делал:
int BarCloseLastPos(string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
datetime time=0;
int j=-1;
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()!=type) continue;
if(OrderCloseTime()>time) {
time=OrderCloseTime();
j=i;
}
}
}
if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) return(iBarShift(symbol_name,timeframe,time));
return(EMPTY);
}
//+------------------------------------------------------------------+
... и проверка:
// Последняя позиция Buy была закрыта не на текущем баре
}
Ну, я бы так делал:
int BarCloseLastPos(string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
datetime time=0;
int j=-1;
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()!=type) continue;
if(OrderCloseTime()>time) {
time=OrderCloseTime();
j=i;
}
}
}
if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) return(iBarShift(symbol_name,timeframe,time));
return(EMPTY);
}
//+------------------------------------------------------------------+
... и проверка:
// Последняя позиция Buy была закрыта не на текущем баре
}
Ну, а если она, подлая, закрылась на текущем баре?
Вот как раз это и нужно пропустить. Ему не нужно открывать позицию, если прошлая закрылась на этом баре - на нулевом.
А если нужно проверить условие что позиция закрылась на текущем баре, то и проверять нужно нулевой:
// Последняя позиция Buy была закрыта на текущем баре
}
У меня здесь возник такой нюанс: Я взял этот код (спасибо Alekseu Fedotov):
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
И теперь ставлю проверку:
И здесь вся загвоздка, т.к. изначально NumberOfBarCloseLastPos будет иметь значение "-1". А соответственно первый ордер никогда не откроется.
Что можно сделать в такой ситуации? Или я не правильно что-то понял?