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

 
vladzeit:

Спасибо за пример.

Уточните ещё пожалуйста... правильно ли понял.

вот этим самым  =(datetime)OrderGetInteger. мы указываем OrderGetInteger принять явный тип datetime. ? 

Это правило касается всех функций, которые не имеют явного типа или не соответствуют типу присваиваемой переменной?  или это только частный случай?

Хочу понять, это правило или просто нужно запомнить как частный случай.  

Это не частный случай. Если в переменную одного типа записываете значение другого типа, то компилятор вас об этом предупредит. А далее уже вам решать в какую переменную принимать какие данные.

В вашем случае - при возврате из функции с типом long явного datetime-значения, конечно же безопасно и нужно явно указать тип значения, которое вы получаете из функции.

Но вот если вы принимаете в int-переменную значение double, то тут уже вы сами должны понимать не будет ли потери данных при таком присвоении. Если вы точно знаете, что возвращаемое значение поместится в int, то указывайте явно int, если не знаете, то принимайте в double-переменную.

 
Artyom Trishkin:

Это не частный случай. Если в переменную одного типа записываете значение другого типа, то компилятор вас об этом предупредит. А далее уже вам решать в какую переменную принимать какие данные.

В вашем случае - при возврате из функции с типом long явного datetime-значения, конечно же безопасно и нужно явно указать тип значения, которое вы получаете из функции.

Но вот если вы принимаете в int-переменную значение double, то тут уже вы сами должны понимать не будет ли потери данных при таком присвоении. Если вы точно знаете, что возвращаемое значение поместится в int, то указывайте явно int, если не знаете, то принимайте в double-переменную.

Спасибо за подробный ответ. Усвоил. 

 

Доброго всем творчества)))


Освоил МТ4, а вот МТ5 …. не вьезжаю((( Мало наглядных примеров , а те что есть не обьясняют нужного.

Подскажите, пожалуйста, как будут выглядеть в МТ5 отрывки из кода на МТ4 или дайте ссылки на индикаторы с подобными случаями.


1. 

if(Period()<=PERIOD_H4 && TimeHour(Time[h])==0 && TimeMinute(Time[h])==0)


2. 

while(A<1)
  {
   ObjectDelete("MB");
   OP=iOpen(NULL,Timeframe,br);
   CL=iClose(NULL,Timeframe,br);
 if(OP>CL)
   bear=(OP-CL)/_Point;
 if(SizeCandles*FactorCandleы <= bear)
   A=2;
 if(br>iBars(NULL,Timeframe))
  {
   Lab("MB", " No Bear candle", 4, 510, 1, clrWhite);
   break;
  }
   br++;
  }


3.  мне не понятно как с помощью хэндла iMa выполнять сравнение элементов... Знаю про структуры!!! Пробовал, но МТ5 не такой наглядный в отличие от МТ4...

   
 for(int i=limit; i>0 && !IsStopped(); i--)
   {
   ma1=iMA(NULL,Period(),Ma1,0,MAMethod1,MAPrice1,i);
   ma2=iMA(NULL,Period(),Ma2,0,MAMethod2,MAPrice2,i);
   ma3=iMA(NULL,Period(),Ma3,0,MAMethod3,MAPrice3,i);
   ma4=iMA(NULL,Period(),Ma4,0,MAMethod4,MAPrice4,i);
   MA=iMA(NULL,Period(),MAPeriod,0,MAMethod,MAPrice,i);
//----
 if(filtercase==true && xPer==Period())
  {
//--- High signal
 if(Open[i]<Close[i] && MA>Open[i] && MA<Close[i] && ma1>ma2 && ma1<ma3 && MA<ma4)  
   ExtLineBuffer1[i]=High[i]+shiftmap*_Point;
 if(ShowPeriod==false && xPeriod==Period())
   ExtLineBuffer1[i]=0.0;
//--- Low signal
 if(Open[i]>Close[i] && MA<Open[i] && MA>Close[i] && ma1<ma2 && ma1>ma3 && MA>ma4)  
   ExtLineBuffer2[i]=Low[i]-shiftmap*_Point;
 if(ShowPeriod==false && xPeriod==Period())
   ExtLineBuffer2[i]=0.0;
  } 
 

Общие отличия программирования в МТ5 уже понял! Но пока программировать не получается (кубики не складываются))))) 

Для меня важно СЛОЖИТЬ в моей голове эти части и модули МТ5.... В МТ4 я понимаю логику быстро, а МТ5 только "кубики".... 

Спасибо за подсказки)))

 
Просьба переделать в моем роботе фикс лот на лот в %. Код в личке.
 
Sprut112:
Просьба переделать в моем роботе фикс лот на лот в %. Код в личке.

Фриланс

 
kopeyka2:

Доброго всем творчества)))


Освоил МТ4, а вот МТ5 …. не вьезжаю((( Мало наглядных примеров , а те что есть не обьясняют нужного.

Подскажите, пожалуйста, как будут выглядеть в МТ5 отрывки из кода на МТ4 или дайте ссылки на индикаторы с подобными случаями.


1. 


2. 


3.  мне не понятно как с помощью хэндла iMa выполнять сравнение элементов... Знаю про структуры!!! Пробовал, но МТ5 не такой наглядный в отличие от МТ4...

Общие отличия программирования в МТ5 уже понял! Но пока программировать не получается (кубики не складываются))))) 

Для меня важно СЛОЖИТЬ в моей голове эти части и модули МТ5.... В МТ4 я понимаю логику быстро, а МТ5 только "кубики".... 

Спасибо за подсказки)))

Для начала внимательно ознакомьтесь с документацией. Раздел "Доступ к таймсериям и индикаторам"

