Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 54

 
Брат старший пришол. Наверно я завтра.
 
Merkulovv_Artem:

Подскажите где ошибка, значения получаю точные, но не могу сделать так, чтобы значение "Obem_Pozic", имело вид 1,00 , чтобы я мог высчитал лот выставления, у меня никак не хочет нормализовывать значения, выдает 4 знака после запятой и все.

Пишу на MQL4.
  

про MQL4 спрашивают на соответствующем форуме, здесь пятерка


По вашему вопросу - выдает 4 знака после запятой Alert. следует использовать функцию DoubleToStr(). для большей точности вывода на экран

DoubleToStr - Документация на MQL4
  • docs.mql4.com
DoubleToStr - Документация на MQL4
 
Yedelkin:

 Скорее всего, эта пара терминалом предусмотрена, просто её надо подключить. Если вручную, то в "Обзоре рынка". А если по-взрослому, то програмно через SymbolSelect().

 Стоит появиться одной ошибке, как остальные сыпятся следом. Первые по очереди ошибки находятся в терминале снизу. Так что надо попробовать устранить первые ошибки, а там посмотрим :)

 

 

 

Спасибо!! Очень правильно понятно и красиво написано.  SymbolSelect() у меня в советнике Действительно есть.   Я её и выкладывал с кодом на стр. 53, если нужно её видно. Сверился со справкой- всё верно!!         Тогда если   Скорее всего, эта пара терминалом предусмотрена  - что же мне думать? 

 

Далее,  если  Первые по очереди ошибки находятся в терминале снизу. Почему не чередуются сообщения принта об ошибке и сообщения терминала- нет, они сгруппированы вместе?

Может терминал сообщает об ошибке не от этой функцции?  

 
А видимо да, не от этой!! Или от этой, но не так. Сначала сообщения программы (принты) и сообщения тирминала действитильно чередуются, а потом вдруг бух- и раз 10-12 вдруг скопом лезет самая ошибка 4002!!
 
Я видимо ещё должен поискать в коде..  где может ещё у миня индикатор 
 
Dimka-novitsek: SymbolSelect() у меня в советнике Действительно есть.   Я её и выкладывал с кодом на стр. 53, если нужно её видно.

Да, вижу. Пропробуем так:

ResetLastError();
if(SymbolSelect(a_symbol,true)) Print("Символ ",a_symbol," успешно выбран");
else Print("Неудача с выбором символа ",a_symbol,", error = ",_LastError);
 

Спасибо!! !!

 

 

Скажите пожалуста,  а принт переменной timeframe  как должен выглядеть, он может быть цифровой? Я вижу один, в смысле выводится цифра один. 

///////////////////////////////////////////////////////////////////////////////////////////////////////
 
 double  iMAf( string symbol, ENUM_TIMEFRAMES timeframe, int period, int mama_shift, ENUM_MA_METHOD mama_method, int applied_pricece, int shift){
 
    Print ( " iMAfsymbol  ",symbol,"    iMAftimeframe ",timeframe,"  iMAfperiod  ",period," iMAfmama_shift  ",mama_shift ,"  iMAfmama_method ",mama_method,
    "  iMAfapplied_pricece ", applied_pricece,"  iMAfshift ",shift);
 
                     MA_handle=iMA(symbol,timeframe,periodd(period),mama_shift, mama_method,applied_pricece);Sleep(2000);
                     //--- если не удалось создать хэндл
   if(MA_handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
     PrintFormat("Не удалось создать хэндл индикатора iMA для пары %s/%s, код ошибки %d",
                 symbol,
                  EnumToString(timeframe),
                  GetLastError()); ResetLastError();return (0.0);} 
                     
                    CopyBuffer( MA_handle,0,0,100,MA);
                    ArraySetAsSeries(MA,true);
                     if(shift>99) return(0);
    return( (MA[shift])); } 
                   
///////////////////////////////////////////////////////////////////////////////////////////////////////

Спрашиваю почему. Это функция, в ней строка с принтами. Вторая сверху соответствено. 

Вот вызов функции.

/////////////////////////////////////////////////////////////////////
int Distance_from_MA(string symbb)
{
 double MAMA = iMAf( symbb, periodd(TFMA), periodMA, ma_shift, ma_method, applied_price, 0);
 
 int spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD));
 double point = SymbolInfoDouble(symbb,SYMBOL_POINT);
 
if(SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 3 || SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 5)
{spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD)/10);
point = SymbolInfoDouble(symbb,SYMBOL_POINT)*10;}
 
 if(iClose(symb,TF_Price,0)+(spread*point)+(Min_Distance_from_MA*point)<=MAMA) return(-1);
 if(iClose(symb,TF_Price,0)-(Min_Distance_from_MA*point)>=MAMA) return (1);
 
 
 return(0);
} 

////////////////////////////////////////////////////////////////////

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

///////////////////////////////////////////////////////////////////////////////////////////////  
    
   ENUM_TIMEFRAMES  periodd(int per)
  {
   switch(per)
     {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);
      
      case 2: return(PERIOD_M2);
      case 3: return(PERIOD_M3);
      case 4: return(PERIOD_M4);      
      case 6: return(PERIOD_M6);
      case 10: return(PERIOD_M10);
      case 12: return(PERIOD_M12);
      case 16385: return(PERIOD_H1);
      case 16386: return(PERIOD_H2);
      case 16387: return(PERIOD_H3);
      case 16388: return(PERIOD_H4);
      case 16390: return(PERIOD_H6);
      case 16392: return(PERIOD_H8);
      case 16396: return(PERIOD_H12);
      case 16408: return(PERIOD_D1);
      case 32769: return(PERIOD_W1);
      case 49153: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
     }
  }  
  
  
  ///////////////////////////////////////////////////////////////////////////

 И вот что я вижу

 

 
Dimka-novitsek: Скажите пожалуста,  а принт переменной timeframe  как должен выглядеть, он может быть цифровой? Я вижу один, в смысле выводится цифра один.  

Ну, чуть ниже в этом коде ведь используется

EnumToString(timeframe), 
 
Спасибо! Щас еще гляну 
 
Dimka-novitsek: Спасибо! Щас еще гляну 

Кажется, понял, где может быть проблема. Сейчас распишу.

Из рисунка видно, что эксперт запущен на М1, timeframe==1,  period==140. Правильно?

Значение  timeframe==1 говорит, скорее всего, о том, что timeframe==М1. При этом запись periodd(period) означает periodd(140). Согласно коду функция periodd(140) должна вернуть значение PERIOD_CURRENT. Т.е получается, что periodd(140)==М1.
А это означает, что вызов iMA выглядит следующим образом: iMA(symbol,M1,M1...). Я не знаю, допустимо ли при расчёте iMA, чтобы значение второго аргумента совпадало со значением третьего аргумента (т.е., чтобы значение периода совпадало с периодом усреднения), но что-то мне подсказывает, что это неправильно.

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