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

 

Как опустошить значения индикаторного максимума и минимума? Например если был выставлен максимум 100 и минимум 0, и потом нужно чтобы индикатор визуализировал всё, то как это организовать? Дело в том что я пишу индикатор с несколькими режимами, в одном из которых использую максимум и минимум, но после переключения режима во входных параметрах максимум остаётся 100, как и минимум 0


MQL5

 
Alekseu Fedotov:

Вы уже вызвали, и передаёте в функцию   Envelopes(........)значение, возвращаемое функцией Deviation(Kanal)

и в самой функции Envelopes(........последний параметр, объявляете переменную которая и примет это значение


как то так

Благодарю, теперь более понятно.

 

Слегка переделал код для МТ5 по вашим советам, получилось вот так:

input  string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

input  ENUM_TIMEFRAMES   Time_Frames    = PERIOD_M5;             // Временной период
       int                Ma_Period     = 120;                   // Период
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_MA_METHOD     Ma_Method     = MODE_SMMA;             // Mетод усреднения
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;           // Tип цены
//************************************************************************************************/
void OnTick()
{
//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------
}
//************************************************************************************************/
double Envelopes(int buff, double _Deviation)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, _Deviation);
   if(handle<0)
   {
    Print("Failed to create handle iEnvelopes, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,buff,0,1,buf)<0)
    {
     Print("Failed to copy data from the indicator iEnvelopes, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Только теперь не пойму почему при каждом тике везде записывается первое расчётное значение.

 Расчёты

Подскажите, как исправить ?
 
Alexander Layzerevich:

Слегка переделал код для МТ5 по вашим советам, получилось вот так:

Только теперь не пойму почему при каждом тике везде записывается одно расчётное значение.

 

//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------

Сразу же в глаза бросается. Даже без выделения.

 
Artyom Trishkin:

Сразу же в глаза бросается. Даже без выделения.

Благодарю.

 

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

WinProject, 2019.05.07 18:38

Подскажите пожалуйста, почему один и тот же код работает в МТ4, но не работает в МТ5? В МТ5 переменная strNum всегда =1, а в МТ4 счетчик ++ работает как надо и strNum = количеству строчных элементов в файле.

int strNum;
void OnStart()
  {
 FileNum();
 Alert1();
  } 

  void FileNum()
{
      int handle=FileOpen("File.csv",FILE_CSV|FILE_READ,';');
      strNum=0; 
      while(!FileIsEnding(handle))
{
      FileReadString(handle);
      strNum++;
      if(FileIsEnding(handle)==true)
      break;
}
      FileClose(handle);
}

      void Alert1()
{
      Alert (strNum);
}

Отвечаю сам себе, может пригодиться тому у кого не работает цикл в МТ5 при открытии, чтении файла в массив или структуру. В МТ5, в отличии от MT4, при чтении .csv файла должен дополнительно стоять флаг открытия файла FILE_ANSI.

Т.е. в МТ5 строка должна выглядеть так: 

int handle=FileOpen("File.csv",FILE_READ|FILE_ANSI|FILE_CSV,";");

Почему не знаю, может кто знает?

 
Если выбивается уведомление в журнале эксперта такого формата - uninit reason 3(уведомление связано с тем что переключён ТМ), но робот не удалён с графика, сохраняются ли значения переменных и всех расчётов которые были получены?
 

Получаю "OrderSend error 130" по непонятной причине, программа выполняется в тестере стратегий на демо счету, так что никаких ограничений от брокера быть не может насколько я понимаю, Stops Level = 30. Ошибку получаю с регулярной периодичностью при тестировании, при этом стоп фиксированный в процентах от ATR для всех сделок, но одни ордера выставляются успешно, другие нет.

      Print("!!!long level = ", level, ", stop = ", NormalizeDouble(level - stop, Digits));
      if(Bid < level) {
         tickets[orders] = OrderSend(symbol, OP_BUYSTOP, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                                                                           
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;          
         firstTouchTimes[orders] = firstTouchTime;
         orders++;                   
      }       
      else { 
         tickets[orders] = OrderSend(symbol, OP_BUYLIMIT, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;
         firstTouchTimes[orders] = firstTouchTime;
         orders++;    
      }

Бывают моменты, когда ордер откланяется несколько раз, а потом проходит... 



 

Как в CodeBase публиковать один и тот же код для разных языковых аудиторий (например как в маркете можно заполнять форму соответствующему языку)?


Я видел уже это в CodeBase, вот пример


Как мне сделать также?

 

К какому отображению графика отнестись более склонным с правильностью данных индикатора, если например уменьшаешь до самого предела мышкой размер масштаба свечей, то и меняются показания данных индикатора, хотя о изменении размера свечей в коде индикатора ни в одном из всех тысяч не пишется ничего.Например на 4 часе объемы в уменьшенном виде показывают одно значение, а стоит чуть увеличить свечи уже другая расстановка какие показания считаются правильнее.


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