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

 
Leo59:

...

А, может быть, у кого-нибудь в архивах есть уже готовый?

Ким выкладывал функцию. Ф-ция возвращает цену точки луча, проведённого от линии вправо.

//+----------------------------------------------------------------------------+
double EquationDirect(double x1, double y1, double x2, double y2, double x) {
  return((x2==x1)?y1:(y2-y1)/(x2-x1)*(x-x1)+y1);
}
//+----------------------------------------------------------------------------+

х1 - бар первой координаты линии, у1 - цена первой координаты линии. х2 - бар второй координаты линии, у2 - цена второй координаты линии, х - бар, для которого вернёт цену.

Можно найти для каждой из двух линий цены, ну и посмотреть пересекаются ли они..

 
Спасибо большое Алексею и Артёму за внимание к моему вопросу!

Я тут написал вроде..., что-то считается и рисуется, но не на каждом пересечении. Что-то не корректно у меня написано. А, в чём дело, не пойму.



#property indicator_separate_window
#property indicator_buffers 4

#property indicator_color1  Aqua                 // Массив 
#property indicator_width1  1
#property indicator_color2  Blue                 // Массив 
#property indicator_width2  1

#property indicator_color3  Lime                 // 
#property indicator_color4  Red                  // 


double   Buf0[];                                 // Массив
double   Buf1[];                                 // Массив

double   y1=0;                                   // Координата Значения буфера Buf0[] на баре с индексом i=2
double   y2=0;                                   // Координата Значения буфера Buf0[] на баре с индексом i=1
double   y3=0;                                   // Координата Значения буфера Buf1[] на баре с индексом i=2
double   y4=0;                                   // Координата Значения буфера Buf1[] на баре с индексом i=1

double   x1=2;                                   // Координата Времени Buf0[] на баре с индексом i=2
double   x2=1;                                   // Координата Времени Buf0[] на баре с индексом i=1
double   x3=2;                                   // Координата Времени Buf1[] на баре с индексом i=2
double   x4=1;                                   // Координата Времени Buf1[] на баре с индексом i=1

double   X=0;                                    // Точка пересечения. Координата по оси Времени
double   Y=0;                                    // Точка пересечения. Координата по оси Значения

double   k1=0;                                   // Тангенс угла наклона 1-первого отрезка
double   k2=0;                                   // Тангенс угла наклона 2-второго отрезка

double   PointX=0;                               // Значение индикатора в точке пересечения отрезков

double   UpArrow[];                              // Зелёные стрелки внизу индикаторного окна
double   DnArrow[];                              // Красные стрелки вверху индикаторного окна

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
   {
    SetIndexBuffer(0,Buf0);       
    SetIndexStyle(0,DRAW_LINE);

    SetIndexBuffer(1,Buf1); 
    SetIndexStyle(1,DRAW_LINE);
   
    SetIndexBuffer(2,UpArrow);                   // Зелёные стрелки внизу индикаторного окна
    SetIndexStyle(2,DRAW_ARROW);
    SetIndexArrow(2,233);

    SetIndexBuffer(3,DnArrow);                   // Красные стрелки вверху индикаторного окна
    SetIndexStyle(3,DRAW_ARROW);
    SetIndexArrow(3,234);
  
    return(0);
   }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
   {
    int i; 
    int limit;
    int counted_bars=IndicatorCounted();
    if(counted_bars<0) return(-1);
    if(counted_bars>0) counted_bars--;
    limit=Bars-counted_bars;

    for(i=limit; i>=0; i--)
         Buf0[i] = ....;

    for(i=limit; i>=0; i--)
         Buf1[i] = ....;

    Fun_New_Bar();
    if (New_Bar==true)
        {
         y1=Buf0_[2];
         y2=Buf0_[1];
         y3=Buf1_[2];
         y4=Buf1_[1];
         
         X=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
         Y=((y3-y4)*X-(x3*y4-x4*y3))/(x4-x3);

         if( ((x1<=X)&&(x2>=X)&&(x3<=X)&&(x4 >=X)) || ((y1<=Y)&&(y2>=Y)&&(y3<=Y)&&(y4>=Y)) )       // Проверка на "Пересечение линий вне отрезков"
             {
              if(y2-y1 != 0)                                                                       // Проверка 1-первого отрезка на вырождение в точку
                  {
                   k1=(x2-x1)/(y2-y1);                                                             // Тангенс угла наклона 1-первого отрезка
                   if(y4-y3 != 0)                                                                  // Проверка 2-второго отрезка на вырождение в точку
                       {
                        k2=(x4-x3)/(y4-y3);                                                        // Тангенс угла наклона 2-второго отрезка
                        if(k1 != k2)                                                               // Проверка прямых(отрезков) на параллельность
                            {
                             PointX=Y;                                                             // Значение индикатора в точке пересечения отрезков
                             if(PointX>=0) UpArrow[1]=-0.001;
                             if(PointX< 0) DnArrow[1]= 0.001;
                            }
                        //else              // Alert("Прямые(отрезки) параллельны");
                       }
                   //else              // Alert("2-второй отрезок выродился в точку");
                  }
              //else              // Alert("1-первый отрезок выродился в точку");
             }
         //else              // Alert("Пересечение вне, хотя бы одного, отрезка");
        }
    return(0);
   }
//+------------------------------------------------------------------+
void Fun_New_Bar()
   { 
    static datetime New_Time=0;
    New_Bar=false;
    if(New_Time!=Time[0])
        {
         New_Time=Time[0];
         New_Bar=true;
        }
   }
 
Leo59:
Спасибо большое Алексею и Артёму за внимание к моему вопросу!

Я тут написал вроде..., что-то считается и рисуется, но не на каждом пересечении. Что-то не корректно у меня написано. А, в чём дело, не пойму.

В текущий момент, я не в состоянии что-либо понимать в программировании, у моей любимой жены сегодня день варенья. Ей исполнилось 18 лет и 384 месяца.

Но!!! Обрати внимание, что пересечение линий может произойти ВНЕ или МЕЖДУ барами, а цену (координату Y) можно получить только на баре. Или до того как, или после, но точку пересечения не всегда можно определить. Я-бы сказал что это редкость. Учитывая вышесказанное, пересмотри свой код с учётом этого, может получится.

 

Alexey Viktorov 2015.12.12 17:33 RU

Ей исполнилось 18 лет

Алексей, так теперь вам всё можно! Счастливы вы.... Поздравляю!
 
TanFX:
Подскажите пожалуйста, что нужно вставить (какой набор команд) в советник чтобы при пересчете он автоматически исправлял уже установленные тейкпрофиты в открытых позициях. Или может есть скрипт который исправляет все стопы по последнему заданному?
про сопровождение позиции тут https://www.mql5.com/ru/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

Пожалуйста подскажите как дописать код чтобы в тестере стратегий можно было изменять -подбирать веса паттернов модели. m_pattern_0(90) заменить input переменными

С ООП у меня не очень хорошо, ошибки то "member function not defined", то просто не работает код

Подобный вопрос без ответа тут https://www.mql5.com/ru/forum/13484

p.s.: c CiCustom  кажется получается менять моделям веса, а со стандартными индикаторами у которых стандартные классы (типа CSignalEnvelopes  и др) где существуют методы для настройки значимости каждой модели, но они пока недоступны из Мастера? 
Или может уже где подсказывался на это ответ?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
В МТ4(Alpari-Demo) хочу сохранить в файл архив котировок длиннее, чем по умолчанию (2048 свечей). Удаляю то, что было, нажимаю "Загрузить".
 С сайта MetaQuotes что-то грузится, получаю такую картину:

Наверху : База данных 2049/12358 записей.
Свечи: предпоследняя от 17.10.2014, последняя - 14.07.1993.
А где же пропущенные ?
 
Нажмите "Загрузить". Автоматически загружаются только последние 2048 баров, остальные нужно пнуть.
 
Здравствуйте!

Может быть у кого-нибудь есть пример кода, который рисует какие-нибудь значки, например, стрелки на графике индикатора, при пересечении линий, если их две, или при пересечении "0" линии, или при любом другом критерии? Желательно, у верхней и нижней границы самомасштабирующегося индикаторного окна.
 
Sergei Vladimirov:
Нажмите "Загрузить". Автоматически загружаются только последние 2048 баров, остальные нужно пнуть.
Так это и вышло после "Загрузить" ...