Ваши вопросы по языку MQL4

Ugar

Гуру форума
Ну теперь понятно мне, что придется в цикле перебирать все бары, однако, покаместь я не знаю как это сделать..
Перебор минимумов баров от бара начала дня до 1 бара.
Код:
int start_bar=iBarShift(NULL,PERIOD_M30,iTime(NULL,PERIOD_D1,0));
double low=0;
if(start_bar>0)
{
low=EMPTY_VALUE;
for(int i=start_bar; i>0; i--)
{
double ilow=iLow(NULL,PERIOD_M30,i);
if(low>ilow)low=ilow;
}
}
 

AskBid

Интересующийся
Перебор минимумов баров от бара начала дня до 1 бара.
Код:
int start_bar=iBarShift(NULL,PERIOD_M30,iTime(NULL,PERIOD_D1,0));
double low=0;
if(start_bar>0)
{
low=EMPTY_VALUE;
for(int i=start_bar; i>0; i--)
{
double ilow=iLow(NULL,PERIOD_M30,i);
if(low>ilow)low=ilow;
}
}

В последней строчке с оператором if, я попробовал вывести на экран переменную принтом Print(low); и получаю попеременный результат из двух цен на паре евро_доллар, 1.08583, 1.08548, это так и должно быть?

И разумеется, спасибо!
 

Ugar

Гуру форума
В последней строчке с оператором if, я попробовал вывести на экран переменную принтом Print(low); и получаю попеременный результат из двух цен на паре евро_доллар, 1.08583, 1.08548, это так и должно быть?

И разумеется, спасибо!
В этом месте он ещё ищет минимум перебирая бары. Результат надо смотреть после закрытия последней фигурной скобки.
 

max020780

Новичок форума
Подскажите пожалуйста как правильно получить цену пересечения двух MA
 

max020780

Новичок форума
Спасибо с этим разобрался , остался вопрос Подскажите пожалуйста как найти номера баров пересечения Машек в количестве допустим 5 последних пересечений за текущий день
 

mobidik

-----
Спасибо с этим разобрался , остался вопрос Подскажите пожалуйста как найти номера баров пересечения Машек в количестве допустим 5 последних пересечений за текущий день

Вот Вам пример поиска последних n пересечений МА, а вот относятся ли они к текущему дню - уже пробуйте сделать сами:

PHP:
    int x = 5;      // Cколько нужно пересечений
    int b = 0;      // Считать с бара
    int cnt = 0;    // Задаем и обнуляем счетчик
    int num_x[];    // Создаем массив для хранения № баров пересечения
    ArrayResize(num_x,x); //Установим массив нужного размера
    
    while(cnt<x)   // Будем перебирать бары b до тех пор, пока не найдем заданное кол. пересеч.
     {
       if((ma1[b+1]>ma2[b+1] && ma1[b+2]<ma2[b+2])||(ma1[b+1]<ma2[b+1] && ma1[b+2]>ma2[b+2]))
        { 
          num_x[cnt] = b;  // запомним № бара пересечения
          cnt++;           // увеличим счетчик на 1
        }  
       b++;                // перейдем к проверке следующего бара
     }
 

malojorsk

Новичок форума
Делаю советник из индикатора, вход по стрелке
Нужно получить значение - какая последняя стрелка была,
через iCustom - не получается, меняются значения (при стрелке вверх значение может быть как больше, так и меньше другого)
HTML:
arrbuy = iCustom(NULL, 0, "indi2", TimeFrame, RsiPeriod, MaType, MaPeriod, Interpolate, arrowsIdentifier, arrowsUpColor, arrowsDnColor, 0, 0);
   arrsell = iCustom(NULL, 0, "indi2", TimeFrame, RsiPeriod, MaType, MaPeriod, Interpolate, arrowsIdentifier, arrowsUpColor, arrowsDnColor, 1, 0);

Подскажите как реализовать?
 

AskBid

Интересующийся
Добрый день, Ugar - и снова я к вам с просьбой помочь мне, потихонечку пытаюсь понять как работают те или иные функции, на примере вашего кода, создал зеркальную функцию поиска вершинки, попробовал создать функцию а потом вызвать ее. сделал и на выходе получил совсем не то, что хотел, иногда цена соответсвует вершинке, но, низинка неверная, и наоборот..ошибок не получаю,но что я делаю не так, подскажите !
PHP:
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int bar_index = iBarShift(NULL,PERIOD_M30,iTime(NULL,PERIOD_D1,0));

int OnInit()
  {
 

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
GetMinPrice();  
GetMaxPrice(); 
Print(GetMinPrice()," Low ",GetMaxPrice()," High ",bar_index);  

}
//+------------------------------------------------------------------+

