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

AlexeyVik

Программист mql4 mql5
Я не так давно один индюк переводил из подвала на график - мне пришлось, чтобы сохранить все расчеты, сделать дубль - старые буферы остались чисто расчетными, а в новые (рисующие) я заносил актуальную информацию.
Ладно. Мы говорим о разном на разных языках. :)
 

mobidik

-----
Уважаемые прогеры, нужна помощь. Буфера не соответствуют, не получается прописать в советнике. Нужно чтобы от верхней зоны селл, от нижней бай
Тут Вы темой ошиблись, это в доработку.
А по существу: в буферах занесена информация по ширине текущего канала, на основании которого строится фибка, т.е., ценовые значения "0" и "100" по фибо. А вот самих зон там нет - вывел их в буферы, соответственно, добавлены 4 буфера, для наглядности, думаю, что разберетесь.
 

Вложения

  • AutoFib TradeZones (buff).mq4
    AutoFib TradeZones (buff).mq4
    17,1 КБ · Просмотры: 15
  • AutoFib TradeZones (buff).png
    AutoFib TradeZones (buff).png
    50,8 КБ · Просмотры: 52

Slava78

Элитный участник
Тут Вы темой ошиблись, это в доработку.
А по существу: в буферах занесена информация по ширине текущего канала, на основании которого строится фибка, т.е., ценовые значения "0" и "100" по фибо. А вот самих зон там нет - вывел их в буферы, соответственно, добавлены 4 буфера, для наглядности, думаю, что разберетесь.
Большое спасибо
 

MERFY

Местный знаток
Добрый день!
Прошу помочь сделать так, чтобы аллерт срабатывал только на текущем таймфрейме, где подключен индикатор. У меня он срабатывает еще и на сопутствующих кроме текущего. Код прилагаю, спасибо за ответ.

C:
Expand Collapse Copy
if (AlertsMessage || AlertsEmail || AlertsMobile || AlertsSound)
    {
     string messageUP = WindowExpertName()+"  >>  "+_Symbol+", "+stringMTF(_Period)+"  >>  PPR low  >>  BUY";   ///Arrow UP >> BUY";  
     string messageDN = WindowExpertName()+"  <<  "+_Symbol+", "+stringMTF(_Period)+"  <<  PPR High  <<  SELL";   ///Arrow DN << SELL";  
   //------
     if (TimeBar!=Time[0] && LOFractal[SIGNALBAR]!=0 ) {
         if (AlertsMessage) Alert(messageUP);
         if (AlertsEmail)   SendMail(_Symbol,messageUP);
         if (AlertsMobile)  SendNotification(messageUP);
         if (AlertsSound)   PlaySound(SoundFile);   //"stops.wav"   //"news.wav"
         TimeBar=Time[0]; }  //return(0);
   //------
     else
     if (TimeBar!=Time[0] && UPFractal[SIGNALBAR]!=0 ) {
         if (AlertsMessage) Alert(messageDN);
         if (AlertsEmail)   SendMail(_Symbol,messageDN);
         if (AlertsMobile)  SendNotification(messageDN);
         if (AlertsSound)   PlaySound(SoundFile);   //"stops.wav"   //"news.wav"
         TimeBar=Time[0]; }  //return(0);
    }  ///*конец* АЛЕРТОВ для всех.....
 

AlexeNP

Гуру форума
Добрый день!
Прошу помочь сделать так, чтобы аллерт срабатывал только на текущем таймфрейме, где подключен индикатор. У меня он срабатывает еще и на сопутствующих кроме текущего. Код прилагаю, спасибо за ответ.
А что такое Time[0]?
 

AlexeNP

Гуру форума
Время открытия текущего бара
Так ты решил винтажный индикатор написать? А зачем? Не проще ли использовать всю мощь последних разработок Метаквотов? К примеру, rates_total > prev_calculated либо при запуске, либо при открытии нового бара...
 

vladradon

Программист
У меня он срабатывает еще и на сопутствующих кроме текущего. К
В функции init() нужно прописать строку
TimeBar=Time[0];
а строки 6 и 14 из предложенного скрина изменить:
if (TimeBar<Time[0] && ...
если я правильно понял проблему.
 

MERFY

Местный знаток
В функции init() нужно прописать строку
TimeBar=Time[0];
а строки 6 и 14 из предложенного скрина изменить:
if (TimeBar<Time[0] && ...
если я правильно понял проблему.

Спасибо, все ок вроде как. А можете объяснить почему работает данная конструкция? не могу логику понять.
 

vladradon

Программист
А можете объяснить почему работает данная конструкция? не могу логику понять.
Все просто: в ините мы при старте или рестарте присваиваем TimeBar время открытия текущего бара и при проверке TimeBar<Time[0] алерты сработают только, если открылся новый бар, время которого будет больше TimeBar и так дальше в процессе работы. Все промежуточные значения не будут срабатывать как при проверке TimeBar!=Time[0], где проверяется на "не равно", а не "меньше" и последовательности в алертах по времени нет.
 

MERFY

Местный знаток
Все просто: в ините мы при старте или рестарте присваиваем TimeBar время открытия текущего бара и при проверке TimeBar<Time[0] алерты сработают только, если открылся новый бар, время которого будет больше TimeBar и так дальше в процессе работы. Все промежуточные значения не будут срабатывать как при проверке TimeBar!=Time[0], где проверяется на "не равно", а не "меньше" и последовательности в алертах по времени нет.

Супер! Спасибо!
 

PilotFX

Прохожий
Приветствую! Я новичок в программировании. Написал индикатор, но не знаю, как дописать к нему стрелку.
Если есть знающие люди, посмотрите файл, пожалуйста, и напишите, слишком ли он коряво сделан или вообще мрак. Не судите строго - я программер с недельным стажем ;)
Если допишите стрелку, буду признателен. А если еще и с алертом (который можно отключать в настройках) - это предел моих мечтаний :)(y)
 

Вложения

AlexeNP

Гуру форума
Приветствую! Я новичок в программировании. Написал индикатор, но не знаю, как дописать к нему стрелку.
Если есть знающие люди, посмотрите файл, пожалуйста, и напишите, слишком ли он коряво сделан или вообще мрак. Не судите строго - я программер с недельным стажем ;)
Если допишите стрелку, буду признателен. А если еще и с алертом (который можно отключать в настройках) - это предел моих мечтаний :)(y)
чего ж вас все на винтажные варианты тянет?
 

Вложения

MERFY

Местный знаток
Добрый вечер! Подскажите, как мне исправить ошибку в коде, мне нужно вывести значения объема Volume на графика цены в масштабе цены. Чтобы отслеживать отклонения цены от обьема на графике цены.

Математику масштаба прописал, вроде как вычисляю Hi и Low и Min Max индикатора обьема, но отображается сплошная линия напротив цены. Индикатор не строится, что я делаю неправильно?

Код:
Expand Collapse Copy
 for(int i = 0; i < limit; i++)
    {
       double _High;
       double _Low;

       int b1 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,1));//бар до которого ищем лоу хай
       int b2 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,0));//бар с которого начинаем поиск лоу хай

       b1 = b1-b2;//число элементов таймсерии

       _High=High[iHighest(NULL,0,MODE_HIGH,b1,b2)];//находим хай в промежутке b1 и b2
       _Low=Low[iLowest(NULL,0,MODE_LOW,b1,b2)];//находим лоу в промежутке b1 и b2
  
       Comment("\n","High:  ",DoubleToStr(_High,Digits),"  Low:  ",DoubleToStr(_Low,Digits),"  bar_count:  ",b1,"   bar_start:  ",b2);
  
         double Min, Max;
         Min = Volume[b2];
         Max = Min;

           double t = Volume[b1];
           if (t < Min) Min = t;
           if (t > Max) Max = t;
    
         double delta = (Max - Min);
         if (delta == 0.0) delta = 0.000001;
    
         double k1, k2;
         k1 = (_High - _Low) /delta;
         k2 = _High - (Max*k1);

         VPT [i]= Volume[b2]*k1 + k2; // Тут хочу получить график обьема в масштабе цены
     }

Untitled-1__2.png


Y1_new = Y1_init * K1 + K2

где:

К1 = (Ymax2 - Ymin2) / (Ymax1 - Ymin1)

K2 = Ymax2 - (Ymax1*K1)

1 - Ymax1 и Ymin1 - график, который надо отобразить в др. масштабе

2 - Ymax2 и Ymin2 - окно в котором надо показать график 1 (там может быть как имеющийся график цены, так и другие пересчитанные графики)
 

AlexeNP

Гуру форума
Добрый вечер! Подскажите, как мне исправить ошибку в коде, мне нужно вывести значения объема Volume на графика цены в масштабе цены. Чтобы отслеживать отклонения цены от обьема на графике цены.

Математику масштаба прописал, вроде как вычисляю Hi и Low и Min Max индикатора обьема, но отображается сплошная линия напротив цены. Индикатор не строится, что я делаю неправильно?

Код:
Expand Collapse Copy
 for(int i = 0; i < limit; i++)
    {

       int b1 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,1));//бар до которого ищем лоу хай
       int b2 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,0));//бар с которого начинаем поиск лоу хай

       b1 = b1-b2;//число элементов таймсерии
вот эта конструкция вызывает большие опасения...
попробуй вывести значения b1 и b2
 

AlexeNP

Гуру форума
В смысле вывести, я вывожу эти значения в комментарии кода, индикатор рисует сплошную линию, не получается исправить (
эх... ладно, зайду издалека... к примеру, ты на графике М5... свеча вот-вот закроется... несколько секунд осталось...
вот запускается у тебя индикатор и начинает считать
int b1 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,1));//бар до которого ищем лоу хай
int b2 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,0));//бар с которого начинаем поиск лоу хай

iTime() - дадут у тебя разные значения... но iBarShift() дадут одно и то же значение... потому что оба минутных бара попали в один и тот же 5-минутный бар...
тут либо
iBarShift(NULL,PERIOD_M1, iTime(NULL,PERIOD_M1,1))
либо, что по смыслу кажется более логичным
iBarShift(NULL,0, iTime(NULL,0,1))
 

MERFY

Местный знаток
эх... ладно, зайду издалека... к примеру, ты на графике М5... свеча вот-вот закроется... несколько секунд осталось...
вот запускается у тебя индикатор и начинает считать
int b1 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,1));//бар до которого ищем лоу хай
int b2 = iBarShift(NULL,0, iTime(NULL,PERIOD_M1,0));//бар с которого начинаем поиск лоу хай

iTime() - дадут у тебя разные значения... но iBarShift() дадут одно и то же значение... потому что оба минутных бара попали в один и тот же 5-минутный бар...
тут либо
iBarShift(NULL,PERIOD_M1, iTime(NULL,PERIOD_M1,1))
либо, что по смыслу кажется более логичным
iBarShift(NULL,0, iTime(NULL,0,1))

Ну я тестировал на М1 поэтому это не проблема основная, проблема в том, что не рисует он график, а тупо выводит сплошную линию.

1586354724682.png

Код заменил на BarShift(NULL,0, iTime(NULL,0,1)) проблема осталась.
 

Игoрь

Новичок форума
советник выдаёт ошибку DLL is not allowed. Индикатор работает с DLL . Как сделать чтоб советник начал работать?
 

Who has viewed this thread (Total: 4) Посмотреть

Верх