Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
7 часов назад, elavr сказал:

Хмм, если рассматривать МТ5(как правило спред для мт4 и мт5 одинаковых счетов у одного брокера сопоставим ), то есть ли смысл делать такую панель когда можно получить эту информацию из котировок?

 

Просто делал такого советника для теста

Да, ваш вариант отличный. Но к сожалению у ффю нет мт5

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Alexnik90 сказал:

через dll какую ни будь

Да. Это возможно - https://docs.mql4.com/ru/runtime/imports
 

4 часа назад, Alexnik90 сказал:

Например хотелось стакан ордеров научится выводить на мт4

Хех... интересная задачка. Я работаю в этом направлении)) Возможно вам пригодятся мои наработки, так как идеи схожи.

Но только не Стакан ордеров, а открытые позиции от сюда - https://tlap.com/indikator-otkryityih-pozitsiy/
Да простят меня отцы основатели этого форума!

Именно в этом примере скрипт отдает не html, а json.

 

807259839_.png.a04d5b03f1fb790073eafb2111c30557.png

 

Раз запрашивать его из MetaTrader я не смог, а вернее не хотел тратить время на изучение, пошел следующим путем - написал скрипт на питоне, который распарит json и положит в папочку терминала в нужном мне формате - ИНСТРУМЕНТ : %ПОКУПАТЕЛЕЙ : %ПРОДАВЦОВ, чтобы потом его обработать внутри индикатора.

 

В общем парсер то сделал, а до индикатора, пока руки не доходят - времени крайне не хватает.

p.s. Ребята из администрации, кто отвечает за https://tlap.com/indikator-otkryityih-pozitsiy/, черканите в ЛС. Я не выкладываю ссылок на свой код, ибо возможно скрипты которые отдают JSON не должны торчать наружу и обращение множества клиентов к ним, плохо скажется на работоспособности вашего сервиса.

 

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
39 минут назад, Gamakiv сказал:

Да. Это возможно - https://docs.mql4.com/ru/runtime/imports

Я знаю что можно импортировать dll. Меня волнует непосредственно код, а лучше готовый код, чтобы можно было скачать файл в директорию доступную mql программам. А все остальное я сам сделаю, mql4 языком не плохо овладел, а что в плане других языков и интернета - для меня пока темный лес. А будет готовый код, пример, смогу его разобрать и понять как и что там работает. Так и учимся.))

 

46 минут назад, Gamakiv сказал:

Именно в этом примере скрипт отдает не html, а json.

Значит ключ в  json, знать бы что это такое и как его получать.)) Значит буду копать в этом направлении, спасибо за наводку.

Но вопрос выше остался.))

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
51 минуту назад, Gamakiv сказал:

Раз запрашивать его из MetaTrader я не смог, а вернее не хотел тратить время на изучение, пошел следующим путем - написал скрипт на питоне

Получается скрипт этот будет работать не на мт4 а на пк?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
11 минут назад, Alexnik90 сказал:

А все остальное я сам сделаю, mql4 языком не плохо овладел, а что в плане других языков и интернета - для меня пока темный лес.

Как я понял, тебе нужен не этот файлик, а сам календарь https://www.myfxbook.com/forex-economic-calendar

Я не шарю особо в html, но на 90% уверен, что эта данные хранятся в формате .php на их сайте, либо на сайте, где они берут информацию. Попроси разбирающихся людей найти тебе эту ссылку.

Если ты ей завладеешь, то перевести в читабельный формат mql сможешь через эту библиотеку https://www.mql5.com/ru/code/13663

Инструкции к ней особо нет, нужно прочитать все ветки на форуме том и понять, как ей пользоваться.

Далее все нужные данные переводишь в массив и строишь свой новостной индикатор, раз тебя не устраивают те, что есть в свободном доступе )

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 минуты назад, Rever27 сказал:

Как я понял, тебе нужен не этот файлик, а сам календарь https://www.myfxbook.com/forex-economic-calendar

Не совсем так, календарь то я уже написал, достаю информацию из HTML страницы. Но увидел, что можно проще все эти данные достать и надежнее, вот и задался вопросом, а как это сделать. Плюс мне на будущее, мало ли еще какую инфу таким способом смогу доставать, многие позволяют скачивать такие таблицы.

 

7 минут назад, Rever27 сказал:

Я не шарю особо в html, но на 90% уверен, что эта данные хранятся в формате .php на их сайте

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

 

9 минут назад, Rever27 сказал:

Если ты ей завладеешь, то перевести в читабельный формат mql сможешь через эту библиотеку https://www.mql5.com/ru/code/13663

Спасибо, буду разбираться. Я уже понял что надо в этом направлении копать.

 

10 минут назад, Rever27 сказал:

раз тебя не устраивают те, что есть в свободном доступе )

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Gamakiv сказал:

p.s. Ребята из администрации, кто отвечает за https://tlap.com/indikator-otkryityih-pozitsiy/, черканите в ЛС. Я не выкладываю ссылок на свой код, ибо возможно скрипты которые отдают JSON не должны торчать наружу и обращение множества клиентов к ним, плохо скажется на работоспособности вашего сервиса.

Мы их не скрываем, данные у нас заранее подготовленны и закэшированы, либо лежат в таких же json файлах, поэтому множественное обращение к ним не вызовет проблем.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем доброго времени. У меня вопрос насчет переключателя сделок. В моем понятии нужно завести две переменные, например buy_flag и sell_flag. Начало положено) Теперь чтоб они переключались по булевому типу, им нужно задать изначально разные значения, например:

bool buy_flag=true;

bool sell_flag=false;

Теперь когда подходит момент войти в сделку например по sell, то булевое условие нам говорит о том что "нет", значит ждем сделки на buy. Сделка случается. А теперь вопрос, чтоб мне переключить значения, мне нужно сделать выборку из истории? и только по баю? Мы находим этот ордер с конца и тут уже ставим значения:

buy_flag=false;

sell_flag=true;

Теперь у нас активные только sell сделки. Ну и т.д. Я правильно мыслю?

Спасибо.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Меняй значение переменных, если OrderSend отработал без ошибки.

И зачем тебе две переменные,  если они не бывают в одном состоянии одновременно? Оставь одну или, для удобства восприятия сделай ее int

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Господа приветствую! Имею вопрос собственно:

Итак есть код индикатора vinin_lrma_color_sound(лежит в паке машек на форуме:

Спойлер


//+------------------------------------------------------------------+
int start() {
   int limit;
 
   double tmp1,tmp2,tmp3;
 
   int tmpBar, tmpTime;
   int counted_bars=IndicatorCounted();
   int i;
 
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
 
   limit=Bars-counted_bars;
 
   int cmd;
   for (i = limit; i>=0; i--)
      {
            tmp1=iMA(Symbol(),0,period,0,MODE_SMA,price,i);
            tmp2=iMA(Symbol(),0,period,0,MODE_LWMA,price,i);
            tmp3=3.0*tmp2-2.0*tmp1;
         
            BufferGreen[i]  = tmp3;
            
            BufferYellow[i] = tmp3;
            
            BufferRed[i]    = tmp3;
            
            
          
            if (BufferYellow[i]>BufferYellow[i+1])
               {
                  BufferRed[i]=EMPTY_VALUE;
               } 
                  else if (BufferYellow[i]<BufferYellow[i+1])
                     {
                        BufferGreen[i] =EMPTY_VALUE;
                     } else 
                        {
                           BufferRed[i]=EMPTY_VALUE;         
                           BufferGreen[i] =EMPTY_VALUE;
                        }
      }
      
   if (bPlaySound &&alertTag!=Time[0]) {
      if (BufferRed[CheckBar+1]==EMPTY_VALUE   && BufferRed[CheckBar]!=EMPTY_VALUE  ) 
            PlaySound(SoundName);
    
      if (BufferGreen[CheckBar+1]==EMPTY_VALUE && BufferGreen[CheckBar]!=EMPTY_VALUE) 
            PlaySound(SoundName);
   
   alertTag=Time[0];      
   
   }

 

 

Мне не ясен смысл этого:
 

  for (i = limit; i>=0; i--)

 

Как понимать? Я вижу так:
Делаем цикл ОТ Количество баров на текущем графике ОТНЯТЬ количество баров, не измененных после последнего вызова индикатора, пока счетчик не станет большие и равен 0, отнимая от счетчика единицу.

Прошу помощь описать словами этот цикл.

Изменено пользователем Gamakiv
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
41 минуту назад, Gamakiv сказал:

Прошу помощь описать словами этот цикл.

В первый раз после запуска индикатора limit равно количеству баров и цикл проходит по всем барам в истории, чтобы построить данные индикатора.

На следующий тик IndicatorCounted() уже пересчитывается и limits будет равен 0 или 1. Соответственно цикл уже не будет гонять историю, а будет проходить только по последнему (текущему бару) и строить по нему нужные данные.

 

Это устойчивая форма, которая есть в справке. https://docs.mql4.com/ru/customind/indicatorcounted

Проставь принтов и сам поймешь, как изменяется limit по тикам.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте уважаемые господа программисты!

Столкнулся со следующей проблемой: пишу скрипт по нахождению треугольника / отрисовки треугольника. Есть 4 фрактальных точки по которым создаются трендовые линии и по их пересечению образуется формация треугольника, так вот 4 точки я нахожу. а вот пятую точку то есть где происходит пересечение, нужно найти путём вычисления и вот с этим проблема. То есть нужно найти цену и дату пересечения в будущем. У меня нашло например на графике USDCHF треугольник, цену в пятой точке пришлось заполнить в ручную, а вот временную точку вроде нашел правда не уверен что формула будет дальше работать на других формациях.  

 

 

 

 

triangle_formation1.png

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Alexfm2000 Приветствую. Как вариант функция "ObjectGetValueByShift" тебе поможет. Вычисляешь цены для каждой линии для определенного бара и сравниваешь с ценами предыдущего бара. Если цены изменили состояние, были одна внизу другая вверху а наследующем баре состояние поменялось стало одна вверху другая внизу, то вот оно пересечение между этими барами.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 минуты назад, MikR0ReR сказал:

@Alexfm2000 Приветствую. Как вариант функция "ObjectGetValueByShift" тебе поможет. Вычисляешь цены для каждой линии для определенного бара и сравниваешь с ценами предыдущего бара.

Да можно было бы воспользоваться этой функцией если бы уже были цены для последней точки. То есть цену которую нужно найти находиться в будущем бары со знаком минус. Я использовал ObjectGetValueByShift для нахождения прорывов. Первоначально я тоже подумал найти при помощи этой функции, но к сожалению так не получится. Нужна формула для вычисления по отрезкам чтобы найти цену пересечения в будущем

Я пробовал таким образом: - но пока что не получается как надо

            if(P2 > P4 && P2 > P1 && P4 < P3) // если цена верхней точки начала тр-ка P2 выше начала нижней точки P4
                                              // если P2 выше первой верхней точки, и P4 ниже нижней второй точки P3
            {
            double speed_up = (MathAbs(P2-P1)/(i2-i1)); //скорость цены верхней линии
            double speed_dn = (MathAbs(P3-P4)/(i4-i3)); //скорость цены нижней линии
            double start_price = P2 - speed_up * (i4-i2); //стартовая цена i4, i2 индексы фрактальных точек
            double start_pricedn = P4;

            //ищем точку пересечения 
            for (int i = 1; i<=50; i++)
            {
              price_up[i] = start_price - speed_up * i; //minus скорость падения
              price_dn[i] = start_pricedn + speed_dn * i; // плюс скорость подъёма
              
              if (price_up[i] <= price_dn[i])
              {
                apex = i; // индекс пятой точки
                P5 = price_up[apex];
                Print ("price P5 ", P5, "apex ", i); 
              } 
            
            }

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@Alexfm2000 Я с планеты " Я Вас не понимаю"

  • Цена уже известна и даже время. Вон Вы даже метку поставили П5 и Т5. Курсором наведите и терминал Вам скажет эти данные. Сомневаюсь, что терминал Вам ответит "ЗДЕСЬ НЕТ НАННЫХ :classic_angry: чет от меня хочешь". Это напоминает "Ты ведешь суслика, нет. А он есть". Для этого и сделана функция ObjectGetValueByShift что бы определять цены трендовых линей.
  • Если я не прав прошу объясните мне конструктивно.
  • И что значит
    40 минут назад, Alexfm2000 сказал:

    но к сожалению так не получится

    Разверните Ваше выражение.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
15 минут назад, MikR0ReR сказал:

Цена уже известна и даже время. Вон Вы даже метку поставили П5 и Т5. Курсором наведите и терминал Вам скажет эти данные.

Так я извиняюсь, возможно вы и правы просто, я не когда не пробовал использовать эту функцию в обратном направлении то есть когда бары ещё не были сформированы. Вот только как делать проверку пересечения? В цикле for  перебирать к примеру от -50 и до нулевого бара если пересечение либо совпадают ли цены трендовых линий?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
19 минут назад, Alexfm2000 сказал:

Вот только как делать проверку пересечения?

Поправка Я с планет "Немых". Печально, что на этой планете ты говоришь, а тебя не слышат. Я в первом посте дал ответ на этот вопрос.

2 часа назад, MikR0ReR сказал:

то вот оно пересечение между этими барами.

 

  • Далее
26 минут назад, Alexfm2000 сказал:

В цикле for  перебирать к примеру от -50 и до нулевого бара

Я бы начал перебор от начала линий, от точек П4Т4 и Т2П2 т.к. мы незнаем где это пересечение, до 0 бара или после.

 

  • Далее, я не понял, что дальше написано, одним словом каша.
30 минут назад, Alexfm2000 сказал:

если пересечение либо совпадают ли цены трендовых линий?

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 09.02.2021 в 23:36, Rever27 сказал:

В первый раз после запуска индикатора limit равно количеству баров и цикл проходит по всем барам в истории, чтобы построить данные индикатора.

На следующий тик IndicatorCounted() уже пересчитывается и limits будет равен 0 или 1. Соответственно цикл уже не будет гонять историю, а будет проходить только по последнему (текущему бару) и строить по нему нужные данные.

Благодарю! Очень доходчиво, я вас понял! И у меня получился один очень интересный момент. Суть такова - в индикаторе этот код работает:

 

   int counted_bars=IndicatorCounted();
   int i;
 
  // if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
 
   
   limit=Bars-counted_bars;
   Print("Limit = ", limit, " | Bars = ", Bars, " | Counter Bars = ", counted_bars);
   

 

Результат верный, согласно вашим словам:

1829713979_.png.52c57c09d0ecef12f110d44af67bcf6d.png

 

Но если я пытаюсь перенести этот код в советника,

   int limit;
   int counted_bars = IndicatorCounted();
 
   if(counted_bars>0) 
      counted_bars--;   
   
   limit = Bars - counted_bars;   
   Print("Limit = ", limit, " | Bars = ", Bars, " | Counter Bars = ", counted_bars);

 

То он дает результат, что counted_bars равен -1

 

2020155452_.png.1b70c212efdfc50ab015534e20be8f79.png

 

Почему? IndicatorCounted не работает в советниках? Его нельзя там использовать? Как быть?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
6 часов назад, Gamakiv сказал:

Его нельзя там использовать?

IndicatorCounted нельзя использовать в советниках. Это же написано в справке.

Если нужно, чтобы в первый тик после установки советников учитывались все бары, а во все следующие уже нет, то можно сделать простой bool переключатель.

Спойлер

 



#property copyright "Copyright (c) Trade Llike a Pro"
#property link      "https://www.tlap.com/"
#property version   "1.00"
#property strict
//--- input parameters

bool switcher = false;
int limit = 0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!switcher) { //подсчет, который нужно выполнить только 1 раз
      limit = Bars
      switcher = true;
   }
   else {
      limit = 2;
   }
   
   Print(limit);
   //дальнейшая работа с limit.
  }
//+------------------------------------------------------------------+

 

 

 

Либо же вообще выполнять все расчеты по нужным свечам в функции обработки событий OnInit, а в OnTick уже только за последние n свечей.

Изменено пользователем Rever27
  • Лайк 1
  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет, не могу найти индикатор который оставляет после сделки точку входа и выхода и чтоб между ними линия была, и чтоб это все не стиралось. У кого есть такой, можете поделиться?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, diodio сказал:

Всем привет, не могу найти индикатор который оставляет после сделки точку входа и выхода и чтоб между ними линия была, и чтоб это все не стиралось. У кого есть такой, можете поделиться?

Попробуй этот, код открытый, сможешь сам поправить как нужно

 

Show history on chart.mq4

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
17 часов назад, diodio сказал:

Всем привет, не могу найти индикатор который оставляет после сделки точку входа и выхода и чтоб между ними линия была, и чтоб это все не стиралось. У кого есть такой, можете поделиться?

Есть тут

https://tlap.com/forum/klassicheskie-indikatory/35/info-nabor-informacionnyh-indikatorov/7444/

 

Раздел - ИНДИКАТОРЫ ИНФОРМАЦИИ ПО ОРДЕРАМ

HistoryOrders

Спойлер

https://fxpics.ru/images/2018/08/24/24-08-2018-2-57-41HistoryOrders.jpg

 

VisualOrders

Спойлер

https://fxpics.ru/images/2018/08/24/24-08-2018-3-58-03VisualOrders.jpg

 

 

 

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Господа, подскажите.

Тестирую советника в mt4. Хочу чтобы при определенных событиях, он записывал нужную информацию в файлик. Но чего-то не записывает.

Это особенности тестера? Что при работе из под него(тестера), нет возможности записывать файлы? В другом скрипте этот код отрабатывает нормально.

 

Код:
 

void Loger(string strComment)
   {
      int hFile = FileOpen("LogOrger.txt", 
      FILE_TXT | FILE_READ | FILE_WRITE, '\t'); 
      
      FileSeek(hFile, 0, SEEK_END);
      FileWriteString(hFile, strComment, StringLen(strComment));             
      FileClose(hFile);
   }

 

Передаю вот это:

Loger(StringConcatenate("Close BUY order #", OrderTicket(), " was ", LogDealStatus));

 

 

В журнале пишется нормально:

Print(StringConcatenate("Close BUY order #", OrderTicket(), " was ", LogDealStatus));

 

1748509525_.png.f7140668574e73d9b30019a655e93914.png

 

Проверил по следующим каталогам:

Спойлер

147412737_.thumb.png.43273b2ce7f2418f0da0c955471b1a5f.png

 

Что делал:

1. Ставил флаг FILE_COMMON
2. Создавал пустой файл руками

 

PS.
На реальном графике запустить не могу, потому что нужные мне условия наступают довольно редко, а данные хочется получить сейчас

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 22.02.2021 в 21:24, Gamakiv сказал:

Это особенности тестера?

По всей видимости так и есть. Ибо на реальном графике, нужное мне событие наступило и лог записался.

 

811475605_.png.6e1b44ff9294edc8de445b32e9195cdf.png

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 22.02.2021 в 17:24, Gamakiv сказал:

Тестирую советника в mt4. Хочу чтобы при определенных событиях, он записывал нужную информацию в файлик. Но чего-то не записывает.

Все он записывает. 
Вот пример кода, который раз в свечу пишет данные цена Bid и Ask в .csv файл как при реальной торговле, так и при тестировании.

Файл тестирования хранится в директории \tester\files 

 

WriteCSVFile.mq4

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...