kart72 Опубликовано 1 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 марта, 2018 Здравствуйте форумчане!Функция открытия ордера. Через раз зацикливается, и не хочет отрывать ордер. Хотя должен ))))Открываю 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); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 1 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 марта, 2018 странно, что Вы передаёте в функцию тип ордера, а открыть пытаетесь по Ask-у - надо-бы сделать выбор цены по типу... Ссылка на сообщение Поделиться на другие сайты More sharing options...
kart72 Опубликовано 1 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 марта, 2018 Открываю BuyПросто раньше эту функцию использовал для открытия отложек. В описании функции была переменная с ценой Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 1 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 марта, 2018 Ну раз проблемы с ценой, пробуйте обновить котировки: while(!RefreshRates()) Sleep(16);Может пока Sleep (10000); котировки не обновляютсяи перед вызовом OrderSend принтом выводите всю инфу в журнал - может что и увидите, например что цена не изменяется... Ссылка на сообщение Поделиться на другие сайты More sharing options...
kart72 Опубликовано 1 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 марта, 2018 СпасибоСкорее всего так и есть. Буду тестить на реале.О том что функция создает копию, не знал!(( Ссылка на сообщение Поделиться на другие сайты More sharing options...
Serhoo Опубликовано 2 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 марта, 2018 Хорошего настроения! Передо мной такая задача. Мне надо сделать так чтобы советник открывал увеличенный лот(*кэф) при каждой закрытой сделке по лосю при соответсвующих показателях индиков. Пример: индики показали сэл, открылось по сэл, выбило по лосю, далее индики показали сэл, лот увеличился, опять лось, далее индики показали бай, открылся бай с еще большим лотом и т.д...Для этого мне думается что надо найти последнюю цену закрытия ордера, сравнить ее с ценой открытия ордера за минусом указанного в советнике лося и прописать функцию по увеличению лота.Первыз раз на форуме, если мое сообщение не отвечает форму заранее прошу прощения. Буду рад любой помощи!Вот кусочек кода: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)) .... в общем потерялася я.... Изменено 2 марта, 2018 пользователем Serhoo Ссылка на сообщение Поделиться на другие сайты More sharing options...
kart72 Опубликовано 2 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 марта, 2018 Перед открытием ордера находишь последний закрытый ордер, смотришь лот, профит, и вуаля: меняешь на новом если надо))) Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 2 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 марта, 2018 Serhoo для покрытия убытков нескольких лосей их нужно считать, тогда формула расчёта лота будет следующей:newLot = ( Желаемая_прибыль + MathAbs(Сумма_Лосей) ) / (Размер_тейка_нового_ордера * Стоимость_пункта) ; Изменено 2 марта, 2018 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
Serhoo Опубликовано 3 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 марта, 2018 Serhoo для покрытия убытков нескольких лосей их нужно считать, тогда формула расчёта лота будет следующей:newLot = ( Желаемая_прибыль + MathAbs(Сумма_Лосей) ) / (Размер_тейка_нового_ордера * Стоимость_пункта) ; Благодарю за совет. Дело в том, что у меня уже посчитаны количество непрерывных проигрышей и просчитан лот, который обеспечивает минимальную просадку депо по 11 непрерывным проигрышам, при выравнивании депо после следующего выигрыша. Т.е. такой сейфовый мартин. Основная моя проблем возникла на стадии нахождения и идентификации цены последнего закрытого ордера, чтобы если он по лосю, то открывался по увеличенному лоту и открывал тот тип ордера который отвечает требованию индюков.Добавлено: 03-03-2018 02:35:02Перед открытием ордера находишь последний закрытый ордер, смотришь лот, профит, и вуаля: меняешь на новом если надо))) Единственное что я нашел для того чтобы решить свою задачу это вот такое вот:elsellot=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) Изменено 3 марта, 2018 пользователем Serhoo Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 3 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 марта, 2018 Serhoo да мы понять не можем что Вы делаете, зачем Вам цена последнего ордера? СЛ может проскользить, причём в разную сторону. Обычно, если ордер закрылся с профитом меньше 0, считается лосем.т.е.: if ( OrderProfit() Ссылка на сообщение Поделиться на другие сайты More sharing options...
Serhoo Опубликовано 3 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 марта, 2018 Serhoo да мы понять не можем что Вы делаете, зачем Вам цена последнего ордера? СЛ может проскользить, причём в разную сторону. Обычно, если ордер закрылся с профитом меньше 0, считается лосем.т.е.: if ( OrderProfit() М-да, все простое гениально)) Буду пробовать. А сделать хочу следующее:есть индик канал Дончиана. Советник внизу покупает, вверху продает. Если ордер по лосю, то лот следующего ордера, при соответсвующих показаниях индика, увеличивается на заданный коэффициент. Вот) Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vidma Опубликовано 3 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 марта, 2018 Привет всем,Переделал советник под бинарные опционы по мартингейлу, но сколько непробовал изменить разные варианты...мартин работает так как он хочет.. :) хотя в тестере сделки открываються согласно условиям.Если кто нибудь могбы исправить или хотябы подсказать где ошибка был бы благодарен.. BO_martingale_v1.0.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 3 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 марта, 2018 А сделать хочу следующее:есть индик канал Дончиана. Советник внизу покупает, вверху продаетЭто нормальная идея, причём канал может быть абсолютно любого типа. Подобные совы способны давать до 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 }} Изменено 3 марта, 2018 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
Serhoo Опубликовано 4 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 марта, 2018 А сделать хочу следующее:есть индик канал Дончиана. Советник внизу покупает, вверху продаетЭто нормальная идея, причём канал может быть абсолютно любого типа. Подобные совы способны давать до 15%/мес. Правда серия лосей может быть более 5 шт.нужно дополнительные фишки, типа трала, дополнительные индюки для уточнения момента входа - для уменьшения СЛ. Удачи! Почти готово! Идея: индик ТМА внизу покупает вверху продает. Если лось повышает лот с учетом условий открытия ордера. Не могу понять что именно не так. Когда ловит лося, повышает лот. Ловит профит, но продолжает повышать лот пока суперогомного лося не словит. И перестал соблюдать условия покупки\продажи при соответствующих показаниях индиков(внизу канала бай, вверху селл). Если такое возможно помогите пожалуйста разобраться.Новый_текстовый_документ.txt Изменено 4 марта, 2018 пользователем Serhoo Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 4 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 марта, 2018 Serhoo посмотри код, который выкладывал выше. Там только поменять расчёт лота - сделать через степень, и будет работать. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Serhoo Опубликовано 4 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 марта, 2018 Serhoo посмотри код, который выкладывал выше. Там только поменять расчёт лота - сделать через степень, и будет работать. А для тупых?))) Что значит в степень?Пробовал по-разному, но получается, что сова фигачит увеличенный лот по, только ему известной, причине. Даже несмотря на то, что по профиту закрылся. Не могу понять по какой причине сова не использует изначально заданный лот после профита. Голову сломал уже... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vidma Опубликовано 4 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 марта, 2018 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 "Хотя из всево этого кое что применил но надо ждать понедельника. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 4 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 марта, 2018 Не могу понять по какой причине сова не использует изначально заданный лот после профита. Голову сломал уже... Вы не весь код продемонстрировали? ибо я не нашёл в Вашей программе места, где бы лот снижался от полученного профита, вообще нет проверки профита. Ваш код надо переписать, вот алгоритм:1. Если новый бар - получим новые уровни канала // на каждом тике не надо!2. проверим наличие сигнала на вход: -1 - нет, 0 - OP_BUY, 1 - OP_SELL3. если сигнала нет - выход: if ( signal 3.1. смотрим дополнительные условия, открытые ордера или время не то - выход4. считаем по истории закрытых ордеров количество лосей подряд, с конца. см код выше. count_loss5. Рассчитываем лот по формуле: newLot = start_lot * MathPow( kf_martin, count_loss );// эта формула будет работать всегда, даже при старте6. Вход в направлении сигнала. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vovchik Опубликовано 4 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 марта, 2018 Ребята, а у кого-то есть архив котировок Альпари? Собирал кто-то?_http://tradelikeapro.ru/mql4-analiz-tikovoy-istorii/На форуме не нашел ничего.Можете поделиться информацией?Заранее благодарен. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Serhoo Опубликовано 5 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 марта, 2018 Вы не весь код продемонстрировали? Абсолютно весь код, кроме шапки с параметрами проперти... Понял Вас, буду копать в просторах сети. Некоторые вещи которые Вы описали, я еще не проходил. Видимо пришло время. Жаль на сайте 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_SELL3. если сигнала нет - выход: if ( signal 3.1. смотрим дополнительные условия, открытые ордера или время не то - выход4. считаем по истории закрытых ордеров количество лосей подряд, с конца. см код выше. count_loss5. Рассчитываем лот по формуле: 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...Если можно пару Ваших комментариев.Заранее спасибо! Изменено 5 марта, 2018 пользователем Serhoo Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 6 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 марта, 2018 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,895. после расчёта объёма ордера - открываем в соответствии с условиями. конечно его используем.вопрос странноватый... Вы сами писали советник? Ссылка на сообщение Поделиться на другие сайты More sharing options...
EmilYus Опубликовано 10 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 марта, 2018 Всем привет. Начал изучать курс, сейчас на втором видео. В моменте, где рассказывается о том, как записать цикл, функцию нахождения минимальной цены среди предыдущих 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 10 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 марта, 2018 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
КонстантинYO Опубликовано 11 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 марта, 2018 Здравствуйте, я тут новенький и тема в целом для меня новая, начал изучать язык и столкнулся с одной проблемкой...вообщем как написать советник что бы покупал от нижней границы канала и продавал от верхней границы канала я понял, но вот хотел написать для другого индикатора, но имеет он всего одну линию , не могу понять как мне добиться что бы при пересечении цены его линии автоматом происходила покупка или продажа..может подскажете где можно подробно об этом почитать, посмотреть ? ^:)^ Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 11 марта, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 марта, 2018 не могу понять как мне добиться что бы при пересечении цены его линии автоматом происходила покупка или продажа..У индикатора есть буфер в виде массива. на 0-баре значение индикатора записывается в буфер[0], на 1-баре в буфер[1] и т.д. Это понятно?, тогда пересечение линии индикатора снизу вверх определяется так:if ( Open[0] = bufer[0] )т.к. 0-свеча не закрыта сигналить может часто, поэтому чаще всего определяют на 1-баре. Для пересечения сверху вниз зеркально. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти