Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1863

 
Бахром Балтабаев #:
Здравствуйте уважаемые. Подскажите где я могу найти скрипт или индикатор который отправляет уведомление на телефон,при достижении цены определенного уровня ,указаного мной. чтоб всё время не следить за терминалом.Спасибо

Недавно написал алерт: . Но его можно доработать добавив SendNotification:

// использовать алерт
input bool alert = true;
// использовать push-уведомления
input bool notification = true;
// уровень срабатывания
input double trigLv = 0.0;
// отклонение от trigLv в пунктах
input int deviation = 30; 


// функция взята из https://www.mql5.com/ru/docs/basis/types/double
bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
  return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]
) {
  static bool triggered = false;
  static datetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (EqualDoubles(trigLv, close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { // сравнение цены Close с trigLv
    if (time_ != time[rates_total - 1])
      time_ = time[rates_total - 1];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level ", NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " triggered!");
      if (notification)
        SendNotification("Level " + (string)NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " triggered!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

В исходник следует добавить строки которые я выделил, бросить в папку Indicators и скомпилировать. Данный индикатор можно добавить в чарт сколько угодно раз и получать сигналы при пересечении разных уровней. Код дорабатывал онлайн. Результат не проверял.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

GlaVredFX, 2022.01.17 18:59

Подскажите в чем проблема, Код должен закрывать ордера и если их нет то открывать новый.

Но почему то, он закрывает только 1 ордер и останавливается до следующего сигнала.  

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 < clos 1.1304 ExistPosSell 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 > clos 1.1304 ExistPosBuy 1
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: Signal 1.1325 < clos 1.1306 ExistPosSell 0
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: Signal 1.1325 > clos 1.1306 ExistPosBuy 1
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Signal 1.1326 < clos 1.1296 ExistPosSell 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Signal 1.1326 > clos 1.1296 ExistPosBuy 1
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 < clos 1.1283 ExistPosSell 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: close #1 buy 0.01 EURUSD at 1.13598 at price 1.12831

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 > clos 1.1283 ExistPosBuy 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: open #4 buy 0.01 EURUSD at 1.13512 ok
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 < clos 1.135 ExistPosSell 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 > clos 1.135 ExistPosBuy 1

if(isNewBar()==true) {  
if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
     if(ExistPositions( NULL, OP_BUY, Magic) == true) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
         if(ExistPositions( NULL, OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию SELL

if(Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_SELL, Magic) == true) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //---------------------закрытие одной позиции с максимальным профитом в валюте депозита.
        if(ExistPositions( NULL, OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition(NULL,OP_BUY, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию BUY

} return; 
Если вы уделите немного больше внимания вашему вопросу и вашему коду, то сами поймёте в чём проблема.
 
Mihail Matkovskij #:

Если вы уделите немного больше внимания вашему вопросу и вашему коду, то сами всё поймёте.

Там вопрос - что должен закрываться на 1 баре 1 самый прибыльный ордер, дальше ждем новый бар и опять закрываем 1 прибыльный ордер. А не сразу все.

А плучается на одном первом баре закрывается, а уже на следующем баре не чего не происходит.

 
GlaVredFX #:

Там вопрос - что должен закрываться на 1 баре 1 самый прибыльный ордер, дальше ждем новый бар и опять закрываем 1 прибыльный ордер. А не сразу все.

Тогда нужно правильно формулировать вопросы. У вас появляется всего 1 сигнал. И то на открытии нового бара. А если будет только 1 сигнал, то сколько ордеров закроется?... И то только если сигнал появится на новом баре. А если не появится, то ордера закроются на следующих барах. И опять же при наличии сигнала.

 
Mihail Matkovskij #:

Тогда нужно правильно формулировать вопросы. У вас появляется всего 1 сигнал. И то на открытии нового бара. А если будет только 1 сигнал, то сколько ордеров закроется?... И то только если сигнал появится на новом баре. А если не появится, то ордера закроются на следующих барах. И опять же при наличии сигнала.

В подобных случаях обычно помогает блоксхема. Или нужно подробно расписать алгоритм по пунктам на листке бумаги либо в текстовом файле. И только тогда вы поймете как нужно писать ваш код.

 

Нужна функция закрытия 1 ордера, открытого самым первым из всех имеющихся.  Кто может поделится. 

 
GlaVredFX #:

Так если заметили, то в коде алгоритм прописан

1) Появление нового бара

2)  Если  МА выше цены закрытия предыдущего бара то переходим к п.3  если MA ниже цены закрытия то переходим к п.4.

3)  Если есть позиция BUY то закрываем одну позицию с максимальным профитом в валюте депозита.

3.1)Если нет открытых ордеров  BUY открываем позицию SELL.

4) Если есть позиция SELL то закрываем одну позицию с максимальным профитом в валюте депозита.

4.1)Если нет открытых ордеров  SELL открываем позицию BUY .


И теперь опять вопрос, что не правильно прописано в этом коде из Выше неписаного алгоритма:

 

 В коде прописан набор команд. Терминал не знает что вам нужно, он знает только то что написано в коде!

...

if(isNewBar()) {  
  if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
    if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
      sellSignal = true;
  } 

 // и аналогично для п.4.

} 
return; 

...

void OnTimer() {
  if (sellSignal) {
    ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com); //------------ открываем позицию SELL
    sellSignal = false;
  }
  // и аналогично для buy
}
Переменные buySignal и sellSignal пропишите на глобальном уровне.
 
Mihail Matkovskij #:

 В коде прописан набор команд. Терминал не знает что вам нужно, он знает только то что написано в коде!

Я это сообщение удалил, так как проблема нашлась, в том что надо закрывать ордера не по профиту а по времени. 

Так как профит есть не всегда и не там где надо. 

Потому нужна функция  "Закрытие одной позиции, открытой самой первой из всех имеющихся" 

 
GlaVredFX #:

Я это сообщение удалил, так как проблема нашлась, в том что надо закрывать ордера не по профиту а по времени. 

Так как профит есть не всегда и не там где надо. 

Потому нужна функция  "Закрытие одной позиции, открытой самой первой из всех имеющихся" 

Добавил пример с открытием позиций в таймере в предыдущем посте. Чтобы позиция гарантированно открывалась. Можете подставить туда свою функцию.

 
Mihail Matkovskij #:

Добавил пример с открытием позиций в таймере в предыдущем посте. Чтобы позиция гарантированно открывалась. Можете подставить туда свою функцию.

Хотя не так. Нужно отслеживать результат работы 

ClosePosWithMaxProfitInCurrency

или новой вашей функции в OnTradeTransaction. И если нет позиций, то входить. Или записывать сигнал в  buySignal или sellSignal и обрабатывать в OnTimer как я показал в примере.

Причина обращения: