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

 
STARIJ:
Ниже вот это:

Событие щелчка мыши на графическом объекте

CHARTEVENT_OBJECT_CLICK

X координата

Y координата

Имя графического объекта, на котором произошло событи


Ух, вроде все дошло)
Благодарю за помощь!

 

не знаю как результат "r" привязать к буферу что бы вывести на график, подскажите пожалуйста.

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

пишут - "Значение "р" пишите в буфер, и оно отобразится на графике." и "Обычно в буфер записывают через цикл for. "

но это мне не о чем не говорит!

один результат просто буква "r" и всё, как это сделать не где не могу найти.


И еще одно

как сгладить к примеру результат "r"

Спасибо за внимание!
 

В чём ошибка? При прогоне в тестере, функция удаляет отложенный ордер, а иной раз нет. Почему? Принцип действия такой: при закрытии ордера Buy по ТП удаляется BuyLimit. Подскажите

////+------------------DELETE BUYLIM-----------------------------------+
   if((SchBuyLimLots(Symbol())-SchBuyLots(Symbol()))!=0)                  //  лот байлимит НЕ лот бая
     {     
      for(int i=0;i<OrdersTotal();i++)
        {
         datetime T_op=0,T_lim=0,buys=0;
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) break;
         if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=SMB_) continue;
         if(OrderType()==OP_BUY)
         if(OrderCloseTime()>buys) buys+=OrderCloseTime();
         buys= OrderCloseTime();
         T_op=buys;                                                       //  время закрытия бая
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=SMB_) continue;
           {
            if(OrderType()==OP_BUYLIMIT)
              {
               T_lim=OrderOpenTime();                                     //  время закрытия селл
               ticket=OrderTicket();
               if(T_lim<=T_op)                                            //  разность
               res=OrderDelete( ticket,clrMagenta);
               if(res<1)
               {
                  Print(GetLastError());
               }
              }
           }
        }
     }
 
ZZuretc:

В чём ошибка? При прогоне в тестере, функция удаляет отложенный ордер, а иной раз нет. Почему? Принцип действия такой: при закрытии ордера Buy по ТП удаляется BuyLimit. Подскажите


OrdersTotal() != OrdersHistoryTotal()

 
Alexey Viktorov:Сам я не смотрел что это за чудо.

Спасибо.

 
Подскажите пожалуйста, как найти максимальное и минимальные значения текущего АТР?
Файлы:
q6a0hh.PNG  12 kb
 

Всем привет.

Составил простенький эксперт на основе Стохстика (на верхнем пике продаёт, на нижнем покупает), а компилятор выдаёт ошибку на ровном месте.

Может кто-нибудь подскажет в чём причина и что значит такая ошибка? Я сначала думал, что скобку где-то забыл поставить.

Но нет, несколько раз проверил - вроде со скобками всё в порядке. Буду весьма признателен за помощь.

Вот ошибки, которые выдаёт компилятор: ')' - not all control paths return a value Stohastic-Сигналы-33.mq4 177 3

                                                                   ')' - not all control paths return a value Stohastic-Сигналы-33.mq4 210 3

Вот сам эксперт и файл mq4 тоже прикрепил: 

И ещё подскажите как красиво советника сюда вставлять(чтобы как в редакторе с цветными буковками)

//+------------------------------------------------------------------+

//|                                          Stohastic-Сигналы-33.mq4 |

//|                        Copyright 2017, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2017, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

//+------------------------------------------------------------------+

bool New_Bar=false;   // Флаг нового бара

extern double H_line=80; // Верхняя(перекупленности) линия Стохастика

extern double L_line=20; // Нижняя(перепроданности) линия Стохастика

extern int Slippage=2;   // Проскальзывание

extern int SL;            // SL устанавливаемого ордера 

extern int TP;           // TP устанавливаемого ордера

extern double Lts;      //  Размер лота устанавливаемого ордера

bool B_Flag=false,  // Флаг сигнала на ПОКУПКУ

     S_Flag=false,  // Флаг сигнала на ПРОДАЖУ

     ORD_Buy=false,   //  Флаг открытой позиции Buy

     ORD_Sell=false;  //  Флаг открытой позиции Sell

bool Work=true;       // Флаг, позволяющий эксперту работать. true-нет критической ошибки, false-есть.

string Symb;                       // Название финанс. инструмента

int Crit_Error=11111111;   // Номер критической оибки

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

   int

    Total,                           // Количество ордеров в окне 

    Tip=-1,                          // Тип выбран. ордера (B=0,S=1)

    Ticket;                          // Номер ордера

   double 

    M_1, M_2, M_3,               // Значение MAIN на 1, 2 и 3 барах

    Lot;                             // Колич. лотов в выбран.ордере

   bool Ans_Close;                 // Флаг успешного закрытия ордера(1-закрыт, 0-не закрыт) 

   bool Ans_Open;                 // Флаг успешного открытия ордера(1-открыт, 0-не открыт)        

//--------------------------------------------------------------- 1 --

// Проверка критической ошибки   

   if(Work==false)                              // Критическая ошибка

     {

      Alert("Критическая ошибка. Эксперт не работает.");

      return;                                   // Выход из start()

     }

//--------------------------------------------------------------- 2 -- 

// Новый бар     

      Fun_New_Bar();                               // Обращение к ф-ии

   if (New_Bar==false)                          // Если бар не новый..

   return;                                   // ..то уходим

//------------------------------------------------------------- 3 --

// Учёт ордеров  

   Symb=Symbol();                               // Название фин.инстр.

   Total=0;                                     // Количество ордеров

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

        {                                       // Анализ ордеров:

         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм

         Ticket=OrderTicket();                  // Номер выбранн. орд.

         Tip   =OrderType();                    // Тип выбранного орд.

         Lot   =OrderLots();                    // Количество лотов

        }

      else

        {

        Alert("OrderSelect() вернул ошибку - ",GetLastError()); // Если не получилось выбрать ордер, то ...

        return;                                // Выход из start

        }  

     }   

//------------------------------------------------------------- 4 --

// Торговые критерии    Анализ ситуации

   M_1=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,1);// 1 бар

   M_2=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,2);// 2 бар

   M_3=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,3);// 3 бар

//------------------------------------------------------------- 5 -- 

   if(M_2>=H_line)  // Если Stohastic пересёк линию перекупленности

    {

     if(M_3 <= M_2 && M_2 > M_1) // Появился верхний пик на Stohastic ...

      {

        if(S_Flag==true) // Если позиция Sell открыта, то...

          return; // Выход из start()

  // Если позиция Sell не открыта, то ...                

      S_Flag=true; // Ставим флаг, что появился сигнал на ПРОДАЖУ

      B_Flag=false; // Ставим флаг, что сигнала на ПОКУПКУ не было

      if(ORD_Buy==true)  // Если имеется откр. ордер Buy,...

         {

           if(Tip!=0)    // Проверка: ТИП ордера не соответствует ФЛАГУ открытого ордера...

            {

             Work=false;   // Советник не будет работать

             Alert("ТИП ордера не соответствует ФЛАГУ открытого ордера.Выход из start.");  // При несовпадении советник заканчивает работу

             return;  //  Выход из start

            }

           Ans_Close=Close_Order(Ticket,Lot,Slippage,Tip);   //  Закрываем открытый ордер Buy

           if(Ans_Close==false)       //  Если не удалось закрыть, то...

              {

                Alert("Не удалось закрыть ордер. Советник прекращает работу.\n Номер критической ошибки ", Crit_Error);                         

                return;   // Выходим из start

              } 

         }

      Ans_Open=Open_Order(Symb,Lts,SL,TP,1); // ОТКРЫВАЕМ КОРОТКУЮ ПОЗИЦИЮ

      if(Ans_Open==false)       //  Если не удалось открыть Sell, то...

          {

           Alert("Не удалось открыть ордер. Советник прекращает работу.\n Номер критической ошибки ", Crit_Error);                         

           return;   // Выходим из start

          }        // Если удалось открыть Sell, то...

      ORD_Sell=true;          // Ставим флаг, что открыта КОРОТКАЯ позиция     

      ORD_Buy=false;          // Ставим флаг, что ДЛИННОЙ позици нет             

     }

     return;    // Выход из start

    }

//------------------------------------------------------------------------ 6 --   

   if(M_2<=L_line)        // Если Stohastic пересёк линию перепроданности

    {

      if(M_3 >= M_2 && M_2 < M_1) // Появился нижний пик(СИГНАЛ НА ПОКУПКУ)

         {     

           if(B_Flag==true) // Если позиция Buy открыта, то...

             return; // Выход из start()

 // Если позиция Buy не открыта, то ...                

           B_Flag=true; // Ставим флаг, что появился сигнал на ПОКУПКУ

           S_Flag=false; // Ставим флаг, что сигнала на ПРОДАЖУ нет

           if(ORD_Sell==true)  // Если имеется откр. ордер Sell,...

             {

               if(Tip!=1)    // Проверка: ТИП ордера не соответствует ФЛАГУ открытого ордера...

                 {

                   Work=false;   // Советник не будет работать

                   Alert("ТИП ордера не соответствует ФЛАГУ открытого ордера.Выход из start.");  // При несовпадении советник заканчивает работу

                   return;  //  Выход из start

                 }

               Ans_Close=Close_Order(Ticket,Lot,Slippage,Tip);   //  Закрываем открытый ордер Sell

               if(Ans_Close==false)       //  Если не удалось закрыть, то...

                  {

                     Alert("Не удалось закрыть ордер. Советник прекращает работу.\n Номер критической ошибки ", Crit_Error);                         

                     return;   // Выходим из start

                  } 

             }

           Ans_Open=Open_Order(Symb,Lts,SL,TP,0); // ОТКРЫВАЕМ ДЛИННУЮ ПОЗИЦИЮ

           if(Ans_Open==false)       //  Если не удалось открыть Buy, то...

              {

                 Alert("Не удалось открыть ордер. Советник прекращает работу.\n Номер критической ошибки ", Crit_Error);                         

                 return;   // Выходим из start

              }       // Если удалось открыть Buy, то...  

           ORD_Sell=false;         // Ставим флаг, что КОРОТКОЙ позици нет

           ORD_Buy=true;           // Ставим флаг, что открыта ДЛИННАЯ позиция                 

         }

       return;    // Выход из start

    }

  }

//+------------------------------------------------------------------ 7 --

void Fun_New_Bar()                              // Ф-ия обнаружения ..

  {                                             // .. нового бара

   static datetime New_Time=0;                  // Время текущего бара

   New_Bar=false;                               // Нового бара нет

   if(New_Time!=Time[0])                        // Сравниваем время

     {

      New_Time=Time[0];                         // Теперь время такое

      New_Bar=true;                             // Поймался новый бар

     }

  }

//--------------------------------------------------------------- 8 --

  bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip)    // Ф-ия закрытия ордера

  {

   double Close_Price=0;                       // Цена закрытия ордера 

   while(true)

     {

         RefreshRates();                        // Обновление данных

         if(F_Tip==0)                          //  Если ордер Buy, ...            

             Close_Price=Bid;               //  Цена закрытия Bid

          Close_Price=Ask;                      //  А если ордер Sell, то цена закрытия Ask

         bool Ans_Close=OrderClose(F_Ticket,F_Lot,Close_Price,F_Slippage);      // Закрытие Buy или Sell

         if (Ans_Close==true)                         // Получилось :)

            return(true);                         // Выход из функции закр

         Crit_Error=GetLastError();              // Фиксируем номер ошибки              

         if (Fun_Error(Crit_Error)==1)      // Обработка ошибок

            continue;                           // Повторная попытка

         return(false);                                // Выход из функции

     }

  }   

 //--------------------------------------------------------------- 9 --

   // Открытие ордеров

bool Open_Order(string F_Symb,double F_Lts,int F_SL,int F_TP,int F_Tip)

  {   

   double Open_Price;                 // Цена открытия

   string Tip_Deal;                   // Направление сделки(Buy или Sell)

   double f_sl;                       // Стоп-лосс ордера

   double f_tp;                       // Тейк-профит

   int Ticket;                        // Тикет открытого ордера 

   while(true)                                  // Цикл закрытия орд.

     {

         RefreshRates();                        // Обновление данных

         if(F_Tip==1)                 // Если нужно открыть SELL, то...      

           {

             Open_Price=Bid;

             Tip_Deal="OP_SELL";

             f_sl=NormalizeDouble(Bid+F_SL*Point,Digits);

             f_tp=NormalizeDouble(Bid-F_TP*Point,Digits);

           }                         

   //--------------------------------  Если нужно открыть BUY, то...

         Open_Price=Ask;                   

         Tip_Deal="OP_BUY";

         f_sl=NormalizeDouble(Bid+F_SL*Point,Digits);

         f_tp=NormalizeDouble(Bid-F_TP*Point,Digits);    

         Ticket=OrderSend(F_Symb,Tip_Deal,F_Lts,Open_Price,2,f_sl,f_tp);//Открытие ОРДЕРА

         if (Ticket > 0)                        // Получилось :)

            return(true);                             // Выход из функции

         Crit_Error=GetLastError();              // Фиксируем номер ошибки              

         if (Fun_Error(Crit_Error)==1)      // Обработка ошибок

            continue;                           // Повторная попытка

         return(false);                                // Выход из функции

     }  

  }  

//--------------------------------------------------------------- 10 --

