Прогнозы по методам Ганна от funny59 и не только ... Попытка создать ГРААЛЬ!!!

Alica

Активный участник
Здравствуйте можно скрипт скачать и объяснить как им пользоваться, читаю ветку но вопросов очень много, хорошо что есть то что экономит время
Вот так мышкой смотрим сколько баров до 1 и 2 точки от самого последнего бара на графике для нашего начального импульса для которого мы хотим построить линии Ганна, и вносим полученные значения в настройки скрипта
 

Вложения

  • Безымянный.png
    Безымянный.png
    25,1 КБ · Просмотры: 68
  • Безымянный2.png
    Безымянный2.png
    51,6 КБ · Просмотры: 66
  • Like
Реакции: saw

Genry_05

Отдыхает
Вот так мышкой смотрим сколько баров до 1 и 2 точки от самого последнего бара на графике для нашего начального импульса для которого мы хотим построить линии Ганна, и вносим полученные значения в настройки скрипта
Ihor Herasko 2019.05.22 как узнать время или номер бара на котором кликнули мышкой:
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
   if (id != CHARTEVENT_CLICK) 
      return;
    
   int nSubWindow = -1;
   datetime dtTime = 0;
   double fPrice = 0.0;
   if (!ChartXYToTimePrice(0, int(lparam), int (dparam), nSubWindow, dtTime, fPrice))
      return;
    
   if (dtTime > iTime(NULL, PERIOD_CURRENT, 0))
      return;
    
   int nBarIndex = iBarShift(NULL, PERIOD_CURRENT, dtTime);
   Alert("Время открытия бара: ", dtTime, ", индекс бара: ", nBarIndex);
}
 
Последнее редактирование:

Alica

Активный участник
Ihor Herasko 2019.05.22 как узнать время или номер бара на котором кликнули мышкой:
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
   if (id != CHARTEVENT_CLICK)
      return;
  
   int nSubWindow = -1;
   datetime dtTime = 0;
   double fPrice = 0.0;
   if (!ChartXYToTimePrice(0, int(lparam), int (dparam), nSubWindow, dtTime, fPrice))
      return;
  
   if (dtTime > iTime(NULL, PERIOD_CURRENT, 0))
      return;
  
   int nBarIndex = iBarShift(NULL, PERIOD_CURRENT, dtTime);
   Alert("Время открытия бара: ", dtTime, ", индекс бара: ", nBarIndex);
}
Спасибо Генри, очень интересно. Надо подумать как это в скрипт можно добавить, я не очень сильна в этом:)

Если кому то нужно будет я могу попробовать добавить код Генри что бы можно было в скрипте указывать 2 точки по щелчкам мышки, кстати очень удобно для постройки линий Ганна скриптом на глубокой истории тогда будет
 
Последнее редактирование:

Genry_05

Отдыхает
Спасибо Генри, очень интересно. Надо подумать как это в скрипт можно добавить, я не очень сильна в этом:)

Если кому то нужно будет я могу попробовать добавить код Генри что бы можно было в скрипте указывать 2 точки по щелчкам мышки, кстати очень удобно для постройки линий Ганна скриптом на глубокой истории тогда будет
Alica, день добрый!
Имеет смысл переделать скрипт в индикатор с кнопкой.
После нажатия кнопки фиксируется два клика мышью и кнопка отжимается.
Так можно выделять более одного импульса на графике без повторного вызова скрипта.
 

Alica

Активный участник
Alica, день добрый!
Имеет смысл переделать скрипт в индикатор с кнопкой.
После нажатия кнопки фиксируется два клика мышью и кнопка отжимается.
Так можно выделять более одного импульса на графике без повторного вызова скрипта.
Было бы еще очень интересно совместить его с каким то трендовым индикатором, который указывал бы на возможное изменение тренда, например с тем же зигзагом и что бы он автоматически выставлял линии Ганна при новом "сломе". Но пока не спешу с этим нужно подумать надо всем. Вот если бы еще можно было бы узнавать программно какой бар пересекает линию, но это не для этой ветки видимо надо поспрашивать у mql4 программистов🙂
 

Genry_05

Отдыхает
.... Вот если бы еще можно было бы узнавать программно какой бар пересекает линию, но это не для этой ветки видимо надо поспрашивать у mql4 программистов🙂
Поиск точки пробоя линии на графике:
// Поиск точки пробоя линии на графике
void fLineBreak(string Name               // Имя линии
               ,int& Bar1,double& Price1  // Точка начала
               ,int& Bar2,double& Price2  // Точка касания
               ,int& Bar3,double& Price3  // Точка пробоя
               ,double& Speed){           // Наклон линии
   datetime Time1, Time2;
   int Type;
   Bar1=LastBar-1;
   Bar2=LastBar-1;
   Bar3=LastBar-1;
   Price1=0;
   Price2=0;
   Price3=0;
   Speed=0;
   if( ObjectFind(Name)!=0 ){
      if( РежимОтладки ) Print("***   "+Name+" не найден");
      return;
   }
   Time1=ObjectGet(Name,OBJPROP_TIME1);
   Bar1=iBarShift(NULL,0,Time1);
   Price1=ObjectGet(Name,OBJPROP_PRICE1);
   Type=ObjectType(Name);
   switch( Type ){
      case  OBJ_TREND   :  // Наклонная линия(основной тип)
                           Time2=ObjectGet(Name,OBJPROP_TIME2);
                           Bar2=iBarShift(NULL,0,Time2);
                           Price2=ObjectGet(Name,OBJPROP_PRICE2);
                           break;
      case  OBJ_HLINE   :  // Горизонтальная линия
                           Bar2=LastBar;
                           Time2=Time[Bar2];
                           Price2=Price1;
                           break;
      default           :  // Необрабатываемый объект
                           Print("***   "+Name+" недопустимый тип: "+Type);
                           return;
   }
   if( Bar1<=Bar2
    || Bar1<=LastBar
    || Bar2<LastBar
    || Price1<Zero
    || Price2<Zero ){
      if( РежимОтладки ) Print("***   "+Name+" не обработан, параметры: "
                    +DoubleToStr(Price1,Digits)+" ("+Bar1+"/"+TimeToStr(Time1)+")..."
                    +DoubleToStr(Price2,Digits)+" ("+Bar2+"/"+TimeToStr(Time2)+")");
      return;
   }
   Speed=fSpeed(Name,Bar1,Price1,Bar2,Price2);
   // "3"-первый слева пробой на интервале "2" ... LastBar
   fBreakPoint(Name,Bar2,Price2,Speed,LastBar,Bar3,Price3);
   return;
}
----------------------------------------
Вариант 2
----------------------------------------
вариант 2:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
// Условие пересечения линии вверх текущей ценой открытия
   double PriceBar0 = PriceLine(TimeTochka1, PriceTochka1, TimeTochka2, PriceTochka2, 0);
   double PriceBar1 = PriceLine(TimeTochka1, PriceTochka1, TimeTochka2, PriceTochka2, 1);
   bool   SignalBuy=false;  
   if(PriceBar0>0 && PriceBar1>0 && Open[0]>PriceBar0 && Open[1]<=PriceBar1) SignalBuy=true;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double PriceLine(datetime t1, double p1, datetime t2, double p2, int bar){
   double kKoef = 0.0, price=0.0;
   double bKoef = Koeff(iBarShift(NULL,0,t1), p1, iBarShift(NULL,0,t2), p2, kKoef);
   if(bKoef == DBL_MAX) return;

// Цена линии на N-баре (bar=0 текущий бар, =1 предыдущий бар)
   int BarIndex = bar;
       price=kKoef*BarIndex+bKoef;
return(price);}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Koeff(int x1, double y1, int x2, double y2, double &kKoef){
   if (x1==x2) return(DBL_MAX);    
       kKoef=(y2-y1)/(x2-x1);
return(y1 - kKoef * x1);}
//+------------------------------------------------------------------+
 
Последнее редактирование:

Alica

Активный участник
Поиск точки пробоя линии на графике:
// Поиск точки пробоя линии на графике
void fLineBreak(string Name               // Имя линии
               ,int& Bar1,double& Price1  // Точка начала
               ,int& Bar2,double& Price2  // Точка касания
               ,int& Bar3,double& Price3  // Точка пробоя
               ,double& Speed){           // Наклон линии
   datetime Time1, Time2;
   int Type;
   Bar1=LastBar-1;
   Bar2=LastBar-1;
   Bar3=LastBar-1;
   Price1=0;
   Price2=0;
   Price3=0;
   Speed=0;
   if( ObjectFind(Name)!=0 ){
      if( РежимОтладки ) Print("***   "+Name+" не найден");
      return;
   }
   Time1=ObjectGet(Name,OBJPROP_TIME1);
   Bar1=iBarShift(NULL,0,Time1);
   Price1=ObjectGet(Name,OBJPROP_PRICE1);
   Type=ObjectType(Name);
   switch( Type ){
      case  OBJ_TREND   :  // Наклонная линия(основной тип)
                           Time2=ObjectGet(Name,OBJPROP_TIME2);
                           Bar2=iBarShift(NULL,0,Time2);
                           Price2=ObjectGet(Name,OBJPROP_PRICE2);
                           break;
      case  OBJ_HLINE   :  // Горизонтальная линия
                           Bar2=LastBar;
                           Time2=Time[Bar2];
                           Price2=Price1;
                           break;
      default           :  // Необрабатываемый объект
                           Print("***   "+Name+" недопустимый тип: "+Type);
                           return;
   }
   if( Bar1<=Bar2
    || Bar1<=LastBar
    || Bar2<LastBar
    || Price1<Zero
    || Price2<Zero ){
      if( РежимОтладки ) Print("***   "+Name+" не обработан, параметры: "
                    +DoubleToStr(Price1,Digits)+" ("+Bar1+"/"+TimeToStr(Time1)+")..."
                    +DoubleToStr(Price2,Digits)+" ("+Bar2+"/"+TimeToStr(Time2)+")");
      return;
   }
   Speed=fSpeed(Name,Bar1,Price1,Bar2,Price2);
   // "3"-первый слева пробой на интервале "2" ... LastBar
   fBreakPoint(Name,Bar2,Price2,Speed,LastBar,Bar3,Price3);
   return;
}
----------------------------------------
Вариант 2
----------------------------------------
вариант 2:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
// Условие пересечения линии вверх текущей ценой открытия
   double PriceBar0 = PriceLine(TimeTochka1, PriceTochka1, TimeTochka2, PriceTochka2, 0);
   double PriceBar1 = PriceLine(TimeTochka1, PriceTochka1, TimeTochka2, PriceTochka2, 1);
   bool   SignalBuy=false;
   if(PriceBar0>0 && PriceBar1>0 && Open[0]>PriceBar0 && Open[1]<=PriceBar1) SignalBuy=true;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double PriceLine(datetime t1, double p1, datetime t2, double p2, int bar){
   double kKoef = 0.0, price=0.0;
   double bKoef = Koeff(iBarShift(NULL,0,t1), p1, iBarShift(NULL,0,t2), p2, kKoef);
   if(bKoef == DBL_MAX) return;

// Цена линии на N-баре (bar=0 текущий бар, =1 предыдущий бар)
   int BarIndex = bar;
       price=kKoef*BarIndex+bKoef;
return(price);}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Koeff(int x1, double y1, int x2, double y2, double &kKoef){
   if (x1==x2) return(DBL_MAX);  
       kKoef=(y2-y1)/(x2-x1);
return(y1 - kKoef * x1);}
//+------------------------------------------------------------------+
Ой и правда тут совсем не нужна геометрия, достаточно узнать насколько изменяется цена между двумя точками на 1 бар. Функция линии все равно линейная:). Спасибо❤️
 
Верх