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

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


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

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

Здравствуйте форумчане!
Функция открытия ордера. Через раз зацикливается, и не хочет отрывать ордер. Хотя должен ))))
Открываю Buy, slippage 5 ст.п.
Код ошибки 129.
Сам сломал голову. Может у вас есть варианты

int OpenPositionBuy(int type, double lot, int colr)
{
int ticket=0,

string str = Symbol();
do
{
ticket = OrderSend(Symbol(),type,lot,Ask,Slippage,0,0,Comm,Magic,0,colr);
if(ticket == -1)
{
Alert(str + " Order Error: ",GetLastError());
Sleep (10000);
}
}
while( ticket== -1);
return(ticket);
}

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

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

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

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

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

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

Перейти

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

Перейти

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

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

странно, что Вы передаёте в функцию тип ордера, а открыть пытаетесь по Ask-у - надо-бы сделать выбор цены по типу...

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

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

Открываю Buy
Просто раньше эту функцию использовал для открытия отложек. В описании функции была переменная с ценой

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

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

Ну раз проблемы с ценой, пробуйте обновить котировки: while(!RefreshRates()) Sleep(16);
Может пока Sleep (10000); котировки не обновляются
и перед вызовом OrderSend принтом выводите всю инфу в журнал - может что и увидите, например что цена не изменяется...

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

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

Хорошего настроения!
Передо мной такая задача. Мне надо сделать так чтобы советник открывал увеличенный лот(*кэф) при каждой закрытой сделке по лосю при соответсвующих показателях индиков. Пример: индики показали сэл, открылось по сэл, выбило по лосю, далее индики показали сэл, лот увеличился, опять лось, далее индики показали бай, открылся бай с еще большим лотом и т.д...
Для этого мне думается что надо найти последнюю цену закрытия ордера, сравнить ее с ценой открытия ордера за минусом указанного в советнике лося и прописать функцию по увеличению лота.
Первыз раз на форуме, если мое сообщение не отвечает форму заранее прошу прощения. Буду рад любой помощи!
Вот кусочек кода:
else
double lastOP=HOOP(); - найденная цена открытия последнего закрытого ордера
double lastCL=HOCP(); - найденная цена закрытия последнего закрытого ордера
llot=fllots(); - функция поиска последнего лота на истории
llot=NormalizeDouble(mult*llot,2);
if(CountBuy()==0||CountSell()==0&&Bid>=prhigh&&lastCP==(lastOP+Stopl*Point)||lastCP==(lastOP-Stopl*Point)) - если нет открытых ордеров и совпадает условие по индику и по значению цены с учетом значения "цена открытия + модуль лось"
{
ticket=OrderSend(Symbol(),OP_SELL,llot,Bid,Slippage,0,0,"",Magic,0,Red);
if (ticket>0)
{
sl=NormalizeDouble(Bid+Stopl*Point,Digits);
tp=NormalizeDouble(Bid-Profit*Point,Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET))
if(!OrderModify(ticket,OrderOpenPrice(),sl,tp,0)) .... в общем потерялася я....

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

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

Перед открытием ордера находишь последний закрытый ордер, смотришь лот, профит, и вуаля: меняешь на новом если надо)))

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Serhoo для покрытия убытков нескольких лосей их нужно считать, тогда формула расчёта лота будет следующей:
newLot = ( Желаемая_прибыль + MathAbs(Сумма_Лосей) ) / (Размер_тейка_нового_ордера * Стоимость_пункта) ; Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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


Serhoo для покрытия убытков нескольких лосей их нужно считать, тогда формула расчёта лота будет следующей:
newLot = ( Желаемая_прибыль + MathAbs(Сумма_Лосей) ) / (Размер_тейка_нового_ордера * Стоимость_пункта) ;



Благодарю за совет. Дело в том, что у меня уже посчитаны количество непрерывных проигрышей и просчитан лот, который обеспечивает минимальную просадку депо по 11 непрерывным проигрышам, при выравнивании депо после следующего выигрыша. Т.е. такой сейфовый мартин. Основная моя проблем возникла на стадии нахождения и идентификации цены последнего закрытого ордера, чтобы если он по лосю, то открывался по увеличенному лоту и открывал тот тип ордера который отвечает требованию индюков.

Добавлено: 03-03-2018 02:35:02


Перед открытием ордера находишь последний закрытый ордер, смотришь лот, профит, и вуаля: меняешь на новом если надо)))



Единственное что я нашел для того чтобы решить свою задачу это вот такое вот:

else
llot=fllots();
llot=NormalizeDouble(mult*llot,2);
int i=OrdersHistoryTotal()-1;
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true&&CountBuy()==0||CountSell()==0&&Bid>=prhigh))
{
{
if ((OrderType() == OP_BUY && OrderStopLoss() - OrderClosePrice() >= -_Point / 10) ||
(OrderType() == OP_SELL && OrderClosePrice() - OrderStopLoss() >= -_Point / 10))
{
ticket=OrderSend(Symbol(),OP_SELL,llot,Bid,Slippage,0,0,"",Magic,0,Red);
if (ticket>0) Изменено пользователем Serhoo
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Serhoo да мы понять не можем что Вы делаете, зачем Вам цена последнего ордера? СЛ может проскользить, причём в разную сторону. Обычно, если ордер закрылся с профитом меньше 0, считается лосем.
т.е.: if ( OrderProfit()
Ссылка на сообщение
Поделиться на другие сайты

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


Serhoo да мы понять не можем что Вы делаете, зачем Вам цена последнего ордера? СЛ может проскользить, причём в разную сторону. Обычно, если ордер закрылся с профитом меньше 0, считается лосем.
т.е.: if ( OrderProfit()



М-да, все простое гениально)) Буду пробовать. А сделать хочу следующее:есть индик канал Дончиана. Советник внизу покупает, вверху продает. Если ордер по лосю, то лот следующего ордера, при соответсвующих показаниях индика, увеличивается на заданный коэффициент. Вот)
Ссылка на сообщение
Поделиться на другие сайты

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

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

BO_martingale_v1.0.mq4

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

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

А сделать хочу следующее:есть индик канал Дончиана. Советник внизу покупает, вверху продает

Это нормальная идея, причём канал может быть абсолютно любого типа. Подобные совы способны давать до 15%/мес. Правда серия лосей может быть более 5 шт.
нужно дополнительные фишки, типа трала, дополнительные индюки для уточнения момента входа - для уменьшения СЛ. Удачи!


Vidma переписал Вашу функцию OnTick, посмотрите
Спойлер


void OnTick()
{
if(tester_close) tester_close_f(); // не знаю зачем

int i, count_loss = 0;
for( i = OrdersHistoryTotal()-1; i >= 0; i-- )
{
if ( !OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )
|| OrderType() > 1 // отфильтровываем отложки
|| OrderSymbol() != _Symbol
|| OrderMagicNumber() != Magic ) continue;

// if(OrderCloseTime()>0) - Вы в списке закрытых ордеров! проверка времени закрытия не нужна
// if (lastTN!=OrderTicket()) - это не понимаю

if ( OrderProfit() {
count_loss++;
if ( count_loss > MaxStep ) count_loss = 0;
}
else break; // is profit
}

if ( CountBuy() > 0 || CountSell() > 0 || !IsTradeHours() || !IsNewBar() ) return;

if ( SignalOpen() == OP_BUY )
{
ticket = OrderSend( NULL, OP_BUY, Lots * arr[count_loss], Ask, Slippage, 0, 0, /*IntegerToString (Expiration) не знаю что это*/,
Magic, 0, clrBlue );
// if(ticket>0) res = OrderModify(ticket, OrderOpenPrice(),0,0,0,Blue); не знаю зачем, если СЛ = ТП = 0
}
if ( SignalOpen() == OP_SELL )
{
ticket = OrderSend( NULL, OP_SELL, Lots * arr[count_loss], Bid, Slippage, 0, 0, /*IntegerToString (Expiration) не знаю что это*/,
Magic, 0, clrRed );
// if(ticket>0) res = OrderModify(ticket, OrderOpenPrice(),0,0,0,Red); не знаю зачем, если СЛ = ТП = 0
}
}

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

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


А сделать хочу следующее:есть индик канал Дончиана. Советник внизу покупает, вверху продает

Это нормальная идея, причём канал может быть абсолютно любого типа. Подобные совы способны давать до 15%/мес. Правда серия лосей может быть более 5 шт.
нужно дополнительные фишки, типа трала, дополнительные индюки для уточнения момента входа - для уменьшения СЛ. Удачи!


Почти готово! Идея: индик ТМА внизу покупает вверху продает. Если лось повышает лот с учетом условий открытия ордера.
Не могу понять что именно не так. Когда ловит лося, повышает лот. Ловит профит, но продолжает повышать лот пока суперогомного лося не словит. И перестал соблюдать условия покупки\продажи при соответствующих показаниях индиков(внизу канала бай, вверху селл). Если такое возможно помогите пожалуйста разобраться.

Новый_текстовый_документ.txt

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Serhoo посмотри код, который выкладывал выше. Там только поменять расчёт лота - сделать через степень, и будет работать.
Ссылка на сообщение
Поделиться на другие сайты

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


Serhoo посмотри код, который выкладывал выше. Там только поменять расчёт лота - сделать через степень, и будет работать.



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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Vidma переписал Вашу функцию OnTick, посмотрите
Спойлер


void OnTick()
{
if(tester_close) tester_close_f(); // не знаю зачем

int i, count_loss = 0;
for( i = OrdersHistoryTotal()-1; i >= 0; i-- )
{
if ( !OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )
|| OrderType() > 1 // отфильтровываем отложки
|| OrderSymbol() != _Symbol
|| OrderMagicNumber() != Magic ) continue;

// if(OrderCloseTime()>0) - Вы в списке закрытых ордеров! проверка времени закрытия не нужна
// if (lastTN!=OrderTicket()) - это не понимаю

if ( OrderProfit() {
count_loss++;
if ( count_loss > MaxStep ) count_loss = 0;
}
else break; // is profit
}

if ( CountBuy() > 0 || CountSell() > 0 || !IsTradeHours() || !IsNewBar() ) return;

if ( SignalOpen() == OP_BUY )
{
ticket = OrderSend( NULL, OP_BUY, Lots * arr[count_loss], Ask, Slippage, 0, 0, /*IntegerToString (Expiration) не знаю что это*/,
Magic, 0, clrBlue );
// if(ticket>0) res = OrderModify(ticket, OrderOpenPrice(),0,0,0,Blue); не знаю зачем, если СЛ = ТП = 0
}
if ( SignalOpen() == OP_SELL )
{
ticket = OrderSend( NULL, OP_SELL, Lots * arr[count_loss], Bid, Slippage, 0, 0, /*IntegerToString (Expiration) не знаю что это*/,
Magic, 0, clrRed );
// if(ticket>0) res = OrderModify(ticket, OrderOpenPrice(),0,0,0,Red); не знаю зачем, если СЛ = ТП = 0
}
}




Здравствуй OLL,
спасибо хоть за какое-то помощь,но ето нето... Этот робот для торговли бинарными опционами а не на форех.
if(tester_close) tester_close_f(); -для визуального просмотра в терминале при тестировании;
/*IntegerToString (Expiration) не знаю что это*/, - время экспирации ордера.
Также согласно Вашим изминениям в OrderSend( NULL, OP_SELL, Lots * arr[count_loss], Bid, Slippage, 0, 0, )
нужно удлить "Lots "
Хотя из всево этого кое что применил но надо ждать понедельника.
Ссылка на сообщение
Поделиться на другие сайты

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

Не могу понять по какой причине сова не использует изначально заданный лот после профита. Голову сломал уже...


Вы не весь код продемонстрировали? ибо я не нашёл в Вашей программе места, где бы лот снижался от полученного профита, вообще нет проверки профита. Ваш код надо переписать, вот алгоритм:

1. Если новый бар - получим новые уровни канала // на каждом тике не надо!
2. проверим наличие сигнала на вход: -1 - нет, 0 - OP_BUY, 1 - OP_SELL
3. если сигнала нет - выход: if ( signal 3.1. смотрим дополнительные условия, открытые ордера или время не то - выход
4. считаем по истории закрытых ордеров количество лосей подряд, с конца. см код выше. count_loss
5. Рассчитываем лот по формуле: newLot = start_lot * MathPow( kf_martin, count_loss );
// эта формула будет работать всегда, даже при старте
6. Вход в направлении сигнала.
Ссылка на сообщение
Поделиться на другие сайты

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

Ребята, а у кого-то есть архив котировок Альпари? Собирал кто-то?
_http://tradelikeapro.ru/mql4-analiz-tikovoy-istorii/
На форуме не нашел ничего.
Можете поделиться информацией?
Заранее благодарен.

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

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

Вы не весь код продемонстрировали?


Абсолютно весь код, кроме шапки с параметрами проперти...
Понял Вас, буду копать в просторах сети. Некоторые вещи которые Вы описали, я еще не проходил. Видимо пришло время. Жаль на сайте tradelikepro нет тематических видео по данным вопросам. СПАСИБО!

Добавлено: 05-03-2018 03:30:11


Ребята, а у кого-то есть архив котировок Альпари? Собирал кто-то?
_http://tradelikeapro.ru/mql4-analiz-tikovoy-istorii/
На форуме не нашел ничего.
Можете поделиться информацией?
Заранее благодарен.



Я в свое время тоже искал, но на сайте Альпари написано что они автоматом грузятся в терминале, надо только настройки выставить. Хотя автоматом там истории маловато было. Для меня кстати тоже эта информация актуальна.






Добавлено: 05-03-2018 13:58:17


Не могу понять по какой причине сова не использует изначально заданный лот после профита. Голову сломал уже...


Вы не весь код продемонстрировали? ибо я не нашёл в Вашей программе места, где бы лот снижался от полученного профита, вообще нет проверки профита. Ваш код надо переписать, вот алгоритм:

1. Если новый бар - получим новые уровни канала // на каждом тике не надо!
2. проверим наличие сигнала на вход: -1 - нет, 0 - OP_BUY, 1 - OP_SELL
3. если сигнала нет - выход: if ( signal 3.1. смотрим дополнительные условия, открытые ордера или время не то - выход
4. считаем по истории закрытых ордеров количество лосей подряд, с конца. см код выше. count_loss
5. Рассчитываем лот по формуле: newLot = start_lot * MathPow( kf_martin, count_loss );
// эта формула будет работать всегда, даже при старте
6. Вход в направлении сигнала.



Разбираюсь что к чему... Вынужден вновь к Вам обратиться.
1. Имеет ли смысл оставить как есть на каждом тике? Или принципиально тут не использовать Void on Tick?
2. проверим наличие сигнала на вход: -1 - нет, 0 - OP_BUY, 1 - OP_SELL - это надо написать функцию по определению типа функции, или открытого ордера как такового?
3. if ( signal 4. Для чего считать лосей не могу понять? И это будет ф-ия или переменная?
5. Получается далее прописать условия и просто ставить туда newlot?
6...

Если можно пару Ваших комментариев.
Заранее спасибо! Изменено пользователем Serhoo
Ссылка на сообщение
Поделиться на другие сайты

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

1. оставляйте. Это относится к скорости работы - можно пренебречь.
2. это просто: int signal = -1;
if ( Bid >= prhigh ) signal = OP_SELL;
if ( Ask 3. signal - это одно из условий на вход. Могут быть другие условия см. 3.1.
4. Лосей считать, чтоб лот следующего ордера вычислить, например при кф. мартина 1,8:
Мартин 1,8
Старт лот 0,1
Рабочий лот
Лоси 0 0,10
1 0,18
2 0,32
3 0,58
4 1,05
5 1,89
5. после расчёта объёма ордера - открываем в соответствии с условиями. конечно его используем.
вопрос странноватый... Вы сами писали советник?

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

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

Всем привет. Начал изучать курс, сейчас на втором видео.
В моменте, где рассказывается о том, как записать цикл, функцию нахождения минимальной цены среди предыдущих 10 баров в виде функции с глобальными переменными MinPrice, MaxPrice и mp, не понял: я пишу фактически тот же код, что представлен на видео, но editor выдает ошибку "Getminprice - function not defined" и "Getminprice - function can be declared only in global scope". То же самое происходит и для void GetMaxPrice. Но разве я их не определил в данном случае? В чем ошибка, не подскажете?

И еще вопрос. Зачем отдельно указывать переменную double mp, minPrice и maxPrice присваивать значения и сравнивать mp с ними, как это делает автор? Почему нельзя опустить mp и сравнение (я так попробовал, мне выдало предупреждение)? Спасибо.
Код во вложении.

minPrice_cycle_2.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
EmilYus Вы пропустили закрывающую скобку функции ОнТик, чтоб избежать таких ошибок разносите вложенные блоки кода по величине отступа - будет нагляднее. Вот я исправил - должно работать.
По поводу mp, minPrice и maxPrice - для сравнения нужны две независимых переменных, в цикле текущее значение на конкретном баре в переменной mp, а значение текущего максимума в другой переменной. по другому не получится.

Спойлер


void OnTick()
{

GetminPrice();
GetmaxPrice();
Comment ("MaxPrice:"+ DoubleToStr (minPrice,5)+"\n"+
"MinPrice"+DoubleToStr (maxPrice,5));
}

void GetminPrice()
{

for (int i=0;i {
mp=iLow (Symbol(),PERIOD_CURRENT,i);
if (mp minPrice = mp;
}
}

void GetmaxPrice()
{
for (int i=0;i>=10;i++)
{
mp= iHigh (Symbol(),PERIOD_CURRENT,i);
if (mp>maxPrice) maxPrice=mp;
}
}

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

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

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

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

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

не могу понять как мне добиться что бы при пересечении цены его линии автоматом происходила покупка или продажа..

У индикатора есть буфер в виде массива. на 0-баре значение индикатора записывается в буфер[0], на 1-баре в буфер[1] и т.д. Это понятно?, тогда пересечение линии индикатора снизу вверх определяется так:
if ( Open[0] = bufer[0] )
т.к. 0-свеча не закрыта сигналить может часто, поэтому чаще всего определяют на 1-баре. Для пересечения сверху вниз зеркально.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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