Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
"MQL4: нет цены?"
//+------------------------------------------------------------------+ //| Triton.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern int TakeProfit = 150; extern int StopLoss = 1; extern int lev= 10; extern int risk = 20; extern int HourOpen = 17; extern int MinutesOpen = 49; extern int SecondsOpen = 30; extern int HourClose = 14; extern int MinutesClose = 0; extern int SecondsClose = 1; int ho, mo, so, Lots; int pos; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- mo=Minute(); so=Seconds(); ho=Hour(); Lots=MathCeil(AccountBalance()*risk/10000.0)/10.0; if (Lots<0.1) Lots=0.1; //*----------------------------------------------------------------------- //|Блок выставления ордеров //*----------------------------------------------------------------------- if( StartTime(60,HourOpen,MinutesOpen,SecondsOpen) ) { if(OrderTotal(OP_BUYSTOP)==0) { OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+lev*Point,3,(Ask+lev*Point)-StopLoss*Point,Ask+(TakeProfit+lev)*Point,"Покупка",222,0,Blue); } if(OrderTotal(OP_SELLSTOP)==0) { OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-lev*Point,3,(Bid-lev*Point)+StopLoss*Point,Bid-(TakeProfit+lev)*Point,"Продажа",222,0,Red); } } //*----------------------------------------------------------------------- //|удаление всех ордеров по данному инструменту //*----------------------------------------------------------------------- if( StartTime(60,HourClose,MinutesClose,SecondsClose) ) { for(pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true) { if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Blue); } else { if(OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Red); } else { if(OrderType()==OP_BUYSTOP) { OrderDelete(OrderTicket(),Blue); } else { if(OrderType()==OP_SELLSTOP) { OrderDelete(OrderTicket(),Red); } } } } } } else { Print("Ошибка ", GetLastError()); } } } return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // функция подсчитывающая количество ордеров в рынке по типу //+------------------------------------------------------------------+ int OrderTotal(int type) { int order=0; for(int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true) { if(OrderSymbol()==Symbol() && OrderType()==type) { order++; } } else Print("Ошибка ", GetLastError()); } //---- return(order); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Функция, отслеживающая время, для того чтобы дать старт определенным // действиям в точно заданное время //+------------------------------------------------------------------+ //здесь немного пояснений как работает функция : //чтобы не зависить от прихода тика, и в то же время не зацикливать эксперт //и при этом терять информацию о вновь поступивших ценах поступаем следующим образом //определяем (на своем опыте) масимальное время, в течении которого не приходит тик (в секундах) //это значение будет храниться в переменной time_absence_tic //кроме того потребуется час, минута, и секунда - точное время дня, когда должно свершиться "чудо" :) bool StartTime(int time_absence_tic,int mHour,int mMinutes,int mSeconds) { //---- bool rez; //в эту переменную запишем результат исполнения функции int ta_m,ta_s; //переменные в которых будем хранить значения полных минут и секунд времени максимального отсутствия тиков int dif_m,dif_s; int tsleep; rez=0; //сначала нужно вычислить сколько времени в минутах и секундах составляет время максимального отсутствия тика //вычислять более высокие промежутки времени (часы и выше) думаю не имеет смысла if( time_absence_tic>60 ) { ta_m=MathFloor(time_absence_tic/60); ta_s=time_absence_tic-ta_m*60; } else { ta_m=0; ta_s=time_absence_tic; } //определяем время в которое должен стартовать наш "цикл" чтобы стать независимым от тиков if( TimeHour(TimeCurrent())==mHour && TimeMinute(TimeCurrent())>=mMinutes-ta_m && TimeSeconds(TimeCurrent())>=mSeconds-ta_s ) { //чтобы задать время "сна" определим разницу времени когда должен стартануть наш цикл в идеале и реальное dif_m=TimeMinute(TimeCurrent())-(mMinutes-ta_m); dif_s=TimeSeconds(TimeCurrent())-(mSeconds-ta_s); //соответственно время сна в секундах составит (на секунду меньше) tsleep=dif_m*60+dif_s-1; //засыпаем :) Sleep(tsleep*1000); //проснулись нужно обновить рыночные данные RefreshRates(); //теперь можно выставить значение тру, и в поход за лиммионами rez=1; } //---- return(rez); } //+------------------------------------------------------------------+Буду разбираться
А разве раньше во внешних переменных не ставилось желаемое время?
extern int HourOpen = 17;
extern int MinutesOpen = 49;
extern int SecondsOpen = 30;
Эксперт в таком виде не выставляет ордера.
не совсем до конца понял как работает функция, отслеживающая время. Допустим пример:
торги закрываются в 20:15. Цель - выставить ордера в 20:14:30.(Время МТ4)
К примеру последний тик пришел в 20:08:01. Я так понимаю: mHour, mMinutes и mSeconds это время прихода последнего тика и на основании этого времени
выполняется условие if( StartTime(60,HourOpen,MinutesOpen,SecondsOpen) )
Или я не правильно понял
не совсем до конца понял как работает функция, отслеживающая время. Допустим пример:
торги закрываются в 20:15. Цель - выставить ордера в 20:14:30.(Время МТ4)
К примеру последний тик пришел в 20:08:01. Я так понимаю: mHour, mMinutes и mSeconds это время прихода последнего тика и на основании этого времени
выполняется условие if( StartTime(60,HourOpen,MinutesOpen,SecondsOpen) )
Или я не правильно понял
в этом случае время в которое ты желаешь выставить ордер 20:14:30 (его и ставишь во внешних переменных), из примера видно что тик на приходил 6 мин. 29 сек, т.е. вместо 60 , как минимум должно стоять 6*60+29 = 389 сек. (нужно на практике знать ориентировочное максимально время отсутствие тиков), за 389 сек. запустится наша функция и будет ждать и ровно в 20:14:30 произведет нужные нам действия. StartTime(389,20,14,30) так будет выглядеть с циферками :)
в этом случае время в которое ты желаешь выставить ордер 20:14:30 (его и ставишь во внешних переменных), из примера видно что тик на приходил 6 мин. 29 сек, т.е. вместо 60 , как минимум должно стоять 6*60+29 = 389 сек. (нужно на практике знать ориентировочное максимально время отсутствие тиков), за 389 сек. запустится наша функция и будет ждать и ровно в 20:14:30 произведет нужные нам действия. StartTime(389,20,14,30) так будет выглядеть с циферками :)
[/quote]
Теперь дошло :)
Спасибо
Подскажите, пожалуйста, почему появляется такое сообщение компилятора ?
Что рекомендуется оптимизировать и сокращать: количество строк кода, переменных, массивов, обращений к функциям ?
Спасибо.
Вместо одной большой функции попробуйте сделать несколько функций
Большое спасибо, помогло.