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

Alica

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

Вложения

  • Безымянный.png
    Безымянный.png
    25,1 КБ · Просмотры: 95
  • Безымянный2.png
    Безымянный2.png
    51,6 КБ · Просмотры: 93

Genry_05

Отдыхает
Вот так мышкой смотрим сколько баров до 1 и 2 точки от самого последнего бара на графике для нашего начального импульса для которого мы хотим построить линии Ганна, и вносим полученные значения в настройки скрипта
[CODE title="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);
}[/CODE]
 
Последнее редактирование:

Alica

Активный участник
[CODE title="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);
}[/CODE]
Спасибо Генри, очень интересно. Надо подумать как это в скрипт можно добавить, я не очень сильна в этом:)

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

Genry_05

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

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

Alica

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

Genry_05

Отдыхает
.... Вот если бы еще можно было бы узнавать программно какой бар пересекает линию, но это не для этой ветки видимо надо поспрашивать у mql4 программистов🙂
[CODE title="Поиск точки пробоя линии на графике"]
// Поиск точки пробоя линии на графике
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;
}[/CODE]
----------------------------------------
Вариант 2
----------------------------------------
[CODE title="вариант 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);}
//+------------------------------------------------------------------+
[/CODE]
 
Последнее редактирование:

Alica

Активный участник
[CODE title="Поиск точки пробоя линии на графике"]
// Поиск точки пробоя линии на графике
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;
}[/CODE]
----------------------------------------
Вариант 2
----------------------------------------
[CODE title="вариант 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);}
//+------------------------------------------------------------------+
[/CODE]
Ой и правда тут совсем не нужна геометрия, достаточно узнать насколько изменяется цена между двумя точками на 1 бар. Функция линии все равно линейная:). Спасибо❤️
 
Верх