mzk_3om6u Опубликовано 20 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 октября, 2013 Так добавьте в конструктор счётчик открытый ордеров, если он > 0 то не открывать ордера.) Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 20 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 октября, 2013 Всем привет!Если не заморачиваться, можно отправить советник спать, после открытия ордера. Измерять будем свечками:ticket = OrderSend(.................)if (ticket > 0){ if (OrderModify(.............)) { int sleep = timefr*60*1000; Sleep(sleep); }}timefr - во внешние переменные. Это период графика в минутах (если H1, пишем 60, если H4 - 240).Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;Теперь, можно ограничить общее количество ордеров: if (CountSell() (например)Конечно, если во время спячки перезапустить терминал или советник, может установиться ещё один ордер... Вы говорите ''Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;''А как я узнаю сколько нужно пропустить баров? Я ведь не смогу предсказать когда именно появится следующий пин-бар.Может лучше все так же оставить, а в конце добавить if (buypin == true) sleep = false;, то-есть если появляется новый пин-бар, то сплячку отключаем:ticket = OrderSend(.................)if (ticket > 0){ if (OrderModify(.............)) { int sleep = timefr*60*1000; Sleep(sleep); if (buypin == true) sleep = false; }} Или так не получится?А то что если во время спячки перезапустить терминал или советник, может установиться ещё один ордер это точно? Если это так то наверное лучше искать другой вариант.А может в этом случае написать что-то типа такого: if (цена первого ордера == цене второго ордера) то второй закрыть; ? Или не получится.Еще. Как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется?Я так написала, ничего не получилось:if (pinbuy == true) { if (ticket > 0 && CountBuyStop() > 0 && CountBuy() == 0) { if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true) { if (Ask { OrderDelete (ticket); } } } } if (pinsell == true) { if (ticket > 0 && CountSellStop() > 0 && CountSell() == 0) { if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true) { if (Bid > dhigh) { OrderDelete (ticket); } } } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vorchunozavr Опубликовано 20 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 октября, 2013 А как я узнаю сколько нужно пропустить баров? Я ведь не смогу предсказать когда именно появится следующий пин-бар. А не нужно узнавать, сколько пропускать баров. Если сов обнаружил пин-бар на предыдущей свече, он выставляет (допустим) отложку. Если ордер установился, срабатывает команда Sleep. В начале следующей свечи он снова проверяет предыдущую и т.д. Двойку, я предложил на случай, если не нужно отрабатывать два пин-бара подряд.Это был просто пример, а не кусок кода в коммерческий бот :) Ссылка на сообщение Поделиться на другие сайты More sharing options...
wmode7 Опубликовано 20 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 октября, 2013 Так добавьте в конструктор счётчик открытый ордеров, если он > 0 то не открывать ордера.) если бы я знал, как это делать. советник мастерил по этому конструктору:_http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/MACDMA.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Renjeni Опубликовано 20 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 октября, 2013 Ребята, подскажите как сделать что бы в советнике по мартину открывать следующие ордера по индикатору. Я добавляю там где идет проверка на сколько ушла цена в обратную сторону , но он почему то игнорирует и продолжает открывать как и раньше else { int order_type = FindLastOrderType(); if (order_type ==OP_BUY) { price=FindLastPrice(OP_BUY); if((Ask S1 && st2 { lastlot = FindLastLots(OP_BUY); lastlot = NormalizeDouble(lastlot*Multiplier,2); ticket = OrderSend(Symbol(),OP_BUY,lastlot,Ask,Slippage,0,0,"",Magic,0,Blue); if ( ticket > 0) ModifyOrders( OP_BUY); } } Добавлено: 21-10-2013 08:43:23всё, я разобрался сам - извините что беспокоил зря Изменено 21 октября, 2013 пользователем Renjeni Ссылка на сообщение Поделиться на другие сайты More sharing options...
nicholas Опубликовано 20 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 октября, 2013 В коде уже есть проверка на открытые позиции, поэтому добавлять не нужно.В самом коде есть ошибки:1. Нету проверки на пересечение EMA, есть только проверка что текущее значение EMA5 выше или ниже LWMA. Чтобы проверить пересечение, нужно проверять что на предыдущем баре (shift=1) значение было ниже(выше), а на следущем - поменялось.2. В самих параметрах индикаторов есть ошибки - в переменной Buy1_2 вместо EMA 5 в одном месте вычисляеться EMA 153. Buy2_1 - вместо LWMA вычисляеться SMAИ не понятно что такое 1 бар MACD в описании. Это предыдущий бар ? MACDMA_fixed.mq4 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 21 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 октября, 2013 А как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется? Ссылка на сообщение Поделиться на другие сайты More sharing options...
wmode7 Опубликовано 21 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 октября, 2013 В коде уже есть проверка на открытые позиции, поэтому добавлять не нужно.В самом коде есть ошибки:1. Нету проверки на пересечение EMA, есть только проверка что текущее значение EMA5 выше или ниже LWMA. Чтобы проверить пересечение, нужно проверять что на предыдущем баре (shift=1) значение было ниже(выше), а на следущем - поменялось.2. В самих параметрах индикаторов есть ошибки - в переменной Buy1_2 вместо EMA 5 в одном месте вычисляеться EMA 153. Buy2_1 - вместо LWMA вычисляеться SMAИ не понятно что такое 1 бар MACD в описании. Это предыдущий бар ? благодарю за помощь ) Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vladimir1_83 Опубликовано 22 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 октября, 2013 Добрый день! Опять я :) Просмотрел еще пару раз видео по мартину и внес некоторые изменения, но почемуто открываются 2 ордера на покупку... Подскажите от куда руки растут, в смысле от куда начал неправильно идти:int start(){ if (HourStart == TimeHour(TimeCurrent()) && CountBay() == 0) { SL1 = NormalizeDouble(Ask - StopLoss*Point, Digits); TP1 = NormalizeDouble(Ask + StopLoss*Point, Digits); ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slipage, SL1, TP1, Coment, Magic, 0, Blue); int order_type = FindLastOrderType(); if (order_type == OP_BUY) { price = FindLastPrice(OP_BUY); if (Ask { SL2 = NormalizeDouble(Ask - StopLoss*Point, Digits); TP2 = NormalizeDouble(Ask + StopLoss*Point, Digits); ticket = OrderSend(Symbol(), OP_BUY, Lots * 2, Ask, Slipage, SL2, TP2, Coment, Magic, 0, Blue); } } } return(0);}//+------------------------------------------------------------------+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); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
mzk_3om6u Опубликовано 22 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 октября, 2013 Добрый вечер, xbms, у меня очень интересный вопрос.А именно:1. Ситуация частичного закрытия ордера - изменяется тикет, и записывается в комментарий к новому ордеру, это понятно, его можно достать.2. Ситуация некоторые брокеры при переносе позиции через ночь\выходные, закрывают позу и в начале дня опять открывают, как в этом случае ведёт себя тикет? Старый тикет запишется в комментарий к новой позе, или вообще случайный тикет, пустой коммент? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vitalya Опубликовано 25 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 25 октября, 2013 Здравствуйте!Не могу найти ошибку в своем коде.Условие - открыть позицию на бай, если между High и Close предыдущего бара меньше 20 пунктов. В тестере открывается так, как не ожидал... Другие условия: свеча не меньше 350 пунктов; восходящая свеча HL1=iHigh(NULL,0,1)-iClose(NULL,0,1); if (iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point&&HL1iOpen(NULL,0,1))Почему открылся BUY?P.S. Опечатался в посте, исправил скобки. Проблема все равно существует xauusdm5.png Изменено 26 октября, 2013 пользователем Vitalya Ссылка на сообщение Поделиться на другие сайты More sharing options...
elruso Опубликовано 25 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 25 октября, 2013 Здравствуйте!Не могу найти ошибку в своем коде.Условие - открыть позицию на бай, если между High и Close предыдущего бара меньше 20 пунктов. В тестере открывается так, как не ожидал... Другие условия: свеча не меньше 350 пунктов; восходящая свеча HL1=iHigh(NULL,0,1)-iClose(NULL,0,1); if ((iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point)&&(HL1iOpen(NULL,0,1)Почему открылся BUY? Зачем столько скобок? внутри лишние а в конце не хватило или это описка не знаю! Вот так не откроет!!!if(iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point && iClose(NULL,0,1)>iOpen(NULL,0,1) && iHigh(NULL,0,1)-iClose(NULL,0,1) или по короче вот так if(High[1]- Low[1]>=350*Point && Close[1]>Open[1] && High[1]-Close[1] Изменено 25 октября, 2013 пользователем elruso Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 26 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 октября, 2013 Так а что по моему вопросу, никто не знает? Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 26 октября, 2013 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 октября, 2013 А как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется? просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку... Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 27 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку... Так я это и так знаю, только как это написать в коде? Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 27 октября, 2013 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку... Так я это и так знаю, только как это написать в коде? да в общем-то несложно...я не смотрел этих индикаторов, но примерно так:if ((Ask + Pips*Point) { DeleteStopOrder(); //-- тут функция удаления стоп-ордера}Pips - это переменная в параметрах, в пунктах... на сколько должна быть ниже pinbuyв общем, как-то так... Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 27 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 Вот, посмотрите, может так: if(pinsell == true) { if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true) { if(OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP) { if(CountSellStop() > 0) { if(Bid == dhigh) OrderDelete(ticket); } } } } if(pinbuy == true) { if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true) { if(OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP) { if(CountBuyStop() > 0) { if(Ask == dlow) OrderDelete(ticket); } } } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 27 октября, 2013 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 Цитата if(Bid == dhigh)if(Ask == dlow) в этих местах слишком жёстко... котировки могут "проскочить" как минимум на 1 пункт и тогда ой :)лучше писать "=" , зависит от условия... Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 27 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 Цитата if(Bid == dhigh)if(Ask == dlow) в этих местах слишком жёстко... котировки могут "проскочить" как минимум на 1 пункт и тогда ой :)лучше писать "=" , зависит от условия... Ага, поняла, ну а в целом правильно написала? Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 27 октября, 2013 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 Цитата Ага, поняла, ну а в целом правильно написала? по синтаксису всё верно, но по логике ничего не могу сказать... я не смотрел ваших индикаторов... Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 27 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 А почему у меня при тестировании высвечивается в журнале ошибка 130?Вот мой стоп-лосс в коде советника:int init(){ if(Digits == 3 || Digits == 5) StopLoss *= 10; return(0);}if(pinbuy == true) SL = NormalizeDouble(dlow - StopLoss * Point, Digits);if(pinsell == true) SL = NormalizeDouble(dhigh + StopLoss * Point, Digits); Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 27 октября, 2013 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 А почему у меня при тестировании высвечивается в журнале ошибка 130?Вот мой стоп-лосс в коде советника:int init(){ if(Digits == 3 || Digits == 5) StopLoss *= 10; return(0);}if(pinbuy == true) SL = NormalizeDouble(dlow - StopLoss * Point, Digits);if(pinsell == true) SL = NormalizeDouble(dhigh + StopLoss * Point, Digits); не ясно как вычисляются dlow и dhigh... скорее всего неправильно, ибо ошибка 130 - это неправильные стопы. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
TANZA Опубликовано 27 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 double dlow = Low [1]; // Минимум предыдущего бараdouble dhigh = High [1]; // Максимум предыдущего бара Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 27 октября, 2013 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 октября, 2013 double dlow = Low [1]; // Минимум предыдущего бараdouble dhigh = High [1]; // Максимум предыдущего бара а не проще выложить целиком файл, дабы не гадать где, что и как... ? Ссылка на сообщение Поделиться на другие сайты More sharing options...
igorёk Опубликовано 29 октября, 2013 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 октября, 2013 Хочу написать советник с использованием индикатора Stochastic oscillator. Так же хочу чтобы в рынок осуществлялся при условии медвежьей и бычьей дивергенции. В основном меня это интересует, кто может помочь? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти