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

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


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

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

да вроде есть проверка открытых ордеров, вот код для бая:


//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
bool select = OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if (OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
nct21 если его правильно использовать, то проблем не будет.

"Почините мне машину - не заводиться. - А где-ж машина? - В гараже, вот её фото..." :d
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Sany2912 сигналы возникают как правило на 1 баре. надо сохранить время открытия бара, отправить ордер, а на следующем тике проверить если время совпало, то значит сигнал отработан - выход. пример:
static datetime sigDT;
if ( /условия входа/ && sigDT != Time[0]) { sigDT = Time[0]; OrderSend(...); } else { return; }
как-то так. а что за индюк волшебный?



0ll, этот код не поможет, так как открытие следующей позиции произойдет на следующей свече!!! А нужно чтобы было следующее открытие на следующем сигнале!!! Есть еще варианты???? (на срине обычная средняя, взял для примера)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912 обычно условия на вход составляют так, что они перестают сигналить на след. свече. Я смотрел на стрелочный индюк на Вашем скрине - стрелки ведь не подряд рисуются.
Ещё вариант: после открытия ордера пауза в х-бар. Или дистанция цены не менее ХХ-пунктов. Вариантов много надо смотреть на условия.
Ссылка на сообщение
Поделиться на другие сайты

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


Sany2912 обычно условия на вход составляют так, что они перестают сигналить на след. свече. Я смотрел на стрелочный индюк на Вашем скрине - стрелки ведь не подряд рисуются.
Ещё вариант: после открытия ордера пауза в х-бар. Или дистанция цены не менее ХХ-пунктов. Вариантов много надо смотреть на условия.



Скрин сделал так, как должно бы было быть. Код сделать не получается... А как в условии на вход сделать так, чтоб сигнал перестал сигналить на следующей свече? И продолжил сигналить при появлении следующего сигнала?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sany2912 >:dОткуда-ж мне знать какие Вы условия рассматриваете? и индюки планируете использовать?
Для исключения дребезга сигнала берут пересечение линий по закрытию бара + добавляют ещё другие индюки и в комплексе получается что-то...
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте. По уроку 7 непонятки есть.

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

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

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

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

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

Привет всем!
Возник такой вопрос:
В журнале обнаружил записи о том, что счет теряет коннект с ДЦ (VPS).
Будут ли обнуляться статические переменные в таких случаях или только при перезагрузке терминала?
По логике не должны конечно.
Часто ли возникают такие косяки у VPS-провайдеров и есть ли способы их избежать?
Пинг до сервера тоже не маленький, под 200ms.

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

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


Здравствуйте. По уроку 7 непонятки есть.

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


Спойлер



//+------------------------------------------------------------------+
//| сетка пробная.mq4 |
//| Copyright 2015, MetaQuotes Software Corp. |
//|
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link
#property version "1.00"
#property strict

extern double Lots = 0.1;
extern int TekeProfit = 30;
extern int Step = 40;
extern int Slippage = 3;
extern int Magic = 1234;
extern int RsiPeriod = 7;
extern string comment = "получается";
int ticket, otype ;
double rsi1, rsi2, TP, price;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits == 5)
{
TekeProfit *= 10;
Step *= 10;
}
return(0);
}

