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

 


Добрый день, подскажите пожалуйста - у меня такая проблема: Робот заходит в позицию, и на следующем тике модифицируется его стоплосс под предыдущий лоу, а мне надо что бы стоплосс модифицировался только когда закроется свеча на которой была открыта позиция

void TrailingStop()
{  
  for(int i=0;i<OrdersTotal();i++)
  {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true);
    {
    if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
      {  
      if (OrderType()==OP_BUY)             
        {              
            double LOW_1 = iLow(NULL,0,1);       
            bool res=OrderModify(OrderTicket(),OrderOpenPrice(),LOW_1,OrderTakeProfit(),0,White);                
            if(!res)  Print("Ошибка модификации ордера. Код ошибки=",GetLastError());         
        }               
       if (OrderType()==OP_SELL)              
        {                  
            double HIGH_1 = iHigh(NULL,0,1);                    
            res=OrderModify(OrderTicket(),OrderOpenPrice(),HIGH_1,OrderTakeProfit(),0,White);                
            if(!res)  Print("Ошибка модификации ордера. Код ошибки=",GetLastError());          
        }                      
      }
    } 
  }     
 return;                   
}
 

или как избавиться от этой ошибки


 
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);

 
напишу попроще: как прописать такое условие - Пока не появилась новая свеча открытый ордер не модифицировать
 
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)

 
Подскажите, пожалуйста. Нужно написать часть кода, где будет выбираться второй ордер в списке и затем удаляться (отложенный). Возвращает 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)