Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 143

 
Лауреат:
как сделать функцию которая бы закрывала открытую позицию по её мейджику  . после того как пройдет заданное количество свечей в временной истории. 
int numBars = 5;
void OnTick()
{
     for(int i = OrdersTotal(); i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
          if( OrderSymbol() != _Symbol)                continue;
          if( OrderMagicNumber() != Magic)             continue;
          if( OrderOpenTime() > Time[numBars-1] )      continue; 
          
          /* work */
     }
}
 
sviter-pro:
ну я эксперементирую!!! логика специфическая!!! поможете?

Чего там специфичного?

Смотрите на последнюю позицию, и открываете противоположную ей.

 
Konstantin Nikitin:

хорошо попроверяю 

 
sviter-pro:

проверю ок 

 

Здравствуйте. Помогите пожалуйста с функцией. На одном счету подразумевается торговля несколькими советниками. Каждый советник может открыть не более чем одну сделку в день. Нужна функция, которая бы скажем возвращала true если сделка по советнику уже была и false если сделки не было. Проверка должна осуществляться по magic за текущую дату как я понимаю. Если поможете то планирую встроить эту функцию в каждый свой советник, где нужна такая проверка. Спасибо.

 
Kolya32:

Здравствуйте. Помогите пожалуйста с функцией. На одном счету подразумевается торговля несколькими советниками. Каждый советник может открыть не более чем одну сделку в день. Нужна функция, которая бы скажем возвращала true если сделка по советнику уже была и false если сделки не было. Проверка должна осуществляться по magic за текущую дату как я понимаю. Если поможете то планирую встроить эту функцию в каждый свой советник, где нужна такая проверка. Спасибо.

Все уже сделано до нас )) Тут смотрите.

 

Похоже мне нужна функция isTradeToDay(). Ну что же буду экспериментировать) Спасибо.

Подправил немного функцию под себя закоментировав int mn=-1 и далее по коду  заменив mn на Magic. Прогнав советник с этой функцией в тестере, обнаружил большой, для себя, недостаток: время тестирования советника увеличилось В НЕСКОЛЬКО РАЗ!!! Сейчас поставил тестить советники с этой функцией на демо счете. На счету 5 советников, переживаю, что сделки будут открываться с запаздыванием, главное чтобы с небольшим...

bool isTradeToDay(string sy="", int op=-1 /*,int mn=-1*/) {
  int i, 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 (Magic<0 || OrderMagicNumber()==Magic) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (Magic<0 || OrderMagicNumber()==Magic) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

 

Нужно на графике отметить уровень безубытка сетки.

Профит в пунктах: 

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point)

Положение безубытка для сетки BUY

zero = Bid-current_Prof_Pts*_Point

(Для SELL, соответственно: Ask+current_Prof_Pts*_Point)

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

Подскажите, где ошибка?

 
Kolya32:

Похоже мне нужна функция isTradeToDay(). Ну что же буду экспериментировать) Спасибо.

обнаружил большой, для себя, недостаток: время тестирования советника увеличилось В НЕСКОЛЬКО РАЗ!!! 

Да, конечно же. Функция ведь написана универсально. Если на каждом тике обращаться к ней, то получаем, что цикл проходит по всей истории счета. А история счета может быть достаточно глубокой (встречал случаи, когда ордеров было более 100 000). Чтобы ускорить выполнение, не нужно каждый раз запускать цикл по всей истории. Это достаточно сделать только один раз в самом начале и запомнить индекс последнего обработанного ордера. В следующий раз потребуется пройтись циклом только по ордерам, которые имеют индекс, больший, чем сохраненный индекс. После этого вновь запомнить индекс последнего ордера и т. д.

 
Igor Zakharov:

Нужно на графике отметить уровень безубытка сетки.

Профит в пунктах: 

Положение безубытка для сетки BUY

(Для SELL, соответственно: Ask+current_Prof_Pts*_Point)

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

Подскажите, где ошибка?

Виноват плавающий спред.

Причина обращения: