Помогите разобраться.

 

Пытаюсь научить МТ4 выделять на графике бары диапазон которых превышает ATR(60), код следующий:


extern int Quant_Bars=100; // Количество баров


  int start()  
  {
  int Ind_Bar;  
   
  for(Ind_Bar=Quant_Bars-1; Ind_Bar>=0; Ind_Bar--)
  {
  Create(Ind_Bar);  
  }

  return;  
  }
//--------------------------------------------------------------- 3 --
int Create(int Ind_Bar) // Пользовательская функция создания объекта
  


  color Color= Red; // Цвет объекта
  datetime T_Bar=Time [Ind_Bar]; // Время открытия бара
  double O_Bar=Open [Ind_Bar]; // Цена открытия бара
  double C_Bar=Close[Ind_Bar]; // Цена закрытия бара
  double H_Bar=High [Ind_Bar]; // Максимальная цена бара
  double L_Bar=Low [Ind_Bar]; // Минимальная цена бара 
  double A= iATR(Symbol(),0,60,Ind_Bar);
   
   
  if((H_Bar-L_Bar)>A)
  ObjectCreate("His_Name",OBJ_TREND,0,T_Bar,H_Bar,T_Bar,L_Bar);  
  return;  
  }

... закрашивет почему то только один бар(самый первый слева помоему), хотя по идее должен все на промежутке 100-0 баров. Подскажите пожайлуста где ошибка?

И еще, объясните пожайлусто как вставлять в посты коды, выделящиеся цветом.

Файлы:
 
Yar1k писал(а) >>
ObjectCreate("His_Name",OBJ_TREND,0,T_Bar,H_Bar,T_Bar,L_Bar);

... закрашивет почему то только один бар(самый первый слева помоему), хотя по идее должен все на промежутке 100-0 баров. Подскажите пожайлуста где ошибка?

У Вас ВСЕ объекты с одним и тем же именем - "His Name". Рисуются все - остается последний. Создайте уникальные имена объектов (например так : "His Name"+i)

Удачи.

 

Спасибо. Сделал так: ObjectCreate("His_Name"+Ind_Bar,OBJ_TREND,0,T_Bar,H_Bar,T_Bar,L_Bar); - теперь вроде нормально рисует.

Еще вопрос. Как изменить параметры линий(цвет,рисовать объект как фон, луч)? 

 

Благодарю! Фсе зделал как хотел.





 
Сейчас следующей задачей озабочен: Как на MQL4 запрограммировать следующие условия(покупка)?-минимум предыдущего бара ниже МА(неважно какой), а минимум текущего бара выше МА(т.е. пересечение мувинга с закреплением над ним). Далее идентифицируем белый бар выше МА и размещаем над ним ордер. Если после пересечения МА условий для размещения ордера небыло и цена забралась обратно под мувинг(минимум бара<МА) ждем следующего пересечения снизу вверх.

Буду благодарен за помощь.  
 

При попытке компиляции выдает ошибку:

... все скобки вроде на месте(час проверял, ненашел). В чем проблема??

Сам эксперт:


#include <stdlib.mqh>
#include <stderror.mqh>
#define MAGICMA  200506100
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double MovingPeriod       = 12;
extern double MovingShift        = 0;
extern double MovingPeriod1      = 4;
extern double AtrPer             = 10;

int CalculateCurrentOrders(string symbol)
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY||OrderType()==OP_BUYSTOP)return(1);
         if(OrderType()==OP_SELL||OrderType()==OP_SELLSTOP)return(2);         
        }
     }
return(0);
  }
   
void CheckForOpen()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   double Atr;
   int    res;
   double openBUY=High[1]+6*Point;
   double openSELL=Low[1]-3*Point;
  
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_EMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_EMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_EMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_EMA,PRICE_CLOSE,2);// короткий мувинг 4
   Atr = iATR(NULL,0,AtrPer,1);
    
   if(maf<mas && maf_p>=mas_p)  
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,Lots,openSELL,3,Low[1]+(Atr+16*Point),Low[1]-Atr*11,"",MAGICMA,0,Red);
       if (res!=-1)         
      return;
     }

   if(maf>mas && maf_p<=mas_p)  
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,Lots,openBUY,3,High[1]-(Atr+16*Point),High[1]+Atr*11,"",MAGICMA,0,Blue);
      if (res!=-1)     
      return;
     }
  }

void CheckForCloseAndModifBUY()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;  
   bool rtvl;
   bool rtv;
//---- 
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_EMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_EMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_EMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_EMA,PRICE_CLOSE,2);// короткий мувинг 4
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //----  
      if(OrderType()==OP_BUY)
        {
         if((Bid-OrderOpenPrice())>=50*Point)
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);         
         if(maf<mas && maf_p>=mas_p) rtvl=OrderClose(OrderTicket(),OrderLots(),Bid,3,Lime);
         if (rtvl!=False)            
         break;
        }          
      if(OrderType()==OP_BUYSTOP)
      if(maf<mas && maf_p>=mas_p)rtv=OrderDelete(OrderTicket(),Red)      
     }    
   }

void CheckForCloseAndModifSELL()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;  
   bool rtvl;
   bool rtv;   
   
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_EMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_EMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_EMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_EMA,PRICE_CLOSE,2);// короткий мувинг 4
//----   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)  break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol())  continue;
      if(OrderType()==OP_SELL)
        {
         if((OrderOpenPrice()-Bid)>=50*Point)
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);  
         if(maf>mas && maf_p<=mas_p)rtvl=OrderClose(OrderTicket(),OrderLots(),Ask,3,Lime);         
        }
      if(OrderType()==OP_SELLSTOP)
         {
          if(maf>mas && maf_p<=mas_p)rtv=OrderDelete(OrderTicket(),Red)          
         }      
    }
  }

void start()
  {
//---- calculate open orders by current symbol
   switch(CalculateCurrentOrders(Symbol())) 
    {                                  
      case 0 :CheckForOpen();break;                                  
      case 1 :CheckForCloseAndModifBUY();break;
      case 2 :CheckForCloseAndModifSELL();break;
    }
  }



 
Yar1k писал(а) >>

При попытке компиляции выдает ошибку:

... все скобки вроде на месте(час проверял, ненашел). В чем проблема??

Сам эксперт:

switch(CalculateCurrentOrders(Symbol()) 
 
Vinin >>:

Спасибо! Я видимо перегрелся малость и незаметил)).

Сейчас подставил скобку, скомпилировал и 10 ошибок получил, совершенно непонятных мне по смыслу:

...поможете разобраться??

 
поставьте точку с запятой в конце в выражении if(maf>mas && maf_p<=mas_p)rtv=OrderDelete(OrderTicket(),Red); (два раза)
 
alsu >>:
поставьте точку с запятой в конце в выражении if(maf>mas && maf_p<=mas_p)rtv=OrderDelete(OrderTicket(),Red); (два раза)

 Заработало! Благодарю.

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