eBaykal Опубликовано 12 мая, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 12 мая, 2020 Урок 1. Начал месяца четыре назад. Прослушал весь урок. Стал выполнять домашнее задание. Не получается. Никак не компилируется. Несколько дней искал ошибку. Пришел к выводу, что программирование это не мое. Забросил. Примерно неделю назад понял, что программистская кавалерия особо не спешит решать мои хотелки с роботами, а мотивировать мне сейчас особо нечем, полез сам снова. Нашел эти долбанные точку с запятой, которые каким то образом оказались там, где вообще не должны были быть. Наконец заработало. Решил еще раз проверить дано мне или не дано в 40 лет снова. Спойлер //+------------------------------------------------------------------+ //| Test.mq4 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern int x = 1; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if (x == 1) { Print ("Всем привет"); Comment ("Tradelikeapro forever"); } else { Print ("Instamustdie"); Comment ("Instamustdie"); } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 12 мая, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 12 мая, 2020 Урок 2. Неделю медитирую на второй урок. Пытаюсь понять, к чему каждая буковка и пробел. Просматриваю урок и сразу за xbms забиваю код. Все, вроде код такой же, а код также не работает. Он компилируется. Встает на график, но через раз, либо совсем виснет терминал, либо ничего не происходит, а потом когда, я уже запарюсь ждать и отвлекусь куда-то он начинает открывать ордера на каждом тике. Спойлер #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern int barcount = 10; extern int HourStart = 11; extern double Lots = 0.1; extern int StopLoss = 300; extern int Takeprofit = 200; extern int Magic = 12345; double minprice=999999, mp, maxprice=-999999, SL, TP; int Ticket; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { getminprice(); getmaxprice(); if(TimeHour(TimeCurrent()) == HourStart) { if(BuyLimitCount() == 0 && BuyCount() == 0) { SL = NormalizeDouble(minprice - StopLoss*Point, 5); TP = NormalizeDouble(minprice + Takeprofit*Point, 5); Ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice, 3, SL, TP, "", Magic, 0, Blue); if (Ticket < 0) Print ("не удалось открыть лимитный ордер на покупку"); } if(SellLimitCount() == 0 && SellCount() == 0) { SL = NormalizeDouble(maxprice + StopLoss*Point, 5); TP = NormalizeDouble(maxprice - Takeprofit*Point, 5); Ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, maxprice, 3, SL, TP, "", Magic, 0, Red); if (Ticket < 0) Print ("не удалось открыть лимитный ордер на продажу"); } } Comment("minprice: " + DoubleToStr(minprice, 5) + "\n"+ "maxprice: " + DoubleToStr(maxprice, 5)); } //+------------------------------------------------------------------+ int BuyLimitCount() { int count = 0; for(int i=OrdersTotal()-1; i<=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUYLIMIT) { count++; } } return(count); } //+------------------------------------------------------------------+ int SellLimitCount() { int count = 0; for(int i=OrdersTotal()-1; i<=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELLLIMIT) { 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 && 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 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) { count++; } } return(count); } //+------------------------------------------------------------------+ void getminprice() { for(int i=0; i<barcount; i++) { mp = iLow(Symbol(), PERIOD_CURRENT, i); if(mp < minprice) minprice = mp; } return; } //+------------------------------------------------------------------+ void getmaxprice() { for(int i=0; i<barcount; i++) { mp = iHigh(Symbol(), PERIOD_CURRENT, i); if(mp > maxprice) maxprice = mp; } return; } xbms не отвечает. Сам я ошибку найти не могу. Если код не начнет работать, то и д/з нет смысла делать, так как оно на этом же коде. Может кто посмотрит, что не так с кодом? Так как уроки сделаны давно, терминал много раз обновлялся, может и код слегка изменился? Ссылка на сообщение Поделиться на другие сайты More sharing options...
pavlus777 Опубликовано 12 мая, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 12 мая, 2020 Я проверить не могу, но в целом мы уроки, которые устарели обновляли. @xbms я предлагал продолжить работу над уроками в начале года, сказал что занят другими делами.... 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
SilverKZ Опубликовано 13 мая, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 13 мая, 2020 Внесите изменения в функции подсчета ордеров, у вас их четыре. В настоящем виде они уходят в бесконечный цикл, поэтому виснет терминал. Необходимо поправить цикл for. Цикл повторяется, пока выражение (i<=0) не станет ложным, если оно ложно, цикл заканчивается. В вашем случае, выражение всегда истинно, т.к. OrdersTotal() = 0. for(int i=OrdersTotal()-1; i<=0; i--) заменить на for(int i=OrdersTotal()-1; i>0; i--) Постараюсь следить за веткой и оказывать посильную помощь. 4 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 13 мая, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 13 мая, 2020 Все заработало. Спасибо! Естественно никакие обновления терминала тут не при чем, проблема в моей невнимательности и непонимании кода, еще. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 14 мая, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 14 мая, 2020 Павел, коллеги, день добрый! Прошу прощения, был очень занят, навалилось всякого... Попробуем продолжить уроки через недельку, осталось вроде не так много разгрести. 3 1 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 14 мая, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 14 мая, 2020 Со вторым домашним заданием получилось быстрее, чем с первым. Значительно. Работает. Спойлер #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern bool LimitTrueStopFalse = false; extern int PipStop = 20; extern int Intend = 20; extern int barcount = 10; extern int HourStart = 11; extern double Lots = 0.1; extern int StopLoss = 300; extern int Takeprofit = 200; extern int Magic = 12345; double minprice=999999, mp, maxprice=-999999, SL, TP; int Ticket; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { getminprice(); getmaxprice(); if(TimeHour(TimeCurrent()) == HourStart && LimitTrueStopFalse == true) { if(BuyLimitCount() == 0 && BuyCount() == 0) { SL = NormalizeDouble(minprice + Intend*Point - StopLoss*Point, 5); TP = NormalizeDouble(minprice + Intend*Point + Takeprofit*Point, 5); Ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice + Intend*Point, 3, SL, TP, "", Magic, 0, Blue); if (Ticket < 0) Print ("не удалось открыть лимитный ордер на покупку"); } if(SellLimitCount() == 0 && SellCount() == 0) { SL = NormalizeDouble(maxprice - Intend*Point + StopLoss*Point, 5); TP = NormalizeDouble(maxprice - Intend*Point - Takeprofit*Point, 5); Ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, maxprice - Intend*Point, 3, SL, TP, "", Magic, 0, Red); if (Ticket < 0) Print ("не удалось открыть лимитный ордер на продажу"); } } if(TimeHour(TimeCurrent()) == HourStart && LimitTrueStopFalse == false) { if(BuyStopCount() == 0 && BuyCount() == 0) { SL = NormalizeDouble(maxprice + PipStop*Point - StopLoss*Point, 5); TP = NormalizeDouble(maxprice + PipStop*Point + Takeprofit*Point, 5); Ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, maxprice + PipStop*Point, 3, SL, TP, "", Magic, 0, Blue); if (Ticket < 0) Print ("не удалось открыть лимитный ордер на покупку"); } if(SellStopCount() == 0 && SellCount() == 0) { SL = NormalizeDouble(minprice - PipStop*Point + StopLoss*Point, 5); TP = NormalizeDouble(minprice - PipStop*Point - Takeprofit*Point, 5); Ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, minprice - PipStop*Point, 3, SL, TP, "", Magic, 0, Red); if (Ticket < 0) Print ("не удалось открыть лимитный ордер на продажу"); } } Comment("minprice: " + DoubleToStr(minprice, 5) + "\n"+ "maxprice: " + DoubleToStr(maxprice, 5)); } //+------------------------------------------------------------------+ int BuyLimitCount() { int count = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUYLIMIT) { count++; } } return(count); } //+------------------------------------------------------------------+ int SellLimitCount() { int count = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELLLIMIT) { count++; } } return(count); } //+------------------------------------------------------------------+ int BuyStopCount() { int count = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP) { count++; } } return(count); } //+------------------------------------------------------------------+ int SellStopCount() { int count = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP) { 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 && 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 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) { count++; } } return(count); } //+------------------------------------------------------------------+ void getminprice() { for(int i=0; i<barcount; i++) { mp = iLow(Symbol(), PERIOD_CURRENT, i); if(mp < minprice) minprice = mp; } return; } //+------------------------------------------------------------------+ void getmaxprice() { for(int i=0; i<barcount; i++) { mp = iHigh(Symbol(), PERIOD_CURRENT, i); if(mp > maxprice) maxprice = mp; } return; } 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 15 мая, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 15 мая, 2020 (изменено) Урок 3. AAa - aa. mq4 файл индикатора TMA_fair не компилируется, выдает ошибки. При этом скачанный ex.4 файл работает нормально. Переменная char в конце кода, видимо была зарезервирована в последних версиях терминала. Изменил название переменной, все заработало, вроде. TMA_Fair_.mq4 Изменено 15 мая, 2020 пользователем eBaykal 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 21 мая, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 21 мая, 2020 Домашнее задание к третьему уроку. Спойлер //+------------------------------------------------------------------+ //| Test4.mq4 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //------------------------------------------------------------------ extern double Lots = 0.1; extern int TakeProfit = 300; extern int StopLoss = 50; extern int TakeProfitStop = 5; extern int StopLossStop = 20; extern int Magic = 111; extern int MagicStop = 112; extern int Slippage = 3; extern bool BorderCloseTrueMediomCloseFalse = True; extern bool AddStopOrdersFalse = True; extern int StopOrdersShift = 20; //------------------------------------------------------------------ extern string TMA = "Параметры индикатора TMA"; extern string TimeFrame = "current time frame"; extern int HalfLength = 56; extern int Price = PRICE_CLOSE; extern double ATRMultiplier = 2.0; extern int ATRPeriod = 100; extern bool Interpolate = true; //------------------------------------------------------------------ double PriceHigh, PriceLow, PriceMedium, SL, TP, BuyStopPrice, SellStopPrice; int Ticket, Ticket2, Ticket3; int OnInit() { if (Digits == 3 || Digits == 5) { TakeProfit *= 10; StopLoss *= 10; Slippage *= 10; TakeProfitStop *= 10; StopLossStop *= 10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0); PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0); PriceMedium = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 0, 0); Comment("PriceMedium: " + DoubleToStr(PriceMedium, 5)); if(CountSell() == 0 && Bid >= PriceHigh) { Ticket = OrderSend(OrderSymbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red); if (Ticket > 0) { SL = NormalizeDouble(Bid + StopLoss*Point, Digits); TP = NormalizeDouble(Bid - TakeProfit*Point, Digits); if (OrderSelect(Ticket, SELECT_BY_TICKET)) if(!OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0)) Print("Ошибка модификации ордера на продажу"); } else Print("Ошибка открытия ордера на продажу"); } if(CountBuy() == 0 && Ask <= PriceLow) { Ticket = OrderSend(OrderSymbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue); if (Ticket > 0) { TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); SL = NormalizeDouble(Ask - StopLoss*Point, Digits); if (OrderSelect(Ticket, SELECT_BY_TICKET)) if(!OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0)) Print("Ошибка модификации ордера на покупку"); } else Print("Ошибка открытия ордера на покупку"); } if (Ask <= PriceLow && CountSell() > 0 && BorderCloseTrueMediomCloseFalse == True) { for (int i = OrdersTotal() - 1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == Magic && OrderType() == OP_SELL) if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black)) Print("Ошибка закрытия ордера"); } } } if (Ask <= PriceMedium && CountSell() > 0 && BorderCloseTrueMediomCloseFalse == False) { for (int i = OrdersTotal() - 1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == Magic && OrderType() == OP_SELL) if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black)) Print("Ошибка закрытия ордера"); } } } if (Bid >= PriceHigh && CountBuy() > 0 && BorderCloseTrueMediomCloseFalse == True) { for (int i = OrdersTotal() - 1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == Magic && OrderType() == OP_BUY) if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black)) Print("Ошибка закрытия ордера на покупку"); } } } if (Bid >= PriceMedium && CountBuy() > 0 && BorderCloseTrueMediomCloseFalse == False) { for (int i = OrdersTotal() - 1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == Magic && OrderType() == OP_BUY) if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black)) Print("Ошибка закрытия ордера на покупку"); } } } if(CountSell() > 0 && BuyStopCount() == 0 && exBuyStopCount() == 0 && AddStopOrdersFalse == False && OrderSelect(Ticket, SELECT_BY_TICKET) == true) { BuyStopPrice = NormalizeDouble(OrderOpenPrice() + StopOrdersShift*Point, Digits); SL = NormalizeDouble(BuyStopPrice - StopLossStop*Point, Digits); TP = NormalizeDouble(BuyStopPrice + TakeProfitStop*Point, Digits); Ticket2 = OrderSend(OrderSymbol(), OP_BUYSTOP, Lots, BuyStopPrice, Slippage, SL, TP, "TMA robot stoporder", MagicStop, 0, Blue); //if(Ticket2 > 0) //{ // if (OrderSelect(Ticket2, SELECT_BY_TICKET)) //if(!OrderModify(Ticket2, OrderOpenPrice(), SL, TP, 0)) // Print("Ошибка модификации стопордера на продажу"); //}else Print("Ошибка открытия стопордера на продажу"); } if(CountBuy() > 0 && SellStopCount() == 0 && exSellStopCount() ==0 && AddStopOrdersFalse == False && OrderSelect(Ticket, SELECT_BY_TICKET) == true) { SellStopPrice = NormalizeDouble(OrderOpenPrice() - StopOrdersShift*Point, Digits); SL = NormalizeDouble(SellStopPrice + StopLossStop*Point, Digits); TP = NormalizeDouble(SellStopPrice - TakeProfitStop*Point, Digits); Ticket3 = OrderSend(OrderSymbol(), OP_SELLSTOP, Lots, SellStopPrice, Slippage, SL, TP, "TMA robot stoporder", MagicStop, 0, Red); //if(Ticket3 > 0) //{ // if (OrderSelect(Ticket3, SELECT_BY_TICKET)) //if(!OrderModify(Ticket3, OrderOpenPrice(), SL, TP, 0)) // Print("Ошибка модификации стопордера на продажу"); //}else Print("Ошибка открытия стопордера на продажу"); } } //+------------------------------------------------------------------+ int CountSell() { int count = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) count++; } } return(count); } //+------------------------------------------------------------------+ int CountBuy() { int count = 0; for (int trade = OrdersTotal()-1; trade >= 0; trade--) { if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) count++; } } return(count); } //+------------------------------------------------------------------+ int BuyStopCount() { int scount = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == MagicStop && OrderType() == OP_BUYSTOP) { scount++; } } return(scount); } //+------------------------------------------------------------------+ int SellStopCount() { int scount = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == MagicStop && OrderType() == OP_SELLSTOP) { scount++; } } return(scount); } //+------------------------------------------------------------------+ int exSellStopCount() { int exscount = 0; for (int trade = OrdersTotal()-1; trade>=0; trade--) { if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicStop && OrderType() == OP_SELL) exscount++; } } return(exscount); } //+------------------------------------------------------------------+ int exBuyStopCount() { int exscount = 0; for (int trade = OrdersTotal()-1; trade >= 0; trade--) { if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicStop && OrderType() == OP_BUY) exscount++; } } return(exscount); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 22 мая, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 22 мая, 2020 Пара вопросов по третьему уроку: 1) Кусок кода: Спойлер if (OrderSelect(Ticket, SELECT_BY_TICKET)) if(!OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0)) Print("Ошибка модификации ордера на продажу"); почему то нет фигурных скобок, хотя везде,, где я еще видел в таких случаях, вложенные условия, они есть. Компилируется и с ними. 2) Отличный тест, дайте денег на памм по ценам открытия. Когда запустил тест на котировках TDS2 сначала стал строчить покупки. По графику в визуальном режиме посмотрел, что верхние и нижние границы канала, он начинает считать не сразу, а через какое-то количество баров, в отличие от средней линии. Тогда как при тесте по контрольным точкам, границы канала показываются сразу. Как исправить? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 22 мая, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 22 мая, 2020 @eBaykal если нет фигурных скобок, то выполняется 1 оператор или функция - и ошибок нет. Скобки позволяют сгруппировать несколько операторов. Если тиковые котировки условно с 1.01.ХХ и тест начинаете с 1.01.ХХ, то из-за отсутствия истории "ДО" индикаторы могут некорректно работать. Советую сдвигать начало теста на месяц или подгружать лишний месяц до даты старта теста. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 2 июня, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 2 июня, 2020 Урок 4. Почему-то опять не получается сделать также идеально как в уроке. Ошибки и предупреждения, которые удалялись в конце урока удалил. Остались свои предупреждения. Спойлер //+------------------------------------------------------------------+ //| Martin.mq4 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern double Lots = 0.1; extern int TakeProfit = 50; extern int Step = 50; extern double Multiplier = 2; extern int Magic = 123; int ticket, tp, price, lastlot; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; Step *= 10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { double ima = iMA(Symbol(), PERIOD_H1, 14, 0,MODE_SMA, PRICE_CLOSE, 1); if(CountTrades() == 0) { if(Ask < ima) { tp = NormalizeDouble(Ask + TakeProfit*Point, Digits); ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, 0, tp, "1 ордер", Magic, 0, Blue); } else { tp = NormalizeDouble(Bid - TakeProfit*Point, Digits); ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, 0, tp, "1 ордер", Magic, 0, Red); } } else { int order_type = FindLastOrderType(); if(OrderType() == OP_BUY) { price = FindLastOrderPrice(OP_BUY); if (Ask <= price - Step*Point) { lastlot = FindLastLots(OP_BUY); lastlot = NormalizeDouble(lastlot*Multiplier, 2); ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0, 0, "", Magic, 0, Blue); if(ticket<1) Print("Ошибка открытия ордера на покупку"); ModifyOrders(OP_BUY); } } if(OrderType() == OP_SELL) { price = FindLastOrderPrice(OP_SELL); if (Bid >= price + Step*Point) { lastlot = FindLastLots(OP_SELL); lastlot = NormalizeDouble(lastlot*Multiplier, 2); ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0, 0, "", Magic, 0, Red); if(ticket<1) Print("Ошибка открытия ордера на продажу"); ModifyOrders(OP_SELL); } } } } //+------------------------------------------------------------------+ void ModifyOrders(int otype) { double avg_price, order_lots = 0; price = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); } } } avg_price = NormalizeDouble(price / order_lots, Digits); if (otype == OP_BUY) tp = NormalizeDouble(avg_price + TakeProfit*Point, Digits); if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits); for(int i = OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0)) Print("Ордера успешно модифицированы!"); else Print("Ошибка модификации ордеров!"); } } } } //+------------------------------------------------------------------+ double FindLastLots(int otype) { int oldticket; double oldlots=0; ticket = 0; for (int cnt=OrdersTotal()-1; cnt>=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if (oldticket > ticket) { ticket = oldticket; oldlots = OrderLots(); } } } } return(oldlots); } //+------------------------------------------------------------------+ 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() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if (oldticket > ticket) { ticket = oldticket; oldopenprice = OrderOpenPrice(); } } } } 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); } //+------------------------------------------------------------------+ int CountTrades() { int count=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if(OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } return(count); } Почему то не нравится знак =. Пишет: result of expression not used Martin.mq4 50 15 Это одно предупреждение и еще 10 possible loss of data due to type conversion Martin.mq4 55 15 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 2 июня, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 2 июня, 2020 @eBaykal знак "=" ему нравится, он предупреждает, что (перевод с МТ-шного): "Что-то посчитал, но не используешь - непорядок!". У меня это предупреждение не возникло... possible loss of data due to type conversion = "возможная потеря точности при конвертации", это если пытаться в int запихнуть double: вместо int ticket, tp, price, lastlot; пиши int ticket; double tp, price, lastlot; 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
eBaykal Опубликовано 4 июня, 2020 Автор Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 4 июня, 2020 Домашнее задание к 4 уроку: Спойлер //+------------------------------------------------------------------+ //| Martin.mq4 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern double Lots = 0.1; extern int TakeProfit = 50; extern int Step = 50; extern double Multiplier = 2; extern int Magic = 123; extern int MaxOrders = 10; extern int MaxLoss = 200; int ticket; double tp, sl, price, lastlot; bool DoFlush; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; Step *= 10; MaxLoss *= 10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { double ima = iMA(Symbol(), PERIOD_H1, 14, 0,MODE_SMA, PRICE_CLOSE, 1); if(CountTrades() == 0) { if(Ask < ima) { tp = NormalizeDouble(Ask + TakeProfit*Point, Digits); ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, 0, tp, "1 ордер", Magic, 0, Blue); } else { tp = NormalizeDouble(Bid - TakeProfit*Point, Digits); ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, 0, tp, "1 ордер", Magic, 0, Red); } } else { int order_type = FindLastOrderType(); if(CountTrades() < MaxOrders && OrderType() == OP_BUY) { price = FindLastOrderPrice(OP_BUY); if (Ask <= price - Step*Point) { lastlot = FindLastLots(OP_BUY); lastlot = NormalizeDouble(lastlot*Multiplier, 2); ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0, 0, "", Magic, 0, Blue); if(ticket<1) Print("Ошибка открытия ордера на покупку"); ModifyOrders(OP_BUY); } } if(CountTrades() < MaxOrders && OrderType() == OP_SELL) { price = FindLastOrderPrice(OP_SELL); if (Bid >= price + Step*Point) { lastlot = FindLastLots(OP_SELL); lastlot = NormalizeDouble(lastlot*Multiplier, 2); ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0, 0, "", Magic, 0, Red); if(ticket<1) Print("Ошибка открытия ордера на продажу"); ModifyOrders(OP_SELL); } } for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) switch(OrderType()) { case OP_BUY: if(OrderType() == OP_BUY && Ask <= Findsl(OP_BUY)) DoFlush = CloseAll(); break; case OP_SELL: if(OrderType() == OP_SELL && Bid >= Findsl(OP_SELL)) DoFlush = CloseAll(); } } } } //+------------------------------------------------------------------+ void ModifyOrders(int otype) { double avg_price, order_lots = 0; price = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); } } } avg_price = NormalizeDouble(price / order_lots, Digits); if (otype == OP_BUY) tp = NormalizeDouble(avg_price + TakeProfit*Point, Digits); if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits); for(int i = OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0)) Print("Ордера успешно модифицированы!"); else Print("Ошибка модификации ордеров!"); } } } } //+------------------------------------------------------------------+ double Findsl(int otype) { double avg_price, order_lots = 0; price = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); } } } avg_price = NormalizeDouble(price / order_lots, Digits); if (otype == OP_BUY) sl = NormalizeDouble(avg_price - MaxLoss*Point, Digits); if (otype == OP_SELL) sl = NormalizeDouble(avg_price + MaxLoss*Point, Digits); return(sl); } //+------------------------------------------------------------------+ double FindLastLots(int otype) { int oldticket; double oldlots=0; ticket = 0; for (int cnt=OrdersTotal()-1; cnt>=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if (oldticket > ticket) { ticket = oldticket; oldlots = OrderLots(); } } } } return(oldlots); } //+------------------------------------------------------------------+ 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() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if (oldticket > ticket) { ticket = oldticket; oldopenprice = OrderOpenPrice(); } } } } 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); } //+------------------------------------------------------------------+ int CountTrades() { int count=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if(OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } return(count); } //+------------------------------------------------------------------+ bool CloseAll() { bool rval = false; int i; for (i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)); { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) switch(OrderType()) { case OP_BUY: if(OrderClose(OrderTicket(),OrderLots(),Bid,5,Navy)) rval = true; break; case OP_SELL: if(OrderClose(OrderTicket(),OrderLots(),Ask,5,Maroon)) rval = true; break; } } } return(rval); } Подсмотрел код в другом роботе. Стырил пару кусочков. Работает. Но предупреждение: empty controlled statement found Martin.mq4 257 48 не знаю, как убрать). Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 4 июня, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 4 июня, 2020 5 часов назад, eBaykal сказал: не знаю, как убрать). @eBaykal в конце строки ";" убери. МТ ругается, что после проверки условия стоит ";" - пустой оператор, типа: "зачем сыр-бор, если ничего делать не нужно?" 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Stranger80 Опубликовано 20 июля, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 20 июля, 2020 В 14.05.2020 в 08:53, xbms сказал: Павел, коллеги, день добрый! Прошу прощения, был очень занят, навалилось всякого... Попробуем продолжить уроки через недельку, осталось вроде не так много разгрести. Павел, благодарю за "Курс молодого бойца. Сам я не молодой, но программист очень начинающий. Написал советник на средней скользящей, но не види индикатор. Открывает покупку независимо от положения цены. И не могу понять в чём дело. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 июля, 2020 Поделиться Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано 20 июля, 2020 1 час назад, Stranger80 сказал: И не могу понять в чём дело. Мы тоже не сможем понять... если код не увидим. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти