Нет открытия ордеров

 

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

 

extern double Lot       = 0.01;
extern double periodMA1 = 0;        //Период первой МА 
extern double periodMA2 = 0;        //Период второй МА
extern int Magic        = 666;
extern int MaxRisk      = 2;

int Ord1,Ord2;

int UseSlippage;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
  
int start()
{
   double Free =AccountFreeMargin();
   double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double Lot =Free*MaxRisk/100/One_Lot;
   Alert(Lot);

   double MA1=iMA(NULL,0,periodMA1,0,MODE_SMA,PRICE_CLOSE,1);
   double MA2=iMA(NULL,0,periodMA1,0,MODE_SMA,PRICE_CLOSE,2);
   
   double MA3=iMA(NULL,0,periodMA2,0,MODE_SMA,PRICE_CLOSE,1);
   double MA4=iMA(NULL,0,periodMA2,0,MODE_SMA,PRICE_CLOSE,2);
     
   if(OrdersTotal()>0)
   {
     for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
         {
            if(MA1>MA3 && MA2<MA4) 
            {
             Ord2=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0,"",Magic,0,clrGreen);    // Покупка
            } 
         }
         if(OrderType()==OP_SELL)
         {
            if(MA1<MA3 && MA2>MA4)                                 
            {
             Ord1=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,0,0,"",Magic,0,clrRed);     // Продажа
            }
         }   
        }
       }
      }
     } 

   return(0);
}  
 
Anna_89:

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

Ответ найдете в этой СТАТЬЕ
 
Не хотел добавляться файл. Теперь добавила.
 
Anna_89:
Не хотел добавляться файл. Теперь добавила.

Вот это уже другое дело ...

У Вас проблема с условиями

Перевожу на Русский язык

Если ордера есть

if(OrdersTotal()>0)

то открыть еще ордера, много ордеров открыть ...

А если ордеров нет то ничего не делать ...

 
Anna_89:

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

 

if(OrdersTotal()<1)
 
voviko:
это как это? так?

if(OrdersTotal() == 0,33)
Должно тоже сработать по вашей логике
 

Разбейте ваш советник на отдельные блоки (функции). Одна функция ищет есть ли открытые позиции. Другая функция уже открывает ордера в зависимости от того есть ли открытые позиции или нет. Можно еще добавить третью функцию которая вычисляет  условия открытия позиций.

int conditions()
{
  if (условия открытия BUY) return(OP_BUY);
  if (условия открытия SELL) return(OP_SELL);
  return(-1);

}

int OrderCount()
{
  Count = .....
  ищите есть ли открытые ордера
  return(Count);
}

bool OpenOrders(int TYPE, необходимые параметры если нужно)
{
  тут открываете ордера в переменной TYPE тип ордера BUY или SELL
}

int start()
{
  int Count = OrderCount();
  if (Count==0)
  {//нет открытых позиций
     int Type = conditions();
     if (Type>=0) OpenOrders(Type);
  }else
  {//есть открытые позиции
    //тут можно реализовать логику закрытия позиций и тралла стоп лосса позиций или также перенести эту логику в отдельную функцию.
  }
}
 
Daniil Stolnikov:
это как это? так?

Должно тоже сработать по вашей логике

OrdersTotal

Возвращает общее количество открытых и отложенных ордеров. 0 меньше 1 (OrdersTotal()<1) значит 0,  (OrdersTotal()==0) Не может быть полтора или половины ордера и тем более 0.33, хотя нужно делать эксперимент....

int start()
  {
   int accTotal=OrdersTotal();
     {
      for(int i=accTotal-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
           {
            if((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY || OrderType()==OP_SELL))
              {
               Alert(OrdersTotal());
              }
           }
        }
     }
     return(0);
  }
 
voviko:

OrdersTotal

Возвращает общее количество открытых и отложенных ордеров. 0 меньше 1 (OrdersTotal()<1) значит 0,  (OrdersTotal()==0) Не может быть полтора или половины ордера и тем более 0.33, хотя нужно делать эксперимент....

Не надо делать экспериментов, Данила шутит.

 
Alekseu Fedotov:

Не надо делать экспериментов, Данила шутит.

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