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

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


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

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

Доброго времени суток Всем!!!Подскажите пожалуйста как правильно рассчитать стоп-лосс (в деньгах).
Ну например : на паре EURGBP стоп-лосс 1000 пунктов.Сколько это будет в рублях,в USD?

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

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

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

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

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

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

Перейти

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

Перейти

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

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


Доброго времени суток Всем!!!Подскажите пожалуйста как правильно рассчитать стоп-лосс (в деньгах).
Ну например : на паре EURGBP стоп-лосс 1000 пунктов.Сколько это будет в рублях,в USD?



ваш вопрос не так прост, чтобы ответить одной строчкой. у каждой пары своя стоимость пункта, зависит от многих факторов.
чтобы понимать всю суть того, что вы будете писать в своем коде, почитайте вот эту статью
https://forum.mql4.com/ru/42497
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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



Доброго времени суток Всем!!!Подскажите пожалуйста как правильно рассчитать стоп-лосс (в деньгах).
Ну например : на паре EURGBP стоп-лосс 1000 пунктов.Сколько это будет в рублях,в USD?



ваш вопрос не так прост, чтобы ответить одной строчкой. у каждой пары своя стоимость пункта, зависит от многих факторов.
чтобы понимать всю суть того, что вы будете писать в своем коде, почитайте вот эту статью
https://forum.mql4.com/ru/42497


Я в курсе , что всё не так просто.При выставлении ордера и стоп-лосса (при наведении на стоп-лосс) подсвечивается сколько денег я потеряю.
И вот хотелось бы мне узнать по какой формуле всё это высчитывается.
Ссылка на сообщение
Поделиться на другие сайты

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


И вот хотелось бы мне узнать по какой формуле всё это высчитывается.

если в валюте депозита, то так:
СЛ_в_деньгах = СЛ_в_пипс * Лот * MarketInfo(NULL, MODE_TICKVALUE);
Если надо в другой валюте, то пересчитывай по курсу.
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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


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

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

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



в mql4 есть такая функция как OrderCloseBy(), закрывает противоположные ордера.
https://docs.mql4.com/ru/trading/ordercloseby

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

хотя... вот пример, у тебя 10 ордеров на бай разной лотности, сумма их лотности пусть будет 100. тебе надо это все закрыть и открыть новый ордер на селл лотностью 0,01. открываешь ордер на селл лотностью 100.01 и вызываешь OrderCloseBy(тикет любого ордера из сетки на бай, тикет ордера на селл).
После этого тикет ордера на селл изменится(по крайней мере с теми брокерами с которыми я чудил с этой функцией меняли тикет этого ордера, лотность которого из пары была больше), и каждый раз(тебе еще 9 раз надо вызывать эту функцию) тебе надо выяснить какой тикет на текущий момент у ордера на селл(с изменившейся лотностью), чтобы корректно вызывать OrderCloseBy(...).

Попробуй поэкспериментировать.

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

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

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

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

Спойлер



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

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

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



в mql4 есть такая функция как OrderCloseBy(), закрывает противоположные ордера.
https://docs.mql4.com/ru/trading/ordercloseby

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

хотя... вот пример, у тебя 10 ордеров на бай разной лотности, сумма их лотности пусть будет 100. тебе надо это все закрыть и открыть новый ордер на селл лотностью 0,01. открываешь ордер на селл лотностью 100.01 и вызываешь OrderCloseBy(тикет любого ордера из сетки на бай, тикет ордера на селл).
После этого тикет ордера на селл изменится(по крайней мере с теми брокерами с которыми я чудил с этой функцией меняли тикет этого ордера, лотность которого из пары была больше), и каждый раз(тебе еще 9 раз надо вызывать эту функцию) тебе надо выяснить какой тикет на текущий момент у ордера на селл(с изменившейся лотностью), чтобы корректно вызывать OrderCloseBy(...).

Попробуй поэкспериментировать.

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

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

по мне все три варианта имеют право на жизнь :d

