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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
vitek01 делай так: int R = (int) ( ( High[ 0 ] - Low[ 0 ] ) / _Point );


Ух ты, спасибо 0ll, полазил по гугле по данной проблеме, одно фуфло, а тут 1 строчкой проблемку решили!

чтобы привести к понятным пунктам для 5 знака зделал так
int R = (int) ( ( ( High[ 0 ] - Low[ 0 ] ) / _Point ) ) / 10;
конечно огругляет не в мою пользу, откидывая лишнее, но ясно и понятно. Изменено пользователем vitek01
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

функция удаления ордеров для xNorDx
комментарии, я думаю, излишни.

Спойлер

// sd == 0 - бай/байлимит/байстоп
// sd == 1 - селл/селллимит/селлстоп
// sd == -1 - значение по умолчанию. удаляет и закрывает ВСЁ
void CloseAll(int sd = -1)
{
int ord=OrdersTotal();
double pr= 0;
for(int i=ord-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderSymbol()!=Symbol()) continue;
if(OrderMagicNumber()!=magic) continue;
if((sd==0 && (OrderType()==2 || OrderType()==4)) || (sd==1 && (OrderType()==3 || OrderType()==5))||(sd==-1&&OrderType()>1))
{
int k=10;
while(k>0)
{
if(OrderDelete(OrderTicket())) break;
Sleep(50);
k--;
}
continue;
}
if(OrderType()==sd || (sd==-1&& OrderType() {
int k=10;
while(k>10)
{
RefreshRates();
if(OrderType()==0) pr=Bid;
if(OrderType()==1) pr=Ask;
if(OrderClose(OrderTicket(),OrderLots(),pr,30)) break;
k--;
Sleep(50);
}
}
}
}

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

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

Добрый день, можно ли как-нибудь понять почему индикатор рисующий пивоты (DailyPivot_ind2) выдает при перезагрузке TF разные результаты, а советник по тем же (за малым исключением которые касаются тупо выбора предыдущего бара) формулам выдает 1 стабильный вариант который вплоть до 10+ пунктов отличается от индюка?

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

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


Добрый день, можно ли как-нибудь понять почему индикатор рисующий пивоты (DailyPivot_ind2) выдает при перезагрузке TF разные результаты, а советник по тем же (за малым исключением которые касаются тупо выбора предыдущего бара) формулам выдает 1 стабильный вариант который вплоть до 10+ пунктов отличается от индюка?


потомучто скорее всего в индюке используется настройка сдвига GMT(), из-за чего в коде используется не простое обращение к предыдущему дню, наподобие iHigh(Symbol(),PERIOD_D1,1), а идет подсчет баров, и именно из-за этого подсчета и возникают "сдвиги", то есть конец дня на разных ТФ из-за ограничения в количестве баров попадает на разные временные промежутки, и соответственно на разные цены хай/лоу.
Ссылка на сообщение
Поделиться на другие сайты

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



Добрый день, можно ли как-нибудь понять почему индикатор рисующий пивоты (DailyPivot_ind2) выдает при перезагрузке TF разные результаты, а советник по тем же (за малым исключением которые касаются тупо выбора предыдущего бара) формулам выдает 1 стабильный вариант который вплоть до 10+ пунктов отличается от индюка?


потомучто скорее всего в индюке используется настройка сдвига GMT(), из-за чего в коде используется не простое обращение к предыдущему дню, наподобие iHigh(Symbol(),PERIOD_D1,1), а идет подсчет баров, и именно из-за этого подсчета и возникают "сдвиги", то есть конец дня на разных ТФ из-за ограничения в количестве баров попадает на разные временные промежутки, и соответственно на разные цены хай/лоу.

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

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


функция удаления ордеров для xNorDx
комментарии, я думаю, излишни.

Прости, но хочу напомнить о таком способе сортировки ордеров, может и не в тему... просто такие конструкции тоску наводят:


if((sd==0 && (OrderType()==2 || OrderType()==4)) || (sd==1 && (OrderType()==3 || OrderType()==5))||(sd==-1&&OrderType()>1))



ПС: прошу прощения - ошибочка!
Код с битовыми флагами пробовал наспех. нужны уникальные коды флагов ( 1-бит на флаг):
enum ORD_TYPE { buy = 1, sell = 2, buy_lim = 4, sell_lim = 8, buy_stop = 16, sell_stop= 32 };
т.е. например sell_lim = MathPow(2,OP_SELLLIMIT) = 2 ^ 3 = 8;
или через массив: int arrType[] = {1,2,4,8,16,32}; // массив флагов
чуть поменяется код и вызов:

void orderDelete( int flag_type )
{
// здесь цикл по ордерам
if ( ( flag_type & MathPow(2,OrderType( ) ) ) > 0 ) .... ; // здесь определяем, что ордер задан
if ( ( flag_type & arrType[ OrderType( ) ] ) > 0 ) .... ; // то-же только через массив
while(k>0) {... // цикл попыток закрытия
if ( OrderType() > 1 ) // здесь выбираем способ Delete || Close
}

вызов функции: orderDelete( sell | sell_lim | sell_stop ); // в вызове используем не стандартные константы, а свои
orderDelete( arrType[OP_SELL] | arrType[OP_SELLLIMIT] | arrType[OP_SELLSTOP] ); // через массив

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

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

Добрый день. Имеется функция подсчета количества убыточных ордеров подряд (в дальнейшем использую для открытия и модификации позиций).

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

Спойлер

int consecutive_loss;
{
int counter = 0;
datetime opentime[];
double profit[];
for(int index=0;index {
if(!OrderSelect(index,SELECT_BY_POS,MODE_HISTORY) )
continue;
else
if(OrderMagicNumber() == MAGIC && OrderSymbol() == Symbol() && OrderType()==OP_BUY||
OrderMagicNumber() == MAGIC && OrderSymbol() == Symbol() && OrderType()==OP_SELL)
{
counter++ ;
ArrayResize( opentime, counter);
ArrayResize( profit, counter);
opentime[counter -1]=OrderOpenTime();
profit[counter -1]=OrderProfit();
}
}
int orderarray [];
ArrayResize( orderarray, counter);
datetime copyopentime[];
ArrayResize( copyopentime, counter);
ArrayCopy(copyopentime,opentime);


for(int x=counter-1;x>=0;x--)
{
int latest = ArrayMaximum(copyopentime,WHOLE_ARRAY,0) ;
orderarray[ x ] =latest;
copyopentime[latest] = 0;
}

for(int x=counter-1;x>=0;x--)
{
int pos = orderarray[ x ];
if(profit[pos] consecutive_loss++;
else
break;
//Print(" Profit = ",profit[pos]) ;
}

}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
xNorDx так Вы считайте только сегодняшние ордера и при переходе даты счётчик сам обнулится.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


xNorDx так Вы считайте только сегодняшние ордера и при переходе даты счётчик сам обнулится.



Никак не могу сообразить как это реализовать кодом. Как то можно сделать выборку из истории именно за текущий день?
Ссылка на сообщение
Поделиться на другие сайты

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

Конечно можно, вообще любой каприз реализуем. Используйте функции Day(); и TimeDay( OrderCloseTime() )
если равны - считаем, нет - пропускаем.

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

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



xNorDx так Вы считайте только сегодняшние ордера и при переходе даты счётчик сам обнулится.



Никак не могу сообразить как это реализовать кодом. Как то можно сделать выборку из истории именно за текущий день?


Можно так, для закрытых сегодня ордеров:

Спойлер

datetime dt=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE));
int i,k=OrdersHistoryTotal();

for(i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(dt {
// Здесь уже ордера только за сегодня.
}
}
}

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

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

Помогите пожалуйста кто может.
Написал советник но он не выставляет на тестере вторые отложные ордера как надо один раз. пробовал и OP_BUYLIMIT и OP+BUYSTOP селы то же самое, но когда решает выставлять гад выставляет кучу!
по стратегии надо выставить в одну сторону один ордер затем в эту же сторону но на шаг лося.

test2+sl.mq4

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

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

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

Не могу нигде найти код, который нужно добавить в индикатор, чтобы отображались вкладки выбора цены и уровни в индикаторе.


Screenshot-1604.jpg

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

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

Скорректировал комплексный советник (из 21 индикатора) , убрав ненужные мне индикаторы и добавив свой - SuperSignalChannel (сократил название до SSCh для простоты). В результате "родные" индикаторы работают, а при подключении SSCh советник не фурычит. После компиляции советник ошибок не выдает, но при тесте в тестере результата нет, хотя ошибок тоже нет, да и в режиме визуализации показывает SSCh. В чем может быть косяк?

SSCh.mq4
MyComplexExpert2.mq4

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

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

Здравствуйте. При написании советника возникла проблема, которую решить не знаю как. В советнике используются две сетки ордеров по sell и buy, отличающиеся суммарной величиной лота. В обоих сериях необходимо установить одинаковую рассчитанную величину ТР. Решение проблемы свел к модельной более простой задаче. Простейший советник открывает ордер sell и модифицирует его 2 способами. В первом случае ТР выставляется выше текущей цены и модификация почему-то не проходит-дает ошибку 130, во втором ниже текущей цены - здесь модифицируется нормально. Ведь ТР в ручном ордере я могу выставить и выше и ниже текущей цены, лишь бы не попасть в область стоп-левела, почему при автоматической модификации это не так? Помогите, кто знает. Советник модельной задачи во вложении

проверка_модификации-тики.mq4

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

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


Простейший советник открывает ордер sell и модифицирует его 2 способами. В первом случае ТР выставляется выше текущей цены и модификация почему-то не проходит-дает ошибку 130, во втором ниже текущей цены - здесь модифицируется нормально. Ведь ТР в ручном ордере я могу выставить и выше и ниже текущей цены, лишь бы не попасть в область стоп-левела, почему при автоматической модификации это не так? Помогите, кто знает. Советник модельной задачи во вложении


На ордер селл невозможно поставить ТП выше текущей цены. Откройте в метатрейдере (на демо счете) ордер селл и попробуйте модифицировать как вы пишете. Ничего не выйдет.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Здравствуйте! Учусь программированию. Изучил урок по трейлингстопу. Написал первый советник ( блин комом).Работает не правильно. Помогите разобратся.
При условиях на покупку, открывает продажи.

PolyVelocity.mq4
Bablokosyaka.mq4
Chandelierstops.mq4

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

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

Помогите разобраться.
Начал изучать программирование в MQL4. Скачал видео урок - смотрю, повторяю.
И вот возникла проблема. Написал код (как в видео):
int ticket;
ticket = OrderSend("EURUSD", OP_BUY, Ask, 0.1, 3, 0, 0, "", 111, 0, Blue);
if(ticket {
Print("Ошибка открытия ордера на покупку!");
}
else
{
Print("Ордер на покупку успешно открыт!");
}
При компиляции ошибок нет. Но когда начинаю прогон, то в журнале вылезает ошибка "OrderSend error 138", и ордера не открываются. Как сказано в справке - это означает, что запрашиваемые цены устарели. И что с этим делать?


Добавлено: 18-05-2016 14:38:35


Помогите разобраться.
Начал изучать программирование в MQL4. Скачал видео урок - смотрю, повторяю.
И вот возникла проблема. Написал код (как в видео):
int ticket;
ticket = OrderSend("EURUSD", OP_BUY, Ask, 0.1, 3, 0, 0, "", 111, 0, Blue);
if(ticket {
Print("Ошибка открытия ордера на покупку!");
}
else
{
Print("Ордер на покупку успешно открыт!");
}
При компиляции ошибок нет. Но когда начинаю прогон, то в журнале вылезает ошибка "OrderSend error 138", и ордера не открываются. Как сказано в справке - это означает, что запрашиваемые цены устарели. И что с этим делать?



Нашёл косяк. "Ask" и "0.1" надо было поменять местами. Изменено пользователем Svarog_AZh
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, написал свой первый советник, но никак не могу в нем поставить запрет на торговлю в понедельник.

Цитата

int DayOfWeek;
void OnTick()
{
if (DayOfWeek()==1) return; //Если понедельник, то в начало.
..... //Действие, если другие дни.
}


Пишет: 'DayOfWeek' - ambiguous call to overloaded function with the same parameters
Что я не так делаю?
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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


vitek01 Попробуйте в МТ - Сервис - Настройки - Графики - Макс.баров истории


Не пройдет, возмите в тестере стратегий любую дату, прям любую, дальше назад 4 дней(На таймфрейме М5) он не отобразит. Также и с реаальной датой, советник видит только 1000 баров, для 5 минуток это 4 дня. И для каждого тайма 1000 баров, хоть месячные. А у меня цикл for, 1000 баров ему маловато!
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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