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

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


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

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

анкт' - необъявленный идентификатор test3.mq4 и 84 13
ST=NormalizeDouble(Ask-StopLoss*Point,Digits); и на той же строке
возможная потеря данных из-за преобразования типов test3.mq4
подскажите как исправить

extern string TMA="Параметры";
extern int TakeProfit =100;
extern int StopLoss =50;
extern int Megic = 123;
extern double Lots = 0.01;
extern int Slippage =5;
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double PriceHigh,PriceLow,SL,TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

if(Digits==3 || Digits==5)
{

TakeProfit*=10;
StopLoss*=10;
Slippage*=10;
}

return(INIT_SUCCEEDED);

}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+

//---

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh=iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
PriceLow=iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);

if(CountBuy()==0 && Ask
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"tma",Megic,0,Blue);
if(ticket>0)
{
TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
ST=NormalizeDouble(Ask-StopLoss*Point,Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET))

if( OrderModify(ticket,OrderOpenPrice(),ST,TP,0))
Print("Ошибка");
}

}

if(CountSell()==0 && Bid>=PriceHigh)

{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"tma",Megic,0,Red);
if(ticket>0)
{
ST=NormalizeDouble(Bid+StopLoss*Point,Digits);
TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET))

if( OrderModify(ticket,OrderOpenPrice(),ST,TP,0))
Print("Ошибка");
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count=0;
for(int trede=OrdersTotal()-1;trede>=0;trede--)
{
if(OrderSelect(trede,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Megic && OrderType()==OP_SELL)

count++;

}
}
return(count);
}

int CountBuy()
{
int count=0;
for(int trede=OrdersTotal()-1;trede>=0;trede--)
{
if(OrderSelect(trede,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Megic && OrderType()==OP_BUY)

count++;

}
}

return(count);
}
//+------------------------------------------------------------------+

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Уважаемы Сергей aka XBMS!

Появилась идея для одного из уроков.

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

Могли бы Вы, опираясь на Ваш опыт программирования, помочь нам - рядовым трейдерам разобраться в этой теме.

Расскажите нам как выгружать автоматом файлы с сайтов (знаю это делается на VBA, в MQL функций не нашел), извлекать данные, и строить непосредственно сам индикатор, т.к. уроков на которых рассматривалось бы построение индикатора от Вас нет.

Советник по индикатору мы уже умеем делать.

Буду Вам очень признателен, да и не только я, как мне кажется, если уделите данному вопросу немного Вашего внимания.

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

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

Подскажите пожалуйста, как при помощи функции iStochastic запретить покупать выше уровня 80 и продавать ниже уровня 20? Как вообще обозначить эти уровни? Справка F1 ответов не дает.

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

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


Подскажите пожалуйста, как при помощи функции iStochastic запретить покупать выше уровня 80 и продавать ниже уровня 20? Как вообще обозначить эти уровни? Справка F1 ответов не дает.

У индикатора есть буфер. в нём значения ( для стоха от 0 до 100 ). Вы эти значения считываете в советнике на каждом баре и принимаете решение покупать или нет, а вот когда принимаете решение там и сравниваете полученное значение с уровнями. например: if ( stoh1 >= 80 && stoh2
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

У меня такой вопрос, существуют ли библиотеки длинной арифметики в mql (т.е. числа > 64 бит. Например 512 и т.п.) или надо думать как самому реализовать?

П.С. вопрос чисто познавательный

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

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

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

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

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


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


Вот держите, на закрытие и модификацию аналогично
// if(/* Сигнал на открытие ордреа*/)
if(MessageBox("Подтвердите открытие позиции","Открытие ордера по "+Symbol(),MB_YESNO)==IDYES)
{
// "Открываем ордер если нажата Yes"
}
else
if(MessageBox("Подтвердите открытие позиции","Открытие ордера по "+Symbol(),MB_YESNO)==IDNO)
{
Print("Пользователь отказался от открытия позиции");
}
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Думаю что лучше будет так:
int res = MessageBox("Подтвердите открытие позиции","Открытие ордера по "+_Symbol,MB_YESNO);
if ( res == IDYES ) { Подтверждено(); }
else if ( res == IDNO ) { НЕподтверждено(); }

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

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

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

Начал я обучатся пошаговым видеокурсом «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт» и стал я писать свой первый советник.

Я взял самую простую стратегию из двух скользящих и что то так написал что советник иногда невыставляет ТейкПрофит и открывает сделки как то очень быстро на каждом тике даже недумая.
Хочу понять где моя ошибка..
При компеляции ошибок нету и незнаю где искть..
Если у кого найдется время и желание-взгляните пожалута и помогите справитя с ошибками..

extern double Lots = 0.1;
extern int TakeProfit = 150;
extern int StopLoss =50;
extern int SMA_1 =13;
extern int Shift1 =1;
extern int SMA_2 =70;
extern int Shift2 =1;
extern int Slippage =3;
extern int Magic =123;


int ticket;
double TP,SL;
bool a = true;
bool b = false;
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits ==3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
void OnTick()
{
double ima =iMA(Symbol(),PERIOD_H4,SMA_1,Shift1,MODE_SMA,PRICE_CLOSE,0);
double iima =iMA(Symbol(),PERIOD_H4,SMA_2,Shift2,MODE_SMA,PRICE_CLOSE,0);
if (CountTrades()==b)
{
if (((Ask>ima)>(Ask>iima))==a)
{
TP = NormalizeDouble(Ask+TakeProfit*Point,Digits);
SL = NormalizeDouble(Ask-StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"SR",Magic,0,Blue);
}
else
{
if (((Bid TP = NormalizeDouble(Bid-TakeProfit*Point,Digits);
SL = NormalizeDouble(Bid+StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"SR",Magic,0,Red);
}
}
}
//+------------------------------------------------------------------+
int CountTrades ()
{
int count =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 || OrderType() == OP_SELL)
count++;
}
}
return(count);
}

TEST6.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
rav основная ошибка здесь:
if (((Ask>ima)>(Ask>iima))==a) и if (((BidВы похоже не поняли что написали. Хотя-бы словами описали условия на вход, а то не знаю что посоветовать...
Подозреваю, что вход по пересечению средних. Для этого нужно значения средних на 1 и 2 баре, примерно так:
дабл мафаст1=0, маслоу1=0, мафаст2 = мафаст1, маслоу2 = маслоу1;
дабл мафаст1 = има(.фаст..)
дабл маслоу1 = има(.слоу..)
иф ( мафаст2 == 0 или маслоу2 ==0 ) выход

условие на вход: иф ( мафаст1 > маслоу1 && мафаст2 извини, что на русском - думаю разберёшься.
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо 0ll !
Суть стратегии проста:
1) Если цена Ask > SMA 70 то рассматриваем только Buy.

2) Если цена Bid
3) Когда SMA 13 пересекла SMA70 с низу вверх и Ask>SMA13 то делаем покупку на Buy.

4) Когда SMA 13 пересекла SMA 70 с верху вниз и Bid
5) Если цена находится где то по середине и нету чёткого сигнала на Buy или Sell то неделаем нечего = False.

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

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

Тогда так:
иф ( мафаст1 > маслоу1 && мафаст2 мафаст1 ) опен ( Бай )
но я думаю последнее условие лишнее, ибо когда быстрая ма идёт вверх, то она отстаёт от цены...

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

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

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

void OnTick()
{
double ima =iMA(Symbol(),0,SMA_1,Shift1,MODE_SMA,PRICE_CLOSE,0);
double iima =iMA(Symbol(),0,SMA_2,Shift2,MODE_SMA,PRICE_CLOSE,0);
if (CountTrades()==b)
{
if (((Ask>ima)&&(ima>iima))==a)
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"SR",Magic,0,Blue);
}
else
{
if (((Bid ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"SR",Magic,0,Red);
}
}
ORDER_MODIFY();
}

skrin-test6-2.png

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

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

Вы логику проверьте, я же дал решение, если оно Вас не устраивает, то у меня другого нет - Вам придется самому.

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

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

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

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

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

1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.
__________________________________________________________________
3. При обрыве связи с терминалом управление передается функций OnDeinit, а при соединений функций int OnInit() и дальше в void OnTick() Все правильно??

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

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


1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.



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

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



1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.



1 Назовите шаблон именем советника, тогда при старте тестера будет подгружаться шаблон с таким же именем как и имя у советника.
2 Циклы нужно использовать по необходимости, и весьма экономно. Циклы могут сильно тормозить советника. По этому их использование должно быть максимально продуманным.

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

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




1.В тестере когда начинаешь тестировать советник визуальный график стоит по умолчанию, он очень неудобный, и приходится включать необходимый шаблон. А можно ли встройть в код вызов нужного шаблона, чтобы не делать лишние ненужные действия.
_________________________________________________________________
2.цикл for используется только если нужно что то перебрать, найти нужное значение или его можно использовать постоянно. Хотел перебрав бары в историй наити материнскую свечу, и уже найдя его и сохранив значения, выйти из цикла, но заметил что он работает прекрасно дальше.---------------------Можно ли цикл for использовать постоянно или не желательно! ----------->
всетаки не желательно, на демо постоянно перебирает. у меня линий дергаются на каждом тике начиная перебор каждый раз все заново.



1 Назовите шаблон именем советника, тогда при старте тестера будет подгружаться шаблон с таким же именем как и имя у советника.
2 Циклы нужно использовать по необходимости, и весьма экономно. Циклы могут сильно тормозить советника. По этому их использование должно быть максимально продуманным.

Спасибо большое! а 3 пункт вопроса не прокоментируете!

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

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

Всем привет. Задавал недавно вопрос по поводу подтверждения открытия/закрытия позиции советником, советовали MessageBox, но так ладу и не дал, не понял как это работает и как происходит обработка открытия
закрытия, понял только, что MessageBox вызывает бокс с сообщением, а что в кавычках? Помогите, господа, нерадивому студенту) прикрепляю бесплатный открытый советник. Можете показать на его примере, как это будет работать, где и как там будет располагаться эта функция. Спасибо.

stochastic-automated.mq4

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

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


Всем привет. Задавал недавно вопрос по поводу подтверждения открытия/закрытия позиции советником, советовали MessageBox, но так ладу и не дал, не понял как это работает и как происходит обработка открытия
закрытия, понял только, что MessageBox вызывает бокс с сообщением, а что в кавычках? Помогите, господа, нерадивому студенту) прикрепляю бесплатный открытый советник. Можете показать на его примере, как это будет работать, где и как там будет располагаться эта функция. Спасибо.


Сделал один пример..

stochastic-automated.mq4

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

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

Компиляция ошибок и предупреждений не выдала..,на тестере работает всё чётка . А на ECN счёте неработает..просто молчит и всё.. Что делатьнепонимаю... Помогите пожалуста! :)

Dzintars.mq4

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

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

Советник нарисовал линий на хай и лоу свечи, но вот при смене таймфрейма линий сбрасываются.... Что пройсходит при смене таймфрейма и как зделать так чтобы линий были устойчивы к таким переключениям???

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

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

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

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

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

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

Войти

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

Войти

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


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

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