Help.

 

Привет, помогите разобраться с логикой. При компиляции данного кода ошибок и предупреждений 0.Дело вот в чём. Захотел написать советник на основе индикатора DeMarker. Идея проста, советник должен открыть одну сделку на покупку при пересечении 0.3 (снизу вверх, то есть справа). Данная позиция закрывается, когда индикатор пересекает 0.7 (сверху в низ, то есть справа), при этом открывается сделка в противоположную сторону.  Вроде всё ясно, но в чем, то я не догоняю.

//------------------параметры советника -------------------------------

extern double lots = 0.01; //
extern int Magic=111111345;
extern int Slippage=0;
extern double sell_level=0.7;
extern double buy_level=0.3;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits==3 || Digits==5)
     {
          Slippage   *=10;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
       double DM=iDeMarker(NULL,0,9,0);
 
          if(DM < sell_level && CountSell()==0)// открытие продаж
          {
          ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,Slippage,0,0,"робот ",Magic,0,Red);
      if(ticket>0)
      {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)== true)
            if(!OrderModify(ticket,OrderOpenPrice(),0,0,0)== true)
               Print("Ошибка модификации ордера на продажу!");
        }
         }
//+------------------------------------------------------------------+
   if(OrderType()==OP_SELL)
        {
   if(DM > buy_level && Bid > OrderOpenPrice()&& CountSell()>0)// закрытие продаж
   {
                 if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
                  }
    }
//+------------------------------------------------------------------+
   if(Ask > OrderOpenPrice() && DM > buy_level && CountBuy()==0)// открытие покупок
     {
            ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,0,0,"робот ",Magic,0,Blue);
         if(ticket>0)
        {

         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),0,0,0)== true)
               Print("Ошибка модификации ордера на покупку!");
        }
     }
//
 
if(OrderType()==OP_BUY)
{
   if(DM < sell_level && Ask > OrderOpenPrice()&&  CountBuy()>0)// закрытие покупок
     {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
             }
  }
//+------------------------------------------------------------------+
int CountSell()//проверкна открытие ордеров на продажу
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)== true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            if(OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()// проверкна открытие ордеров на покупку
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)== true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Игорь:

Привет, помогите разобраться с логикой. При компиляции данного кода ошибок и предупреждений 0.Дело вот в чём. Захотел написать советник на основе индикатора DeMarker. Идея проста, советник должен открыть одну сделку на покупку при пересечении 0.3 (снизу вверх, то есть справа). Данная позиция закрывается, когда индикатор пересекает 0.7 (сверху в низ, то есть справа), при этом открывается сделка в противоположную сторону.  Вроде всё ясно, но в чем, то я не догоняю.

//------------------параметры советника -------------------------------

extern double lots = 0.01; //
extern int Magic=111111345;
extern int Slippage=0;
extern double sell_level=0.7;
extern double buy_level=0.3;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits==3 || Digits==5)
     {
          Slippage   *=10;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
       double DM=iDeMarker(NULL,0,9,0);
 
          if(DM < sell_level && CountSell()==0)// открытие продаж
          {
          ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,Slippage,0,0,"робот ",Magic,0,Red);
      if(ticket>0)
      {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)== true)
            if(!OrderModify(ticket,OrderOpenPrice(),0,0,0)== true)
               Print("Ошибка модификации ордера на продажу!");
        }
         }
//+------------------------------------------------------------------+
   if(OrderType()==OP_SELL)
        {
   if(DM > buy_level && Bid > OrderOpenPrice()&& CountSell()>0)// закрытие продаж
   {
                 if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
                  }
    }
//+------------------------------------------------------------------+
   if(Ask > OrderOpenPrice() && DM > buy_level && CountBuy()==0)// открытие покупок
     {
            ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,0,0,"робот ",Magic,0,Blue);
         if(ticket>0)
        {

         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),0,0,0)== true)
               Print("Ошибка модификации ордера на покупку!");
        }
     }
//
 
if(OrderType()==OP_BUY)
{
   if(DM < sell_level && Ask > OrderOpenPrice()&&  CountBuy()>0)// закрытие покупок
     {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
             }
  }
//+------------------------------------------------------------------+
int CountSell()//проверкна открытие ордеров на продажу
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)== true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            if(OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()// проверкна открытие ордеров на покупку
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)== true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

Уважаемый! Вставляйте код правильно!

Вставка кода...
 

Кнопка Исходный код предназначена для вставки исходного кода в текст сообщения.

Давайте проследим за логикой программы. Первый условный оператор такой: if(DM < sell_level && CountSell()==0)   // открытие продаж

Если он не сработал, то следующий оператор if(OrderType()==OP_SELL)  выдаст ошибку, т.к. ордер еще не выбран

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