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

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


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

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

Вопросы от новичка.
Какой смысл в параметре Slippage в отложенных ордерах?
В чем отличие его работы от рыночных ордеров?

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

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

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

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

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

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

Перейти

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

Перейти

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

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

И ещё, уже долго до меня не дойдёт, как сделать так чтобы открывался только один ордер при заданном условии и при закрытии по тейку не открывался ещё один, так как условие всё ещё соблюдено. То есть, на примере советника, если цена выше скользящей средней - открывается ордер на покупку и закрывается по тейку, ну или стопу, а следующий ордер должен быть только на продажу, и не важно закрылся он по SL || TP.
Просмотрев уроки учителя, открыв MetaEditor, написал (напечатал), НО, во-первых ордера на покупку открываются ниже мувинга
при условии Ask>MA, ну и во-вторых за ордером BUY и последующим его закрытием открывается BUY.
Кому не сложно посмотрите, укажите на ошибки.

OneOrder.mq4

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

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


Спойлер

И ещё, уже долго до меня не дойдёт, как сделать так чтобы открывался только один ордер при заданном условии и при закрытии по тейку не открывался ещё один, так как условие всё ещё соблюдено. То есть, на примере советника, если цена выше скользящей средней - открывается ордер на покупку и закрывается по тейку, ну или стопу, а следующий ордер должен быть только на продажу, и не важно закрылся он по SL || TP.
Просмотрев уроки учителя, открыв MetaEditor, написал (напечатал), НО, во-первых ордера на покупку открываются ниже мувинга
при условии Ask>MA, ну и во-вторых за ордером BUY и последующим его закрытием открывается BUY.
Кому не сложно посмотрите, укажите на ошибки.




Для начала:
int MA = iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,0);

Переменная MA, должна быть объявлена как double. Ваша МА, в лучшем случае, выдаёт 1. Также, я бы написал Bid>MA, вместо Ask>MA (но это неприципиально). Не лепите скобки на один уровень, сделайте как у xbms - ступеньками. Похоже sell советник не открывает - не на месте закрывающая скобка... . Slippage, на рыночных, не ставьте 0.

Команда start срабатывает на каждом тике. Исходя из этого и печатать надо: => если ордеров нет => если последний ордер был Бай, значит ждём сигнал на Селл => если последний был Селл, значит ждём сигнал на Бай...

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

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


ни чё у меня не получается...
Vorchunozavr, покажите мне как это в коде надо записать


Столько раз в уроках пережевано было: и пересчет ордеров, и нужные параметры в них.
При пересчете от конца находишь нужный ордер, сравниваешь время открытия со временем настоящим. Если разные, то возвращаешь true, как сигнал к торговле.
Ссылка на сообщение
Поделиться на другие сайты

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

Добавлено: 19-12-2013 17:32:51

Мне кто нибудь поможет сделать то, что я каждыми днями пытаюсь сделать?
То что удалось сделать, так это изменить немного функцию выборки закрытых ордеров, добавил переменную oldticket которая сравнивается с последним тикетом, и забирает у последнего ордера тип, и переменной type присвоил значение OrderType()+1, что бы переменная была или 1 или 2 в зависимости от типа закрытого ордера. Добавил в условия и чуда не произошло, но уже более менее похоже на истину. Скажите что ж надо ещё туда вписать, чтобы всё заработало?

OneOrder.mq4

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

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


Мне кто нибудь поможет сделать то, что я каждыми днями пытаюсь сделать?



Уж и помогать особо нечего...
Просто МА считается, только если if (Count() == 0 && order_type == 0), считать нужно или вне условий, или после каждого. Я, почему ступеньками советовал - так виднее... ;).

Ещё, при отсутствии стопа, ордер может висеть долго.
Переменная ticket, объявлена на глобальном уровне, в функции лучше её не использовать.
Ссылка на сообщение
Поделиться на другие сайты

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

Доброго времени вам господа программисты. всех С Новым 2014 Годом.
В общем интересует что б кто то посмотрел код. А то сомнение берет правильно ли я написал без убыток и трелинг в нем. Задумка была токова,когда по мартину открываются доливочные ордера,то вычисляем общий без убыток,ставим стоп лосс и потом тралим.

Test_22.mq4

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

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

Всех с Новым Годом!! Программисты, помогите с совой. Ошибка со скобками, что там не так?? Вроде же все верно писал...

VaiL.mq4

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

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

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

VaiL.mq4

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

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

У вас немного другая сова, я когда то так же её писал. А меня интересует что именно в моей неправильно. И никак не могу найти ошибку.(

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

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

Скажу словами господина xbms Очень настоятельно рекомендую просмотреть вводные видео уроки.иначе совсем не чего не поймете.

Vail_2.mq4

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

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

xbms, посмотрите пожалуйста функции на наличие ошибок ( они там похоже точно есть)
суть первой функции в поиске лота, который необходим для покрытия убытка за TP пунктов в случае закрытия сетки ордеров.
вторая функция должна закрывать половину сетки начиная с самого старшего ордера
double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после
//закрытия сетки ордеров
{
double Lot=0; double TotalLot=0;
for (int i = OrdersTotal()-1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
{
if (otype == OP_BUY)
{
Lot = NormalizeDouble ((OrderOpenPrice()-Bid)*OrderLots()/TP,2);
if (Lot>0)
{
TotalLot= NormalizeDouble (TotalLot+Lot,2);
}
}


else if (otype == OP_SELL)
{
Lot = NormalizeDouble ((Ask-OrderOpenPrice())*OrderLots()/TP,2);
if (Lot>0)
{
TotalLot= NormalizeDouble (TotalLot+Lot,2);
}

}
}
}
}
return (TotalLot);

}
//+------------------------------------------------------------------+

void CloseHalfOrders (int otype)// ф-ция закрытия половины ордеров сетки
{
int count = 0;
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
{
if (otype == OP_BUY)
{
if (count3 )

OrderClose(OrderTicket(),OrderLots(),Bid,0,Black);
count++;

}


else if (otype == OP_SELL)
{
if (count3)

OrderClose(OrderTicket(),OrderLots(),Ask,0,Black);
count++;

}
}
}
}

}

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

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


Доброго времени вам господа программисты. всех С Новым 2014 Годом.
В общем интересует что б кто то посмотрел код. А то сомнение берет правильно ли я написал без убыток и трелинг в нем. Задумка была токова,когда по мартину открываются доливочные ордера,то вычисляем общий без убыток,ставим стоп лосс и потом тралим.




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

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

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

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

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

Сорри за нубский вопрос, но что-то я не разобрался, а с одного чарта нельзя в эксперте открывать явно ордера по другим инструментам?
Т.е. если я запускаю сову на EURUSD, а в коде написано:
OrderSend("USDJPY", OP_SELL, ....ну и так далее), то... ничего не происходит. В логе тоже пусто.

UPD: Разобрался сам: нужно было в качестве параметра цены передавать MarketInfo по инструменту.

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

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

Люди добрые подскажите: мне нужно определить профит последнего закрытого ордера и его тип,а так же последний лот .Накидал вот такие функции но,что не работает
double CountProfitHystory()
{
int profit = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false) { Print("Error in history!"); break; }

if(OrderSymbol() != Symbol() && OrderMagicNumber() != Magic)continue;
profit=OrderProfit();


}

return(profit);
}
2) int FindLastOrderType()
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
3) double FindLastLots(int otype)
{
double oldLots;
int oldticket;

ticket = 0;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldLots = OrderLots();

ticket = oldticket;
}
}
}
}
return(oldLots);
}


Добавлено: 12-01-2014 10:15:23

Спасибо товарищи за помощь,она была неоценимой :d
Выкладываю исправленную версию,авось кому пригодится \M/
int CountProfitHystory()
{
double profit = 0;
int i,accTotal=OrdersHistoryTotal();

for( i=0;i {
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
{if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

profit=OrderProfit();

}
}

return(profit);
}
2) //+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldLots;
int oldticket;

ticket = 0;

for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldLots = OrderLots();

ticket = oldticket;
}
}
}
}
return(oldLots);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i = OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
} Изменено пользователем AndreyP
Ссылка на сообщение
Поделиться на другие сайты

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

к уроку - Пишем советник на мартингейле

Сразу извиняюсь если эта тема уже освещалась (не нашел).
Писал советник под-диктовку с урока, но вылазит куча ошибок.
Сразу отвечу, что предварительные уроки смотрел.
Прошел несколько раз по коду параллельно с прокруткой видео ...
Возможно сказывается полное отсутствие опыта программирования.
(Почему то, мне нельзя засунуть текст кода ни в поле КОДА, ни в поле СПОЙЛЕРА. Так, что извиняюсь...)
Привожу код, который писал под-диктовку:
=================================================================================
extern double Lots = 0.1;
extern int TakeProfit = 50;
extern int Step = 50;
extern double Multiplier = 2;
extern int Slippage = 5;
extern int Magic = 333;

int ticket;
double price, TP, lastlot;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
Step *= 10;
Slippage *= 10;
}

return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (CountTrades() == 0)
{
double ima = iMA(Symbol(), PERIOD_H1, 14, 0, MODE_SMA, PRICE_CLOSE, 1);
if (Ask > ima)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Green);
if (ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
}
}
else if(Bid {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
if (ticket > 0)
{
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
}
}
}
else
{
int order_type = FindLastOrderType();
{
if (order_type == OP_BUY)
{
price = FindLastPrice(OP_BUY);
if(Ask {
lastlot = FindLaslLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", 0, Green);
if (ticket > 0)
ModifyOrders(OP_BUY);
}
}
else if (order_type == OP_SELL)
{
price = FindLastPrice(OP_SELL);
if(Bid {
lastlot = FindLaslLots(OP_SELL);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, 0, "", 0, Red);
if (ticket > 0)
ModifyOrders(OP_SELL);
}
}
}

return(0);
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avgprice = 0, order_lots = 0;

price = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
price += OrderOpenPrice()*OrderLots();
order_lots += OrderLots();
}
}
}
avgprice = NormalizeDouble(price / order_lots, Digits);

if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);

for (i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0);
}
}
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldlots;
int oldticket;

ticket = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;

ticket = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
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)
count ++;
}
}

return(count);
}

=====================================================================

Пожалуйста, помогите.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Nafanja, проверяй код - когда такие ошибки сыпят, это скорее всего синтаксис - незакрытые(открытые) фигурные скобки и (или) непоставленные ";" - точка с запятой в конце выражений. У меня по этому уроку тоже сначала куча ошибок по компиляции была.
А вот более серьезная ошибка в этом уроке, которая изначально в видео есть - неправильная проверка для доливки при SELL ордерах. Изначально в уроке так:

if(Bid if (Bid >= price + Step * Point).
Без этого мартышка правильно работать не будет.
Ссылка на сообщение
Поделиться на другие сайты

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


Изначально в уроке так:
if(Bid if (Bid >= price + Step * Point).
Без этого мартышка правильно работать не будет.


Спасибо за подсказку.
А на счет синтаксиса - проверял раза четыре.
Если конечно это не СПЕЦИАЛЬНО созданная ошибка.
Потому как я пока в этом ...
Ладно, буду рыть дальше
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Добрый день.
Прошу подсказать следующую информацию:

1. На каком минимальном расстоянии от Ask можно открывать ордер Buystop? Как это можно узнать программно?
Я пытаюсь узнать с помощью MarketInfo(Symbol(), MODE_STOPLEVEL).
Но, во-первых, значение возвращается 0, а во-вторых, я не уверен, что это именно то, про что я спрашиваю.

2. Как можно сделать паузу в выполнении операции до следующего тика?

Спасибо.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1. MODE_FREEZELEVEL константа - 33. Описание - Уровень заморозки ордеров в пунктах. Если цена исполнения находится в пределах, определяемых уровнем заморозки, то ордер не может быть модифицирован, отменен или закрыт.
Вызывается через MarketInfo(Symbol(), MODE_FREEZELEVEL).

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

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

Здравствуйте уважаемые! Вот у меня такая вот "беда".Написал функцию подсчета максимальной просадки,но она не сохраняет значение,после закрытия ордера обнуляется почему то :d .Дак вот вопрос как сделать чтоб она все же хранила эту переменную?
double MaxDrawn()
{ double DrMax;

double Dr=NormalizeDouble((AccountProfit()/AccountBalance())*100,2);

if (DrMax
DrMax=Dr;

return(DrMax);
}

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

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

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

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

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

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

Войти

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

Войти

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


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

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