//+------------------------------------------------------------------+
//| Expert tick function выставляем первый ордер по индекатору iRSI ,определяемся в какую сторону будем открывать ордера |
//+------------------------------------------------------------------+
int start()
{
rsi1= iRSI(Symbol(),0,RsiPeriod,PRICE_CLOSE,1); //--- вычисляем период входа по первой свече
rsi2= iRSI(Symbol(),0,RsiPeriod,PRICE_CLOSE,2); //--- вычисляем период входа по второй свече

//--- проверяем есть ли открытые ордера цена в данный момент имеет значение 0 ,1 свеча выше цены значит покупки
//--- 2 свеча ниже цены значит продажи

if (CountTredes() == 0 && rsi1 > rsi2 ;//--- если нет открытых ордеров и rsi1 > rsi2 то мы входим в покупку
{
// Покупка
ticket = OrderSend (Symbol(),OP_BUY, Lots, Ask, Slippage,0,0,comment,Magic,0,Blue);// покупка
if ( OrderSelect( ticked, SELECT_BY_TICKET ,MODE_TRADES)) // выбираем ордер из списка ордеров
{
TP = NormalizeDouble(Ask + TekeProfit * Point,Digits); // нормализуем тейк профит
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Blue);//
}

}
else
if (CountTredes() == 0 && rsi1 {
// Продажа
ticket = OrderSend (Symbol(),OP_SELL, Lots, Bid, Slippage,0,0,comment,Magic,0,Red);// покупка
if ( OrderSelect( ticked, SELECT_BY_TICKET ,MODE_TRADES)) // выбираем ордер из списка ордеров
{
TP = NormalizeDouble(Bid - TekeProfit * Point,Digits); // нормализуем тейк профит
OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
}

}


if (CountTredes() > 0) // проверяем есть ли уже ордера в рынке, далее необходимо выбрать последний ордер его тип
{ // создаем переменную otype

// цена последнего ордера на покупку
otype = FindLastOrderType(); //вычисляем тип последнего ордера

if (otype == OP_BUY)
{
price = FindLastBuyPrice(); //

if ((price - Ask )/Point >= Step) // проверяем отступила ли цена от последнего ордера на степ для выставления следущего ордера
{
OrderSend (Symbol, OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue); // открываем следующий ордер

ModifyOrders();// модифицируем тейк всех ордеров
}

}
else if (otype == OP_SELL)
{
// цена последнего ордера на продажу
price = FindLastSellPrice();//

if (( Bid - price)/Point >= Step) // проверяем отступила ли цена от последнего ордера на степ для выставления следущего ордера
{
OrderSend (Symbol, OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); // открываем следующий ордер

ModifyOrders();// модифицируем тейк всех ордеров
}

}

return(0);
}

//+------------------------------------------------------------------+
// пишем функцию модификации тейк профита она небудет возвращать пораметры поэтому присваиваем ей тип void

void ModifyOrders()

{
double avg = 0; // переменную обьявляем для средней цены
int count = 0; // и переменная count для количиства ордеров имеющихся

for(int i = OrdersTotal() -1; i>=0; i--) //пересчитываем ордера
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))// выбираем ордер
{
if(OrderMagicNumber() == Magic && OrderSymbol() == Symbol())// проверяем наш ли это ордер
{
if (OrderType() == OP_BUY || OP_SELL)// проверяем тип ордера
{
avg += OrderOpenPrice(); // выщитывем среднию цену всех открытых ордеров на OP_BUY или OP_SELL
count ++ ; // считаем количество наших ордеров
}
}

}

} // выщитываем среднюю цену открытых ордеров ,все сложеные цены разделим на количество ордеров
avg = NormalizeDouble(avg / count,Digits)

//--- перебераем ордера в цикле и выставляем им ТР

for( i = OrdersTotal() -1; i>=0; i--) //пересчитываем ордера
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))// выбираем ордер
{
if(OrderMagicNumber() == Magic && OrderSymbol() == Symbol())// проверяем наш ли это ордер
{
if (OrderType() == OP_BUY )// проверяем тип ордера
{
TP = NormalizeDouble(avg + TakeProfit * Point, Digits); // выставляем ТР OP_BUY ордерам
OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0, Yellow);// модифицируем ордера и выставляем ТР ордерам
}
else

if (OrderType() == OP_SELL)// проверяем тип ордера
{
TP = NormalizeDouble(avg - TakeProfit * Point, Digits); // выставляем ТР OP_SELL ордерам
OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0, Yellow);// модифицируем ордера и выставляем ТР ордерам
}

}

}

}
}


//+------------------------------------------------------------------+

//--- описываем количество открытых ордеров в рынке (проверяем есть ли открытые ордера)
int CountTredes()
{
int count = 0; //--- обьявляем переменную 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); //--- возврашаем значение count на 0

}
//+------------------------------------------------------------------+
int FindLastOrderType() // пишем функцию проверки какой ордер выставлен в данный момент в рынке OP_BUY или OP_SELL
{
int oticket, ticketnumber = 0, OType; // добовляем переменные для поиска наивышего тикета

for (int i = OrdersTotal() -1; i>=0; i--)// выщитываем и находим последний ордер
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Выбирает ордер для дальнейшей работы с ним.
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) //--- проверяем наш ли это ордер
{
oticket = OrderTicket();// переменная = ордер тикету.(OrderTicket) Возвращает номер тикета текущего выбранного ордера.

if (oticket > ticketnumber)// ищем самый старший тикет а раз oticket > ticketnumber ,а ticketnumber = 0 . то
{
ticketnumber = oticket; //
OType = OrderType(); // переменная OType = типу нашего ордера
}

}

}

}
return(OType);
}
//+------------------------------------------------------------------+
// пишем функцию проверки ордера по какой цене он куплен
//+------------------------------------------------------------------+
double FindLastBuyPrice() // пишем функцию проверки по какой цене куплен последний ордер