Должно стать понятным как получить время, "засунуть" его в структуру и оттуда получить по отдельности час и минуту.

Там-же есть CopyBuffer для получения значений индикатора по его хендлу.

Ну, а если останутся вопросы...


 
kopeyka2:

Доброго всем творчества)))


Освоил МТ4, а вот МТ5 …. не вьезжаю((( Мало наглядных примеров , а те что есть не обьясняют нужного.

Подскажите, пожалуйста, как будут выглядеть в МТ5 отрывки из кода на МТ4 или дайте ссылки на индикаторы с подобными случаями.


1. 


2. 


3.  мне не понятно как с помощью хэндла iMa выполнять сравнение элементов... Знаю про структуры!!! Пробовал, но МТ5 не такой наглядный в отличие от МТ4...

Общие отличия программирования в МТ5 уже понял! Но пока программировать не получается (кубики не складываются))))) 

Для меня важно СЛОЖИТЬ в моей голове эти части и модули МТ5.... В МТ4 я понимаю логику быстро, а МТ5 только "кубики".... 

Спасибо за подсказки)))

Если нужно сравнивать несколько таймсерий одного таймрейма, работайте с массивом типа MqlRates -> и для заполнения этого массива используйте CopyRates.

Время удобно хранить в структуре  MqlDateTime -> для конвертации времени из datetime в структуру  MqlDateTime используйте TimeToStruct.

Теперь Ваши пример 1 будет выглядеть так:

//+------------------------------------------------------------------+
//|                                                      Test_en.mq5 |
//+------------------------------------------------------------------+
#property script_show_inputs
//--- input parameters
int InpBarTime=3; // Bar where we compare the time
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlRates rates[];
   ArraySetAsSeries(rates,true);

   int start_pos  =0;                           // start position 
   int count=(InpBarTime<10)?10:InpBarTime+1;   // data count to copy 

   int result=CopyRates(Symbol(),Period(),start_pos,count,rates);
   if(result!=count)
     {
      Print("Ordered: ",IntegerToString(count),", received ",IntegerToString(result));
     }

//--- example 1
// if(Period()<=PERIOD_H4 && TimeHour(Time[h])==0 && TimeMinute(Time[h])==0)
   MqlDateTime SDateTime;
   TimeToStruct(rates[InpBarTime].time,SDateTime); // Converts a value of datetime type into a structure variable MqlDateTime
   if(Period()<=PERIOD_H4 && SDateTime.hour==0 && SDateTime.min==0)
     {

     }
  }
//+------------------------------------------------------------------+
Файлы:
Test_en.mq5  3 kb
 
Пожалуйста подскажите. есть ли какое то правило.
В mql5 одну и туже задачу можно решить множеством способов.
Если я в одном коде обращаюсь к экземпляру класса например: CSymbolInfo.  m_symbol.Ask().. и так. далее. 
и в том же коде присваиваю Ask значение, не обращаясь к классу. например так. 
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

Вопрос: приводит ли это к ошибкам или это нормально в рамках одного кода или даже одной функции?

 
kopeyka2:

Доброго всем творчества)))


Освоил МТ4, а вот МТ5 …. не вьезжаю((( Мало наглядных примеров , а те что есть не обьясняют нужного.

Подскажите, пожалуйста, как будут выглядеть в МТ5 отрывки из кода на МТ4 или дайте ссылки на индикаторы с подобными случаями.


1. 


2. 


3.  мне не понятно как с помощью хэндла iMa выполнять сравнение элементов... Знаю про структуры!!! Пробовал, но МТ5 не такой наглядный в отличие от МТ4...

Общие отличия программирования в МТ5 уже понял! Но пока программировать не получается (кубики не складываются))))) 

Для меня важно СЛОЖИТЬ в моей голове эти части и модули МТ5.... В МТ4 я понимаю логику быстро, а МТ5 только "кубики".... 

Спасибо за подсказки)))

Работа с индикаторами - на примере кода MA Force

Шаг 1: на глобальном программном уровне объявляем переменную handle_iMA, в которой будет хранится хендл индикатора

int    handle_iMA;                           // variable for storing the handle of the iMA indicator

Шаг 2: в OnInit() создаём индикатор и возвращаем хендл созданного индикатора в переменную handle_iMA

//--- create handle of the indicator iMA
   handle_iMA=iMA(m_symbol.Name(),Inp_MA_period,Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created 
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Inp_MA_period),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

Шаг 3: в OnTick() делаем запрос - копируем определённое количество данных (count)с индикатора в массив ma[] 

   double ma[],force[];
   ArraySetAsSeries(ma,true);
   ArraySetAsSeries(force,true);
   int start_pos=0,count=InpTrendBars+3;
   if(!iGetArray(handle_iMA,0,start_pos,count,ma) || 
      !iGetArray(handle_iForce,0,start_pos,count,force))
     {
      PrevBars=0;
      return;
     }

Шаг 4: работаем с массивом данных индикатора и сравниваем его элементы:

   bool trend_up=(ma[1]>ma[2]);
   bool trend_down=(ma[1]<ma[2]);
 
vladzeit:
Пожалуйста подскажите. есть ли какое то правило.
В mql5 одну и туже задачу можно решить множеством способов.
Если я в одном коде обращаюсь к экземпляру класса например: CSymbolInfo.  m_symbol.Ask().. и так. далее. 
и в том же коде присваиваю Ask значение, не обращаясь к классу. например так. 
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

Вопрос: приводит ли это к ошибкам или это нормально в рамках одного кода или даже одной функции?

Лучше не путать и использовать один подход: или торговый класс CSymbolInfo или же системные функции вида SymbolInfoXXXX.

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