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

 
trader_fx:
https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger

Спасибо ! Все понял. Теперь такой вопрос.  Эти функции работают для получения значения от объектов. Но как получить значения , допустим , стрелок,

которые видны на графике, но не видны в списке объектов. Например, если стрелки прорисованы , например :

SetIndexStyle(0, DRAW_ARROW);

SetIndexArrow(0, 234); 

\\\\ 

ObjectsTotal() ( да и другие функции объектов) эти стрелки не видят.... 

 
ilmel:

Спасибо ! Все понял. Теперь такой вопрос.  Эти функции работают для получения значения от объектов. Но как получить значения , допустим , стрелок,

которые видны на графике, но не видны в списке объектов. Например, если стрелки прорисованы , например :

SetIndexStyle(0, DRAW_ARROW);

SetIndexArrow(0, 234); 

\\\\ 

ObjectsTotal() ( да и другие функции объектов) эти стрелки не видят.... 

 iCustom в помощь

 
Здравствуйте! Кто-нибудь знает, что это было 2-го сентября? см.файл.              
 

Добрый вечер! Подскажите где ошибка, индикатор взял из учебника mql4 https://book.mql4.com/ru/samples/icustom. Но хочу чтоб огибающая была в отдельном окне. На скрине в основном окне индикатор из учебника, в нижнем окне то что получилось у меня

.скрин

 

#property strict
#property indicator_separate_window
#property indicator_minimum 1
#property indicator_buffers 1
#property indicator_color1 Blue

double Buf_0[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  SetIndexBuffer(0,Buf_0);
  SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,clrAqua);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,                           // Индекс бара
       Counted_bars;                // Количество просчитанных баров 
    Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      Buf_0[i]=Close[i];             // Значение 0 буфера на i-ом баре     
      i--;                          // Расчёт индекса следующего бара
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
bobrush:

Добрый вечер! Подскажите где ошибка, индикатор взял из учебника mql4 https://book.mql4.com/ru/samples/icustom. Но хочу чтоб огибающая была в отдельном окне. На скрине в основном окне индикатор из учебника, в нижнем окне то что получилось у меня


А минимум зачем задавать?

#property indicator_minimum 1???

Да и цвет два раза тозе, зачем, причём разный? 

Но главная ошибка - в стиле буфера, с количеством параметров  чутка промашка вышла.

 SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,0,indicator_color1);

В общем, как-то вот так:

#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue

double Buf_0[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  SetIndexBuffer(0,Buf_0);
  SetIndexStyle(0,DRAW_LINE,0,0,indicator_color1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i=rates_total-prev_calculated-1;
   if(prev_calculated>0)     i++;

   while(i>=0)                      // Цикл по непосчитанным барам
     {
      Buf_0[i]=сlose[i];             // Значение 0 буфера на i-ом баре     
      i--;                          // Расчёт индекса следующего бара
     }
   return(rates_total);
  }
 
evillive:

А минимум зачем задавать?

#property indicator_minimum 1???

Да и цвет два раза тозе, зачем, причём разный? 

Но главная ошибка - в стиле буфера, с количеством параметров  чутка промашка вышла.

 SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,0,indicator_color1);

В общем, как-то вот так:

 

 Огромнейшее спасибо! По поводу #property indicator_minimum 1 я вообще не знаю для чего это :) , если не сложно разъясните?? Мой опыт программирования это 3 сливных советника

 
bobrush:По поводу #property indicator_minimum 1 я вообще не знаю для чего это :)  , если не сложно разъясните?

Нижнее ограничение шкалы отдельного окна индикатора, всё выходящее за рамки не показывается  в окне. Обычно минимум-максимум задают, когда нужен фиксированный масштаб индикатора и известно, что его значения не выходят за пределы этого ограничения.
[Deleted]  
evillive:

Нижнее ограничение шкалы отдельного окна индикатора, всё выходящее за рамки не показывается  в окне. Обычно минимум-максимум задают, когда нужен фиксированный масштаб индикатора и известно, что его значения не выходят за пределы этого ограничения.
о, то что искал, спасибо)
 

Уважаемые программисты, помогите пожалуйста ,  установить запрет на открытие более одной серии сделок одновременно ( серия это если ордер закрывается в убытке или в нолях и тогда открывается следующая сделка по этому же инструменту, но с увеличенным лотом), то есть если открывается одна серия сделок вторая и последующая ставиться по другим инструментам под  запрет ( бот одновременно работает на разных инструментах). Думаю, это нужно делать через глобальную переменную терминала, но у меня не хватает знаний и опыта я только недавно начал изучать  MQL. Это советник по бинарным опционам. Вот код 

extern double       Lots             = 1;      // Лот

extern int          Exp              = 1;      // Експирация

extern int          Wait             = 1;      // Количество свечей одного направления

extern int          Timeout          = 1;      // Промежуток времени

extern double       Multiplier       = 3;      // Множитель

extern int          Slippage         = 5;      // Проскальзывание

extern int          Magic            = 2090; // Магик


int ticket, Type;

double Price, Lot;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

{

   

   return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

   

}

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

{

   // --------------- Открытие сделок ---------------

   if (OrdersTotal() == 0) // Количество ордеров должно равняться нулю     

   {

      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) 

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))) 

      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY)) 

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))) 

      || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (SignalBuy() && OrdersTotal() == 0) 

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (SignalSell() && OrdersTotal() == 0)

         {

            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

            

            Comment ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY),  "PriceCloseLastHistOrder(OP_SELL)=", 

             PriceCloseLastHistOrder(OP_SELL) );

         }

      }

   }

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1) // Определение количества сделок

{

   int cnt = 0;

   for (int i=OrdersTotal()-1; i>=0; i--) // В цикле идет перебор абсолютно всех открытых ордеров, i -- порядковый номер ордера

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Функция проверяет есть ли в рынке ордер с порядковым ордером i, 

      // если есть то проверяются следующие условия...

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Если символ, 

         // на котором открыт ордер, равняется текущему символу и Магик ордера равняется магику в настройках текущего советника и 

         // тип ордера равняется равняется значению type (или type == -1 (в случае, если без разницы какой тип нужен для подсчета ордеров))

            cnt++; // К переменной cnt добавляется 1, и в конце цикла cnt уже будет равнятся количеству сделок, 

            // открытых текущим советнкиом по текущей валютной паре с определенным типом

      }

   }

   return(cnt); // Возвращается значение переменной cnt

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

   int cnt = 0;

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

//+------------------------------------------------------------------+

bool SignalBuy()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] > Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

//+------------------------------------------------------------------+

bool SignalSell()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] < Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;


   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   

   return(opentime);

}

//+------------------------------------------------------------------+

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   

   return(type);

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   

   return(lots);

}

//+------------------------------------------------------------------+

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   

   return(price);

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   

   return(price);

}

//+------------------------------------------------------------------+ 

 
Здравствуйте, коллеги!

У меня при программировании появился вопрос: а можно ли как-то получить в Советнике время сервера с точностью до миллисекунд?
Например, получаем: 23.09.2016 14час. : 53мин. : 54000 миллисекунд? То есть ровно в 54 секунды, 000 м/сек.