{
int oticket, ticketnumber = 0; // добовляем переменные для поиска цены последнего ордера
double oprice;

for (int i = OrdersTotal() -1; i>=0; i--)// выщитываем и находим последний ордер
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Выбирает ордер для дальнейшей работы с ним.
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) //--- проверяем наш ли это ордер и OrderType является ордером на покупку OP_BUY
{
oticket = OrderTicket();// переменная = ордер тикету.(OrderTicket) Возвращает номер тикета текущего выбранного ордера.

if (oticket > ticketnumber)// ищем самый старший тикет а раз oticket > ticketnumber ,а ticketnumber = 0 . то
{
ticketnumber = oticket; //
oprice = OrderOpenPrice(); // цена последнего ордера по которой был открыт ордер

}

}

}

}
return(oprice);
}
//+------------------------------------------------------------------+
// пишем функцию проверки ордера по какой цене он продан
//+------------------------------------------------------------------+
double FindLastSellPrice() // пишем функцию проверки по какой цене куплен последний ордер

{
int oticket, ticketnumber = 0; // добовляем переменные для поиска цены последнего ордера
double oprice;

for (int i = OrdersTotal() -1; i>=0; i--)// выщитываем и находим последний ордер
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Выбирает ордер для дальнейшей работы с ним.
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) //--- проверяем наш ли это ордер и OrderType является ордером на покупку OP_BUY
{
oticket = OrderTicket();// переменная = ордер тикету.(OrderTicket) Возвращает номер тикета текущего выбранного ордера.

if (oticket > ticketnumber)// ищем самый старший тикет а раз oticket > ticketnumber ,а ticketnumber = 0 . то
{
ticketnumber = oticket; //
oprice = OrderOpenPrice(); // цена последнего ордера по которой был открыт ордер

}

}

}

}
return(oprice);
}



Пожалуйста тут код полностью 7 урока сенсея я только его когда разбирал описал что мы делаем, я предпологаю ошибка из - за обновления билда , но возможно я неправ. Изменено пользователем Pavel888
Ссылка на сообщение
Поделиться на другие сайты

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



Здравствуйте. По уроку 7 непонятки есть.

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

Пожалуйста тут код полностью 7 урока сенсея я только его когда разбирал описал что мы делаем, я предпологаю ошибка из - за обновления билда , но возможно я неправ.
Вы неправы. Куча ошибок из-за Вашей не внимательности.
Даже не знаю что делать... Ладно, вот исправленный код, но Вам нужно найти все свои ошибки и проанализировать (в качестве домашнего задания).
Исправьте свой пост - код выкладывайте в виде файла или под спойлером.

_урок7.mq4

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

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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar При потере связи ничего с совой не происходит, тиков нет - работы нет. Спит.
Переменные обнуляются (переинициализируются) только если меняете настройки совы.
Проблемы с ВПС - меняй ВПС. У меня на ВПС за 2+ года была пара заморочек, да и то - плановых (предупреждали). Даже терминалы месяцами не перегружаю.

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

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

У меня форекс VPS самый дешевый, т к мне одного терминала достаточно пока
А какие нормальные конторы еще есть?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar здесь тема ВПС оффтоп. Почитай отзывы в соответствующей ветке. я плачу 100$ / год и проблем практически нет.
Ссылка на сообщение
Поделиться на другие сайты

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

дело в том, что у меня на графике есть индикатор "часы", он тоже отображается в правом верхнем углу. В нем нет настроек никаких, кроме цвета. Получается что иконка советника с надписью накладывается на часы и я не вижу ни часов, ни смайлика!

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

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

Подскажите что означает восклицательный знак в коде , просматриваю у одного програмера
кода он часто их ставит
if (!DrawInfo) return; if (!OrderModify(OrderTicket(),OOP,SL,0,0,White)) Print("Error

if (!IsTradeAllowed())

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

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

Подскажите что означает восклицательный знак в коде

Dron15 если Вы не научитесь работать с документацией, то не станете программистом. Читай
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите, как написать Функцию на мкл4:

double FindLastProfit() возвращает OrderProfit() (торговый результат) последнего, уже закрытого ордера., чтобы узнать результат предыдущей сделки для кода робота.

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

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

код робота - это мэджик?

Хотите посмотреть результат 2-х последних закрытых ордеров, ранее открытых ботом?

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

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

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

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

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


код робота - это мэджик?

Хотите посмотреть результат 2-х последних закрытых ордеров, ранее открытых ботом?



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




Добавлено: 12-05-2015 06:28:17


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



А как это можно сделать ? )
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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