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

От xbms, 13 апреля, 2013 в Уголок Программиста

#3426

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

#3427


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



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



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



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


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


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

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

... + OrderSwap() + OrderComission()...

#3431

Благодарю!!!Всем спасибо за ответы!!!

#3432

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

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

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

#3433


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

У меня в советнике ордера в определенный момент времени всегда только либо 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

Изменено 16 апреля, 2016 пользователем dermitay

#3434

Спойлер



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

У меня в советнике ордера в определенный момент времени всегда только либо 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?

Изменено 17 апреля, 2016 пользователем Старик

#3435

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

#3436


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


посмотрите вот этот урок, там есть практически вся инфа, которая вам нужна
http://tradelikeapro.ru/izuchaem-mql-urok-3/
#3437


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



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

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

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



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



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


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


datetime tc;
#3438


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


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

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

Изменено 18 апреля, 2016 пользователем bist

#3439


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




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

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()));
}
}
}

Изменено 10 ноября, 2017 пользователем Pavel888

#3440

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

#3441


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

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



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

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

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

Топик из разряда "порассуждать". И поделиться кусочком своих мозгов :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

Изменено 20 апреля, 2016 пользователем dermitay

#3444

Делаю 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;
}

#3445
 (
mp = iLow(Symbol(),PERIOD_CURRENT,i);
if(mp minprice = mp;
)


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

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

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

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

#3447


Делаю 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 .
#3448


Делаю 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;
}
#3449

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

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

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

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

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

Перейти к списку тем
Форум · 2.0.20260627.0025