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

blacksky

Прохожий
Привет, программисты. Подскажите, пожалуйста, где копать и куда писать код для установки максимального колличества открытых ордеров?
 

Вложения

  • EURGPB.mq4
    16,1 КБ · Просмотры: 10

1_Lexa

Активный участник
Здравствуйте! Может кто подсказать как трал сделать общим?
Код:
double OOP,SL;
   int b=0,s=0,tip,TicketB=0,TicketS=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            tip = OrderType();
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            if(tip==OP_BUY)
              {
               b++;
               TicketB=OrderTicket();
               if(Stoploss!=0   && Bid<=OOP - Stoploss   * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;}
               if(Takeprofit!=0 && Bid>=OOP + Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;}
               if(TrailingStop>0)
                 {
                  SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                  if(SL>=OOP+TrailingStart*Point && (TrallB==0 || TrallB+TrailingStep*Point<SL)) TrallB=SL;
                 }
              }
            if(tip==OP_SELL)
              {
               s++;
               if(Stoploss!=0   && Ask>=OOP + Stoploss   * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;}
               if(Takeprofit!=0 && Ask<=OOP - Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;}
               TicketS=OrderTicket();
               if(TrailingStop>0)
                 {
                  SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                  if(SL<=OOP-TrailingStart*Point && (TrallS==0 || TrallS-TrailingStep*Point>SL)) TrallS=SL;
                 }
              }
           }
        }
     }
 

BUT

Местный житель
Всем привет.
Всех с наступившим Новым Годом!
Я начал изучать язык mql4, выполняя простейшие задачи. Поскольку у меня нет профильной базы и я самоучка, для обучения использую все доступные материалы: различные текстовые типа справочника, форумы ну и конечно видео в ютюбе.

Написал простенький советник, который работает на двух мувингах. И вроде бы все хорошо и написанные условия выполняются, однако не совсем так как хотелось.
Условия для открытия сделки: пересечение MA1 и MA2. Условия для закрытия: обратное пересечение, тейк-профит или стоп-лосс.
Помогите, пожалуйста, решить следующие вопросы:
1. Когда начинаю тестирование, советник сразу же открывает сделку в сторону пересечения, хотя пересечение было давно несколько баров назад. Как сделать так, чтобы сделка открывалась только на следующем баре после пересечения?
2. После достижения тейк-профита или стоп-лосса советник продолжает открывать сделки в сторону пересечения. Как его остановить? Если был достигнут стоп или тейк, то сделка должна будет открыться только после обратного сигнала? То есть, если позиция бай закрылась по ТП или СЛ, то следующий бай будет только после отработки позиции селл?
3. У меня получается одновременно открыть два ордера, но не получается прописать для них разные условия закрытия. Например, открывается два ордера одновременно, но один должен закрыться при достижении ТП или СЛ, а второй при обратном сигнале или достижении СЛ. Как прописать разные условия для двух одновременно открытых ордеров?

Заранее всем спасибо за помощь!
Код:
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//----------Переменные-----------------------------------------------
input double Lot = 0.01;        //Размер лота
input int Slippage = 150;       //Величина проскальзвания
input int Magic = 1;            //Мэджик
input int TakeProfit = 300;     //Тейк-профит в пунктах
input int StopLoss = 300;       //Стоп-лосс в пунктах
input int MA1 = 3;             //Период первого мувинга
input int MA2 = 20;             //Период второго мувинга
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double tp=NormalizeDouble(TakeProfit*_Point,_Digits); //Нормализация значения тейк-профита
   double sl=NormalizeDouble(StopLoss*_Point,_Digits);   //Нормализация значения стоп-лосса

//+------------------------------------------------------------------+
//| Подсчет открытых ордеров                                         |
//+------------------------------------------------------------------+
   int sellorders = 0;
   int buyorders = 0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               buyorders++;
            if(OrderType()==OP_SELL)
               sellorders++;
           }
     }
//+------------------------------------------------------------------+
//| Условия для открытия позиции                                     |
//+------------------------------------------------------------------+
   double ma1=iMA(_Symbol,0,MA1,0,MODE_EMA,PRICE_CLOSE,1);
   double ma2=iMA(_Symbol,0,MA2,0,MODE_EMA,PRICE_CLOSE,1);
   if(buyorders==0 && ma1>ma2)
     {
      int tik=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,0,"",Magic,0,clrGreen);
      if(tik>0)
         Print("Ордер BUY открыт");
      else
         Print("Ордер BUY отклонен");
     }
   if(sellorders==0 && ma1<ma2)
     {
      int tik=OrderSend(_Symbol,OP_SELL,Lot,Bid,Slippage,0,0,"",Magic,0,clrRed);
      if(tik>0)
         Print("Ордер SELL открыт");
      else
         Print("Ордер SELL отклонен");
     }

//+------------------------------------------------------------------+
//| Модификация ордеров. Установка тейк-профита и стоп-лосса         |
//+------------------------------------------------------------------+
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,_Digits),NormalizeDouble(OrderOpenPrice()+tp,_Digits),0,clrBlue)==true)
                     Print("Modify is OK!");
                  else
                     Print("Modify is not OK!");
            if(OrderType()==OP_SELL)
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,_Digits),NormalizeDouble(OrderOpenPrice()-tp,_Digits),0,clrOrange)==true)
                     Print("Modify is OK!");
                  else
                     Print("Modify is not OK!");
           }
     }
//+------------------------------------------------------------------+
//| Условия для закрытия ордеров по обратному сигналу                |
//+------------------------------------------------------------------+
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               if(buyorders>0 && ma1<ma2)
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slippage,clrAqua)==true)
                     Print("Ордер BUY закрыт");
                  else
                     Print("Ордер BUY не закрыт");

            if(OrderType()==OP_SELL)
               if(sellorders>0 && ma1>ma2)
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slippage,clrAqua)==true)
                     Print("Ордер SELL закрыт");
                  else
                     Print("Ордер SELL не закрыт");
           }
     }
  }
 

Вложения

  • Вопрос 1.jpg
    Вопрос 1.jpg
    140,1 КБ · Просмотры: 36
  • Вопрос 2.jpg
    Вопрос 2.jpg
    105,9 КБ · Просмотры: 34
  • Example1.mq4
    10,2 КБ · Просмотры: 9

Ugar

Гуру форума
Всем привет.
Всех с наступившим Новым Годом!
Я начал изучать язык mql4, выполняя простейшие задачи. Поскольку у меня нет профильной базы и я самоучка, для обучения использую все доступные материалы: различные текстовые типа справочника, форумы ну и конечно видео в ютюбе.

Написал простенький советник, который работает на двух мувингах. И вроде бы все хорошо и написанные условия выполняются, однако не совсем так как хотелось.
Условия для открытия сделки: пересечение MA1 и MA2. Условия для закрытия: обратное пересечение, тейк-профит или стоп-лосс.
Помогите, пожалуйста, решить следующие вопросы:
1. Когда начинаю тестирование, советник сразу же открывает сделку в сторону пересечения, хотя пересечение было давно несколько баров назад. Как сделать так, чтобы сделка открывалась только на следующем баре после пересечения?
2. После достижения тейк-профита или стоп-лосса советник продолжает открывать сделки в сторону пересечения. Как его остановить? Если был достигнут стоп или тейк, то сделка должна будет открыться только после обратного сигнала? То есть, если позиция бай закрылась по ТП или СЛ, то следующий бай будет только после отработки позиции селл?
3. У меня получается одновременно открыть два ордера, но не получается прописать для них разные условия закрытия. Например, открывается два ордера одновременно, но один должен закрыться при достижении ТП или СЛ, а второй при обратном сигнале или достижении СЛ. Как прописать разные условия для двух одновременно открытых ордеров?

Заранее всем спасибо за помощь!
Код:
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//----------Переменные-----------------------------------------------
input double Lot = 0.01;        //Размер лота
input int Slippage = 150;       //Величина проскальзвания
input int Magic = 1;            //Мэджик
input int TakeProfit = 300;     //Тейк-профит в пунктах
input int StopLoss = 300;       //Стоп-лосс в пунктах
input int MA1 = 3;             //Период первого мувинга
input int MA2 = 20;             //Период второго мувинга
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double tp=NormalizeDouble(TakeProfit*_Point,_Digits); //Нормализация значения тейк-профита
   double sl=NormalizeDouble(StopLoss*_Point,_Digits);   //Нормализация значения стоп-лосса

//+------------------------------------------------------------------+
//| Подсчет открытых ордеров                                         |
//+------------------------------------------------------------------+
   int sellorders = 0;
   int buyorders = 0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               buyorders++;
            if(OrderType()==OP_SELL)
               sellorders++;
           }
     }
//+------------------------------------------------------------------+
//| Условия для открытия позиции                                     |
//+------------------------------------------------------------------+
   double ma1=iMA(_Symbol,0,MA1,0,MODE_EMA,PRICE_CLOSE,1);
   double ma2=iMA(_Symbol,0,MA2,0,MODE_EMA,PRICE_CLOSE,1);
   if(buyorders==0 && ma1>ma2)
     {
      int tik=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,0,"",Magic,0,clrGreen);
      if(tik>0)
         Print("Ордер BUY открыт");
      else
         Print("Ордер BUY отклонен");
     }
   if(sellorders==0 && ma1<ma2)
     {
      int tik=OrderSend(_Symbol,OP_SELL,Lot,Bid,Slippage,0,0,"",Magic,0,clrRed);
      if(tik>0)
         Print("Ордер SELL открыт");
      else
         Print("Ордер SELL отклонен");
     }

//+------------------------------------------------------------------+
//| Модификация ордеров. Установка тейк-профита и стоп-лосса         |
//+------------------------------------------------------------------+
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,_Digits),NormalizeDouble(OrderOpenPrice()+tp,_Digits),0,clrBlue)==true)
                     Print("Modify is OK!");
                  else
                     Print("Modify is not OK!");
            if(OrderType()==OP_SELL)
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,_Digits),NormalizeDouble(OrderOpenPrice()-tp,_Digits),0,clrOrange)==true)
                     Print("Modify is OK!");
                  else
                     Print("Modify is not OK!");
           }
     }
//+------------------------------------------------------------------+
//| Условия для закрытия ордеров по обратному сигналу                |
//+------------------------------------------------------------------+
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               if(buyorders>0 && ma1<ma2)
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slippage,clrAqua)==true)
                     Print("Ордер BUY закрыт");
                  else
                     Print("Ордер BUY не закрыт");

            if(OrderType()==OP_SELL)
               if(sellorders>0 && ma1>ma2)
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slippage,clrAqua)==true)
                     Print("Ордер SELL закрыт");
                  else
                     Print("Ордер SELL не закрыт");
           }
     }
  }
ma1>ma2 Это не пересечение МА. Это буквально одна МА больше другой. Значит пересечение было, но когда неизвестно.
Пересечение это одна МА больше другой, но в прошлом их расположение было обратным.
В прошлом может быть на предыдущем тике или на предыдущем баре.
Например:
if(ma1>ma2 && ma12<ma22)
ma1, ma2 - МА на 1 баре
ma12, ma22 - эти же МА, но на 2 баре
 
  • Like
Реакции: BUT

Ugar

Гуру форума
ma1>ma2 Это не пересечение МА. Это буквально одна МА больше другой. Значит пересечение было, но когда неизвестно.
Пересечение это одна МА больше другой, но в прошлом их расположение было обратным.
В прошлом может быть на предыдущем тике или на предыдущем баре.
Например:
if(ma1>ma2 && ma12<ma22)
ma1, ma2 - МА на 1 баре
ma12, ma22 - эти же МА, но на 2 баре
Всем привет.
Всех с наступившим Новым Годом!
Я начал изучать язык mql4, выполняя простейшие задачи. Поскольку у меня нет профильной базы и я самоучка, для обучения использую все доступные материалы: различные текстовые типа справочника, форумы ну и конечно видео в ютюбе.

Написал простенький советник, который работает на двух мувингах. И вроде бы все хорошо и написанные условия выполняются, однако не совсем так как хотелось.
Условия для открытия сделки: пересечение MA1 и MA2. Условия для закрытия: обратное пересечение, тейк-профит или стоп-лосс.
Помогите, пожалуйста, решить следующие вопросы:
1. Когда начинаю тестирование, советник сразу же открывает сделку в сторону пересечения, хотя пересечение было давно несколько баров назад. Как сделать так, чтобы сделка открывалась только на следующем баре после пересечения?
2. После достижения тейк-профита или стоп-лосса советник продолжает открывать сделки в сторону пересечения. Как его остановить? Если был достигнут стоп или тейк, то сделка должна будет открыться только после обратного сигнала? То есть, если позиция бай закрылась по ТП или СЛ, то следующий бай будет только после отработки позиции селл?
3. У меня получается одновременно открыть два ордера, но не получается прописать для них разные условия закрытия. Например, открывается два ордера одновременно, но один должен закрыться при достижении ТП или СЛ, а второй при обратном сигнале или достижении СЛ. Как прописать разные условия для двух одновременно открытых ордеров?

