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

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


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

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


Oll, но в твоем примере не сработает отследить что нужные бары идут подряд (а это именно то, что нужно) или я чего-то не понял

Если не подряд, то счётчик обнуляется. O0

chistaia-rodina это время компиляции, а не прогона. Для чего оно нужно - не знаю, ибо на одном и том-же коде может быть сильно разным из-за доп. нагрузок на процессор.

Добавлено: 25-10-2015 16:04:56


Всем привет! Не могу понять почему ордера не открываются) В этом деле новичок, нужна помощь.

Здесь просто: нужно код перенести из start() в OnTick() (старт потом удалить) Изменено пользователем 0ll
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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


0ll, ок, спс. На будущее... счетчики быстрее чем циклы?

В сотни раз. Цикл тоже на счётчике + вычисления внутри цикла и т.д.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Сложно сказать... в журнале пишет чего-нибудь. Если хотите чтоб проблема решалась нужно сову целиком выкладывать - ведь в тестере не запустишь кусочек...
ПС: это: if (OrderProfit()*(-1) > Zamok) можно писать более понятно: if (OrderProfit()

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

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


JR не нормальная. Цикл вообще не нужен. Просто счётчик баров с фильтром размера. Логика:
Если размер бара больше Х - счетчикБаровБай++ иначе =0
Если размер бара меньше -Х - счётчикБаровСелл++ иначе =0
Если счетчикБаровБай больше N - код
Если счётчикБаровСелл больше N - код

ПС: Естественно запускать счётчики на открытии бара.
ППС: после исполнения кода можно обнулить счётчик или нет - тебе решать.


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

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

Тогда что-то типа:
Если abs(клоуз-опен)Иначе Если клоуз>опен счетчикБаровБай++; счетчикБаровСэлл=0
иначе счетчикБаровСэлл++; счетчикБаровБай=0

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

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


В довольно странном :) учебном задании также выбраковываются все свечи меньше BarPipsMin (в абсолютном выражении).


Немного разъясню (раскрою страшную тайну), чего я вас тут терроризирую )))
В качестве хобби и зарядки для ума изучаю MQL и пишу своего супер-сеточника. Как основу (пример) взял ApMGrid. Многое оттуда удалось повторить, кое-что не смог, в силу отсутствия времени и знаний, кое-что привнес свое. В частности изучаю разные режимы работы для сеточника-мартингейла. Индикаторый вход на базе болинджера+стохастик+рси повторить не составило труда, но захотелось добавить свои режимы.
Так вот например заметил, что на некоторых парах, после приведенного в качестве примера выше паттерна (2-4 свечи одного направления и не меньше X-пунктов) случается неплохой откат. Почему-бы не взять такой паттерн в качестве индикаторного входа для советника на мартингейле? Неточности как всегда закроем сеткой :)
Чтобы не быть голословным - картинка теста во вложении на AUDUSD. Это не грааль, но при мультивалютной торговле может показать неплохие результаты.

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

TesterGraph1.gif

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
JR, в Лаборатория ProfitFX вход абсолютно свободный и всячески приветствуется!
Ограничение только одно - код должен быть собственной разработки или кого-то из форумчан или по заказу кого-то из форумчан.
Созреете - выкладывайте бота безоговорочно.

Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо за -Zamok

Вот цельный код.


Добавлено: 25-10-2015 21:47:59

в журнале есть ошибка но не знаю как ее исправить "OrderSend error 130" везде уже вставил MarketInfo ошибка сохраняется.

MAX.mq4

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

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


Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.



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

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

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

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

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


Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.

v:) v:) v:)
JR не смотри ни в коем случае!!! если посмотришь, то не говори, что я тебя не предупреждал...
Просто живёшь спокойно, своего бота ковыряешь, а потом вот такое посмотришь и всё, писец, как дальше жить?
ПС: я смотрел (валерьянка не помогает)
ППС: Qj без обид - я в восхищении.
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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



Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.



