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

mobidik

-----
Тренд, в данном случае - это соответствующее (стрелке) движение, которое длится до появления противоположной.
Стрелка буферная, так что показать можно на любом стрелочном индикаторе...
Вводим интовую переменную trend = 0, как только получили, например, сигнал вверх - trend = 1, если пришла стрелка вниз - trend = -1, вот и все...
 

MrGreen86

Гуру форума
Тренд, в данном случае - это соответствующее (стрелке) движение, которое длится до появления противоположной.
Стрелка буферная, так что показать можно на любом стрелочном индикаторе...
допустим 0 буфер это стрелка вверх, 1 буфер это стрелка вниз. название индикатора "trend_arrow"
когда нужно найти тренд делаем так:
int current_trend = -1;
for(int i=1;i<Bars;i++) {
double buffer_buy = iCustom(NULL,0,"trend_arrow",0,i);
double buffer_sell = iCustom(NULL,0,"trend_arrow",1,i);
if(buffer_buy!=EMPTY_VALUE) {
current_trend = 0;
break;
}
if(buffer_sell!=EMPTY_VALUE) {
current_trend = 1;
break;
}
}
вот и все. если тренд восходящий, в переменной current_trend будет 0, если нисходящий 1
 

AlanTrade

Интересующийся
Уважаемые коллеги. Открыл в редакторе стандартный индикатор MACD и ничего не понял.
Код:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2020, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Averages Convergence/Divergence"
#property strict

#include <MovingAverages.mqh>

//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
//--- indicator parameters
input int InpFastEMA=12;   // Fast EMA Period
input int InpSlowEMA=26;   // Slow EMA Period
input int InpSignalSMA=9;  // Signal SMA Period
//--- indicator buffers
double    ExtMacdBuffer[];
double    ExtSignalBuffer[];
//--- right input parameters flag
bool      ExtParameters=false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexDrawBegin(1,InpSignalSMA);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")");
   SetIndexLabel(0,"MACD");
   SetIndexLabel(1,"Signal");
//--- check for input parameters
   if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)
     {
      Print("Wrong input parameters");
      ExtParameters=false;
      return(INIT_FAILED);
     }
   else
      ExtParameters=true;
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit;
//---
   if(rates_total<=InpSignalSMA || !ExtParameters)
      return(0);
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- macd counted in the 1-st buffer
   for(i=0; i<limit; i++)
      ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
                    iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//--- signal line counted in the 2-nd buffer
  
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+

Что такое за зверь SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer); и почему и как он работает??
Заранее благодарен.
 

mobidik

-----
Уважаемые коллеги. Открыл в редакторе стандартный индикатор MACD и ничего не понял.
Код:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2020, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Averages Convergence/Divergence"
#property strict

#include <MovingAverages.mqh>

//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
//--- indicator parameters
input int InpFastEMA=12;   // Fast EMA Period
input int InpSlowEMA=26;   // Slow EMA Period
input int InpSignalSMA=9;  // Signal SMA Period
//--- indicator buffers
double    ExtMacdBuffer[];
double    ExtSignalBuffer[];
//--- right input parameters flag
bool      ExtParameters=false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexDrawBegin(1,InpSignalSMA);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")");
   SetIndexLabel(0,"MACD");
   SetIndexLabel(1,"Signal");
//--- check for input parameters
   if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)
     {
      Print("Wrong input parameters");
      ExtParameters=false;
      return(INIT_FAILED);
     }
   else
      ExtParameters=true;
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit;
//---
   if(rates_total<=InpSignalSMA || !ExtParameters)
      return(0);
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- macd counted in the 1-st buffer
   for(i=0; i<limit; i++)
      ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
                    iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//--- signal line counted in the 2-nd buffer
 
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+

Что такое за зверь SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer); и почему и как он работает??
Заранее благодарен.
Раз есть обращение к функции, а её в коде не наблюдаем - смотрим, как правило, в начало кода, в данном случае, строка 11: #include <MovingAverages.mqh>. Осталось только выяснить, что такое include и MovingAverages.mqh - надеюсь, со справкой (F1) дружите, разберетесь.
 

AlanTrade

Интересующийся
Давно наблюдаю непонятное явление. Стоит 6 индикаторов, 3 стандартные, 3 свои, но регулярно при загрузке не загружается один пользовательский. Как правило при включении терминала.
С чего бы это могло быть? Может кто сталкивался?
 

AlexeNP

Гуру форума
Давно наблюдаю непонятное явление. Стоит 6 индикаторов, 3 стандартные, 3 свои, но регулярно при загрузке не загружается один пользовательский. Как правило при включении терминала.
С чего бы это могло быть? Может кто сталкивался?
ну может долго загружается, вот терминал его и абортирует
 

MrGreen86

Гуру форума
Давно наблюдаю непонятное явление. Стоит 6 индикаторов, 3 стандартные, 3 свои, но регулярно при загрузке не загружается один пользовательский. Как правило при включении терминала.
С чего бы это могло быть? Может кто сталкивался?
критическая ошибка в индикаторе связанная с отсутствием проверок.
Смотрите журнал (вкладка эксперты), там будет написано в каком именно индикаторе, в какой стоке. Скриншот ошибки и сам индикатор приложите тут:
https://forexsystemsru.com/threads/...-bolnichka-ispravljaem-oshibki.77226/page-345
 

AlanTrade

Интересующийся
ну может долго загружается, вот терминал его и абортирует
Благодарю. Терминал работает нормально. Загрузка около 30 сек.
критическая ошибка в индикаторе связанная с отсутствием проверок.
Смотрите журнал (вкладка эксперты), там будет написано в каком именно индикаторе, в какой стоке. Скриншот ошибки и сам индикатор приложите тут:

Спасибо, да, это оно. Деление на 0 при инициализации, функция
Код:
Expand Collapse Copy
     case 1:dApZonEx=iApZonEx/MarketInfo(Symbol(),MODE_TICKVALUE)*Point();break;
MarketInfo(Symbol(),MODE_TICKVALUE) =0 Однако, что странно, при запуске индикатора из загруженного терминала MarketInfo(Symbol(),MODE_TICKVALUE) =1 .
 

AlexeNP

Гуру форума
Благодарю. Терминал работает нормально. Загрузка около 30 сек.


Спасибо, да, это оно. Деление на 0 при инициализации, функция
Код:
Expand Collapse Copy
     case 1:dApZonEx=iApZonEx/MarketInfo(Symbol(),MODE_TICKVALUE)*Point();break;
MarketInfo(Symbol(),MODE_TICKVALUE) =0 Однако, что странно, при запуске индикатора из загруженного терминала MarketInfo(Symbol(),MODE_TICKVALUE) =1 .
Серьезно? 30 секунд? ну, вот и ответ на все вопросы)
 

mobidik

-----
Код:
Expand Collapse Copy
case 1:dApZonEx=iApZonEx/MarketInfo(Symbol(),MODE_TICKVALUE)*Point();break;
MarketInfo(Symbol(),MODE_TICKVALUE) =0 Однако, что странно, при запуске индикатора из загруженного терминала MarketInfo(Symbol(),MODE_TICKVALUE) =1 .
Перед самим switch-чом сделайте проверку на "0", если равно "0" - вываливаемся с кода, ничего не делаем, если больше "0" - код выполняется дальше. Если данный switch находится в ф-ции OnInit() - switch нужно перенести в OnCalculate(), т.к. в OnInit() отрабатывает один раз, а при появлении результат "0" - нужно повторить попытку, лучше всего, это сделать на следующем тике.
 

AlanTrade

Интересующийся
Благодарю всех за содействие.

Перед самим switch-чом сделайте проверку на "0", если равно "0" - вываливаемся с кода, ничего не делаем, если больше "0" - код выполняется дальше. Если данный switch находится в ф-ции OnInit() - switch нужно перенести в OnCalculate(), т.к. в OnInit() отрабатывает один раз, а при появлении результат "0" - нужно повторить попытку, лучше всего, это сделать на следующем тике.
Выкрутился так:
Код:
Expand Collapse Copy
  if(MarketInfo(Symbol(),MODE_TICKVALUE)<2)dApZonEx=iApZonEx/Point();
  else 
    {
    switch(Period())
       {
       case 1:dApZonEx=iApZonEx/MarketInfo(Symbol(),MODE_TICKVALUE)*Point();break; и т.д.

При запуске символов с MarketInfo(Symbol(),MODE_TICKVALUE)>1 индикатор устанавливается правильно.
При MarketInfo(Symbol(),MODE_TICKVALUE)==1, как я написал, выдает 0.
Но это именно "выкрутился".
Почему при запуске терминал выдает ложное значение функции? Или это из серии глюков МТ4 типа загрузки программ до обновления данных?
 

MrGreen86

Гуру форума
Благодарю всех за содействие.


Выкрутился так:
Код:
Expand Collapse Copy
  if(MarketInfo(Symbol(),MODE_TICKVALUE)<2)dApZonEx=iApZonEx/Point();
  else
    {
    switch(Period())
       {
       case 1:dApZonEx=iApZonEx/MarketInfo(Symbol(),MODE_TICKVALUE)*Point();break; и т.д.

При запуске символов с MarketInfo(Symbol(),MODE_TICKVALUE)>1 индикатор устанавливается правильно.
При MarketInfo(Symbol(),MODE_TICKVALUE)==1, как я написал, выдает 0.
Но это именно "выкрутился".
Почему при запуске терминал выдает ложное значение функции? Или это из серии глюков МТ4 типа загрузки программ до обновления данных?
Вот только на евре MarketInfo(Symbol(),MODE_TICKVALUE) должен иметь значение 1. (5 знак, базовая валюта USD).
да, что-то из сериии глюков мт4. MQ пытаются без мыла пропихнуть свое изделие МТ5, которое даже на фондах под которые писалось работает с трудом, по этому даже не пытаются чинить МТ4. Есть мнение что даже портят, но без пруфов, теория. Я бы портил на их месте.
Благо в казино на форексе МТ5 работает нормально.
 

snakesoft

Интересующийся
Помогите новичку. Есть желание написать советника, по индикатору. Проблема в том, что индикатор рисует стрелки на покупку и продажу, но эти стрелки не буферные, а графические. Как программно определить появление следующей стрелки на графике и ее свойства (цвет или направление)?
Всем здравствуйте!!! Вот был задан вопрос!!! У меня такая же ситуация только стрелки буферные!!! Сразу скажу что с помощью iCustom вижу изменение значения буфера! Но вот засада в том, что буфер может измениться, а стрелка при этом не появляется!!!! Пробовал даже брать цвет с помощью GetPixel(Handel, x, y) но тоже не подходит так как графиков несколько!!! Подскажите как можно еще поймать буферную стрелку???Её цвет или код стрелки??? Спасибо!!!
 

Ugar

Гуру форума
Всем здравствуйте!!! Вот был задан вопрос!!! У меня такая же ситуация только стрелки буферные!!! Сразу скажу что с помощью iCustom вижу изменение значения буфера! Но вот засада в том, что буфер может измениться, а стрелка при этом не появляется!!!! Пробовал даже брать цвет с помощью GetPixel(Handel, x, y) но тоже не подходит так как графиков несколько!!! Подскажите как можно еще поймать буферную стрелку???Её цвет или код стрелки??? Спасибо!!!
Если в стрелочном буфере есть не пустое значение, значит и стрелка есть на этом баре и на этом значении. Даже если её не видно, например если задан цвет clrNONE, или значение за пределами видимости экрана.
 

11bish

Активный участник
Всем - здрасьте!
Есть советник, но без настроек торговли по времени.
Пробовал сделать по рекомендации программиста, но что-то не вышло. Выдает 2 красные ошибки, хоть тресни.
Возможно, кто подскажет/исправит, где проблема зарыта?
С плюсиком - моя попытка.
Заранее благодарен.

2020-07-30_083200.jpg
 

Вложения

AlexeNP

Гуру форума
выкинь ты их. не будут они работать... даже за пиво
 

Вложения

11bish

Активный участник
не будут они работать...
Да как-то рука не поднимается(((
Тот, который исходник, работает же, и - достаточно неплохо. Рисковый, конечно, но если ограничить по времени - может быть выхлоп. За день по 100-150 иногда выдавал с просадкой около 30. Чем плохо?
 

AlexeNP

Гуру форума
Да как-то рука не поднимается(((
Тот, который исходник, работает же, и - достаточно неплохо. Рисковый, конечно, но если ограничить по времени - может быть выхлоп. За день по 100-150 иногда выдавал с просадкой около 30. Чем плохо?
это конечно хорошо.... но в коде там столько проблемных мест, что меня начинают терзать смутные сомнения
 

11bish

Активный участник
меня начинают терзать смутные сомнения
В исходнике? Который без плюсика? Тот при компилляции ошибок вообще не выдавал.
Фишка там получается при использовании типо нейронной сети. За счет этого (молчит, молчит, потом бахнет лотом на обученной уже ситуации) и около 50% прибыли получается. Но и льет из-за этого бывает частенько. В целом же, в ту же Азию, 10-15% (деп 100-150) спокойно может слепить. Без завышения лота.
Но и спред при этом нужен минимальный.

Извиняюсь за правки)
 
Верх