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

Alexey Belyakov #:
Господи!!! Как много всего! 

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

Типа этого:

Comment("\n\n\n\n"); // Clear previous comments
Коллеги День Добрый! Допустим есть треугольник из 3-х валютных пар, его по истории можно прогнать на МТ5 какой ни будь приблудой, в которой указаны такие показатели как лотность, направление ордеров, закрытие по указанному профиту и максимальная просадка?
Alexey Belyakov #:
 Добрый день!
Помогите пожалуйста решить одну задачу. Хочу посчитать - cколько закрытий цен после послдеднего пересечения ценой Машки. К примеру взял 9-периодную машку. 
...То есть сколько баров закрылось выше MA после последнего пересечения цены 9 -периодной MA ? 


 Мне удалось вытащить последние 100 цен Close, дальше упёрся. Не могу сообразить, как теперь посчитать количество после пересечения.


Лучше считайте сколько close выше МА9 от текущего бара до пересечения. Это и есть количество закрытых баров после пересечения… Просто это одно и то же…

Всем доброго времени суток! Вопрос по тестеру  mql5.

int Tik;
void OnTick()
{
Tik++;
if(если последний тик, или если сразу после последнего тика )Print("---------------- ",Tik);
}
//void OnDeinit()
//{
//Print ("--------------",Tik);
//}

В этом коде программа считает каждый тик. Считает в течении 1 недели.
ВОПРОС. При помощи какой функции или языковой конструкции  можно сделать так что бы Print() напечатала количество тиков 1 раз или на последнем тике, или сразу после последнего тика.
Разумеется я могу заранее посмотреть сколько тиков в недельной свече и написать в условии if( Tik== х) напечатать Print(). Но мне нужно что бы именно программа нашла нужный мне момент и напечатала Print().

Я пробовал добавлять функцию OnDeinit() и в ней печатать Print(). Но Print() не печатался.

Всем спасибо за помощь.

Андрей Кондрашов #:

Всем доброго времени суток! Вопрос по тестеру  mql5.

В этом коде программа считает каждый тик. Считает в течении 1 недели.
ВОПРОС. При помощи какой функции или языковой конструкции  можно сделать так что бы Print() напечатала количество тиков 1 раз или на последнем тике, или сразу после последнего тика.
Разумеется я могу заранее посмотреть сколько тиков в недельной свече и написать в условии if( Tik== х) напечатать Print(). Но мне нужно что бы именно программа нашла нужный мне момент и напечатала Print().

Я пробовал добавлять функцию OnDeinit() и в ней печатать Print(). Но Print() не печатался.

Всем спасибо за помощь.

int Tik = 0;

void OnTick()
{
   Tik++;
}

// Вызывается один раз, когда тестирование закончилось (только в тестере)
double OnTester()
{
   Print("---------------- OnTester: ", Tik);
   return(Tik); 
}

// Вызывается при выгрузке эксперта: конец теста, удаление с графика, перекомпиляция и т.д.
void OnDeinit(const int reason)
{
   Print("---------------- OnDeinit: ", Tik, "  reason=", reason);
}
Vladimir Deryagin #:

Спасибо.

Всем привет!

Решил разобраться со старой историй. Почему показывает неправильный расчёт?

Вывел в переменную значение iClose...  

//+------------------------------------------------------------------+
//|                                                   PriceSubW.mq5 |
//|                        Копирует график цены в отдельное подокно |
//+------------------------------------------------------------------+

#property version   "1.00"
#property indicator_separate_window   // Рисуем в отдельном окне
#property indicator_buffers 2         // Один буфер данных
#property indicator_plots     2       // Один графический график

//--- Отрисовка линии графика
#property indicator_label1  "Price Line"
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2


//--- Буфер для хранения цен
double top=0; // Вычисляет разницу между двумя инструментами
double ind_top[]; //={top};// Пытаюсь значение переменной связать с массивом


input string x1 = "EURUSD"; // инструмент EURUSD из терминала MT5
input string x2 = "GBPUSD"; // инструмент GBPUSD из терминала MT5


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Связывание массива с буфером №0
   SetIndexBuffer(0,ind_top, INDICATOR_DATA);
   
//--- Имя индикатора
   IndicatorSetString(INDICATOR_SHORTNAME, "Chart Price");
   
//--- Значение, которое терминал считает "пустым" (чтобы не рисовались нули)
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   
//--- Устанавливаем точность отображения (как у текущей пары)
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
   
   return(INIT_SUCCEEDED);
  }


int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
  
  
//--- Проверка наличия данных
   if(rates_total < 2) return(0);
      
//--- Индекс начала расчета (если это первый запуск - считаем всё)
   int start_bar = MathMax(prev_calculated - 1, 0);
   
//--- Главный цикл: заполняем буфер ценами Close
   for(int i = start_bar; i < rates_total && !IsStopped(); i++)
     {
     
 double  eur=iClose(x1,PERIOD_M5, i);
 double  eur2=iClose(x1,PERIOD_M5, 0);
 
 double  gbp=iClose(x2,PERIOD_M5, i);

 
      top =  iClose(x1,PERIOD_M5, i) - iClose(x2,PERIOD_M5, i);
      ind_top[i] = top;  //...Пытался привязать массив к истории по барам 
      
      Print ("EURUSD===  ",eur);
      Print ("EURUSD2===  ",eur2);
      
      Print ("GBPUSD===  ",gbp);
     }
     
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

1

Только текущую цену EURUSD верно показывает, остальное непонятно.. GBPUSD вообще ноль.

Alexey Belyakov #:

Всем привет!

Решил разобраться со старой историй. Почему показывает неправильный расчёт?

Вывел в переменную значение iClose...  


Только текущую цену EURUSD верно показывает, остальное непонятно.. GBPUSD вообще ноль.

Причин несколько, но главная — разное направление нумерации баров, а «ноль» и «непонятные» значения в журнале — её прямое следствие.

//+------------------------------------------------------------------+
//|                                                   PriceSubW.mq5 |
//| Разница Close двух инструментов в отдельном окне   |
//+------------------------------------------------------------------+
#property version   "1.1"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "Spread"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

input string          x1 = "EURUSD";        // Инструмент 1
input string          x2 = "GBPUSD";        // Инструмент 2
input ENUM_TIMEFRAMES tf = PERIOD_CURRENT;  // Таймфрейм

double ind_top[];

//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, ind_top, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   IndicatorSetString(INDICATOR_SHORTNAME, x1 + " - " + x2);
   IndicatorSetInteger(INDICATOR_DIGITS, (int)SymbolInfoInteger(x1, SYMBOL_DIGITS));

//--- без символа в "Обзоре рынка" данных не будет
   if(!SymbolSelect(x1, true) || !SymbolSelect(x2, true))
     {
      Print("Символ не найден у брокера: ", x1, " / ", x2);
      return(INIT_PARAMETERS_INCORRECT);
     }
   return(INIT_SUCCEEDED);
  }

//--- история символа загружена и синхронизирована?
bool Ready(const string sym)
  {
   return(Bars(sym, tf) > 0 && (bool)SeriesInfoInteger(sym, tf, SERIES_SYNCHRONIZED));
  }

//--- Close символа sym на баре, соответствующем времени t
double CloseAt(const string sym, const datetime t)
  {
   int sh = iBarShift(sym, tf, t, false);
   if(sh < 0)
      return(0.0);
   if(iTime(sym, tf, sh) > t)   // время раньше начала истории символа
      return(0.0);
   return(iClose(sym, tf, sh));
  }

//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total < 2)
      return(0);

//--- данные ещё подкачиваются — пересчитаем всё на следующем тике
   if(!Ready(x1) || !Ready(x2))
      return(0);

   int start = (prev_calculated > 0) ? prev_calculated - 1 : 0;

//--- i идёт от старых баров к новым, как и time[]
   for(int i = start; i < rates_total && !IsStopped(); i++)
     {
      double p1 = CloseAt(x1, time[i]);
      double p2 = CloseAt(x2, time[i]);
      ind_top[i] = (p1 > 0 && p2 > 0) ? p1 - p2 : EMPTY_VALUE;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
Vladimir Deryagin #:
AMES

Очень круто! Спасибо! 

Всем добрый день.
Есть пара вопросов.
Разработана торговая стратегия - комплект индикаторов (три основных и два вспомогательных) и робот на их основе (терминалы МТ4 и МТ5).
Подробная информация в блоге на этом ресурсе - https://www.mql5.com/ru/users/neophyte_2014/blog

Занимался прямыми продажами, но честно говоря задолбался по причине возраста плюс свалившейся инвалидности.
Планирую разместить элементы системы на маркете, возможно это облегчит жизнь.
Небольшой технический вопрос. 
Обязательно ли удалять гиперссылки в свойствах индикаторов и робота, ведущие на мой персональный блог?
Если да, то можно ли заменить их гиперссылками на блог на данном ресурсе?

Сорри, если вопрос тупой и ответ на него есть. Со зрением тоже проблемы, мог не увидеть.

Nikolay Skrigan
Nikolay Skrigan
  • www.mql5.com
Профиль трейдера