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

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


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

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

PS: доступа к коду торгующего советника нет. 

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

1 час назад, DUBROV сказал:

А команды, чтобы из одного советника выгрузить параметры другого в *.set-файл и потом загрузить отредактированные обратно, есть?

Можете пробовать сделать через DLL на 90% уверен что это можно сделать, например через WinApi открываете свойства нужного советника, и подсовываете ему нужный сет файл.

Но скорее всего это будет ненадежно. 

 

Так же можете открывать новый шаблон/профиль с закрытием старого.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

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

Можете пробовать сделать через DLL на 90% уверен что это можно сделать, например через WinApi открываете свойства нужного советника, и подсовываете ему нужный сет файл.

Но скорее всего это будет ненадежно. 

 

Так же можете открывать новый шаблон/профиль с закрытием старого.

Благодарю!!! Показали определённое направление выхода из тупика. Будем развиваться, осваивать новое, копать дальше.

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

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

Доброго времени. Такой вопрос, советник работает по индикаторам, есть индикатор, при сигнале которого ордер должен закрыться на следующей свече, если прописываем сдвиг. Да, он закрывается если ордер в плюсе, но иногда бывают моменты когда ордер в минусе и индикатор сигнализирует закрытие, но ордер в этом случае не закрывается. Вопрос почему? Сигнал на закрытие есть, ну да, он в минусе, но минус то растет, и ему бы лучше закрыться при сигнале. Можно что-то добавить в код чтоб закрытие при минусе и по сигналу было принудительным? Может цикл спасет из нескольких проходов? А то цикл работает один раз и все, ордер то один выставляется.

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

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

Да, он закрывается если ордер в плюсе, но иногда бывают моменты когда ордер в минусе и индикатор сигнализирует закрытие, но ордер в этом случае не закрывается. Вопрос почему?

Без кода тяжело что то подсказать.

Есть ошибки в журнале при попытке закрыть?

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

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

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

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

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

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

int RangePeriod = 100; //считаем по 100 последним барам
double high = iHigh(Symbol(), Period(), iHighest(Symbol(), Period(), MODE_HIGH, RangePeriod));
double low = iLow(Symbol(), Period(), iLowest(Symbol(), Period(), MODE_LOW, RangePeriod));
double range  =  high - low;

 

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Rigal сказал:
double range  =  high - low;

@Rigal, не осилил цикл дописать? :))

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
8 часов назад, Rigal сказал:
int RangePeriod = 100; //считаем по 100 последним барам
double high = iHigh(Symbol(), Period(), iHighest(Symbol(), Period(), MODE_HIGH, RangePeriod));
double low = iLow(Symbol(), Period(), iLowest(Symbol(), Period(), MODE_LOW, RangePeriod));
double range  =  high - low;

 

спасибо большое но все равно не получается(

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

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

#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      
#property version   "1.00"
#property strict


extern int    BarCountOpen    = 10; //Меняем значение при добавлении
extern int    BarCountClose   = 10; //Меняем значение при добавлении
extern int    КолвоСвечей     = 1;  //Меняем значение при добавлении


double minprice = 999999, mp,
       maxprice = -999999, range, total;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{


    GetMaxPrice();
    GetMinPrice();
    GetMiddleCount();
    
    Comment("MinPrice: " + DoubleToStr(minprice) + "\n" +
            "MaxPrice: " + DoubleToStr(maxprice) + "\n" +
            "MiddleCount: " + DoubleToStr(range) + "\n" +
            DoubleToStr(total));
  

}
//+------------------------------------------------------------------+
void GetMinPrice()
{
    for (int i = BarCountOpen; i < BarCountClose; i++)
    {
         mp = iLow(Symbol(), PERIOD_CURRENT, i);
         if (mp < minprice)
             minprice = mp;
    }
    return;
}
//+------------------------------------------------------------------+
void GetMaxPrice()
{
    for (int i = BarCountOpen; i < BarCountClose; i++)
    {
        mp = iHigh(Symbol(), PERIOD_CURRENT, i);
        if (mp > maxprice)
            maxprice = mp;
    }
    return;
}
//+------------------------------------------------------------------+  
void GetMiddleCount()
{
    for (int i = BarCountOpen; i < BarCountClose; i++)
    {
         int RangePeriod = i; //считаем по 100 последним барам
         double high = iHigh(Symbol(), Period(), iHighest(Symbol(), Period(), MODE_HIGH, i));
         double low = iLow(Symbol(), Period(), iLowest(Symbol(), Period(), MODE_LOW, i));
         range  =  high - low;
         total = range/КолвоСвечей; 
         
    }
    return;
}

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

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

Я хочу задать период например с 20 свечи по 45 и в этом периоде посчитать сумму всех high а затем сумму всех low затем суммаhigh - суммаlow = total, и в конечном итоге total поделить на количество свечей.

 

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

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

спасибо большое но все равно не получается(

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double total = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         double high = iHigh(Symbol(), Period(), i);
         double low = iLow(Symbol(), Period(), i);
         double range  =  high - low;
         total += range; 
    }
    return(total/CountBars);
}

По-моему все решали разные задачи :)

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, usver73 сказал:
extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double total = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         double high = iHigh(Symbol(), Period(), i);
         double low = iLow(Symbol(), Period(), i);
         double range  =  high - low;
         total += range; 
    }
    return(total/CountBars);
}

По-моему все решали разные задачи :)

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

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

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

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

слишком мало информации.ю
Вставьте Print, задайте стартовое значение-1, количество 2, посчитайте калькулятором, сравните с расчетным значением...

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

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

слишком мало информации.ю
Вставьте Print, задайте стартовое значение-1, количество 2, посчитайте калькулятором, сравните с расчетным значением...

я вот тоже хотел сказать: "не работает", "работает неправильно" - это так себе формулировка проблемы.

Но если следовать ТЗ вот тут

2 часа назад, Гладиoлус сказал:

Я хочу задать период например с 20 свечи по 45 и в этом периоде посчитать сумму всех high а затем сумму всех low затем суммаhigh - суммаlow = total, и в конечном итоге total поделить на количество свечей.

то, вот так:

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double sumHigh = 0.0;
	double sumLow = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/CountBars);
}

Исторические значения могут быть недоступны, начиная с некоторого индекса (настройки терминала). В идеале нужно проверять каждый полученный iHigh и iLow на > DBL_EPSILON и != EMPTY_VALUE и если оно не проверилось - тут же возвращать, например, EMPTY_VALUE, или ноль.

 

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

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

слишком мало информации.ю
Вставьте Print, задайте стартовое значение-1, количество 2, посчитайте калькулятором, сравните с расчетным значением...

А, все, спасибо, получилось 

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

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

я вот тоже хотел сказать: "не работает", "работает неправильно" - это так себе формулировка проблемы.

Но если следовать ТЗ вот тут

то, вот так:

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double sumHigh = 0.0;
	double sumLow = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/CountBars);
}

Исторические значения могут быть недоступны, начиная с некоторого индекса (настройки терминала). В идеале нужно проверять каждый полученный iHigh и iLow на > DBL_EPSILON и != EMPTY_VALUE и если оно не проверилось - тут же возвращать, например, EMPTY_VALUE, или ноль.

 

Вот как, понял, спасибо большое.

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

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

я вот тоже хотел сказать: "не работает", "работает неправильно" - это так себе формулировка проблемы.

Но если следовать ТЗ вот тут

то, вот так:

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double sumHigh = 0.0;
	double sumLow = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/CountBars);
}

Исторические значения могут быть недоступны, начиная с некоторого индекса (настройки терминала). В идеале нужно проверять каждый полученный iHigh и iLow на > DBL_EPSILON и != EMPTY_VALUE и если оно не проверилось - тут же возвращать, например, EMPTY_VALUE, или ноль.

 

А можно ли сделать так что бы ввел дату и время свечи начала отрезка и конца отрезка и из этого отрезка производился подсчет тот же что и выше?

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

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

или же на графике провести трендовую линию от одной свечи к другой и за этот промежуток индикатор посчитал (ну это будет уже в идеале). Я кстати пытался сделать это с помощью OBJ_TREND но что то ничего не получилось

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

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

#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern datetime OpenDate=D'2021.12.01 00:00';
extern datetime CloseDate=D'2021.12.31 00:00';
extern int Amount = 19;
   double sumHigh;
    double sumLow;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
 
    
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   int StartBar = 1;
   int CountBars = 100;
   
   GetMiddleSize();
   Comment((sumHigh - sumLow)/Amount);
   
}
//+------------------------------------------------------------------+
double GetMiddleSize()
{
    sumHigh = 0.0;
     sumLow = 0.0;

    for (int i = CloseDate; i < OpenDate; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/Amount);
}
//+------------------------------------------------------------------+
 

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

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

вот я вместо StartBar и CountBar вписал datetime но к сожалению выдает ошибку

даты, конечно, не заменяют простой счетчик.

Функции iHigh  и iLow принимают номер бара, не дату.

Вам нужно превратить даты в номера баров. Для этого есть метод iBarShift

Но вообще у меня складывается впечатление, что вам бы пригодился базовый курс по программированию. 

На любом языке.

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

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

даты, конечно, не заменяют простой счетчик.

Функции iHigh  и iLow принимают номер бара, не дату.

Вам нужно превратить даты в номера баров. Для этого есть метод iBarShift

Но вообще у меня складывается впечатление, что вам бы пригодился базовый курс по программированию. 

На любом языке.

Безмерно благодарен, даа так и есть, знания по программированию у меня совсем скудные к сожалению. НО это пока что) 

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

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

Безмерно благодарен, даа так и есть, знания по программированию у меня совсем скудные к сожалению. НО это пока что) 

ну вот здесь в ветке есть видеоуроки, например

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

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

ну вот здесь в ветке есть видеоуроки, например

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

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

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

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

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

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

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

Войти

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

Войти

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


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

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