ju.vskv Опубликовано 14 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 сентября, 2019 24 минуты назад, Александр 1939 сказал: (Курс молодого бойца)не могу получить не приходит письмо для скачивания-как быть?? Получите ссылочку http://tlap.com/wppage/videokurs-mql4-programmirovanie/ 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Oleg Petrov Опубликовано 15 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 сентября, 2019 Доброго времени суток! Вот написал небольшой простенький советник-сеточник. Скомпилировал, ошибок не выдает. Но при тестировании обратил внимание, что новые дополнительные сделки открываются без изменения коэффициента лота, шага и ТР, как это предусмотрено прописанной логикой. Да и ограничение максимального количества дополнительных сделок не срабатывает. То есть например после открытия стартовой сделки лотом 0,1 советник должен открыть 3 дополнительные сделки лотом 0,05, потом еще 5 дополнительных сделок лотом 0,02 и тд. А он после стартовой сделки начинает открывать все дополнительные сделки лотом 0,05 и не контролирует их общее количество. Странно. Все проверил, думал функция CountTrades() неправильно считает открытые ордера, но тоже вроде правильно написано. Подскажите плиз в чем ошибка, Заранее благодарен. Спойлер //+------------------------------------------------------------------+ //| PRIM v 1.00.mq4 | //| Copyright 2019, PRIM Corp. | //| https://www.prim.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, PRIM Corp." #property link "https://www.prim.com" #property version "1.00" #property strict extern double Lot = 0.1; extern double K_Lot1 = 0.5; extern double K_Lot2 = 0.2; extern double K_Lot3 = 0.1; extern int TakeProfit_1 = 3; extern int TakeProfit_2 = 4; extern int TakeProfit_3 = 5; extern int TakeProfit_4 = 7; extern int Step1 = 2; extern int Step2 = 4; extern int Step3 = 6; extern int Step4 = 8; extern int MaxDopKolen1 = 3; extern int MaxDopKolen2 = 5; extern int MaxDopKolen3 = 7; extern int Magic = 1111111; extern int MAPeriod = 20; int ticket; double lot, tp, price, lastlot; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if (Digits == 3 || Digits == 5) { TakeProfit_1 *= 10; TakeProfit_2 *= 10; TakeProfit_3 *= 10; TakeProfit_4 *= 10; Step1 *= 10; Step2 *= 10; Step3 *= 10; Step4 *= 10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { double ic = iClose(Symbol(), PERIOD_CURRENT, 1); double io = iOpen(Symbol(), PERIOD_CURRENT, 1); double ih = iHigh(Symbol(), PERIOD_CURRENT, 1); double il = iLow(Symbol(), PERIOD_CURRENT, 1); double iM = iMA(Symbol(),PERIOD_CURRENT, MAPeriod,0, MODE_SMA, PRICE_CLOSE, 1); if(CountTrades()==0) { if(Ask<=iM) { tp = NormalizeDouble(Ask + TakeProfit_1*Point, Digits); ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, 5, 0, tp, "", Magic, 0, Blue); SendNotification("Милорд, мы открыли сделку на покупку: " + Symbol()); } if(Bid>=iM) { tp = NormalizeDouble(Bid - TakeProfit_1*Point, Digits); ticket = OrderSend(Symbol(), OP_SELL, Lot, Bid, 5, 0, tp, "", Magic, 0, Red); SendNotification("Милорд, мы открыли сделку на продажу: " + Symbol()); } } if (CountTrades()>0) { if(CountTrades()<= MaxDopKolen1) { if(BuyCount()>0 && SellCount()==0 && BuyCount()<=MaxDopKolen1) { price = FindLastOrderPrice(OP_BUY); if (Ask <= NormalizeDouble(price - Step1*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot1, Digits); tp = NormalizeDouble(Ask + TakeProfit_1*Point, Digits); ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue); SendNotification("Мы увеличили сделку на покупку: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на покупку"); } } if (BuyCount()==0 && SellCount()>0 && SellCount()<=MaxDopKolen1) { price = FindLastOrderPrice(OP_SELL); if (Bid >= NormalizeDouble(price + Step1*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot1, Digits); tp = NormalizeDouble(Bid - TakeProfit_1*Point, Digits); ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red); SendNotification("Мы увеличили сделку на продажу: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на продажу"); } } } if (CountTrades()>MaxDopKolen1 && CountTrades()<= MaxDopKolen2) { if(SellCount()==0 && BuyCount()>MaxDopKolen1 && BuyCount()<=MaxDopKolen2) { price = FindLastOrderPrice(OP_BUY); if (Ask <= NormalizeDouble(price - Step2*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot2, Digits); tp = NormalizeDouble(Ask + TakeProfit_2*Point, Digits); ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue); SendNotification("Мы увеличили сделку на покупку: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на покупку"); } } if (BuyCount()==0 && SellCount()>MaxDopKolen1 && SellCount()<=MaxDopKolen2) { price = FindLastOrderPrice(OP_SELL); if (Bid >= NormalizeDouble(price + Step2*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot2, Digits); tp = NormalizeDouble(Bid - TakeProfit_2*Point, Digits); ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red); SendNotification("Мы увеличили сделку на продажу: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на продажу"); } } } if (CountTrades()>MaxDopKolen2 && CountTrades()<= MaxDopKolen3) { if(SellCount()==0 && BuyCount()>MaxDopKolen2 && BuyCount()<=MaxDopKolen3) { price = FindLastOrderPrice(OP_BUY); if (Ask <= NormalizeDouble(price - Step3*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot3, Digits); tp = NormalizeDouble(Ask + TakeProfit_3*Point, Digits); ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue); SendNotification("Мы увеличили сделку на покупку: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на покупку"); } } if (BuyCount()==0 && SellCount()>MaxDopKolen2 && SellCount()<=MaxDopKolen3) { price = FindLastOrderPrice(OP_SELL); if (Bid >= NormalizeDouble(price + Step3*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot3, Digits); tp = NormalizeDouble(Bid - TakeProfit_3*Point, Digits); ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red); SendNotification("Мы увеличили сделку на продажу: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на продажу"); } } } if (CountTrades()>MaxDopKolen3) { if(SellCount()==0 && BuyCount()>MaxDopKolen3) { price = FindLastOrderPrice(OP_BUY); if (Ask <= NormalizeDouble(price - Step4*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot3, Digits); tp = NormalizeDouble(Ask + TakeProfit_4*Point, Digits); ticket=OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0,tp, "", 0, 0, Blue); SendNotification("Мы увеличили сделку на покупку: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на покупку"); } } if (BuyCount()==0 && SellCount()>MaxDopKolen3) { price = FindLastOrderPrice(OP_SELL); if (Bid >= NormalizeDouble(price + Step4*Point, Digits)) { lastlot = NormalizeDouble(Lot*K_Lot3, Digits); tp = NormalizeDouble(Bid - TakeProfit_4*Point, Digits); ticket=OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0,tp, "", 0, 0, Red); SendNotification("Мы увеличили сделку на продажу: " + Symbol()); if (ticket<1) Print("Ошибка открытия ордера на продажу"); } } } } } //+------------------------------------------------------------------+ int CountTrades() { int count=0; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) count++; } } return(count); } //+------------------------------------------------------------------+ int BuyCount() { int count = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true && OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY) { count++; } } return(count); } //+------------------------------------------------------------------+ int SellCount() { int count = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true && OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL) { count++; } } return(count); } //+------------------------------------------------------------------+ double FindLastOrderPrice(int otype) { int oldticket; double oldopenprice=0; ticket=0; for (int cnt=OrdersTotal()-1; cnt >=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderType() == otype) { oldticket = OrderTicket(); if (oldticket > ticket) { ticket=oldticket; oldopenprice=OrderOpenPrice(); } } } } return(oldopenprice); } //+------------------------------------------------------------------+ Изменено 15 сентября, 2019 пользователем Oleg Petrov Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 16 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 сентября, 2019 @Oleg Petrov После открытия сделки где у Вас SendNotification , вставьте Print("Buy=",BuyCount(),", Sell=",SellCount() ); После сделаете короткий прогон на пару сеток и смотрите в журнале как логика отработала. Этот приём основной при поиске ошибок. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Oleg Petrov Опубликовано 16 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 сентября, 2019 1 час назад, 0ll сказал: @Oleg Petrov После открытия сделки где у Вас SendNotification , вставьте Print("Buy=",BuyCount(),", Sell=",SellCount() ); После сделаете короткий прогон на пару сеток и смотрите в журнале как логика отработала. Этот приём основной при поиске ошибок. Oll спасибо за подсказку. Добавил Print по вашей рекомендации. В журнале после каждой дополнительно открытой сделки появляются следующие строки: 2019.09.16 14:37:20.013 2019.08.05 09:14:26 prim EURUSD,M1: Buy=0, Sell=1, Count=1 2019.09.16 14:37:15.514 2019.08.05 09:12:14 prim EURUSD,M1: Buy=0, Sell=1, Count=1 То есть получается все мои функции Count() работают некорректно, не суммируют открытые сделки. Подскажите плиз что не так в моем коде Count. Цикл вроде стандартный, перебирает все открытые ордера от начала до 0. Почему не суммирует их? int CountTrades() { int count=0; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) count++; } } return(count); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 16 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 сентября, 2019 10 минут назад, Oleg Petrov сказал: Подскажите плиз что не так в моем коде Count. Цикл вроде стандартный, перебирает все открытые ордера от начала до 0. Получается не только Count но и SellCount() у Вас не считает... Думаю для Вас будет полезно самому найти ошибку, Print в руки и вперёд, вставляйте везде, только не в основной цикл, а то заспамите журнал. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Oleg Petrov Опубликовано 16 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 сентября, 2019 21 минуту назад, 0ll сказал: Получается не только Count но и SellCount() у Вас не считает... Думаю для Вас будет полезно самому найти ошибку, Print в руки и вперёд, вставляйте везде, только не в основной цикл, а то заспамите журнал. Вы имеете ввиду использовать функцию Print во всех строках функции Count ? Так там же смысловая строка только цикл и есть. А выводимый результат явно не корректен судя по журналу. Не совсем понял какие выходные параметры в советнике мне нужно проверить с помощью Print для поиска ошибки. Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 16 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 сентября, 2019 18 часов назад, Oleg Petrov сказал: Подскажите плиз в чем ошибка разобрался? 1 минуту назад, Oleg Petrov сказал: Добрый день! Нет. Понял что проблема в функциях Count, BuyCount, SellCount но не пойму в чем там ошибка. OrdersTotal добавил в Print. Он правильно тянется. Цикл вроде правильно написан, анализирует по убыванию все открытые ордера. В общем запутался еще больше. 1 минуту назад, Oleg Petrov сказал: Понял что проблема в функциях Count, BuyCount, SellCount но не пойму в чем там ошибка. Это как красивая девушка на сцене отвлекает от происходящего с иллюзионистом или фокусником. 1 минуту назад, Oleg Petrov сказал: добавил в Print Для этого существует отладка, не стоит пренебрегать её. Ответ: Все гораздо проще! Дело в MagicNumber в OrderSend(). В первом ордере ставите MagicNumber-1111111, а в последующих ордерах 0. Отсюда следует что Count, BuyCount, SellCount считают MagicNumber-1111111, вот поэтому Count, BuyCount, SellCount и будут видеть (считать) только по одному ордеру. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Oleg Petrov Опубликовано 16 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 сентября, 2019 34 минуты назад, MikR0ReR сказал: Ответ: Все гораздо проще! Дело в MagicNumber в OrderSend(). В первом ордере ставите MagicNumber-1111111, а в последующих ордерах 0. Отсюда следует что Count, BuyCount, SellCount считают MagicNumber-1111111, вот поэтому Count, BuyCount, SellCount и будут видеть (считать) только по одному ордеру. Вот спасибо. А то я уж и не знал что еще проверить в Count. Оказалось, что проблема в том, что часть кода скопировал из другого своего советника, где Magic не контролировался. И конечно раз этот нюанс на общую логику советника не влиял, я его и не проверил. Изменено 16 сентября, 2019 пользователем Oleg Petrov Ссылка на сообщение Поделиться на другие сайты More sharing options...
molot_1 Опубликовано 17 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 сентября, 2019 Здравствуйте!!! Нашёл интересный код трейлинг стоп. Помогите пожалуйста Tral_ForexGrail_v2.3 вписать в 15AO. Заранее спасибо !!! Tral_ForexGrail_v2.3.mq4 15AO.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Partorius Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 Хочу сделать чтобы советник выдавал алерты и отправлял сообщения на телефон, но при соблюдении условий начинает постоянно отправлять сообщения и выдавать алерты, подскажите как сделать чтобы это происходило 1 раз Спойлер if (StopBuy < 10000 && Stochastic < 20) { if (AlertOn==True) { Alert(Symbol()," сигнал на покупку"); if (PushMessagesOn==True) { SendNotification(_Symbol + " сигнал на покупку "); Print ("Алерт на мобильник покупка", Stochastic); } } } if (StopSell < 10000 && Stochastic > 80) { if (AlertOn==True) { Alert(Symbol()," сигнал на продажу"); if (PushMessagesOn==True) { SendNotification(_Symbol + " сигнал на продажу"); Print ("Алерт на мобильник продажа", Stochastic); } } } Изменено 19 сентября, 2019 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 @Partorius введите флаг напр: bool one = true; , Затем в тексте добавьте проверки и сброс флага: if (one && StopBuy < 10000 && Stochastic < 20) { one = false; и далее по тексту } else one = true; // когда нет сигнала - восстанавливаем флаг Также и с другим условием. Надеюсь сигнал Stochastic не с 0-бара? Можно задать время таймаута, когда сигнал не отправляется. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Partorius Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 Спойлер bool one = true; if (one && StopBuy < 10000 && Stochastic < 20) { one = false; if (AlertOn==True) { Alert(Symbol()," сигнал на покупку"); if (PushMessagesOn==True) { SendNotification(_Symbol + " сигнал на покупку"); Print ("Алерт на мобильник покупка", Stochastic); } } } else one = true; if (one && StopSell < 10000 && Stochastic > 80) { one = false; if (AlertOn==True) { Alert(Symbol()," сигнал на продажу"); if (PushMessagesOn==True) { SendNotification(_Symbol + " сигнал на продажу"); Print ("Алерт на мобильник продажа", Stochastic); } } } else one = true; Почему то все равно постоянно шлет сообщения Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 4 часа назад, Partorius сказал: Почему то все равно постоянно шлет сообщения bool one = true; нужно объявить на глобальном уровне перед void OnTick() или добавить static bool one = true; Ссылка на сообщение Поделиться на другие сайты More sharing options...
Partorius Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 1 час назад, 0ll сказал: bool one = true; нужно объявить на глобальном уровне перед void OnTick() или добавить static bool one = true; Пробовал и на глобальном уровне Спойлер //+------------------------------------------------------------------+ //| Alert.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern bool AlertOn = True; //Алерт extern bool PushMessagesOn = False;// Отправка сигнала на мобильник bool one = true; и добавлял Спойлер static bool one = true; все равно постоянно шлет сообщения Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 @Partorius Стохастик с какого бара? и на каком ТФ всё это запускается? Никто весь Ваш код не видит, поэтому сказать не возможно. Вам понятна суть моего предложения? или надо подробнее описать? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Partorius Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 5 минут назад, 0ll сказал: @Partorius Стохастик с какого бара? и на каком ТФ всё это запускается? Никто весь Ваш код не видит, поэтому сказать не возможно. Вам понятна суть моего предложения? или надо подробнее описать? Стохастик с предыдущего бара, тайм фрейм 1 час, в коде в принципе больше ничего нет, кроме вытягивания данных с индикатора Stochastic и BuyStop и SellStop. Если можно то поподробнее распишите, мне кажется что в таком исполнении как сейчас на каждом тике будут обновляться данные в том числе и переменная one будет всегда true т.к мы ей в конце цикла присваиваем true Ссылка на сообщение Поделиться на другие сайты More sharing options...
Partorius Опубликовано 19 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 сентября, 2019 20 минут назад, 0ll сказал: @Partorius Стохастик с какого бара? и на каком ТФ всё это запускается? Никто весь Ваш код не видит, поэтому сказать не возможно. Вам понятна суть моего предложения? или надо подробнее описать? Вот код целиком Спойлер //+------------------------------------------------------------------+ //| Alert.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern bool AlertOn = True; //Алерт extern bool PushMessagesOn = False;// Отправка сигнала на мобильник //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static bool one = true; double Stochastic = iCustom (Symbol(), 0, "Drake Delay Stochastic", 5, 3, 1, 0, 1); double StopBuy = iCustom (Symbol(), 0, "BB_Stop_v1", 80, 2, 1, 1, 1, 1000, true, 4, 1); double StopSell = iCustom (Symbol(), 0, "BB_Stop_v1", 80, 2, 1, 1, 1, 1000, true, 5, 1); { if (one && StopBuy < 10000 && Stochastic < 20) { one = false; if (AlertOn==True) { Alert(Symbol()," сигнал на покупку "); if (PushMessagesOn==True) { SendNotification(_Symbol + " сигнал на покупку"); Print ("Алерт на мобильник покупка", Stochastic); } } } else one = true; if (one && StopSell < 10000 && Stochastic > 80) { one = false; if (AlertOn==True) { Alert(Symbol()," сигнал на продажу"); if (PushMessagesOn==True) { SendNotification(_Symbol + " сигнал на продажу"); Print ("Алерт на мобильник продажа", Stochastic); } } } else one = true; } } //+------------------------------------------------------------------+ Ссылка на сообщение Поделиться на другие сайты More sharing options...
Владимир Стариков Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 Здравствуйте! Я не то чтобы умею в mql4, но копипастить могу. Сделал функцию: Спойлер //+---------------------------------------------------------------------------------+ //|Функция для определения тренда (общая) | //+---------------------------------------------------------------------------------+ int Trend(Filtr filtr_, ENUM_TIMEFRAMES tf, int shift) { int res=0; if(filtr_==no) { if(Ask<lowerEnv2()) { res=1; } if(Bid>upperEnv2()) { res=0; } } if(filtr_==Pik) { if(iLow(NULL,tf,shift)<=iLowest(NULL,tf,MODE_LOW,period_env2,shift)) { res=1; } if(iHigh(NULL,tf,shift)>=iHighest(NULL,tf,MODE_HIGH,period_env2,shift)) { res=0; } } if(filtr_==full_color) { if (iClose(NULL,tf,shift)>iOpen(NULL,tf,shift)&&ha(tf,3,shift)>=ha(tf,2,shift))//белая { res=1; } if (iClose(NULL,tf,shift)<=iOpen(NULL,tf,shift)&&ha(tf,3,shift)<ha(tf,2,shift))//черная { res=0; } } if(filtr_==HA) { if (ha(tf,3,shift)>=ha(tf,2,shift))//белая { res=1; } if (ha(tf,3,shift)<ha(tf,2,shift))//черная { res=0; } } if(filtr_==JC) { if (iClose(NULL,tf,shift)>iOpen(NULL,tf,shift))//белая { res=1; } if (iClose(NULL,tf,shift)<=iOpen(NULL,tf,shift))//черная { res=0; } } return res; } Работает так как и задумывал, кроме участка: if(filtr_==full_color) { if (iClose(NULL,tf,shift)>iOpen(NULL,tf,shift)&&ha(tf,3,shift)>=ha(tf,2,shift))//белая { res=1; } if (iClose(NULL,tf,shift)<=iOpen(NULL,tf,shift)&&ha(tf,3,shift)<ha(tf,2,shift))//черная { res=0; } } Поясню. Функция возвращает 0 - тренд вниз, 1 - вверх на основании японской свечи или Heiken. НО!!!! Когда пытаюсь "скрестить" и японскую свечу И Heiken функция в теле советника работает так как-будто видит только японскую свечу. Прошу ПОМОЩИ, если кто может, подсказать в чем здесь секрет. Корректно ли написана функция? Заранее, СПАСИБО!!! Изменено 20 сентября, 2019 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
Partorius Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 2 часа назад, 0ll сказал: Не знаю, Ваш код у меня работает нормально. Вы изменили название советника? Заработало, тупанул я надо было на минутный график бросить )) Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 8 часов назад, Владимир Стариков сказал: Корректно ли написана функция? код ha покажите.... Изменено 20 сентября, 2019 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Partorius Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 2 часа назад, 0ll сказал: Не знаю, Ваш код у меня работает нормально. Вы изменили название советника? я так понимаю предлагается поставить таймер чтобы он сигналил один раз в таймфрейм, правильно? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Владимир Стариков Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 13 минут назад, usver73 сказал: код ha покажите.... Пожалуйста!) double ha(int HA_tf,int mode,int shift) { double buff=iCustom(NULL,HA_tf,"Heiken Ashi",mode,shift); return buff; } Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 13 минут назад, Владимир Стариков сказал: Пожалуйста!) х.з., может я неправ, но в параметрах индикатора в моем тереме четыре входных параметра, а в Вашем вызове их нет... Возможно, дефолтные настройки в iCustom можно опускать... я не пробовал... Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 1 минуту назад, usver73 сказал: Возможно, дефолтные настройки в iCustom можно опускать... я не пробовал... Я пробовал - без проблем. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 20 сентября, 2019 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 сентября, 2019 ну тогда дебагер- Print ^) Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти