Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 810

 
remjte:
Господа хорошие! Подскажите код который остановит тестирование советника при не достаточной маржи для открытия позиции.
Спасибо!
Если AccountFreeMarginCheck() меньше определённого значения (например, меньше 50% от AccountFreeMargin) - выход из торговой функции, тест быстро заканчивается, так как пустые циклы почти не грузят.
[Удален]  
evillive:
Если AccountFreeMarginCheck() меньше определённого значения (например, меньше 50% от AccountFreeMargin) - выход из торговой функции, тест быстро заканчивается, так как пустые циклы почти не грузят.

Честно, еще очень зеленый, нашел вот такой кусок кода не подскажете как поправить

   if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= 0.0) return (-1);
   if (GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2);
   return (l_lots_4);

[Eliminado]  
напишу попроще: как прописать такое условие - Пока не появилась новая свеча открытый ордер не модифицировать
 
zhezheria:
напишу попроще: как прописать такое условие - Пока не появилась новая свеча открытый ордер не модифицировать
Работать по открытию нового бара соответствующего таймфрейма. Примеров кода тьма
 
remjte:

Честно, еще очень зеленый, нашел вот такой кусок кода не подскажете как поправить

   if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= 0.0) return (-1);
   if (GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2);
   return (l_lots_4);

Зачем править, и так сойдёт. Разве что имена переменных свои подставить.

Но если нужно риск поменьше, то if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= AccountFreeMargin()*0.5) return (-1); - в  этом случае, если после открытия позиции с указанным лотом останется 50% свободных средств или меньше, то return (-1)

[Eliminado]  
Подскажите, пожалуйста. Нужно написать часть кода, где будет выбираться второй ордер в списке и затем удаляться (отложенный). Возвращает 4051 при OrderSelect(1, SELECT_BY_POS, MODE_TRADES)
[Удален]  
remjte:
Господа хорошие! Подскажите код который остановит тестирование советника при не достаточной маржи для открытия позиции.
Спасибо!
      // проверяем доступность свободных средств
      if(AccountFreeMarginCheck(Symbol(),OP_BUY,OpenLot)<=0 || GetLastError()==134)
            {
               Print("It is impossible to open the order Buy, not enough money.");
               return(0);
            }
      // проверяем доступность свободных средств
      if(AccountFreeMarginCheck(Symbol(),OP_SELL,OpenLot)<=0 || GetLastError()==134)
            {
               Print("It is impossible to open the order Sell, not enough money.");
               return(0);
            }
doube OpenLot; // Лот который вы хотите открыть.
Вставляете это перед открытием рыночного ордера.
 
Pomid:
Подскажите, пожалуйста. Нужно написать часть кода, где будет выбираться второй ордер в списке и затем удаляться (отложенный). Возвращает 4051 при OrderSelect(1, SELECT_BY_POS, MODE_TRADES)
Счет ордеров начинается с 0. Попробуй, OrderSelect(0, SELECT_BY_POS, MODE_TRADES)
[Eliminado]  

Здесь нужно выставить отложенные ордера и рассчитать их цены относительно цены закрытия предыдущего бара. BUYSTOP ставит, а SELLSTOP возвращает ошибку 130. В этом коде есть ошибка? Или в другой функции искать.

void SetOrders() {

  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double PredBar=iClose(NULL,PERIOD_M5,1);
  double pAsk=PredBar+(DistanceSet+spr)*Point;
  double pBid=PredBar-(DistanceSet+spr)*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}
 
Pomid:

Здесь нужно выставить отложенные ордера и рассчитать их цены относительно цены закрытия предыдущего бара. BUYSTOP ставит, а SELLSTOP возвращает ошибку 130. В этом коде есть ошибка? Или в другой функции искать.

void SetOrders() {

  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double PredBar=iClose(NULL,PERIOD_M5,1);
  double pAsk=PredBar+(DistanceSet+spr)*Point;
  double pBid=PredBar-(DistanceSet+spr)*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

 А почему бы к Автору не обратиться?! Он ещё живой и молодой, не старый! Координаты в коде над каждой функцией! Все его знают и уважают! 

И научитесь вставлять код вот так, с SRC!

void SetOrders() {

  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double PredBar=iClose(NULL,PERIOD_M5,1);
  double pAsk=PredBar+(DistanceSet+spr)*Point;
  double pBid=PredBar-(DistanceSet+spr)*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

 C PredBar'ом побаловались без понимания, вот и результат! Сначала мат. часть учите!