Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2325

 
Alexey Viktorov #:

В результате что должно получиться? Цель сравнения какая?

Если буфер не EMPTY_VALUE , то соединяет линией точки open[j] open[i]

 
Tretyakov Rostyslav #:

Если буфер не EMPTY_VALUE , то соединяет линией точки open[j] open[i]

При этом ещё должен определить куда направлена свеча? Я правильно понимаю? Или это уже определено до того как…? Сколько баров должно быть найдено? Один или все на указанном участке?

Самый тупой вариант, перебирая цикл в цикле заполнять вспомогательный массив, а потом из него рисовать линии.

 
Alexey Viktorov #:

При этом ещё должен определить куда направлена свеча? Я правильно понимаю? Или это уже определено до того как…? Сколько баров должно быть найдено? Один или все на указанном участке?

Самый тупой вариант, перебирая цикл в цикле заполнять вспомогательный массив, а потом из него рисовать линии.

Я понимаю, что цикл в цикле не очень хорошо, но как правильно сделать не понимаю.

суть того что мне надо:

есть буфер, если свеча нисходящая = close, если восходящая = EMPTY_VALUE

на новом баре от цены open надо провести линии к каждому значению буфера != EMPTY_VALUE за последние n-баров

Если не сложно сделай набросок кода или подскажи где можно посмотреть подобное.

 
Tretyakov Rostyslav #:

Я понимаю, что цикл в цикле не очень хорошо, но как правильно сделать не понимаю.

суть того что мне надо:

есть буфер, если свеча нисходящая = close, если восходящая = EMPTY_VALUE

на новом баре от цены open надо провести линии к каждому значению буфера != EMPTY_VALUE за последние n-баров

Если не сложно сделай набросок кода или подскажи где можно посмотреть подобное.

Ну так если на новом баре, то зачем цикл в цикле? Есть один массив с данными, есть первая свеча. Вот этот массив и перебираешь.

Или это надо на всю историю рисовать? Тогда твой рисунок не соответствует задаче. Ведь на рисунке только от первой свечи трендовые нарисованы, а ведь и дальше были свечи удовлетворяющие условию. Ты задачу невнятно ставишь.

 

Как узнать, сколько в данный момент используется агентов оптимизатора? Имею ввиду, что пользователь может отключить часть локальных агентов, интересует именно сколько активных агентов в данный момент.

А желательно знать вообще сколько всего агентов активных, в том числе и подключенных по сети (не облако).

 
Всем доброго! Может кто подскажет как добавить на Айфоне линейку, типа как в ТрейдВью: короткая/длинная, отношение риск/прибыль, длина в пипсах/тейках. Есть в Маркете вроде Free, но как добавить не знаю. Кто может знает? Пояснит. Спасибо
 
Cripta_Nick #:
Всем доброго! Может кто подскажет как добавить на Айфоне линейку, типа как в ТрейдВью: короткая/длинная, отношение риск/прибыль, длина в пипсах/тейках. Есть в Маркете вроде Free, но как добавить не знаю. Кто может знает? Пояснит. Спасибо

Никак. На мобильном нет возможности прикреплять к графику пользовательские скрипты/индикаторы/советники.

 

Здравствуйте!

Буду очень признателен, если поможете, подправить код индикатора. Переписал код своего индикатора с использованием функций OnCalculate() и OnTimer() , но достичь поставленных целей  не получилось. Индикатор выставляет заданное количество линий Хай-Лоу Дней, Недель, Месяцев. Индикатор должен обновляться один раз в сутки на первом тике дневной свечи , либо по заданному времени, к примеру в 1 час 15 минут. При обновлении дневной свечи на графике любого таймфрейма (несмотря  на переключения между таймфреймами) отрисовываются линии не задетые ценой. На текущей дневной цене при пробитии ценой линий, они должны оставаться на месте, даже при переключении между таймфреймами, до очередного первого тика новой свечи. После этого все линии обновляются. Проблема в том, что примеров с использованием функции OnTimer() я так и не нашел.  Может у кого-то имеется подобный по замыслу код индикатора.

С уважением, Вячеслав.

//+------------------------------------------------------------------+
//|                                                     HL_LEVEL.mq4 |
//+------------------------------------------------------------------+
#property copyright "kochegarov.vm"
#property link      "kochegarov.vm@mail.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern string General   = "//////////////////////////////////////////";
extern int    TimeFrame     = 0;
extern bool   Ray           = true; // длинна линий при true - до конца графика, при false - до текущей цены на графике

extern string D1_Settings   = "//////////////////////////////////////////";
extern int    ObjD1         = 3;  // количество дней для отрисовки линий хай-лоу
extern color  ColorHigh_D1  = clrRed;
extern color  ColorLow_D1   = clrBlue;
extern int    LineStyle_D1  = 0;
extern int    LineWidth_D1  = 2;

extern string W1_Settings   = "//////////////////////////////////////////";
extern int    ObjW1         = 3;  // количество недель для отрисовки линий хай-лоу
extern color  ColorHigh_W1  = clrMagenta;
extern color  ColorLow_W1   = clrDeepSkyBlue;
extern int    LineStyle_W1  = 0;
extern int    LineWidth_W1  = 4;

extern string MN_Settings   = "//////////////////////////////////////////";
extern int    ObjM1         = 3;  // количество месяцев для отрисовки линий хай-лоу
extern color  ColorHigh_MN  = clrRed;
extern color  ColorLow_MN   = clrBlue;
extern int    LineStyle_MN  = 0;
extern int    LineWidth_MN  = 5;

extern double Max_Spread = 5;
extern int CalculatedDays = 50; //Calculated Days
extern bool ShowLotInfo = true;
extern bool ShowOrdersInfo = true;

double D1h[], D1l[], W1h[], W1l[], M1h[], M1l[];
datetime D1ts[], D1te[], W1ts[], W1te[], M1ts[], M1te[];

int MaxObj=0; 
int PipsDivided = 1;
datetime TimeNewBar = 0;
datetime time_bar_ontimer_all;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   if(Digits == 3 || Digits == 5) PipsDivided=10;
   EventSetTimer(1440);
   
   ArrayResize(D1h,ObjD1+1); ArrayResize(D1l,ObjD1+1); ArrayResize(D1ts,ObjD1+1); ArrayResize(D1te,ObjD1+1);
   ArrayResize(W1h,ObjW1+1); ArrayResize(W1l,ObjW1+1); ArrayResize(W1ts,ObjW1+1); ArrayResize(W1te,ObjW1+1);
   ArrayResize(M1h,ObjM1+1); ArrayResize(M1l,ObjM1+1); ArrayResize(M1ts,ObjM1+1); ArrayResize(M1te,ObjM1+1);
   
   if (ObjD1+1 > MaxObj) MaxObj=ObjD1+1;
   if (ObjW1+1 > MaxObj) MaxObj=ObjW1+1;
   if (ObjM1+1 > MaxObj) MaxObj=ObjM1+1;
   
   Print("Инициализация индикатора");
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+  
void OnDeinit(const int reason)
{
   EventKillTimer();
   
   rLines(MaxObj+1);
   Comment("");
   Print("Деинициализация индикатора");
} 
//+------------------------------------------------------------------+
//| 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[])
{
   
   if(TimeNewBar == iTime(NULL,PERIOD_D1,0)) return(rates_total); //Выполнять дальнейшие условия только при появлении нового Бара
   //TimeNewBar = iTime(NULL,PERIOD_CURRENT,0); //сохраняем текущее время
   
   for(int x=0; x<MaxObj; x++)
   {
      D1h[x]=iHigh(Symbol(),1440,x);   D1l[x]=iLow(Symbol(),1440,x);
      W1h[x]=iHigh(Symbol(),10080,x);  W1l[x]=iLow(Symbol(),10080,x);
      M1h[x]=iHigh(Symbol(),43200,x);  M1l[x]=iLow(Symbol(),43200,x);

      D1ts[x]=iTime(Symbol(),1440,x);  D1te[x]=Time[0];
      W1ts[x]=iTime(Symbol(),10080,x); W1te[x]=Time[0];
      M1ts[x]=iTime(Symbol(),43200,x); M1te[x]=Time[0];
   }
   
   dD1(ObjD1+1);
   dW1(ObjW1+1);
   dM1(ObjM1+1);
   
   return(rates_total); 
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- время первого вызова OnTimer()
   static datetime start_time=TimeCurrent();
//--- локальное время на компьютере
   datetime local_time=TimeLocal();
//--- 

}
  
//+----------------------------------------------------------------------------+
void dD1(int Obj) 
{
   for (int x=1; x<Obj; x++)
   {  
      int nb1=iBarShift(NULL,0, D1ts[x],false); 
      int nb2=iBarShift(NULL,0, D1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_D1>0) LineWidth_D1=1;
      SetTLine(ColorHigh_D1,"D1_High_"+(string)x,iTime(NULL,PERIOD_D1,x),D1h[x],Time[0],D1h[x],Ray,LineStyle_D1,LineWidth_D1);
      if(up>D1h[x]) {ObjectDelete("D1_High_"+(string)x);}
      
      SetTLine(ColorLow_D1,"D1_Low_"+(string)x,iTime(NULL,PERIOD_D1,x),D1l[x],Time[0],D1l[x],Ray,LineStyle_D1,LineWidth_D1);
      if(dn<D1l[x]) {ObjectDelete("D1_Low_"+(string)x);}
   }
}
//+----------------------------------------------------------------------------+
void dW1(int Obj) 
{
   for (int x=1; x<Obj; x++)
   {  
      int nb1=iBarShift(NULL,0, W1ts[x],false);
      int nb2=iBarShift(NULL,0, W1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_W1>0) LineWidth_W1=1;
      SetTLine(ColorHigh_W1,"W1_High_"+(string)x,iTime(NULL,PERIOD_W1,x),W1h[x],Time[0],W1h[x],Ray,LineStyle_W1,LineWidth_W1);
      if(up>W1h[x]) {ObjectDelete("W1_High_"+(string)x);}
      
      SetTLine(ColorLow_W1,"W1_Low_"+(string)x,iTime(NULL,PERIOD_W1,x),W1l[x],Time[0],W1l[x],Ray,LineStyle_W1,LineWidth_W1);
      if (dn<W1l[x]) {ObjectDelete("W1_Low_"+(string)x);}
   }
}
//+----------------------------------------------------------------------------+
void dM1(int Obj)
{
   for (int x=1; x<Obj; x++)
   { 
      int nb1=iBarShift(NULL,0, M1ts[x],false);
      int nb2=iBarShift(NULL,0, M1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_MN>0) LineWidth_MN=1;
      SetTLine(ColorHigh_MN,"M1_High_"+(string)x,iTime(NULL,PERIOD_MN1,x),M1h[x],Time[0],M1h[x],Ray,LineStyle_MN,LineWidth_MN);
      if(up>M1h[x]) {ObjectDelete("M1_High_"+(string)x);}
      
      SetTLine(ColorLow_MN,"M1_Low_"+(string)x,iTime(NULL,PERIOD_MN1,x),M1l[x],Time[0],M1l[x],Ray,LineStyle_MN,LineWidth_MN);
      if (dn<M1l[x]) {ObjectDelete("M1_Low_"+(string)x);}
   }
}
//+----------------------------------------------------------------------------+
void SetTLine( color    cl, 
               string   nm="",
               datetime t1=0, 
               double   p1=0, 
               datetime t2=0, 
               double   p2=0,
               bool     ry=False, 
               int      st=0, 
               int      wd=1 ) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}   
//+------------------------------------------------------------------+
void rLines(int Obj)    
{
   for (int x=1; x<Obj; x++)
   {
      ObjectDelete("D1_High_"+(string)x); 
      ObjectDelete("D1_Low_"+(string)x);   
      ObjectDelete("W1_High_"+(string)x); 
      ObjectDelete("W1_Low_"+(string)x);  
      ObjectDelete("M1_High_"+(string)x); 
      ObjectDelete("M1_Low_"+(string)x);  
   }
}
//+------------------------------------------------------------------+
 
Хочу открывать два отложенных ордера и уходить, если пока меня нету откроется один из ордеров то чтобы закрывался второй (и оставалась одна открытая позиция и ноль отложенных), вот код скажите всё ли правильно?
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void OnTrade()
  {
//-- объявление и инициализация запроса и результата
   MqlTradeRequest request={};
   MqlTradeResult  result={};
   int total=OrdersTotal(); // количество установленных отложенных ордеров
      for(int i=total; i>0;)
        {
         ulong  order_ticket=OrderGetTicket(i);                   // тикет ордера
         ulong  magic=OrderGetInteger(ORDER_MAGIC);               // MagicNumber ордера
         i--;
         //--- если MagicNumber ордера совпадает
         if(magic==EXPERT_MAGIC)
           {
            //--- обнуление значений запроса и результата
            ZeroMemory(request);
            ZeroMemory(result);
            //--- установка параметров операции     
            request.action=TRADE_ACTION_REMOVE;                   // тип торговой операции(указывает на закрытие отложенного ордера)
            request.order = order_ticket;                         // тикет ордера
            //--- отправка запроса
            if(!OrderSend(request,result))                        // исполняет операцию
               PrintFormat("OrderSend error %d",GetLastError());  // если отправить запрос не удалось, вывести код ошибки
            //--- информация об операции   
            PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
           }
        }        
  }
Ну и соответсвенно на график добавляю эксперта только после того как установленны два отложника
 
Andrey Dik #:

Как узнать, сколько в данный момент используется агентов оптимизатора? Имею ввиду, что пользователь может отключить часть локальных агентов, интересует именно сколько активных агентов в данный момент.

А желательно знать вообще сколько всего агентов активных, в том числе и подключенных по сети (не облако).

Профиль > Агенты  > Агенты > "Активные за последние сутки"