Да я отдаю себе отчет, что во многих случаях "изобретаю велосипед" :)
Просто, как уже писал, для меня это лишняя практика, тренинг и обучение, приносящее удовольствие )))

JR, в принципе, я сторонник обучения на чужих ботах.
Берешь действительно серьезную программу, изучаешь её до буковки, пока не поймешь абсолютно всё - и потом пробуешь её улучшить хоть немного.
Это обычно хорошая школа.

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

Но код от Qj я тоже не рекомендую - сложен для начинающих. Хорош - но сложен!
Кстати, код широко известного KimIV тоже, как по мне, сложен для начинающих: каждый блок прост - а в целом воспринимается сложно.

Ну а вообще программирование в удовольствие ничуть не хуже, чем писать прозу, рисовать или музицировать.
Вполне творческое и приносящее удовольствие занятие для тех, у кого есть к этому хоть какой-то талант.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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



Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.

v:) v:) v:)
JR не смотри ни в коем случае!!! если посмотришь, то не говори, что я тебя не предупреждал...
Просто живёшь спокойно, своего бота ковыряешь, а потом вот такое посмотришь и всё, писец, как дальше жить?
ПС: я смотрел (валерьянка не помогает)
ППС: Qj без обид - я в восхищении.

Извиняюсь за оффтоп, но это только начало :)
Ссылка на сообщение
Поделиться на другие сайты

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

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

[SPOILER]
//---------------------------------------------------------------------------------------------
// Expert initialization function
//---------------------------------------------------------------------------------------------
int OnInit()
{
...
GVNamePrefix=GVNamePrefix0+Symbol()+"_";
GlobalVarablesRead();
...
//---
return(INIT_SUCCEEDED);
}

//---------------------------------------------------------------------------------------------
// Чтение глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesRead()
{
double _OrdersCount;
if (GlobalVariableGet(GVNamePrefix+"OrdersCount", _OrdersCount)) OrdersCount = _OrdersCount;
else OrdersCount = 0;
if (!GlobalVariableGet(GVNamePrefix+"LotSize", LotSize)) LotSize = 0;
if (!GlobalVariableGet(GVNamePrefix+"CurrTrend", CurrTrend)) CurrTrend = 0;
}

//---------------------------------------------------------------------------------------------
// Запись глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesWrite()
{
GlobalVariableSet(GVNamePrefix+"OrdersCount", OrdersCount);
GlobalVariableSet(GVNamePrefix+"LotSize", LotSize);
GlobalVariableSet(GVNamePrefix+"CurrTrend", CurrTrend);
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Delirious сохранить можно любое значение. Вам какое? зачем нужно обращаться к сигналу, который остался в прошлом? а если будет другой сигнал, переписываем или все сигналы хранить будем?
Ссылка на сообщение
Поделиться на другие сайты

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


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

[SPOILER]
//---------------------------------------------------------------------------------------------
// Expert initialization function
//---------------------------------------------------------------------------------------------
int OnInit()
{
...
GVNamePrefix=GVNamePrefix0+Symbol()+"_";
GlobalVarablesRead();
...
//---
return(INIT_SUCCEEDED);
}

//---------------------------------------------------------------------------------------------
// Чтение глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesRead()
{
double _OrdersCount;
if (GlobalVariableGet(GVNamePrefix+"OrdersCount", _OrdersCount)) OrdersCount = _OrdersCount;
else OrdersCount = 0;
if (!GlobalVariableGet(GVNamePrefix+"LotSize", LotSize)) LotSize = 0;
if (!GlobalVariableGet(GVNamePrefix+"CurrTrend", CurrTrend)) CurrTrend = 0;
}

//---------------------------------------------------------------------------------------------
// Запись глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesWrite()
{
GlobalVariableSet(GVNamePrefix+"OrdersCount", OrdersCount);
GlobalVariableSet(GVNamePrefix+"LotSize", LotSize);
GlobalVariableSet(GVNamePrefix+"CurrTrend", CurrTrend);
}



Спасибо! Опробую

Добавлено: 27-10-2015 07:14:21


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


Я писал , значение булевого типа. Суть в чём, предположим имеется канал и по идее должен произойти отбой от этого канала, но перед тем как это произойдёт цена может и дальше уходить за линию канала , так вот мы храним в переменной состояние , которое , грубо говоря, определяло бы перекупленность/перепроданность(в данном конкретном случае 2 переменных orderbuy = FALSE/TRUE, ordersell = TRUE/FALSE). Но входить в сделку мы будем, в тандеме с другим индикатором, более медленным, когда он будет подтверждать движение в интересующую нам сторону, что пора входить в сделки, но пока это произойдёт пройдёт n-ое количество свечей перед тем как оба индикатора будут показывать сигналы на покупку/продажу Изменено пользователем Delirious
Ссылка на сообщение
Поделиться на другие сайты

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

Ну это просто. Объявите переменную bool уровня программы (сразу после внешних переменных). Только не забудьте сбрасывать её в фальсе после использования. Глобальные переменные уровня терминала здесь в принципе не нужны. имхо.

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

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


Ну это просто. Объявите переменную bool уровня программы (сразу после внешних переменных). Только не забудьте сбрасывать её в фальсе после использования. Глобальные переменные уровня терминала здесь в принципе не нужны. имхо.



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

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

Друзья, здравствуйте! Помогите советом: есть робот, который работает так как и нужно, когда на счете только он один и на одной паре. Но как только стоит его же запустить на другую пару этого же счета, то все начинает глючить - выдает ошибку "не правильных параметров" (err 3). Хотя, магики разные... даже, специально сделал для каждой пары своего, отдельного, чтоб он не путался, но не помогло... Кто знает, как можно это исправить???? Цель - один робот на одном счете работает на разных параз. Заранее, благодарю.

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

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

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

int _GetLastError=0,_OrdersTotal=OrdersTotal();

for(int z=_OrdersTotal-1; z>=0; z --)
{

if(OrderSelect(z,SELECT_BY_POS)==true)
{



//---- если позиция открыта не по текущему инструменту, пропускаем её
if(OrderSymbol()!=Symbol()) continue;

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if(OrderMagicNumber()!=Magic) continue;

Print("ok");

}

else
{
order=OrderSend(Symbol(),OP_SELLSTOP,Lots*0.1,Bid-Otstup*Point,3,0,0,Magic+" "+Symbol(),Magic,0,Green);
}
Sleep(20000);
}

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

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

int order_type;

// это делаем после того, как ордер выбран
order_type=OrderType();

// вот проверка что ордер отложенный
if (order_type==OP_BUYSTOP || order_type==OP_BUYLIMIT || order_type==OP_SELLSTOP || order_type==OP_SELLLIMIT)
break; // сами же говорили, чтоб открывался только один

*** На всякий случай документация по типам ордеров _docs.mql4.com/ru/trading/ordertype

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
grave Вы открытие ордера не туда поместили... Логика Вашей программы сейчас такова:
- Цикл по ордерам
- Если ордер выделен успешно (select), то проверяем символ и магик. и дальше ничего!?
если ордер не выбран, то открываем новый! - это не правильно.

Поправьте общую логику. и согласен с st2050 нужна сортировка по типу и вот тогда, если данного типа нет - открытие.:
//сначала (до цикла) определяем счётчики:
int countSS=0, countBS=0;
//туда, где Print("ok") пишем:
if (order_type==OP_BUYSTOP) countBS++;
if (order_type==OP_SELLSTOP) countSS++;
//после выхода из цикла туда где Sleep(20000) (а лучше вместо):
if (countBS == 0) //открываем БайСтоп
if (countSS == 0) //открываем СеллСтоп

ПС: зачем Вам Sleep(20000);?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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