Т.е. банальная функция основанная на цикле IfOrderExistClose лучше чем OrderCloseBy? Изменено пользователем Старик
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите ,как реализовать открытие ордера при закрытии свечи,например если свеча закрылась ниже нижней границы канала тма?

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

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


Подскажите ,как реализовать открытие ордера при закрытии свечи,например если свеча закрылась ниже нижней границы канала тма?


посмотрите вот этот урок, там есть практически вся инфа, которая вам нужна
http://tradelikeapro.ru/izuchaem-mql-urok-3/
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Подскажите ,как реализовать открытие ордера при закрытии свечи,например если свеча закрылась ниже нижней границы канала тма?



Можно выполнять данную проверку на открытии новой свечи.

Вот пример функции для определения новой свечи

bool isNewBar(datetime ct)
{
if (ct != Time[0])
{
return true;
}
else return false;
}



Вызов выглядит следующим образом



if (isNewBar(tc))
{
tc = Time[0];
if (Close[1]
}


незабудьте добавить объявление переменной


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

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


Свежий урок от Сергея XBMS:
->


Несколько раз останавливал себя, но всё же качество звука урока про индикатор ужасное.

дополнено:
Автору спасибо за эти уроки. Есть ли возможность дать видео пояснение (или хотя бы тут кодом) по третьему уроку как сделать чтобы используемый внешний индикатор отображался на графике при использовании советника? Изменено пользователем bist
Ссылка на сообщение
Поделиться на другие сайты

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


Здравствуйте ! Как написать функцию что бы советник закрывал по общему профиту и ордера на покупку и ордера на продажу ? Что то не увидел может просмотрел в каком видео ?




вот еще вариант

bool rer;
for (int i=OrdersTotal()-1; i >= 0; i--){
rer=false;
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if ((OrderSymbol() == Symbol())&&((OrderMagicNumber() == Magic_Zero)||(OrderMagicNumber() == Magic_Incremental))) //Поправь как тебе нужно (Магики и т.п.)
{
if (OrderType()==OP_BUY){
while(!rer){
while(!IsTradeAllowed()) Sleep(100);
rer=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrNONE);
if(rer==false)
Print("OrderClose() error - ", ErrorDescription(GetLastError()));
}
}
else {
while(!rer){
while(!IsTradeAllowed()) Sleep(100);
rer=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrNONE);
if(rer==false)
Print("OrderClose() error - ", ErrorDescription(GetLastError()));
}
}
}
else
{
Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
}
}
} Изменено пользователем Pavel888
Ссылка на сообщение
Поделиться на другие сайты

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

Я вот задумался, если писать время работы совы, то 2 раза в год будет косяк Переход Европы и Амереке с Зимнего на Летнее и наоборот время. Можно ли как-то это исправить?

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

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


Я вот задумался, если писать время работы совы, то 2 раза в год будет косяк Переход Европы и Амереке с Зимнего на Летнее и наоборот время. Можно ли как-то это исправить?

Можно - отменить перевод времени в сша.
А в чём косяк-то? Вы новости торгуете? - так у новостей время в гмт-0...
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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



Я вот задумался, если писать время работы совы, то 2 раза в год будет косяк Переход Европы и Амереке с Зимнего на Летнее и наоборот время. Можно ли как-то это исправить?

Можно - отменить перевод времени в сша.
А в чём косяк-то? Вы новости торгуете? - так у новостей время в гмт-0...

Ну дело не в новостях, а во времени входа в торговые сессии, думаю лучше и правда в gmt 0 все забить.
Ссылка на сообщение
Поделиться на другие сайты

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

Топик из разряда "порассуждать". И поделиться кусочком своих мозгов :d v:)

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

Думал-думал, и вот что я надумал в коде.
Задача: ведется мультивалютная торговля 28 стандартными парами. необходимо внедрить блок, ограничивающий открытие сделок по прямо и обратно коррелирующим между собой парам.