int Fun_Error(int Error)                        // Ф-ия обработ ошибок

  {

   switch(Error)

     {                                          // Преодолимые ошибки            

      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");

         Sleep(3000);                           // Простое решение

         return(1);                             // Выход из функции

      case 135:Alert("Цена изменилась. Пробуем ещё раз..");

         RefreshRates();                        // Обновим данные

         return(1);                             // Выход из функции

      case 136:Alert("Нет цен. Ждём новый тик..");

         while(RefreshRates()==false)           // До нового тика

            Sleep(1);                           // Задержка в цикле

         return(1);                             // Выход из функции

      case 137:Alert("Брокер занят. Пробуем ещё раз..");

         Sleep(3000);                           // Простое решение

         return(1);                             // Выход из функции

      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");

         Sleep(500);                            // Простое решение

         return(1);                             // Выход из функции

         // Критические ошибки

      case  2: Alert("Общая ошибка.");

         return(0);                             // Выход из функции

      case  5: Alert("Старая версия терминала.");

         Work=false;                            // Больше не работать

         return(0);                             // Выход из функции

      case 64: Alert("Счет заблокирован.");

         Work=false;                            // Больше не работать

         return(0);                             // Выход из функции

      case 133:Alert("Торговля запрещена.");

         return(0);                             // Выход из функции

      case 134:Alert("Недостаточно денег для совершения операции.");

         return(0);                             // Выход из функции

      default: Alert("Возникла ошибка ",Error); // Другие варианты   

         return(0);                             // Выход из функции

     }

  }

//-------------------------------------------------------------- 11 --



Файлы:
 
RomanRott:   Подскажите пожалуйста, как найти максимальное и минимальные значения текущего АТР?
   double max=-10000, min=+10000, ATR;
   for(int n=0; n<WindowFirstVisibleBar();n++)
   {
      ATR=iATR(NULL, 0, 14, n);
      if(max<ATR)max=ATR;
      if(min>ATR)min=ATR;
   }
   Alert("min = ", DoubleToStr(min,4), "    max = ", DoubleToString(max,4));
Для других индикаторов аналогично
 
Skander:  Всем привет.Составил простенький эксперт на основе Стохстика (на верхнем пике продаёт, на нижнем покупает), а компилятор выдаёт ошибку на ровном месте.
Может кто-нибудь подскажет в чём причина и что значит такая ошибка? Я сначала думал, что скобку где-то забыл поставить.
Но нет, несколько раз проверил - вроде со скобками всё в порядке. Буду весьма признателен за помощь.
Вот ошибки, которые выдаёт компилятор: ')' - not all control paths return a value    Stohastic-Сигналы-33.mq4    177    3
                                       ')' - not all control paths return a value    Stohastic-Сигналы-33.mq4    210    3
//--------------------------------------------------------------- 8 --
  bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip)    // Ф-ия закрытия ордера
  {
   double Close_Price=0;                       // Цена закрытия ордера
   while(true)
     {
         RefreshRates();                        // Обновление данных
         if(F_Tip==0)                          //  Если ордер Buy, ...           
             Close_Price=Bid;               //  Цена закрытия Bid
          Close_Price=Ask;                      //  А если ордер Sell, то цена закрытия Ask
         bool Ans_Close=OrderClose(F_Ticket,F_Lot,Close_Price,F_Slippage);      // Закрытие Buy или Sell
         if (Ans_Close==true)                         // Получилось :)
            return(true);                         // Выход из функции закр
         Crit_Error=GetLastError();              // Фиксируем номер ошибки             
         if (Fun_Error(Crit_Error)==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return(false);                                // Выход из функции
     }
  }  

Нажмите в MetaEditor кнопку Компилировать и читайте сообщение об ошибке - там номер строки и номер позиции

//--------------------------------------------------------------- 8 --
  bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip)    // Ф-ия закрытия ордера
  {
   double Close_Price=0;                       // Цена закрытия ордера 
   while(true)
     {
        ....................................
            continue;                           // Повторная попытка
         return(false);                                // Выход из функции
     }
     return false;   // Компилятор хочет return в конце функции
  }

Вставляйте код программы кнопкой SRC - так здешним читателям нравится больше!!! а Ваша длинная портянка - БРРРРР

Кнопка Код предназначена для вставки исходного кода в текст сообщения. При нажатии появляется пустое окно, в которое необходимо вставить код и далее нажать кнопку Вставить.

 
STARIJ:

Нажмите в MetaEditor кнопку Компилировать и читайте сообщение об ошибке - там номер строки и номер позиции

Вставляйте код программы кнопкой SRC - так здешним читателям нравится больше!!! а Ваша длинная портянка - БРРРРР

Кнопка предназначена для вставки исходного кода в текст сообщения. При нажатии появляется пустое окно, в которое необходимо вставить код и далее нажать кнопку Вставить.


Спасибо.

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