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

 
Alexey Viktorov:

Проблема в этой строке

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

В общем или в эту строку добавить проверку добавить символа, или вообще цикл повторять только при условии открытия нового бара. Но есть опасение, что при появлении нового бара на символе с этим индикатором, на другом символе новый бар ещё не нарисовался.

Отсюда вывод: надо напрягать мышцы головы, чтобы определять появление нового бара на каждом символе отдельно, но в то-же время не растягивать количество строк до бесконечности. Готового решения у меня нет. Да и не люблю я подсказывать написанием кода...

А я не решил его проблему?

Может где-то что-то и упустил - на коленке писал код.

 
Artyom Trishkin:

А я не решил его проблему?

Может где-то что-то и упустил - на коленке писал код.

Артём, последнее предложение моего поста объясняет всё. Твой код даже не смотрел. Открыл первое не прочитанное, вопрос с цитатой моего предыдущего ответа, я ответил и уже потом видел другие советы. В правильности твоего кода, даже с коленки, я не сомневаюсь...

 
Alexey Viktorov:

Артём, последнее предложение моего поста объясняет всё. Твой код даже не смотрел. Открыл первое не прочитанное, вопрос с цитатой моего предыдущего ответа, я ответил и уже потом видел другие советы. В правильности твоего кода, даже с коленки, я не сомневаюсь...

Так бы и сказал, что лень ;)

Даже при первом взгляде видно, что код зависит от тиков на текущем символе. А значит нужно убирать цикл из OnTick() и пихать его в таймер. И слегка видоизменить определение времени алерта.

 

Здравия всем,есть недопонимание процесса,в функции "старт", в цикле  mm++; и слежу за изменения в ней через Print();, так вопрос:"почему вместо 1,2,3,4 и т.д. выскакивают четырёхзначные числа? "

сам код

int start()

  {
   int    counted_bars=IndicatorCounted();
   int limit, i;
                                               int mm=0;     // ======= ПЕРВОЕ========
  

   if(counted_bars<0) return(-1);

   limit=(Bars-counted_bars)-1;

for (i=limit; i>=0;i--)
    { 
       if (TimeDayOfWeek(Time[i]) != 0)
       {if (High[i+1]>LastHigh) LastHigh=High[i+1];if (Low[i+1]<LastLow) LastLow=Low[i+1];}
 

if (TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0)
   {
      
                                                   mm++; // ==========ВТОРОЕ==========
       
   
   
                                                   Print(" TEST= ",mm);// ========ТРЕТЬЕ========
  
   LastLow=Open[i]; LastHigh=Open[i];

  /* ObjectMove("Pivot", 0, Time[i],P);
     ObjectMove("S1", 0, Time[i],S1);
     ObjectMove("R1", 0, Time[i],R1); */
   }
   
   // S1Buffer[i]=S1;
   // R1Buffer[i]=R1;

}

//----
   return(0);
  }
//+------------------------------------------------------------------+
 
виталик:

Здравия всем,есть недопонимание процесса,в функции "старт", в цикле  mm++; и слежу за изменения в ней через Print();, так вопрос:"почему вместо 1,2,3,4 и т.д. выскакивают четырёхзначные числа? "

сам код


При первом запуске, секунд 10     IndicatorCounted()=0

 limit=(Bars-counted_bars)-1;

значит limit= макс. баров в истории-1

 
Alekseu Fedotov:


При первом запуске, секунд 10     IndicatorCounted()=0

значит limit= макс. баров в истории-1

чот всё равно не понятно,  объявление и инициалицация нулём вне цикла int mm=0;  и помещено в цикл mm++; в print() видно как четырёхзначные числа меняются с разницей в одну единицу только почему то в сторону убывания
 
виталик:
чот всё равно не понятно,  объявление и инициалицация нулём вне цикла int mm=0;  и помещено в цикл mm++; в print() видно как четырёхзначные числа меняются с разницей в одну единицу только почему то в сторону убывания
В этот журнал выводятся не все принты. В файле смотрите.
 

Alexey Viktorov:

...надо напрягать мышцы головы...

Благодарю всех, кто откликнулся.

Artyom TrishkinНапример, так:

Артём, почему вы пишите, что не решили? Сигналит по всем инструментам, только грузит систему сильно. Есть возможность снизить нагрузку?

Ограничение проверки на новом баре не подойдёт, потому что будут ещё условия, которые нужно проверять на каждом тике.

 В ваш код пытаюсь добавить OnTimer(),  работало в советнике когда OnTick() а как сделать с OnCalculate ?

int OnInit()
  {
  EventSetMillisecondTimer(1);
//--- indicator buffers mapping
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason)
{// ---
        EventKillTimer();
 // ---
}
void OnTimer()
  {
   RefreshRates();
  // OnTick();
   OnCalculate();
  }

 
Ibragim Dzhanaev:

Подскажите, почему не открывает ордера ?


Так, будет открывать:
//пересечение вверх
bool PeresVverh()
  {//Объявление пересечения вверх
   //if(Ma(MaPer1,2)>Ma(MaPer2,2))
      if(Ma(MaPer1,1)>=Ma(MaPer2,1))
         if(Ma(MaPer1,0)<Ma(MaPer2,0))
            return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PeresVniz()
  {//Объявление пересечения вниз
   //if(Ma(MaPer1,2)<Ma(MaPer2,2))
      if(Ma(MaPer1,1)<=Ma(MaPer2,1))
         if(Ma(MaPer1,0)>Ma(MaPer2,0))
            return(true);
   return(false);
  }

 
Sile Si:

Благодарю всех, кто откликнулся.

Артём, почему вы пишите, что не решили? Сигналит по всем инструментам, только грузит систему сильно. Есть возможность снизить нагрузку?

Ограничение проверки на новом баре не подойдёт, потому что будут ещё условия, которые нужно проверять на каждом тике.

 В ваш код пытаюсь добавить OnTimer(),  работало в советнике когда OnTick() а как сделать с OnCalculate ?


Так попробуйте. Таймер на 200 милисекунд

//+------------------------------------------------------------------+
//|                                                      Test_01.mq4 |
//|              Copyright 2017, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window

input string Symbols = "EURUSD, GBPUSD, USDJPY"; // Список символов, разделитель - запятая
//---
struct SSymbolsData
  {
   string   name;       // Имя символа
   datetime time_alert; // Время последнего алерта
  };
SSymbolsData symbols_array[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(200);
   IndicatorShortName("UP DN");
   ushort sz=SetSymbols(Symbols,symbols_array);
   if(sz==0) {
      Print("Список символов пуст!");
      return(INIT_FAILED);
      }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   for(int i=0; i<ArraySize(symbols_array); i++) {
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_BUY) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);;
         if(symbols_array[i].time_alert!=tm) {
            Alert("UP - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      if(Condition(symbols_array[i].name,1)==ORDER_TYPE_SELL) {
         datetime tm=iTime(symbols_array[i].name,PERIOD_CURRENT,0);
         if(symbols_array[i].time_alert!=tm) {
            Alert("Down - " ,symbols_array[i].name,", time: ",TimeToString(tm,TIME_DATE|TIME_MINUTES));
            symbols_array[i].time_alert=tm;
            }
         }
      }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Condition(string symbol_name,int shift) {
   MqlRates array[];
   if(CopyRates(symbol_name,PERIOD_CURRENT,shift,2,array)==2){
      if(array[0].open<array[0].close && array[1].open>array[1].close) return(ORDER_TYPE_BUY);
      if(array[0].open>array[0].close && array[1].open<array[1].close) return(ORDER_TYPE_SELL);
      }
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
ushort SetSymbols(string symbols_list,SSymbolsData &array[]){
   symbols_list+=","; // Добавим признак конца строки
   short beg=WRONG_VALUE, end=1, len=(short)StringLen(symbols_list);
   string sy="";
   Print(__FUNCTION__," > ",symbols_list); // Посмотрим символы в строке
   while(beg<len) {
      beg++;
      end=(short)StringFind(symbols_list,",",beg);
      if(end==beg || end<0) continue;
      sy=StringSubstr(symbols_list,beg,end-beg);
      if(CheckSymbol(sy,array) || !IsPresentSymbol(sy)) continue;
      ushort sz=(ushort)ArraySize(array);
      ArrayResize(array,sz+1);
      array[sz].name=sy;
      array[sz].time_alert=0;
      //--- Посмотрим корректность найденного символа и записи его в массив
      Print("beg=",IntegerToString(beg,2,'0'),", end=",IntegerToString(end,2,'0'),", sy=|",sy,"|",", in array[",sz,"]=",array[sz].name);
      }
   return((ushort)ArraySize(array));
}
//+------------------------------------------------------------------+
bool CheckSymbol(string symbol_name,SSymbolsData &array[]){
   for(short i=0; i<ArraySize(array); i++) if(array[i].name==symbol_name) return(true);
   return(false);
}
//+------------------------------------------------------------------+
bool IsPresentSymbol(string symbol_name){
   for(ushort i=0; i<SymbolsTotal(false); i++){
      if(SymbolName(i,false)==symbol_name) {
         SymbolSelect(symbol_name,true);
         return(true);
         }
      }
   return(false);
}
//+------------------------------------------------------------------+
Причина обращения: