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

Leonup

Новичок форума
Я просто не скопировал принты - они старые из старого кода подходят. Я вообще проверял:
SQL:
   MqlDateTime str1;
   MqlRates rates[];
   int copy_rates=0;
   bool begin=false;
   double High1=0.0;
   double Low1=10000.0;
   int day=32;

   for(int r=0; r<=62; r++)
     {
      copy_rates=CopyRates(_Symbol,PERIOD_D1,r,1,rates);
      if(copy_rates<1) {Print("Ошибка копирования данных"); break;}
      TimeToStruct(rates[0].time,str1);
      if(day>str1.day && !begin) {day=str1.day; continue;}
      if(day<str1.day && !begin) {day=32; begin=true;}
      if(begin)
        {
         if(day>str1.day) day=str1.day;
         else {begin=false; break;}
         if(High1<rates[0].high) High1=rates[0].high;
         if(Low1>rates[0].low) Low1=rates[0].low;
        }
     }
   Print("High= ",iHigh(_Symbol,PERIOD_MN1,1));
   Print("High1=",High1);
   Print("Low= ",iLow(_Symbol,PERIOD_MN1,1));
   Print("Low1=",Low1);
   if(iHigh(_Symbol,PERIOD_MN1,1)!=High1) Print(iHigh(_Symbol,PERIOD_MN1,1)," High ",High1);
   if(iLow(_Symbol,PERIOD_MN1,1)!=Low1) Print(iLow(_Symbol,PERIOD_MN1,1)," Low ",Low1);
А 2 последние строки сравнивают между собой оба варианта и выдают принт, если они не равны, но они у Вас будут постоянно принтовать. Просто оставьте нужные строки. Я не думал, что принты нужны для сова, если там автоматика работает.
Код считает сформированные данные 1-го месяца когда он уже сформирован полностью.
У меня отличаются только в марте этого года и все одинаковые результаты в каждой минуте одинаковые с первой по последнюю минуту, сколько бы тиков в ней не было.
В тестовом сове я ограничиваю работу - работает по открытию дневного бара, чтобы не тормозил по всем тикам.

Спасибо вам огромное за труд! Все получилось!!!
Насчет print. В предпоследнем коде я выводил по ценам открытия с помощью тех же Print("High1= ", High1) и Print("Low1= ", Low1). Но там было очень много строк за месяц, и они сильно отличались. И я не понимал, как пользоваться.
А в последнем коде стало все в порядке!!! Еще раз спасибо!
 

eevviill2

Местный знаток
Напишите тупым метакротам что не плохо было бы это правило и в индикаторах использовать!!!!!!!!!!

Факт открытия окна настроек эксперта на значения глобальных переменных не влияет. В течение всего времени, пока открыто окно настроек, и после его закрытия, глобальные переменные сохраняют свои значения, имеющиеся на момент, предшествующий открытию панели настроек эксперта.
 

MrGreen86

Гуру форума
Напишите тупым метакротам что не плохо было бы это правило и в индикаторах использовать!!!!!!!!!!

Факт открытия окна настроек эксперта на значения глобальных переменных не влияет. В течение всего времени, пока открыто окно настроек, и после его закрытия, глобальные переменные сохраняют свои значения, имеющиеся на момент, предшествующий открытию панели настроек эксперта.
Конкретней?
1) Поставил советник на график который записывает GetTickCount в глобальную переменную, затем ее читает и выводит в Comment. Открыл его настройки - цифры продолжают меняться.
2) поставил рядом пустой советник, открыл его настройки - цифры продолжают меняться.
3) в пустом советнике добавил вывод на экран значение этой же глобальной переменной все так же через Comment - цифры меняются на графиках не зависимо от открытых настроек 1 и 2 советника.
в приложении test_global первый советник
global test 2 второй советник.

О чем речь? при каких условиях глобальные переменные не меняются?
 

Вложения

  • test global.mq4
    1,5 КБ · Просмотры: 19
  • glob test 2.mq4
    1,4 КБ · Просмотры: 12

ИванМН

Местный знаток
1. на сколько я знаю, нельзя просматривать входные параметры установленных советников.
2. это не сложно. вбейте в коде ChartNext и откройте справку по этой функции, там пример как перебрать все графики терминала и получить их ID.
В этот перебор вставляете ObjectFind уже с известным ID и именем объекта.
Благодарю, понятно.
Ещё вопрос (те же вводные): как можно задать последовательность обработки нового тика несколькими советниками? По умолчанию, как я понимаю, новый тик сперва начинает обрабатываться советником с 1-го графика, затем со 2-го и т.д. А мне нужно, чтобы, например, первым обрабатывал сов с 3-го графика. Это можно как-либо установить?

Извиняюсь, если уже где-то было, поиск в Гугле выдаёт всё не совсем то.
 

Ugar

Гуру форума
Если символы графиков разные то порядок в порядке поступления первого тика на символах.
А вообще, можно организовать порядок глобальную переменную.
В советниках задаётся порядковый номер. Каждый со воветник ждёт своего номера. Дождавшись наращивает значение, последний сбрасывает.
Например советник №1. Пришёл новый тик, если в GV 0, выполняет программу и наращивает значение GV до 1.
Советник №2. Пришёл новый тик, если в GV 0 спим, проверяем снова, если 1 выполняет программу и наращивает значение GV до 2...
 

MrGreen86

Гуру форума
Благодарю, понятно.
Ещё вопрос (те же вводные): как можно задать последовательность обработки нового тика несколькими советниками? По умолчанию, как я понимаю, новый тик сперва начинает обрабатываться советником с 1-го графика, затем со 2-го и т.д. А мне нужно, чтобы, например, первым обрабатывал сов с 3-го графика. Это можно как-либо установить?

Извиняюсь, если уже где-то было, поиск в Гугле выдаёт всё не совсем то.
если валютная пара одинаковая, то обрабатывают новый тик они одновременно. но организовать можно, так же как написал Ugar:
В советниках задаётся порядковый номер. Каждый со воветник ждёт своего номера. Дождавшись наращивает значение, последний сбрасывает.
Например советник №1. Пришёл новый тик, если в GV 0, выполняет программу и наращивает значение GV до 1.
Советник №2. Пришёл новый тик, если в GV 0 спим, проверяем снова, если 1 выполняет программу и наращивает значение GV до 2...
только в таком случае организуйте работу советников в OnTimer и EventSetMillisecondTimer(25). Думаю 40 циклов в секунда достаточно будет чтобы не пропустить тик.
 

eevviill2

Местный знаток
Конкретней?
1) Поставил советник на график который записывает GetTickCount в глобальную переменную, затем ее читает и выводит в Comment. Открыл его настройки - цифры продолжают меняться.
2) поставил рядом пустой советник, открыл его настройки - цифры продолжают меняться.
3) в пустом советнике добавил вывод на экран значение этой же глобальной переменной все так же через Comment - цифры меняются на графиках не зависимо от открытых настроек 1 и 2 советника.
в приложении test_global первый советник
global test 2 второй советник.

О чем речь? при каких условиях глобальные переменные не меняются?
В советнике глобальные переменные после прикрепления к графику и изменения настроек остаются такими же.
В индикаторах после прикрепления к графику и изменения настроек глобальные переменные сбиваются.

P.S. Не переменные терминала, а глобальные переменные.
 

Ugar

Гуру форума
только в таком случае организуйте работу советников в OnTimer и EventSetMillisecondTimer(25). Думаю 40 циклов в секунда достаточно будет чтобы не пропустить тик.
Можно и по таймеру. Но у него есть свои недостатки и серьёзные.
 

ИванМН

Местный знаток
МистерГрин, Угар, спасибо. У меня так и реализовано, через глобалку. Просто мне хотелось знать, можно ли как-либо напрямую задать последовательность. Как я понимаю, нет.

Тут вот ещё такая проблема: пытаюсь через ChartSetDouble задать жёсткие ценовые максимум и минимум графика (см. 1-й рисунок): максимум от цены Бид + 60 пунктов, минимум - Бид - 60 пунктов, т.е. отцентровать график. Максимум задаётся корректно, а вот минимум устанавливается некорректно.
2.JPG
Крутил, вертел, ничего не смог добиться. Причём беру уже после перерисовки графика значение минимума - да, точно (2-й рисунок), а на самом графике какая-то шняга - намного меньшее значение, чем должно быть. В чём может быть причина?
1.JPG
 

Milord

Местный знаток
Всем привет,в том числе профи программерам!
давно не был на форуме, и не узнал его...)
но вопрос в тему установки советника на МТ4, то ли я забыл как это делать,то ли создатели MT4 намудрили снова..
суть в чем, скачал новый терминал МТ4,version 4.0, build 1170, установил на комп, все прошло удачно, затем в папку experts кинул обычного Илана, причем он рабочий точно, при запуске МТ4 он почему то не видит советника,причем те советники,что там были по умолчанию в кодах mql, а он их показывает как ex4, а вот Илан в коде ex4, он вапще не показывает, в чем тут проблема, подскажите кто знает?
 

MrGreen86

Гуру форума
Всем привет,в том числе профи программерам!
давно не был на форуме, и не узнал его...)
но вопрос в тему установки советника на МТ4, то ли я забыл как это делать,то ли создатели MT4 намудрили снова..
суть в чем, скачал новый терминал МТ4,version 4.0, build 1170, установил на комп, все прошло удачно, затем в папку experts кинул обычного Илана, причем он рабочий точно, при запуске МТ4 он почему то не видит советника,причем те советники,что там были по умолчанию в кодах mql, а он их показывает как ex4, а вот Илан в коде ex4, он вапще не показывает, в чем тут проблема, подскажите кто знает?
файл - открыть каталог данных - ставьте вот тут.
иногда терминал создает свою папку в общих документах, иногда там куда ставишь.
обязательно перезапустите терминал после этого, но думаю вы это и так знаете.
еслин е поможет - сбросьте ваш код, посмотрим.
 

Milord

Местный знаток
файл - открыть каталог данных - ставьте вот тут.
иногда терминал создает свою папку в общих документах, иногда там куда ставишь.
обязательно перезапустите терминал после этого, но думаю вы это и так знаете.
еслин е поможет - сбросьте ваш код, посмотрим.
спасибо, все получилось, просто я не мог найти папку MQL4/Experts, которой из проводника не вижу..
 

panand

Местный знаток
Привет всем!
Подскажите как разделить переменную максимальной просадки от общей на раздельные ,стоповых ордеров и лимитных ордеров?
Для наглядности пример кода общей максимальной просадки,что имею:
//Расчет максимальной просадки за цикл.
if(AccountEquity()>MaxEq){MaxEq=AccountEquity();CurDrod=0;}
if(AccountEquity()<MaxEq)CurDrod=100*(MaxEq-AccountEquity())/MaxEq;
if(CurDrod>MaxDrod)MaxDrod=CurDrod;

if(StopMaxDrowdown>0)if(MaxDrod>StopMaxDrowdown){while(check()>0)close_();return(0);}
 

Ugar

Гуру форума
Привет всем!
Подскажите как разделить переменную максимальной просадки от общей на раздельные ,стоповых ордеров и лимитных ордеров?
Для наглядности пример кода общей максимальной просадки,что имею:
//Расчет максимальной просадки за цикл.
if(AccountEquity()>MaxEq){MaxEq=AccountEquity();CurDrod=0;}
if(AccountEquity()<MaxEq)CurDrod=100*(MaxEq-AccountEquity())/MaxEq;
if(CurDrod>MaxDrod)MaxDrod=CurDrod;

if(StopMaxDrowdown>0)if(MaxDrod>StopMaxDrowdown){while(check()>0)close_();return(0);}
У стоповых и лимитных ордеров не бывает просадки, так же как и прибыли, пока они не сработают и не превратятся в рыночные. Я так понимаю что надо посчитать отдельно просадку ордеров которые когда то были стоповыми и лимитными.
Для этого надо ордера как то пометить, что бы когда они сработают, можно было определить какой из них когда то был стоповым, а какой лимитным. Это можно сделать с помощью комментария (не всегда и не везде будет работать) или присвоив им разные маджики.
Надо считать суммарную прибыль открытых ордеров, различая их по меткам. и вместо AccountEquity() использовать AccountBalance()+посчитанная прибыль.
 

panand

Местный знаток
У стоповых и лимитных ордеров не бывает просадки, так же как и прибыли, пока они не сработают и не превратятся в рыночные. Я так понимаю что надо посчитать отдельно просадку ордеров которые когда то были стоповыми и лимитными.
Для этого надо ордера как то пометить, что бы когда они сработают, можно было определить какой из них когда то был стоповым, а какой лимитным. Это можно сделать с помощью комментария (не всегда и не везде будет работать) или присвоив им разные маджики.
Надо считать суммарную прибыль открытых ордеров, различая их по меткам. и вместо AccountEquity() использовать AccountBalance()+посчитанная прибыль.
Разумеется ,что считается отдельно просадка активного ордера от когда-то бывших стоповых или лимитных ордеров,ведь в отличии от стандартной просадки,которая плавает,в данной ситуации такая просадка фиксируется и сохраняется до конца цикла.
Верно то,что надо разделить магиками на две ветки,ветка лимитных и ветка стоповых ордеров, где такой алгоритм по макс.просадке работает в каждой ветке отдельно.
Полагаю что зря постучался.
Извините за беспокойство.
 

Leonup

Новичок форума
SQL:
   MqlDateTime str1;
   MqlRates rates[];
   int copy_rates=0;
   bool begin=false;
   double High1=0.0;
   double Low1=10000.0;
   int day=32;

   for(int r=0; r<=62; r++)
     {
      copy_rates=CopyRates(_Symbol,PERIOD_D1,r,1,rates);
      if(copy_rates<1) {Print("Ошибка копирования данных"); break;}
      TimeToStruct(rates[0].time,str1);
      if(day>str1.day && !begin) {day=str1.day; continue;}
      if(day<str1.day && !begin) {day=32; begin=true;}
      if(begin)
        {
         if(day>str1.day) day=str1.day;
         else {begin=false; break;}
         if(High1<rates[0].high) High1=rates[0].high;
         if(Low1>rates[0].low) Low1=rates[0].low;
        }
     }
   Print("High= ",iHigh(_Symbol,PERIOD_MN1,1));
   Print("High1=",High1);
   Print("Low= ",iLow(_Symbol,PERIOD_MN1,1));
   Print("Low1=",Low1);
   if(iHigh(_Symbol,PERIOD_MN1,1)!=High1) Print(iHigh(_Symbol,PERIOD_MN1,1)," High ",High1);
   if(iLow(_Symbol,PERIOD_MN1,1)!=Low1) Print(iLow(_Symbol,PERIOD_MN1,1)," Low ",Low1);

Добрый день!
Как узнать номер и время открытия бара, на котором был найден экстремум – High1 или Low1?
Благодарю за помощь!
 

MrGreen86

Гуру форума
Добрый день!
Как узнать номер и время открытия бара, на котором был найден экстремум – High1 или Low1?
Благодарю за помощь!
записывать в момент поиска:
C++:
   MqlDateTime str1;
   MqlRates rates[];
   int copy_rates=0;
   bool begin=false;
   double High1=0.0;
   double Low1=10000.0;
   int High1_bar  = 0;
   int Low1_bar   = 0;
   datetime High1_time = 0;
   datetime Low1_time  = 0;
   
   int day=32;

   for(int r=0; r<=62; r++)
     {
      copy_rates=CopyRates(_Symbol,PERIOD_D1,r,1,rates);
      if(copy_rates<1) {Print("Ошибка копирования данных"); break;}
      TimeToStruct(rates[0].time,str1);
      if(day>str1.day && !begin) {day=str1.day; continue;}
      if(day<str1.day && !begin) {day=32; begin=true;}
      if(begin)
        {
         if(day>str1.day) day=str1.day;
         else {begin=false; break;}
         if(High1<rates[0].high) {
            High1=rates[0].high;
            High1_bar = r;
            High1_time = rates[0].time;
         }
         if(Low1>rates[0].low) {
            Low1=rates[0].low;
            Low1_bar = r;
            Low1_time = rates[0].time;
         }
        }
     }
 

Leonup

Новичок форума
записывать в момент поиска:
C++:
   MqlDateTime str1;
   MqlRates rates[];
   int copy_rates=0;
   bool begin=false;
   double High1=0.0;
   double Low1=10000.0;
   int High1_bar  = 0;
   int Low1_bar   = 0;
   datetime High1_time = 0;
   datetime Low1_time  = 0;
  
   int day=32;

   for(int r=0; r<=62; r++)
     {
      copy_rates=CopyRates(_Symbol,PERIOD_D1,r,1,rates);
      if(copy_rates<1) {Print("Ошибка копирования данных"); break;}
      TimeToStruct(rates[0].time,str1);
      if(day>str1.day && !begin) {day=str1.day; continue;}
      if(day<str1.day && !begin) {day=32; begin=true;}
      if(begin)
        {
         if(day>str1.day) day=str1.day;
         else {begin=false; break;}
         if(High1<rates[0].high) {
            High1=rates[0].high;
            High1_bar = r;
            High1_time = rates[0].time;
         }
         if(Low1>rates[0].low) {
            Low1=rates[0].low;
            Low1_bar = r;
            Low1_time = rates[0].time;
         }
        }
     }

Добрый день!
На основе этого кода для создания линий Ганна сначала сделал скрипт script_1. А затем на основе того же кода начал писать новый советник EA_1, к этому коду пока добавил только создание линий Ганна, точно также как в script_1.
И почему-то наклон линий, созданных советником в тестере стратегий (ТФ Н1), отличается от наклона линий, созданных при помощи скрипта. Но все 4 параметра линий на графиках идентичны: время и цена 1-й точки, время 2-й точки, масштаб.
Возможно, что это происходит из-за того, что в ObjectCreate не указан chart_id. Но мне непонятно, как это сделать.
Нужно чтобы линии на графике с помощью советника располагались точно так же, как и с помощью скрипта (т.е. наклон должен быть меньше)
Помогите, пожалуйста!
 

Вложения

  • EURUSDH1.png
    EURUSDH1.png
    126,3 КБ · Просмотры: 44
  • script_1.mq4
    4,5 КБ · Просмотры: 12
  • EA_1.mq4
    5,4 КБ · Просмотры: 13
Верх