Ваши вопросы по языку MQL4

ZenFX

Почетный гражданин
Я тебе один умный вещь скажу, но только ты не обижайся ). Ну надо менять мозги короче чтобы что-то ПИСАТЬ, и УЧИТЬСЯ УЧИТЬСЯ и еще раз УЧИТЬСЯ ). Так понятно чтоли нет ?
 

star603

Новичок форума
Я не обижаюсь. Для этого я сда и выкладываю чтобы подсказывали что и как делать. в последнем коде что то не учел. Сделки на продажу модернизируются, а на покупку нет. Подскажешь что не так сделал?
Код:
double indikator[75][31];//Значения разных индикаторов
double fiks[3];//Фиксация приболи и убытка
//**************************************************************
void OnTick()
  {
   if(OrdersTotal()==0)
     {
      uo(indikator);//работает
      st1(fl(),sw(),ST(),PT());
      OrderModifi();
     }
  }
  //*************************************************************
  string sw()
  {
   string swop = "yes";
   double p = MarketInfo(_Symbol,MODE_SWAPLONG);
   double p1 = MarketInfo(_Symbol,MODE_SWAPSHORT);
   if(p>0.0)
      swop = "buy";
   else
      if(p1>0.0)
         swop = "sell";
   if(p<0.0 && p1<0.0)
      swop = "bouth";
   else
      if(p>0.0 && p1>0.0)
         swop = "test";
   return(swop);
  }
//+------------------------------------------------------------------+

  double ST()
  {
   double Sl=0.0;
   int Magic = 45789632;
   switch(Stop)
     {
      case 0:
         Sl=0.0;
         break;
      case 1:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0)
                        Sl = NormalizeDouble(Bid-StopLoss*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0)
                        Sl = NormalizeDouble(Ask+StopLoss*Point,Digits);
                     break;
                 }
              };
           }
         break;
      case 2:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0)
                        Sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0)
                        Sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);;
                     break;
                 }
              };
           }
         break;
     }
   return(Sl);
  }
//+------------------------------------------------------------------+
double PT()
  {
   double Pt=0.0;
   int Magic = 45789632;
   switch(Profit)
     {
      case 0:
         Pt=0.0;
         break;
      case 1:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0)
                        Pt = NormalizeDouble(Ask+TakeProfit*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0)
                        Pt = NormalizeDouble(Bid-TakeProfit*Point,Digits);
                     break;
                 }
              };
           }
         break;
      case 2:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0)
                        Pt = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0)
                        Pt = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
                     break;
                 }
              };
           }
         break;
     }
   return(Pt);
  }
//+------------------------------------------------------------------+
void uy(double &gh2[3])
  {
   gh2[0]=ST();
   gh2[1]=PT();
   gh2[2]= N*Point;
  }
//+------------------------------------------------------------------+
void OrderModifi()//+
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      bool ticketss;
      int Magic = 45789632;
      uy(fiks);
      double Sl= fiks[0];
      double Pt= fiks[1];
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()>Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()<Pt && OrderTakeProfit()!=Pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow);
                  break;
                 }
            case 1:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()<Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()>Pt && OrderTakeProfit()!=Pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrWhite);
                  break;
                 }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void st1(double Flot,string swop, double Sl, double Pt)
  {
   bool ticketss;
   int Magic = 45789632;
   switch(TORGISW)
     {
      case 0:
         if(swop == "buy")
            ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
      case 1:
         if(swop == "sell")
            ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
      case 2:
         ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
     }
  }
 

ZenFX

Почетный гражданин
Нет я не подскажу тут уже ), долго разбираться ). UGAR подскажет ).
 

AlexeyVik

Программист mql4 mql5
Я не обижаюсь. Для этого я сда и выкладываю чтобы подсказывали что и как делать. в последнем коде что то не учел. Сделки на продажу модернизируются, а на покупку нет. Подскажешь что не так сделал?
Код:
double indikator[75][31];//Значения разных индикаторов
double fiks[3];//Фиксация приболи и убытка
//**************************************************************
void OnTick()
  {
   if(OrdersTotal()==0)
     {
      uo(indikator);//работает
      st1(fl(),sw(),ST(),PT());
      OrderModifi();
     }
  }
  //*************************************************************
Я давно уже хочу сказать такое как тебе сказал ZenFX но не хочу никого обижать. А ведь это сказано не для того чтобы обидеть. Действительно у программиста мозг как-то по другому работает. Можно сказать как у идиота. М. Ботвинник сказал «Компьютер это идиот.» вот и попробуй поговорить с идиотом… Сам таким станешь.
Теперь попробуй словами описать этот код
Код:
//**************************************************************
void OnTick()
  {
   if(OrdersTotal()==0)
     {
      uo(indikator);//работает
      st1(fl(),sw(),ST(),PT());
      OrderModifi();
     }
  }
  //*************************************************************
Не стесняйся, если не сможешь сказать что происходит при выполнении кода, тебе лучше не заниматься этим.
Как говорится «Не царское дело в п****е ковыряться. Прикажу и в***т»
 

star603

Новичок форума
Я не обижаюсь. Для этого я сда и выкладываю чтобы подсказывали что и как делать. в последнем коде что то не учел. Сделки на продажу модернизируются, а на покупку нет. Подскажешь что не так сделал?
Код:
double indikator[75][31];//Значения разных индикаторов
double fiks[3];//Фиксация приболи и убытка
//**************************************************************
void OnTick()
  {
   if(OrdersTotal()==0)
     {
      uo(indikator);//работает
      st1(fl(),sw(),ST(),PT());
      OrderModifi();
     }
  }
  //*************************************************************
  string sw()
  {
   string swop = "yes";
   double p = MarketInfo(_Symbol,MODE_SWAPLONG);
   double p1 = MarketInfo(_Symbol,MODE_SWAPSHORT);
   if(p>0.0)
      swop = "buy";
   else
      if(p1>0.0)
         swop = "sell";
   if(p<0.0 && p1<0.0)
      swop = "bouth";
   else
      if(p>0.0 && p1>0.0)
         swop = "test";
   return(swop);
  }
//+------------------------------------------------------------------+

  double ST()
  {
   double Sl=0.0;
   int Magic = 45789632;
   switch(Stop)
     {
      case 0:
         Sl=0.0;
         break;
      case 1:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0)
                        Sl = NormalizeDouble(Bid-StopLoss*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0)
                        Sl = NormalizeDouble(Ask+StopLoss*Point,Digits);
                     break;
                 }
              };
           }
         break;
      case 2:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0)
                        Sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0)
                        Sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);;
                     break;
                 }
              };
           }
         break;
     }
   return(Sl);
  }
//+------------------------------------------------------------------+
double PT()
  {
   double Pt=0.0;
   int Magic = 45789632;
   switch(Profit)
     {
      case 0:
         Pt=0.0;
         break;
      case 1:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0 || OrderStopLoss()<0.0)
                        Pt = NormalizeDouble(Ask+TakeProfit*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0|| OrderStopLoss()<0.0)
                        Pt = NormalizeDouble(Bid-TakeProfit*Point,Digits);
                     break;
                 }
              };
           }
         break;
      case 2:
         for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
           {
            if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
              {
               switch(OrderType())
                 {
                  case 0:
                     if(OrderStopLoss()==0.0)
                        Pt = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
                     break;
                  case 1:
                     if(OrderStopLoss()==0.0)
                        Pt = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
                     break;
                 }
              };
           }
         break;
     }
   return(Pt);
  }
//+------------------------------------------------------------------+
void uy(double &gh2[3])
  {
   gh2[0]=ST();
   gh2[1]=PT();
   gh2[2]= N*Point;
  }
//+------------------------------------------------------------------+
void OrderModifi()//+
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      bool ticketss;
      int Magic = 45789632;
      uy(fiks);
      double Sl= fiks[0];
      double Pt= fiks[1];
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()>Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()<Pt && OrderTakeProfit()!=Pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow);
                  break;
                 }
            case 1:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()<Sl && OrderStopLoss()!= Sl) || (OrderOpenPrice()>Pt && OrderTakeProfit()!=Pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrWhite);
                  break;
                 }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void st1(double Flot,string swop, double Sl, double Pt)
  {
   bool ticketss;
   int Magic = 45789632;
   switch(TORGISW)
     {
      case 0:
         if(swop == "buy")
            ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
      case 1:
         if(swop == "sell")
            ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
      case 2:
         ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
     }
  }
И что вот интересно по одиночки открываю сделки на покупку или продажу (не вместе) оба ордера модернизируются. А если открыть одновременно то сделки на покупку не модифицируются.
 

star603

Новичок форума
Код:
extern int    Plot = 2;//Коэффициэнт увеличения лота
extern double Lot  = 0.01;//Установка текущего лота
extern double Risk = 0.01;//Установка риска
extern int    StopLoss = 250;//Фиксированный уровень стопа
extern int    TakeProfit = 500;//Фиксированный уровень профита
extern int    Slippage = 24;
extern int    N = 45;
//**********************************************************************************
void OnTick()
  {
//---
   Comment(fiks[5]);

  }
//+----
//**********************************************************************************
void uy(double &gh[5])
  {
   gh[0]=Lot;//лот для использования в дальнейших функциях
   gh[1]=Risk;//риск для использования в дальнейших функциях
   gh[2]=StopLoss;//убыток для использования в дальнейших функциях
   gh[3]=TakeProfit;//профит фикс для использования в дальнейших функциях
   gh[4]=N*Point;//трейлинг стопа для использования в дальнейших функциях
  }
Начнем тогда вместе по порядку.
 

ИванМН

Местный знаток
Да уж, дорогой Стар603, код, конечно, устрашающий (стиль программирования)... но это на вкус и цвет, понимаю.
Вопрос на засыпку: а отчего бы не модифицировать открытые позиции СРАЗУ после их открытия в st1, а не лепить для этого отдельную функцию OrderModifi(), тем более что между вызовами st1 и OrderModifi() никаких событий в OnTick не происходит? И отпадёт необходимость в куче лишних проверок и переборов. Например:

C-подобный:
void st1(double Flot,string swop, double Sl, double Pt)
{
   //bool ticketss;    //НЕПРАВИЛЬНО!!! OrderSend возвращает № позиции, т.е. int
   int ticketss;
   int Magic = 45789632;
   switch(TORGISW)
   {
      case 0:
         if(swop == "buy")
            //ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
            //Не рекомендую ставить стопы и тейки при открытии позиции, лучше делать это сразу же ПОСЛЕ, тогда и отпадает нужда в куче лишних проверок
            ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
            // ........... получить значения Sl и Pt ...........................
            if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))//если открытие прошло успешно, выбрать позицию
               ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow);
            //и все дела, повторить то же самое в других case'ах
            break;
      case 1:
         if(swop == "sell")
            ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
      case 2:
         ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
     }
  }
 
Последнее редактирование:

блондинка

Элитный участник
Подскажите пожалуйста как сделать что бы индикатор .mq4 работал только на одной конкретно указанной валютной паре?На других парах ноль реакции.Спасибо!)
типа:
if(Symbol()!="EURUSD"){Alert("Неверная пара.. индикатор не работает");return(0);}
просто не встречала подобного живьём)))
 
Последнее редактирование:

star603

Новичок форума
Да уж, дорогой Стар603, код, конечно, устрашающий (стиль программирования)... но это на вкус и цвет, понимаю.
Вопрос на засыпку: а отчего бы не модифицировать открытые позиции СРАЗУ после их открытия в st1, а не лепить для этого отдельную функцию OrderModifi(), тем более что между вызовами st1 и OrderModifi() никаких событий в OnTick не происходит? И отпадёт необходимость в куче лишних проверок и переборов. Например:

C-подобный:
void st1(double Flot,string swop, double Sl, double Pt)
{
   //bool ticketss;    //НЕПРАВИЛЬНО!!! OrderSend возвращает № позиции, т.е. int
   int ticketss;
   int Magic = 45789632;
   switch(TORGISW)
   {
      case 0:
         if(swop == "buy")
            //ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
            //Не рекомендую ставить стопы и тейки при открытии позиции, лучше делать это сразу же ПОСЛЕ, тогда и отпадает нужда в куче лишних проверок
            ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
            // ........... получить значения Sl и Pt ...........................
            if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))//если открытие прошло успешно, выбрать позицию
               ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow);
            //и все дела, повторить то же самое в других case'ах
            break;
      case 1:
         if(swop == "sell")
            ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
      case 2:
         ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
     }
  }
Код:
 if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))/

В этой строке выдает стобщение:
possible use of uninitialized variable 'ticketss' Lavina.mq4 505 17
 

DomovenokBrest

♔♕♖♗♘♙
Подскажите пожалуйста как сделать что бы индикатор .mq4 работал только на одной конкретно указанной валютной паре?На других парах ноль реакции.Спасибо!)
типа:
if(Symbol()!="EURUSD"){Alert("Неверная пара.. индикатор не работает");return(0);}
просто не встречала подобного живьём)))
Вариантов много.
Как пример:

Пример:
extern  string symbol = "GBPUSD";


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[])
  {

  {
string expire_symbol = (GBPUSD);
   string e_s = expire_symbol;
   if (symbol    != e_s || symbol    != Symbol())
   {
     Alert (Invalid currency pair. Contact the developer.);
     return(0);
   }
  }

    
    return(rates_total);
    
  }
 

блондинка

Элитный участник
Вариантов много.
Как пример:

Пример:
extern  string symbol = "GBPUSD";


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[])
  {

  {
string expire_symbol = (GBPUSD);
   string e_s = expire_symbol;
   if (symbol    != e_s || symbol    != Symbol())
   {
     Alert (Invalid currency pair. Contact the developer.);
     return(0);
   }
  }

   
    return(rates_total);
   
  }
сенькию вери мач!)))
 

star603

Новичок форума
Использовать (передавать) глобальные переменные в внутрь пользовательских функций это приемлемо? Так подразумеваются те данные которые я буду вводить в момент прикрепления советника на график
Код:
double fiks[10];//Дополнительные данные
extern double Lot  = 0.01;//Установка текущего лота
extern double Risk = 0.01;//Установка риска
extern int    StopLoss = 250;//Фиксированный уровень стопа
extern int    TakeProfit = 500;//Фиксированный уровень профита
extern int    Slippage = 24;
extern int    N = 45;
//************************************************************
void uy(double &gh[10])
  {
//для использования в дальнейших функциях
   gh[0]=Lot;//лот
   gh[1]=Risk;//риск
   gh[2]= NormalizeDouble(StopLoss*Point,Digits);//убыток
   gh[3]= NormalizeDouble(TakeProfit*Point,Digits);//профит
   gh[4]= NormalizeDouble(N*Point,Digits);//трейлинг стопа
   gh[5]= NormalizeDouble(MarketInfo(Symbol(),13)*Point,Digits);//спред
   gh[6]= NormalizeDouble(MarketInfo(Symbol(),14)*Point,Digits);//минимальные пункты
   gh[7]= NormalizeDouble(MarketInfo(Symbol(),18)*Point,Digits);//своп покупок
   gh[8]= NormalizeDouble(MarketInfo(Symbol(),19)*Point,Digits);//своп продаж
   gh[9]= NormalizeDouble(MarketInfo(Symbol(),33)*Point,Digits);//дист заморозки
  }
 

vladradon

Программист
Подскажите пожалуйста как сделать что бы индикатор .mq4 работал только на одной конкретно указанной валютной паре?На других парах ноль реакции.Спасибо!)
типа:
if(Symbol()!="EURUSD"){Alert("Неверная пара.. индикатор не работает");return(0);}
просто не встречала подобного живьём)))
Привет! У тебя правильно написана строка, если ее вставить в основную функцию индикатора, но тогда индикатор все равно будет инициализирован. Правильнее такую строку вставить в функцию инициализации и тогда индикатор не запустится вообще:
C-подобный:
int OnInit()
  {
   if(_Symbol!="EURUSD") {Alert("Неверная пара.. индикатор не работает"); return(INIT_FAILED);}
//--- indicator buffers mapping
А если нужно делать выбор символа в параметрах, то вариант такой:
C-подобный:
extern string symbol = "EURUSD";

int OnInit()
  {
   if(_Symbol!=symbol) {Alert("Неверная пара.. индикатор не работает"); return(INIT_FAILED);}
//--- indicator buffers mapping
 

WayToTheTop

Интересующийся
строиш свою трендовую на графике руками,
в скрипте\индюке\сове узнаеш нужные тебе параметры своей линии
спомощью
ObjectGet( string name, int prop_id)
name - имя твоего обекта
prop_id - Идентификатор свойства объекта. Может быть любым из значений списка свойств объекта.

Пример вызова:
PHP:
 double price1 = ObjectGet("hline12", OBJPROP_PRICE1);

в хелпе все достаточно понятно описано
 

WayToTheTop

Интересующийся
Привет. Есть хорошая стратегия торговли созданная мною, нужно ее автоматизировать. Если знаешь язык mql отзовись, предлагаю тебе сотрудничество
 

fxbo

Активный участник
Всем привет! Кто подскажет чайнику как решить проблему.
Есть канальный ТМА индюк, что и где прописать что бы не дергалась стрелка, а намертво прикрепилась выдавая в буфер сигнал один раз в момент закрытии свечи на определенном ТФ за каналом. Для примера предоставляю скрин с индюком и алертом(стрелкой) в буфере. ТФ М15 (не имеет значения какой). Цена(свеча) зашла за уровень появляется долбаная стрелка и начинает мигать потому что, цена как угорелая бегает туди-сюди (я так полагаю, в таком случае И сигнал подается в буфер в таком же режиме как мигает стрелка). По этому, когда индюка ставишь в сову он выдает кучу ордеров, а ордер должен открыться только один в момент закрытия свечи на данном таймфрейме.

На скрине показано, что цена(свеча) зашла за канал, до закрытия свечи еще 9 минут 20 секунд а стрелка уже появилась. На самом деле стрелка должна появится только в момент закрытия свечи за каналом. Бывает такое что цена закрывается ниже канала, а бот уже выставит в лучшем случае несколько десятков ордеров (((.
Благодарю заранее за подсказку....

1676307804582.png
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Всем привет! Кто подскажет чайнику как решить проблему.
Есть канальный ТМА индюк, что и где прописать что бы не дергалась стрелка, а намертво прикрепилась выдавая в буфер сигнал один раз в момент закрытии свечи на определенном ТФ за каналом. Для примера предоставляю скрин с индюком и алертом(стрелкой) в буфере. ТФ М15 (не имеет значения какой). Цена(свеча) зашла за уровень появляется долбаная стрелка и начинает мигать потому что, цена как угорелая бегает туди-сюди (я так полагаю, в таком случае И сигнал подается в буфер в таком же режиме как мигает стрелка). По этому, когда индюка ставишь в сову он выдает кучу ордеров, а ордер должен открыться только один в момент закрытия свечи на данном таймфрейме.

На скрине показано, что цена(свеча) зашла за канал, до закрытия свечи еще 9 минут 20 секунд а стрелка уже появилась. На самом деле стрелка должна появится только в момент закрытия свечи за каналом. Бывает такое что цена закрывается ниже канала, а бот уже выставит в лучшем случае несколько десятков ордеров (((.
Благодарю заранее за подсказку....

Посмотреть вложение 499871
Надо всего-то проверять стрелку на первом баре, а не нулевом…
 

fxbo

Активный участник
Надо всего-то проверять стрелку на первом баре, а не нулевом…
блин наверное лоханулся, 0 бар это же текущая свечка которая двигается, нужно проверить, наверное забыл поставить 1 , нужно перепроверить...
 
Верх