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

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


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

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

double CandleHigh = iHigh(Symbol(), 0, 0);


Nikavl, ну вы же неправильно используете эти функции - нуля в конце там не должно быть, получается, что Вы берете значение High на нулевой (текущей) свече, как только пришел первый тик на свечу, у вас High=Low=Close=Open, поэтому и ноль выходит. Лучше конечно второй вариант, но тут опять же, хотите получать правильные данные, нужно брать High[1] и Low[1].
Еще, я далее не знаю как Вы считаете, ищете среднее значение вашего АТР, или нет, но в котировках часто проскакивают неполноценные свечи, поэтому для правильной работы нужно сравнивать if(CandleATR==0) break; если вы используете цикл, если вы используете только значения одной свечи, то либо return, либо берем следующую - High[2] и Low[2] и так далее, пока не будут нормальные значения
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

Вы когда нибудь видели дневную свечу полностью нулевую? Ну, чтоб open=high=low=close? Я ни разу нигде не видел. Не понимаю, зачем if(CandleATR==0) break;
А я б вот так написал:
double CandleHigh = iHigh(_Symbol, _Period, 1);
double CandleLow = iLow(_Symbol, _Period, 1);
double CandleATR = (CandleHigh - CandleLow) / Point;

Или даже период вывел бы во внешние переменные, чтоб можно было указать, с какого таймфрейма брать данные, типа такого:
input ENUM_TIMEFRAMES SLPeriod = PERIOD_D1;

double CandleHigh = iHigh(_Symbol, SLPeriod, 1);
double CandleLow = iLow(_Symbol, SLPeriod, 1);
double CandleATR = (CandleHigh - CandleLow) / Point;

Вот так повеселей бы было ;)

А еще прикольней было б так:

input ENUM_TIMEFRAMES SLPeriod = PERIOD_D1; // Период для анализа данных для стопа
extern int SearchSLHistory = 3; // Сколько свечей брать в расчет

double CandleHigh = iHigh(_Symbol, SLPeriod, iHighest(_Symbol, SLPeriod, MODE_HIGH, SearchSLHistory, 1)); //Ищем максимальный хай за последние SearchSLHistory свечи
double CandleLow = iLow(_Symbol, SLPeriod, iLowest(_Symbol, SLPeriod, MODE_LOW, SearchSLHistory, 1)); //Ищем минимальный лой за последние SearchSLHistory свечи
double CandleATR = (CandleHigh - CandleLow) / Point; Диапазон за последние SearchSLHistory свечи.

Одна свеча может же и флетовой быть, типа доджи, и стоп получится мизерный. А если диапазон - меньше вероятности. А почему для этих целей собсна атр не хотите использовать?

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

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

Всем здравствуйте!

Копирую свой пост из этой темы: http://tlap.com/forum/indikatory/7/urovni-indikator-adr-kak-sredstvo-borby-s-zhadnostyu/6604

Вкратце, ADR (Average Daily Range) - индикатор, расчитывающий средний дневной диапазон цены за последние N дневных баров, и на этом основании строящий внутридневные уровни предполагаемого диапазона текущего дня.

В общем, возникла у меня одна "граальная" идея с этим индюком, но для её адекватного тестирования нужно, чтобы ADR мог строить свои уровни на истории! А этого, к сожалению, текущая версия делать не умеет - рисует их только на последнем дне.
Поэтому я прошу всех заинтересовавшихся программеров написать такой индикатор, благо что алгоритм здесь предельно простой и понятный. (Меня боженька, к (не)счастью, не наградил способностями к кодингу :(() Думаю многие, не только я, будут вам очень благодарны.

Итак, алгоритм:
1. Считаем относительно каждого дня(!) расстояние в пунктах от High до Low последних "N" дневных свечей и складываем их.
2. Полученную сумму делим на кол-во дней "N", получаем среднее значение "S".
3. "S" делим на 2, получаем "Q"
4. Сверху и снизу от цены открытия рассчитываемого дня, на расстоянии равном "Q", рисуем уровни предполагаемых High и Low на этот день. Это и есть те самые уровни, который строит оригинальный ADR!

Спойлер



Пример.
Допустим, нам надо рассчитать ADR за последние 5 дней для 16 декабря 2016 на паре EURUSD.
1. Считаем и складываем расстояние High-Low за 9,12,13,14,15 декабря: 99+126+63+174+172=634
2. Общую сумму делим на 5 дней: 634/5=126,8 пункта ("S").
3. 126,8/2=63,4 ("Q")
4. От цены открытия 16 декабря 1,0412 на расстоянии в 63 пункта сверху и снизу рисуем по уровню:
Спойлер



Сосбственно, - и всё! Также ADR рисует и средние недельные уровни, но там немного по-другому нужно считать, и я не буду об этом заикаться, пока кто-то не осилит программу-минимум по дневным уровням ))

Пару слов о том, зачем все это нужно, об идее. Дело в том, что все рекомендуют использовать этот индюк в качестве ориентира по тейк-профиту внутри дня. Я же заметил другое: при первом(!) подходе цены к этим уровням, она почти всегда делает хотя бы небольшой, но - откат. Следовательно, хотелось бы на истории посмотреть как можно больше примеров и оптимизировать этот подход. Пока же я вручную считал и смотрел разные рандомные периоды у евробакса и фунтобакса, и предварительные результаты весьма и весьма обнадеживающие (Например, при определенных параметрах за ноябрь по фунту набирается 14 сделок в среднем по 15-20п без единого стопа!). Проблема в том, что ручками считать это все очень утомительно и долго, поэтому и обращаюсь к сообществу с такой просьбой. Возможно, коллективно придумаем что-то толковое.

Оригинальный индикатор - во вложении.

Спасибо за внимание!

Average_Daily_Range_Pro_Calculator.ex4
Average_Daily_Range_Pro_Calculator.mq4

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

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

благо что алгоритм здесь предельно простой и понятный


А код тут на 845 строчек, все переменные зашифрованы, без единого комментария, да еще с применением двумерных массивов :-W.
Не завидую тому, кто возьмется :).
Ссылка на сообщение
Поделиться на другие сайты

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

А код тут на 845 строчек, все переменные зашифрованы, без единого комментария, да еще с применением двумерных массивов. Не завидую тому, кто возьмется.


Спасибо за отзыв, но вы, кажется, не так меня поняли. Не стоит задачи скопировать для истории весь функционал оригинального индикатора, т.к., например, инфо-панель и недельные уровни (которых там штук 10) нам пока не нужны. Думаю, именно они занимают 90% кода. Может, я ошибаюсь, но сделать индюк по той формуле что я предложил, должно быть не сложнее чем написать какой-нибудь примитивный рисовальщик дневных пивот-уровней. 3 переменные, один раз сложил, 2 раза поделил, 2 линии нарисовал - всё!
Ссылка на сообщение
Поделиться на другие сайты

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

Привет!

Может кто подскажет, как заставить сову закрывать сделку при получении противоположного сигнала с индикатора, на котором она открывалась? Желательно иметь возможность выбора ТФ для этого индикатора.

Сейчас стоит так


extern bool oppositeclose=true; // close the orders on an opposite signal
extern bool reversesignals=false; // reverse the signals, long if short, short if long
extern bool usefilter3=true;
extern int filter3tf=240;
extern int mamethod7=2;
extern int maperiod7=6;
extern int mamethod8=3;
extern int maperiod8=2;
extern int trendshift3=1;
extern int maxtrades=100;


Потом под


int start(){
if(usefilter3)
double f3ha1=iCustom(Symbol(),filter3tf,"Heiken_Ashi_Smoothed",mamethod7,maperiod7,mamethod8,maperiod8,2,trendshift3);
double f3ha2=iCustom(Symbol(),filter3tf,"Heiken_Ashi_Smoothed",mamethod7,maperiod7,mamethod8,maperiod8,3,trendshift3);
if((oppositeclose && sell))closebuy();
if((oppositeclose && buy))closesell();
}


Компилятор ошибок не выдает, но ничего не работает.
P.S. Сам не кодер, нашел сову в нете, в ней все работает, кроме этого.
Заранее спасибо

Heiken_Ashi_MTF_EA.mq4

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

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

Привет! Хочу немного украсить оформление настройки параметров индикатора. Решил некоторые переменные вписать в выпадающий список, чтобы не прописывать их руками.

С численными переменными все ок. К примеру:

enum ENUM_TPO_DATAPERIOD
{
ENUM_TPO_DATAPERIOD_M1 = 1, // M1
ENUM_TPO_DATAPERIOD_M5 = 5, // M5
ENUM_TPO_DATAPERIOD_M15 = 15, // M15
ENUM_TPO_DATAPERIOD_M30 = 30, // M30
};

input ENUM_TPO_DATAPERIOD DataPeriod = ENUM_TPO_DATAPERIOD_M1;

Но вот со строковыми не пойму как приручить enum. Есть параметр string со значением "tf+m1". Я хочу создать такой же выпадающий список со значениями "tf+m5", "tf+m15" и т.д.

Ругается компилятор. Я уже пробовал EnumToString. Но, по ходу неправильно его использую, либо не понимаю как это реализовать.

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

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

Приветствую.
Подскажите, пожалста, зачем, в данном примере при использовании на графике с тремя знаками идет умножение на 10 равно как на графике с пятью?
int OnInit()
{
if (Digits==3 || Digits==5){
TakeProfit*=10; StopLoss*=10; Slippage*=10;}

return(INIT_SUCCEEDED);
}

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

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

Приветствую.
Подскажите, пожалста, зачем, в данном примере при использовании на графике с тремя знаками идет умножение на 10 равно как на графике с пятью?
int OnInit()
{
if (Digits==3 || Digits==5){
TakeProfit*=10; StopLoss*=10; Slippage*=10;}

return(INIT_SUCCEEDED);
}



Для того чтобы перевести старые пункты в новые. Это позволяет использовать советник с любыми котировками, хоть с 4 знаками после запятой, хоть 5. Для пар с JPY соответственно с 2 или 3 знаками.
Ссылка на сообщение
Поделиться на другие сайты

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

Для того чтобы перевести старые пункты в новые.


Я правильно понимаю что по этой логике получается что "старые" пункты имеют разницу в сто раз с "новыми"?
Ссылка на сообщение
Поделиться на другие сайты

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

Я правильно понимаю что по этой логике получается что "старые" пункты имеют разницу в сто раз с "новыми"?



В этой статье все подробно написано о старых и новых пунктах. http://tradelikeapro.ru/chto-takoe-novyie-i-staryie-punktyi/
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте уважаемые кодеры!
Обращаюсь за помощью.
Суть в следующем: есть бот который выставляет корзины ордеров, 1 корзина- все ордера в ней с одним магиком, вторая и так далее с другими, у каждой корзины свой уровень перевода в БУ и дальнейший трал. Но хотелось бы чтобы при достижении общего бу+n пунктов по всем ордерам отключался трал и перевод в бу по отдельным корзинам и все переводилось в общий БУ, и последующий трал. При всем при этом, после перевода всех ордеров в общий бу, новые корзины учитывались бы уже отдельно и работали по этой же схеме.
Так вот, просьба подсказать логику всего этого действа, ну и если есть кусок кода реализующий такой вариант то будет вообще круто.
Спасибо.

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

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

Написал свой первый советник для торговли на Форекс в Metatrader 4 .Использовал для этого его MetaEditor.Помоги,пожалуйста, разобраться.Советник в
тестере «по ценам открытия» работает хорошо. Но на Демо счете, на контрольных точках и всех тиках в тестере — выставляет до 500 ордеров за несколько секунд, а за день — 2-3 пачки таких ордеров.Как сделать, чтобы на Демо и реальном счете он выставлял 1 ордер на Д1?

DMB.mq4

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

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

У тебя в коде нет проверки на наличии уже выставленных отложенных и открытых ордеров. Ты должен сначала проверить есть ли уже открытые ордера или нет.

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

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


Написал свой первый советник для торговли на Форекс в Metatrader 4 .Использовал для этого его MetaEditor.Помоги,пожалуйста, разобраться.Советник в
тестере «по ценам открытия» работает хорошо. Но на Демо счете, на контрольных точках и всех тиках в тестере — выставляет до 500 ордеров за несколько секунд, а за день — 2-3 пачки таких ордеров.Как сделать, чтобы на Демо и реальном счете он выставлял 1 ордер на Д1?


Добавьте в коде подсчет количества ордеров:
   //Подсчет Sell и Buy ордеров
int CountSell=0, CountBuy=0;
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY) CountBuy++;
if(OrderType()==OP_SELL) CountSell++;
}

И проверку:

if(CountBuy==0 и есть сигнал на покупки) {открываем ордер buy}
if(CountSell==0 и есть сигнал на продажи) {открываем ордер sell}

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

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

Всем доброго времени суток!
У меня следующая проблема - не могу разобраться как сделать, чтобы на открытие каждой свечи открывались ордера. не важно какие, условие смогу прописать. А вот именно, чтоб на открытии - у меня не получается. Буду очень признателен за помощь!

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

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

Всем привет! У меня есть глобальный вопрос. Месяца три назад начал изучать MQL4 по учебнику Ковалёва, но после обновления некоторые моменты не совпадают. расскажите мне пожалуйста на людском языке как надо правильно писать функцию OnInit? OnDeinit,OnTick и где надо ставить void,где после return надо скобки, где ноль в скобках, короче у меня такая каша в голове. С учебника просто повторял код , там конечно int start() и всё в таком духе, перевёл на On Init и всё хана куча ошибок. Помогите!!!!!


Добавлено: 09-02-2017 20:49:30

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

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

расскажите мне пожалуйста на людском языке как надо правильно писать функцию OnInit? OnDeinit,OnTick и где надо ставить void,где после return надо скобки, где ноль в скобках, короче у меня такая каша в голове.



Если бы вы посмотрели первый пост этой темы, то вопрос отпал бы сам собой. В видео курсе все подробно объясняется. http://tradelikeapro.ru/programmirovanie-na-mql-kurs/

Цитата

как сюда вложить скриншот?



В FAQ по форуму написано как это сделать. Ответ здесь http://tlap.com/forum/forum-trade-like-a-pro/14/bolshoe-faq-po-forumu/2421/?do=findComment&comment=31714
Ссылка на сообщение
Поделиться на другие сайты

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

Помогите пожалуйста реализовать в код следующие:
1. Ищем на графике элемент по имени, в пределах дня (горизонтальная линия).

2. Получаем цену уровня.

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

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

Добрый день!
Реализация и пример использования:

int start()
{
string name_obj = "HLine_Name";
Comment(GetPriceObject(name_obj));
//-----------------------------------------------------------------
return(0);
}

double GetPriceObject(string name_obj)
{
double price = -1;

if(ObjectFind(0, name_obj) != -1)
{
price = ObjectGet(name_obj, OBJPROP_PRICE1);
}
return(price);
}

Поставьте прививку, помогает )
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые форумчане, по видео _https://www.youtube.com/watch?v=63REtIKc4gQ (это написание советника на TMA_Fair, написал свой и имею сейчас такую непонятку
ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,vSpread,0,0,"TMA_BB",MagicNumber,0,Red);
if(ticket>0)
{
SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
if(OrderSelect(ticket,SELECT_BY_TICKET)) OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
}
Код взят из урока. У одного брокера идет модификация ордеров, у другого ошибка 130. Подскажите, как разрулить такую ситуацию?

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

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

Если правильно понял вопрос, то нужно найти разницу во времени между ближайшей вертикальной линией и последним баром. Имена линий меняются и непостоянны. Задача именно в том, чтобы определить ближайшую к нулевому бару вертикальную линию, получить её временнУю координату и вычислить расстояние от нулевого бара до этой самой линии. Т.к. из задачи неясно в каких именно единицах мы будем измерять дистанцию между последним баром и вертикальной линией, то будем измерять ее в стандартных для программирования, применительно ко времени, единицах, т.е. в секундах. Пишем скрипт, который будет выводить это расстояние в виде алерта. Поехали.

void OnStart()
{
string dist=IntegerToString(TimeToLineDistance());
Alert("Дистанция до ближайшей вертикальной линии ",dist);

}

long TimeToLineDistance()
{
//зададим переменной значение побольше, в даннном случае в секундах равное примерно одному году
long timeDistance=32000000;
//сюда будем запоминать имя исомой линии (вдруг пригодится)
string objName="lineName";
//получим количество всех графических объектов на графике
int objTotal=ObjectsTotal();
//в цикле проверим каждый объект
for(int i=0;i {
//получаем сюда имя обрабатываемого объекта
string oName=ObjectName(i);

//если выбраный объект является горизонтальной линией
if(ObjectType(oName)==OBJ_VLINE)
{
//получаем её временную координату
long objTime=ObjectGetInteger(0,oName,OBJPROP_TIME);

//если время линии больше времени последнего бара
if(objTime>Time[0])
{
//высчитаем расстояние между временем линии и последним баром
long t_distance=objTime-Time[0];

//если временнАя разница с последним баром наименьшая
if(t_distance {
objName=oName;//то запоминаем имя этой линии
timeDistance=t_distance;//и запоминаем искомое раастояние
}

}
}
}
return(timeDistance);
}


Теперь мы получили искомую дистанцию в секундах. Что с этим делать дальше уже зависит от Ваших задач.
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

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


и тишина в ветке...
либо всё понятно и погнали дальше, либо тема нафиг не нужна и желание научиться чему-то было сиюминутным?

У меня проблема, перестали работать файлы с расширением mq вв терминале МТ4, и от этого индикаторы не видны в списке всех индикаторов. Есть ли какие нибудь специалисты которые могли бы помочь? Помогите буду очень блогодарен.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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