double GetMinPrice()
{

   double low = 0;
   if(bar_index > 0)
   {
      low = EMPTY_VALUE;
      for(int i = bar_index; i > 0; i--)
      {
         double ilow = iLow(NULL,PERIOD_M30,i);
         if(low > ilow)
            low = ilow;
      }
    }
return(low);        
}

//+------------------------------------------------------------------+
double GetMaxPrice()
{

   double high = 0;
   if(bar_index > 0)
   {
      high = EMPTY_VALUE; 
      for(int i = bar_index; i > 0; i--) 
      {
         double ihigh = iHigh(NULL,PERIOD_M30,i);
         if(high > ihigh)
            high = ihigh;
            
      }
    }
return(high);        
}
 

max020780

Новичок форума
Подскажите где ошибка почему рисует линии не на точках пересичения MA а просто рядом друг с другом
PHP:
//+------------------------------------------------------------------+//|                                      подсчет пересечений Ma .mq4 |//|                        Copyright 2017, MetaQuotes Software Corp. |//|                                             https://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2016, MetaQuotes Software Corp."#property link      "https://www.mql5.com"#property version   "1.00"#property strictextern int Баров = 500;  // Баров для подсчета пересечений МАextern int MA_1  =10;extern int MA_2  =100;void OnTick(){  int Бар, Счетчик;  double MA_1_Предыдущая, MA_2_Предыдущая,         MA_1_Следующая,  MA_2_Следующая;  ObjectsDeleteAll(); // Удалить вертикальные линии  for(Счетчик=0, Бар=0; Бар<Баров; Бар++) // Начинаем с послнего бара  {    MA_1_Предыдущая = iMA(Symbol(),PERIOD_M5,MA_1,0,MODE_SMA,PRICE_CLOSE,Бар+1);    MA_1_Следующая  = iMA(Symbol(),PERIOD_M5,MA_1,0,MODE_SMA,PRICE_CLOSE,Бар);    MA_2_Предыдущая = iMA(Symbol(),PERIOD_M5,MA_2,0,MODE_SMA,PRICE_CLOSE,Бар+1);    MA_2_Следующая  = iMA(Symbol(),PERIOD_M5,MA_2,0,MODE_EMA,PRICE_CLOSE,Бар);    if((MA_1_Предыдущая>=MA_2_Предыдущая && MA_1_Следующая<=MA_2_Следующая) ||       (MA_1_Предыдущая<=MA_2_Предыдущая && MA_1_Следующая>=MA_2_Следующая))    {      Счетчик++;      Alert(Счетчик, "  Бар = ", Бар, "  T = ",Time[Бар]);      // Создать вертикальную линию      ObjectCreate( (string)Счетчик+"_"+(string)Бар,OBJ_VLINE,0,Time[Бар],0);      if(Счетчик == 5) break;  // 5 линий есть - выход    }  }}
 
Последнее редактирование:

Omukchaan

Элитный участник
Делаю советник из индикатора, вход по стрелке
Нужно получить значение - какая последняя стрелка была,
через iCustom - не получается, меняются значения (при стрелке вверх значение может быть как больше, так и меньше другого)
HTML:
arrbuy = iCustom(NULL, 0, "indi2", TimeFrame, RsiPeriod, MaType, MaPeriod, Interpolate, arrowsIdentifier, arrowsUpColor, arrowsDnColor, 0, 0);
   arrsell = iCustom(NULL, 0, "indi2", TimeFrame, RsiPeriod, MaType, MaPeriod, Interpolate, arrowsIdentifier, arrowsUpColor, arrowsDnColor, 1, 0);

Подскажите как реализовать?

Привет!
Возможно буфера перепутал.
 

max020780

Новичок форума
Подскажите пожалуйста как правильно и более точно получить цену пересечения двух машек
 

Вложения

  • Безымянный.png
    Безымянный.png
    18,1 КБ · Просмотры: 28

malojorsk

Новичок форума
Подскажите пожалуйста как правильно и более точно получить цену пересечения двух машек
через iMA доставать значение каждой, затем ловить пересечение
HTML:
     maB = iMA(NULL, 0, Период_Большой_МА, 0, MODE_EMA, PRICE_CLOSE, 0);
     maM = iMA(NULL, 0, Период_Малой_МА, 0, MODE_EMA, PRICE_CLOSE, 0);
     
     if (maB > maM)
 

max020780

Новичок форума
Не могу найти где ошибся в расчетах может кто поможет
Нужно найти максимум и минимум прошлого дня , но почему то минимум находит аж в позапрошлом дне
PHP:
//Найдем день неделиint DayWeek=TimeDayOfWeek(TimeCurrent());//Сегодняшний деньdatetime timsegodny=TimeCurrent();MqlDateTime time; time.year=TimeYear(TimeCurrent());   // год  time.mon=TimeMonth(TimeCurrent());    // месяц  time.day=TimeDay(TimeCurrent());    // день  time.hour=0;  // час  time.min=0;    // минуты timsegodny=StructToTime(time);// Количество баров от начала дня сегодня //NumberBar=iBarShift(Symbol(),TF,timsegodny);//--------------------------------------//// сегодняшний день 2datetime timeseg=TimeCurrent();MqlDateTime seg;TimeToStruct(timeseg,seg); seg.hour=0;  // час  seg.min=0;    // минуты timeseg=StructToTime(seg);// Вчерашний деньif(DayWeek==1){timevhera=TimeCurrent()-72*60*60;}if(DayWeek==2 || DayWeek==3 ||DayWeek==4 ||DayWeek==5) {timevhera=TimeCurrent()-24*60*60;}MqlDateTime vhera;TimeToStruct(timevhera,vhera); vhera.hour=0;  // час  vhera.min=5;    // минуты timevhera=StructToTime(vhera);// Количество баров от начала вчерашнего  дня //NumberBarVhera=iBarShift(Symbol(),TF,timevhera);int countVhera=Bars(Symbol(),TF,timevhera,timeseg);// Найдем максимум и минимум прошлого дняHighIndexMP3Sell=iHighest(Symbol(),TF,MODE_HIGH,NumberBarVhera,NumberBar); // получаем индекс бара максимума прошлого дняLowIndexMP3Buy=iLowest(Symbol(),TF,MODE_LOW,NumberBarVhera,NumberBar); // получаем индекс бара минимума прошлого дня аж на позавчерашнем дне
 
Последнее редактирование:

alexshell

Элитный участник
Не могу найти где ошибся в расчетах может кто поможет
Нужно найти максимум и минимум прошлого дня , но почему то минимум находит аж в позапрошлом дне
PHP:
//Найдем день неделиint DayWeek=TimeDayOfWeek(TimeCurrent());//Сегодняшний деньdatetime timsegodny=TimeCurrent();MqlDateTime time; time.year=TimeYear(TimeCurrent());   // год  time.mon=TimeMonth(TimeCurrent());    // месяц  time.day=TimeDay(TimeCurrent());    // день  time.hour=0;  // час  time.min=0;    // минуты timsegodny=StructToTime(time);// Количество баров от начала дня сегодня //NumberBar=iBarShift(Symbol(),TF,timsegodny);//--------------------------------------//// сегодняшний день 2datetime timeseg=TimeCurrent();MqlDateTime seg;TimeToStruct(timeseg,seg); seg.hour=0;  // час  seg.min=0;    // минуты timeseg=StructToTime(seg);// Вчерашний деньif(DayWeek==1){timevhera=TimeCurrent()-72*60*60;}if(DayWeek==2 || DayWeek==3 ||DayWeek==4 ||DayWeek==5) {timevhera=TimeCurrent()-24*60*60;}MqlDateTime vhera;TimeToStruct(timevhera,vhera); vhera.hour=0;  // час  vhera.min=5;    // минуты timevhera=StructToTime(vhera);// Количество баров от начала вчерашнего  дня //NumberBarVhera=iBarShift(Symbol(),TF,timevhera);int countVhera=Bars(Symbol(),TF,timevhera,timeseg);// Найдем максимум и минимум прошлого дняHighIndexMP3Sell=iHighest(Symbol(),TF,MODE_HIGH,NumberBarVhera,NumberBar); // получаем индекс бара максимума прошлого дняLowIndexMP3Buy=iLowest(Symbol(),TF,MODE_LOW,NumberBarVhera,NumberBar); // получаем индекс бара минимума прошлого дня аж на позавчерашнем дне
Что то чересчур сложно)))
max=iHigh(Symbol(),PERIOD_D1,1);//макс. вчер. дня
min=iLow(Symbol(),PERIOD_D1,1);// мин. вчер. дня
 

Ugar

Гуру форума
Ну для форекса я думаю пятница в понедельник является вчерашним днем.
А если это принципиально, в любом случае можно как то выкрутится.
У некоторых ДЦ сдвинуто время. Например, в пятницу торговля заканчивается в 22:00, а торговля начинается в воскресенье в 22:00.
Тогда в воскресенье есть бары, в том числе и дневной.
 
Верх