Заранее всем спасибо за помощь!
Код:
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//----------Переменные-----------------------------------------------
input double Lot = 0.01;        //Размер лота
input int Slippage = 150;       //Величина проскальзвания
input int Magic = 1;            //Мэджик
input int TakeProfit = 300;     //Тейк-профит в пунктах
input int StopLoss = 300;       //Стоп-лосс в пунктах
input int MA1 = 3;             //Период первого мувинга
input int MA2 = 20;             //Период второго мувинга
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double tp=NormalizeDouble(TakeProfit*_Point,_Digits); //Нормализация значения тейк-профита
   double sl=NormalizeDouble(StopLoss*_Point,_Digits);   //Нормализация значения стоп-лосса

//+------------------------------------------------------------------+
//| Подсчет открытых ордеров                                         |
//+------------------------------------------------------------------+
   int sellorders = 0;
   int buyorders = 0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               buyorders++;
            if(OrderType()==OP_SELL)
               sellorders++;
           }
     }
//+------------------------------------------------------------------+
//| Условия для открытия позиции                                     |
//+------------------------------------------------------------------+
   double ma1=iMA(_Symbol,0,MA1,0,MODE_EMA,PRICE_CLOSE,1);
   double ma2=iMA(_Symbol,0,MA2,0,MODE_EMA,PRICE_CLOSE,1);
   if(buyorders==0 && ma1>ma2)
     {
      int tik=OrderSend(_Symbol,OP_BUY,Lot,Ask,Slippage,0,0,"",Magic,0,clrGreen);
      if(tik>0)
         Print("Ордер BUY открыт");
      else
         Print("Ордер BUY отклонен");
     }
   if(sellorders==0 && ma1<ma2)
     {
      int tik=OrderSend(_Symbol,OP_SELL,Lot,Bid,Slippage,0,0,"",Magic,0,clrRed);
      if(tik>0)
         Print("Ордер SELL открыт");
      else
         Print("Ордер SELL отклонен");
     }

//+------------------------------------------------------------------+
//| Модификация ордеров. Установка тейк-профита и стоп-лосса         |
//+------------------------------------------------------------------+
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,_Digits),NormalizeDouble(OrderOpenPrice()+tp,_Digits),0,clrBlue)==true)
                     Print("Modify is OK!");
                  else
                     Print("Modify is not OK!");
            if(OrderType()==OP_SELL)
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,_Digits),NormalizeDouble(OrderOpenPrice()-tp,_Digits),0,clrOrange)==true)
                     Print("Modify is OK!");
                  else
                     Print("Modify is not OK!");
           }
     }
//+------------------------------------------------------------------+
//| Условия для закрытия ордеров по обратному сигналу                |
//+------------------------------------------------------------------+
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               if(buyorders>0 && ma1<ma2)
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slippage,clrAqua)==true)
                     Print("Ордер BUY закрыт");
                  else
                     Print("Ордер BUY не закрыт");

            if(OrderType()==OP_SELL)
               if(sellorders>0 && ma1>ma2)
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slippage,clrAqua)==true)
                     Print("Ордер SELL закрыт");
                  else
                     Print("Ордер SELL не закрыт");
           }
     }
  }
Что бы советник по разному сопровождал открытые ордера, нужно что бы он их отличал.
Самый универсальный, но не самый простой, способ это использовать разные маджики.
 
  • Like
Реакции: BUT

BUT

Местный житель
ma1>ma2 Это не пересечение МА. Это буквально одна МА больше другой. Значит пересечение было, но когда неизвестно.
Пересечение это одна МА больше другой, но в прошлом их расположение было обратным.
В прошлом может быть на предыдущем тике или на предыдущем баре.
Например:
if(ma1>ma2 && ma12<ma22)
ma1, ma2 - МА на 1 баре
ma12, ma22 - эти же МА, но на 2 баре
Спасибо ОГРОМНОЕ! Здесь все получилось!
Что бы советник по разному сопровождал открытые ордера, нужно что бы он их отличал.
Самый универсальный, но не самый простой, способ это использовать разные маджики.
Спасибо ОГРОМНОЕ! А здесь логика мне теперь понятна.
Реально, спасибо большое, что по-русски мне объяснили.
 

Viktor73

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

1673417085208.png
 

vladradon

Программист
Добрый день. подскажите. мозг весь сломал. почему ругается именно на нее а дальше везде норм.

Посмотреть вложение 495389
Это он не ругается, а предупреждает, что в строке, где переменная clr инициализируется, не задается ее первоначальное значение. Нужно что-то типа color clr=clrWhite;
 

Viktor73

Новичок форума
Идентичный кусок кода, все в порядке
1673419832216.png


на старте так как и везде

1673420018586.png
 

vladradon

Программист
Идентичный кусок кода, все в порядке
Посмотреть вложение 495394


на старте так как и везде

Посмотреть вложение 495395
Значит есть разница. Просто сделайте как сказал и предупреждение исчезнет. По хорошему, все переменные должны иметь изначальное значение. При компиляции в режиме стрикт на это обращается внимание.
Из куска кода на скрине я вижу, что значение переменной присваивается только, если проходит одна из проверок, и переменная может вообще остаться без значения, если ни одна проверка не пройдет. Вот компилятор и ругается, предупреждая, что переменная может остаться без заданного параметра. Хотя по-умолчанию ей все равно присваивается 0.
 
Последнее редактирование:

Viktor73

Новичок форума
Нужна небольшая помощь. Знаем буфер индикатора. "BUF" , как получить от него данные один раз в день на закрытии последней свечи.
Цель какая. При получении данных построить горизонтальную линия до следующего дня.
если не трудно помогите.
 

Ugar

Гуру форума
Нужна небольшая помощь. Знаем буфер индикатора. "BUF" , как получить от него данные один раз в день на закрытии последней свечи.
Цель какая. При получении данных построить горизонтальную линия до следующего дня.
если не трудно помогите.
Только примерно, за несколько секунд до закрытия. Окончательная цена закрытия свечи будет известна только при открытии новой.
if(Hour()==23 && Minute()==59 && Seconds()==59)
{
Ind=iCustom(...);
}
Естественно, это должно работать в таймере OnTime(). Так как в строго заданную секунду тиков может и не быть, события OnTick() может не быть.
 

Viktor73

Новичок форума
Только примерно, за несколько секунд до закрытия. Окончательная цена закрытия свечи будет известна только при открытии новой.
if(Hour()==23 && Minute()==59 && Seconds()==59)
{
Ind=iCustom(...);
}
Естественно, это должно работать в таймере OnTime(). Так как в строго заданную секунду тиков может и не быть, события OnTick() может не быть.
понятно. уточню . запускаем индикатор в обед . а он должен найти открытие этого дня или закрытие прошлого дня и на этой свече взять данные от стороннего индикатора или произвести расчет и построить уровень на этот день. как то так.1674102038550.png
 

Ugar

Гуру форума
понятно. уточню . запускаем индикатор в обед . а он должен найти открытие этого дня или закрытие прошлого дня и на этой свече взять данные от стороннего индикатора или произвести расчет и построить уровень на этот день. как то так.Посмотреть вложение 496578
Узнать время открытия дневного бара сегодня. Найти бар нужного таймфрема соответствующего этому времени. Это первый бар текущего дня. +1 - последний бар прошлого дня.
Последний бар прошлого дня текущего таймфрейма.
int LastBar=iBarShift(NULL,0,iTime(NULL,1440,0))+1;
double Ind=iCustom(... ,LastBar);
 

Viktor73

Новичок форума
Узнать время открытия дневного бара сегодня. Найти бар нужного таймфрема соответствующего этому времени. Это первый бар текущего дня. +1 - последний бар прошлого дня.
Последний бар прошлого дня текущего таймфрейма.
int LastBar=iBarShift(NULL,0,iTime(NULL,1440,0))+1;
double Ind=iCustom(... ,LastBar);
Спасибо, попробую реализовать.
 

Viktor73

Новичок форума
Получилось вот так . теперь как продлить линия до конца дня ?

LastBar = iBarShift(Symbol(),0,iTime(NULL,1440,0));
Ind = iCustom(Symbol(),0,Indicatr,0,LastBar);
name = "Line"; if(ObjectFind(name)==-1) Line(name,Time[LastBar],Ind1,Time[0],Ind,clrBlack,STYLE_SOLID,2,false,false,false);
Time[0] - вносить надо сюда ,

1674126618506.png
Заранее спасибо.
 

Viktor73

Новичок форума
еще вопрос. сделал через функции. теперь как сделать отрисовку на указанное количество дней назад.


int LastBar;
int M;
int D=20;//количество дней отрисовки

int init()
{
M=0; if ((ChartSymbol(0))=="XAUUSD")M=1;
int i=1440;
LastBar=iBarShift(Symbol(),0,iTime(NULL,i,0))-M;
if (LastBar>1){H1LINE();H4LINE();}

return(0);
}


1674148932243.png
 
Верх