Данный момент разъясню на пальцах.
Прямая корреляция в моём понимании - это когда две пары содержит основную одну и ту же валюту(EURUSD и EURGBP ) или одну и ту же вспомогательную валюту (GBPJPY и EURJPY). Глупо по обеим одновременно входить в одну и ту же сторону.
Обратная же корреляция - это все тоже самое но наоборот. GBPUSD и USDCAD, CADJPY и AUDCAD. Здесь глупо входить одновременно по первым парам в бай а по вторым в селл(ну или наоборот :)).

Ниже приведу код. Все разъяснения под спойлером.

Спойлер


Список переменных, логическое описание применения.

para - входной Symbol() текущей обрабатываемой пары
sd - на какую сторону будет вестись проверка по вышеуказанной паре(бай/лонг или селл/шорт). то есть ситуация, у нас есть все чтобы строить сетку в бай, вот и передаем ноль в функцию, если в селл - единицу.

bool CheckFree(string para, int sd)
{

int count_1 = 0; // счетчик для бай
int count_2 = 0; // счетчик для селл
string mem1 =StringSubstr(para,0,3); // парсим первую валюту
string mem2 =StringSubstr(para,3,3); // парсим вторую валюту
string mem_1=""; // для первой валюты из обрабатываемого OrderSymbol()
string mem_2=""; // для второй валюты из обрабатываемого OrderSymbol()
string memory = ""; // "память" дабы не считать уже обработанную пару
int asd=OrdersTotal();
for(int k=asd-1; k>=0; k--)
{
bool fas = false;
if(!OrderSelect(k,SELECT_BY_POS))continue;
if (OrderMagicNumber()!=Magic) continue;
if (OrderSymbol() == para) continue; // нас не интересует сетка по текущей проверяемой паре
if (StringFind(memory,OrderSymbol(),0)>=0) continue; //суть в том что либо сетка строится и будет строиться, либо ее не будет вовсе
string mem=OrderSymbol(); // а вот тут мы будем парсить на валюты текущий ордер
mem_1 =StringSubstr(mem,0,3);
mem_2 =StringSubstr(mem,3,3);
if (StringFind(mem,mem1)>=0 || StringFind(mem,mem2)>=0) fas = true; // нашли совпадение по валюте
if (!fas) continue;
memory+=mem+","; // запомнили, чтобы больше ее не обрабатывать в цикле(выше на 7 строк)

// обработка прямой корреляции валют для бай и для селл
// CountOrders возвращает количество ордеров определенного типа и по определенной паре. Здесь
// стоит пояснить что блок изначально писался для Илана(Pavel888 и Старик превед :)) :d ;;)), то есть по умолчанию уже открыто по одному ордеру
// по каждой паре в обе стороны, то есть уже если ордеров больше одного - значит сетка уже строится по паре текущего ордера

//повторюсь, это прямая корреляция
if (CountOrders(0,mem)>1 && sd == 0 && (mem1 == mem_1 || mem2 == mem_2 ))
{
count_1++;
}
if ( CountOrders(1,mem)>1 && sd == 1 && (mem1 == mem_1 || mem2 == mem_2))
{
count_2++;
}
// а вот тут обработка обратной корреляции
if (CountOrders(0,mem)>1 && sd == 1 && (mem1 == mem_2 || mem2==mem_1))
{
count_2++;
}
if (CountOrders(1,mem)>1 && sd == 0 && (mem1 == mem_2 || mem2==mem_1))
{
count_1++;
}
}

// здесь внешняя переменная NumMaxCur которая отвечает за максимально дозволенное
// количество коррелируемых между собой пар, по которым будет вестись торговля в одну и ту же сторону
// грубо говоря это число пар, в которых ведется торговля по одной валюте
// для примера при цифре "2" у меня будут строится сетки по USDJPY и EURUSD в разные стороны(это обратная корреляция)
// или другой пример по EURUSD и EURJPY будут строиться сетки в одном направлении(обе в бай например), а вот следующая пара, которая будет
// проходить проверку на дозволенность построения сетки
// пойдет в лес(например третий по счету бай по EURCAD в бай из-за уже евры в бай дважды,
// или AUDUSD в селл(если уже открыты евробакс в селл а баксйена в бай)

// стоит отметить что еврокад в селл - в примерах выше откроется, так же как и аудиюсд в бай откроется так же

// кому не охота засорять мозг - ставьте единицу по умолчанию, кому нужно - понял о чем я

if (count_1>=NumMaxCur || count_2>=NumMaxCur) return false;

return true;
}



Мнения, дополнения, предложения?))
Минус подхода - много циклов, перебирающих ордера. Но это мелочь, главное - оно работает))

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

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

Делаю 2-й урок. а у меня выходит ошибка '{' - function definition unexpected, хотя все копирую как в видео.
можете глянуть, в чем дело.

void OnTick();
{

GetMinPrice();
GetMaxPrice();

Comment("MinPrice: " + DoubleToStr(minprice, 5) + "\n" +
"Maxprice: " + DoubleToStr(maxprice, 5));
}
void GetMinPrice();
{
for(int i=0; i (
mp = iLow(Symbol(),PERIOD_CURRENT,i);
if(mp minprice = mp;
)
return;
}

void GetMaxPrice();
{
for(int i=0; i (
mp = iHigh(Symbol(),PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
)
return;
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
 (
mp = iLow(Symbol(),PERIOD_CURRENT,i);
if(mp minprice = mp;
)


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

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

не знаю,я делаю как указано в видео.

ошибки выходят по поводу скобок после void OnTick(); void GetMinPrice(); и void GetMaxPrice();

ровно 3 ошибки '{' - function definition unexpected

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

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


Делаю 2-й урок. а у меня выходит ошибка '{' - function definition unexpected, хотя все копирую как в видео.
можете глянуть, в чем дело.

void OnTick();
{

GetMinPrice();
GetMaxPrice();

Comment("MinPrice: " + DoubleToStr(minprice, 5) + "\n" +
"Maxprice: " + DoubleToStr(maxprice, 5));
}
void GetMinPrice();
{
for(int i=0; i (
mp = iLow(Symbol(),PERIOD_CURRENT,i);
if(mp minprice = mp;
)
return;
}

void GetMaxPrice();
{
for(int i=0; i (
mp = iHigh(Symbol(),PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
)
return;
}



У Вас не хватает открывающей круглой скобки сразу после Comment .
Ссылка на сообщение
Поделиться на другие сайты

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


Делаю 2-й урок. а у меня выходит ошибка '{' - function definition unexpected, хотя все копирую как в видео.
можете глянуть, в чем дело.
[SPOILER]
void OnTick();
{

GetMinPrice();
GetMaxPrice();

Comment("MinPrice: " + DoubleToStr(minprice, 5) + "\n" +
"Maxprice: " + DoubleToStr(maxprice, 5));
}
void GetMinPrice();
{
for(int i=0; i (
mp = iLow(Symbol(),PERIOD_CURRENT,i);
if(mp minprice = mp;
)
return;
}

void GetMaxPrice();
{
for(int i=0; i (
mp = iHigh(Symbol(),PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
)
return;
}



А ты перед "{" убери ";". Точка с запятой ставится только если ты вызвал функцию откуда-то и после этого завершил написание действия. Т.е.
void Shalom(){
Bla bla;
if (aleichem()) Bla bla;
else Shabat(4, 33);
}

bool aleichem(){
Bla bla;
return (false) ;
}

Shabat(int a, int b){
Bla bla;
}
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

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

Практически оптимальный код, если не считать множество циклов..., но если использовать массив по символам, то можно сделать за 2 прохода: 1 проход - считаем, 2 - анализируем. а именно:
maxSymbolCount = 28;
int count[]; ArrayResize( count, maxSymbolCount );
потом в цикле если не находишь символ в строке, то счётчик_символов++ и сразу count[счётчик_символов]++
ну и т.д.

Бывают котировки с префиксами и суффиксами. можно попытаться добыть валютный литерал через SYMBOL_CURRENCY_BASE

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

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

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

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

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

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

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

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

Войти

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

Войти

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


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

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