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

 

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


Освоил МТ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.

 
Vladimir Karputov:

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

Угу, спасибо. можно ещё уточнить.

Это может приводить к ошибкам или это только рекомендация по культуре кодирования?

 
vladzeit:

Угу, спасибо. можно ещё уточнить.

Это может приводить к ошибкам или это только рекомендация по культуре кодирования?

Использовать винегрет никто не запрещает, НО: не запутаетесь ли Вы сами со временем с именами переменных, будете ли помнить - обновили или не обновили данные в переменной?