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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
dermitay уже придумал 1-проходный алгоритм. только надо решить: по одному символу в разные стороны торговля разрешена? если да и открыты разные ордера, то это считать или локи не считаются? А если в разных символах есть лок по валюте, то как? Короче надо вводить строгий/не_строгий режим по локам.
Суть: нам для анализа нужны только 2 валюты, в цикле по ордерам сразу выделяем валюты, если не наши - пропускаем, если хоть 1 наша - счетчик бай/селл +1. И всё. на выходе из цикла у тебя будут 4 счётчика - 1 валюта бай и селл и 2 валюта бай и селл.
единственный нюанс: ты записываешь новый символ в строку для его дальнейшего пропуска, а если торговля разрешена в обе стороны,то надо иметь 2 строки для бай и селл и в зависимости от типа ордера писать символы.
ПС: если что код накидаю.
Вот код, который выделяет 2 валюты из символа с учётом префиксов и суффиксов:
// GBPUSD
sym1 = SymbolInfoString( Symbol(), SYMBOL_CURRENCY_BASE ); //GBP
sym2 = SymbolInfoString( Symbol(), SYMBOL_CURRENCY_PROFIT ); //USD
Изменено пользователем 0ll
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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


по одному символу в разные стороны торговля разрешена?


да
Цитата


если да и открыты разные ордера, то это считать или локи не считаются?


нет, лок игнорится
считаются ордера вне лока( >1 в возврате CountOrders(...)). но как ты понимаешь - лок тут это два ордера одинакового объема смотрящие в разные стороны. анализа объемов и т.д. тут нет и в помине(это я про сложные составные локи)
Цитата


А если в разных символах есть лок по валюте, то как?


хм... такого в моем коде нет... хотя логически так-то есть. грубо говоря у меня реализвано что не больше двух(переменная NumMaxCur ) сеток в бай по GBP например (при этом учитывается и EURGBP в селл - то есть будет запрет на вход по построению сетки в селл по этой паре если существует уже две другие пары GBP### в бай или другой пример на запрет по конкретному EURGBP в селл - если сущесвует уже две пары по которым строится сетка в селл и эти пары имеют вид EUR###). то есть - именно это и реализовано.

Цитата


Суть: нам для анализа нужны только 2 валюты, в цикле по ордерам сразу выделяем валюты, если не наши - пропускаем, если хоть 1 наша - счетчик бай/селл +1. И всё. на выходе из цикла у тебя будут 4 счётчика - 1 валюта бай и селл и 2 валюта бай и селл.


именно это у меня и реализовано

Цитата


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



посмотри внимательней, у меня при нахождении символа идет полная проверка на все(я парсю как пару входящую в функцию, так и сам символ текущего перебираемого ордера в цикле, а дальше проверяю как на прямую корреляцию так и на обратную), и на это тоже.
поэтому в дальнейшем символ и исключается.

Цитата


Вот код, который выделяет 2 валюты из символа с учётом префиксов и суффиксов:
// GBPUSD
sym1 = SymbolInfoString( Symbol(), SYMBOL_CURRENCY_BASE ) ); //GBP
sym2 = SymbolInfoString( Symbol(), SYMBOL_CURRENCY_PROFIT ) ); //USD



не знал, спасибо \M/ >000
ЗЫ: так-то код у меня крутится уже двое суток и пока все работает именно так как задумано, я поэтому его и выложил. Изменено пользователем dermitay
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Вот накидал код 1 проходного алгоритма ( не проверял )

Спойлер


bool CheckFree(string para, int sd)
{
int s1cnt[2]={0,0}, s2cnt[2]={0,0}, dir = -1;
string s1str = SymbolInfoString( para, SYMBOL_CURRENCY_BASE );
string s2str = SymbolInfoString( para, SYMBOL_CURRENCY_PROFIT );
string s1tmp = "", s2tmp = "";
string name[2];

for ( int no = OrdersTotal()-1; no >= 0; no-- )
{
if ( !OrderSelect(no, SELECT_BY_POS, MODE_TRADES)
|| OrderSymbol() == para
|| OrderMagicNumber() != Magic
|| OrderType() > 1
) continue;
dir = OrderType();

if (StringFind(name[dir], OrderSymbol(), 0) >= 0) continue;
name[dir] += OrderSymbol() + ",";

s1tmp = SymbolInfoString( OrderSymbol(), SYMBOL_CURRENCY_BASE );
s2tmp = SymbolInfoString( OrderSymbol(), SYMBOL_CURRENCY_PROFIT );

if ( s1str == s1tmp ) s1cnt[dir]++; else if ( s1str == s2tmp ) s1cnt[1-dir]++;
if ( s2str == s1tmp ) s2cnt[dir]++; else if ( s2str == s2tmp ) s2cnt[1-dir]++;
}
//В строгом случае - лок всё равно запрет
return( !(s1cnt[sd] >= NumMaxCur || s2cnt[1-sd] >= NumMaxCur) );
}


ПС: исправил - исключил отложки. Изменено пользователем 0ll
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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



Делаю 2-й урок. а у меня выходит ошибка '{' - function definition unexpected, хотя все копирую как в видео.
можете глянуть, в чем дело.
[SPOILER]
void OnTick();
{

GetMinPrice();
GetMaxPrice();

Comment("MinPrice: " + DoubleToStr(minprice, 5) + "\n" +
"Maxprice: " + DoubleToStr(maxprice, 5));
}
void GetMinPrice();
{
for(int i=0; i (
mp = iLow(Symbol(),PERIOD_CURRENT,i);
if(mp minprice = mp;
)
return;
}

void GetMaxPrice();
{
for(int i=0; i (
mp = iHigh(Symbol(),PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
)
return;
}



А ты перед "{" убери ";". Точка с запятой ставится только если ты вызвал функцию откуда-то и после этого завершил написание действия. Т.е.
void Shalom(){
Bla bla;
if (aleichem()) Bla bla;
else Shabat(4, 33);
}

bool aleichem(){
Bla bla;
return (false) ;
}

Shabat(int a, int b){
Bla bla;
}


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

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

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

А вот вы как помечайте костыли?

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

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

Вопрос по второму уроку:
-Как задать время жизни отложенного ордера, скажем на несколько часов?
это по какой то причине не объяснили в уроке :(( :((

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

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


-Как задать время жизни отложенного ордера, скажем на несколько часов?

А чем не устраивает datetime expiration=0, // срок истечения ордера в функции OrderSend? или справку не читаем в принципе?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Старый бородатый анекдот в тему:

Подходит сын к отцу-программисту и спрашивает:
- Папа, а почему солнце всходит на востоке, а садиться на западе?
- Сынок, а оно точно всходит на востоке?
- Да.
- А точно садится на западе?
- Да папа.
- И так каждый день работает?
- Конечно
- Сынок, оставь все как есть и ничего не трогай!

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

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


А вот вы как помечайте костыли?



В коде "// ----- пометка"
а в шапке так: "// сделать то-то, строки 123-150"
Ссылка на сообщение
Поделиться на другие сайты

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

У меня вопрос по поводу OnChartEvent(...) в тестере с включенной визуализацией.

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

При этом я знаю что тот же Протрейдер обработку клавиш в тестере каким-то образом обрабатывает(через dll скорее всего но нахера так изгаляться?).
Толи лыжи не едут толи я...
Есть идеи почему такая дребедень и как это корректно обернуть в тестере?

Пример:

Спойлер


buy и sell - уже созданные кнопки. нажатие по ним и пытаюсь делать в тестере но нифига не происходит.


void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_OBJECT_CLICK)

{
Print("123");
if(sparam=="buy")
{
Print(">>>>>>>>>>");
Openord(0);
ObjectSetInteger(0,"buy",OBJPROP_STATE,0);
return;
}
//-----------------------------------------------------------------------------------------------------------------
if(sparam=="sell")
{
Openord(1);
ObjectSetInteger(0,"sell",OBJPROP_STATE,0);
return;
}
}



Добавлено: 23-04-2016 09:39:15

вопрос снимается... пустил обработку нажания клавиш в обход OnChartEvent() путем проверки нажатия через ObjectGetInteger(0,имя_кнопки,OBJPROP_STATE) Изменено пользователем dermitay
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Цитата: boovood от Сегодня в 09:04:21 am
-Как задать время жизни отложенного ордера, скажем на несколько часов?
А чем не устраивает datetime expiration=0, // срок истечения ордера в функции OrderSend? или справку не читаем в принципе?

Умник покажи мне в справке где вообще описано как задавать время жизни отложенного ордера! Желательно с примером реализации!!! я буквально вчера начал изучать язык программирования и столкнулся с проблемой - вот её и выкладыаю

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

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



А вот вы как помечайте костыли?



В коде "// ----- пометка"
а в шапке так: "// сделать то-то, строки 123-150"

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

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


Цитата: boovood от Сегодня в 09:04:21 am
-Как задать время жизни отложенного ордера, скажем на несколько часов?
А чем не устраивает datetime expiration=0, // срок истечения ордера в функции OrderSend? или справку не читаем в принципе?

Умник покажи мне в справке где вообще описано как задавать время жизни отложенного ордера! Желательно с примером реализации!!! я буквально вчера начал изучать язык программирования и столкнулся с проблемой - вот её и выкладыаю



батенька, вы приперлись за советом на форум а уже выеживаетесь. вас в гугле забанили?
на тупые вопросы а что такое datetime в expiration ответ найдете там же - в официальной справке mql4

https://docs.mql4.com/ru/trading/ordersend
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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


Ну номера строк имеют саоюство иногда смещаться


Согласен, бывает.
Но главное - записи в шапке: как только открываю код - сразу вижу.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Согластно справке я написал
tiket=OrderSend(Symbol(),OP_BUYSTOP, Lots, maxprice,3,SL,TP,"",magik,D'22:59:00',Blue);
но ордера живут бесконечно а не заканчивают жизнь в 22:59:00 каждого дня.
как мне это исправить?
я раньше спрашивал меня послали в справку и вобще накинулись вые....
какие мы крутые чтоб мы нашли эту информацию в справке.
Что нашёл в справке то не работает прошу помощи

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

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

в expiration вбивается время, которое ордер будет жить в секундах а не время в которое он должен удаляться. для примера вбей туда 3600 и ордер удалится через час после выставления(если не заденет его ценой).
пиши функцию удаления ордеров в нужное время. по-другому никак.
не, ну можно заморочиться с вычислением кол-ва секунд между нужным временем для удаления и текущим, и пихать эту разницу в expiration.

ЗЫ: ордера не живут бесконечно. они живут ровно столько секунд, сколько задано(даже если это при переводе на года будет хоть 30 лет).

Спойлер

ЗЫЫ: по поводу твоих эмоций - ты перепутал ресурс, здесь в основном сидят взрослые люди(которым в принципе абсолютно побарабану на мнение кого-то там ноунейма в онлайне), и то что знания и опыт ресурса ты видишь как "вые..." и типа "какие мы крутые", то это только твои проблемы, здесь этого нет.

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

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

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

ЗЫ: ордера не живут бесконечно. они живут ровно столько секунд, сколько задано(даже если это при переводе на года будет хоть 30 лет


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

test2.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
boovood спасибо за умника :d
Чуток поправил Вашу сову - код оптимизировал, можешь посмотреть, даже в профит работает...

test2.mq4

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

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

всем привет.
сделал домашнее задание по Уроку "Построение Индикаторов". все работает))
приятных выходных!!!!

indtest.mq4
GBPUSDDaily.png

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

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

boovood спасибо за умника :d
Чуток поправил Вашу сову - код оптимизировал, можешь посмотреть, даже в профит работает...
* test2.mq4 (2.77 кБ - загружено 2 раз.)

Ни х... себе оптимизировал что аж на один экран влазить стал!
Что скажешь - Умник он и есть умник!

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

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

довёл свой советник до прибыльности! кстати написанного после просмотра второго урока! Спасибо автору уроков :d

test2.mq4

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

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

Народ купил советник, декомпильнул его. Не могу дописать на то что бы он выставлял ордера две ошибки появляются. Я понял что на место print вписывается проверка на выставленные ордера и ordersend а как правильно вписать не могу понять и ещё как написать чтоб он в обе стороны ордера открывал. помогите или советом или сами программируйте но допишите в коде что вы сделали чтоб можно было понять.
Заранее благодарен.

Забиваем_гвозди_Buy_Only~.mq4

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

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


Народ купил советник, декомпильнул его. Не могу дописать на то что бы он выставлял ордера две ошибки появляются. Я понял что на место print вписывается проверка на выставленные ордера и ordersend а как правильно вписать не могу понять и ещё как написать чтоб он в обе стороны ордера открывал. помогите или советом или сами программируйте но допишите в коде что вы сделали чтоб можно было понять.
Заранее благодарен.



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

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

ЗЫ: это дело не пяти минут. это нужно воткнуть полностью в алгоритм, но, как мне кажется, ты сам не знаешь логики этого кода.
ЗЫЫ: не знаешь куда пихнуть ордерсенд - запихни его перед алертом или после - без разницы.
ЗЫЫЫ: не, ну может и найдется добрая душа, которая перелопатит весь код. это я к тому, чтобы ты сильно не обижался, если такая добрая душа здесь не найдется)) Изменено пользователем dermitay
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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


Добавлено: 25-04-2016 09:35:14

Кому надо красоту на график качаем
по ней можно торговать а не только смотреть
Но я не пойму как всё это можно впихнуть в один файл индюка
у кого будут мысли поделитесь.

AGGRESSION_BAR_~.mq4
Indicators.rar

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

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

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

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

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

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

Войти

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

Войти

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


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

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