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

Leva20

Новичок форума
Вам следует использовать ф-цию создания графических объектов ObjectCreate() и создать объект типа OBJ_BUTTON (кнопка), а для ввода значений: OBJ_EDIT (поле ввода). После создания, следует считывать данные с созданных объектов. Считывать можно как по тикам, по таймеру или с помощью ф-ции OnChartEvent(). Замечу, что в тестере будет работать только по тикам, при этом, для работы на реальном графике, удобнее использовать ф-цию OnChartEvent().
Ниже прилагаю файл торговой панельки, в которой есть как кнопки, так и поле ввода. Вам предстоит разобраться что и как там сделано и повторить код под себя. Автор панельки: cmillion, он есть на этом форуме.


Большое спасибо за помощь.

Практически получилось сделать, что хотел.
Может знаете как исправить ошибки?

1) Реагирование на нажатие происходит на новом тике.
Как сделать, что бы изменение на графике происходило сразу после нажатия на кнопку и не ждало нового тика?

2) В объекте "Поле ввода". Не вводятся новые значения для быстрого перехода по истории, а только отображается текущее значение.
Что нужно, для ввода нового значения в окне "Поле ввода"?
 

Вложения

mobidik

-----
1) Реагирование на нажатие происходит на новом тике.
Как сделать, что бы изменение на графике происходило сразу после нажатия на кнопку и не ждало нового тика?
Выполнять нужное действие в ф-ции OnChartEvent().
2) В объекте "Поле ввода". Не вводятся новые значения для быстрого перехода по истории, а только отображается текущее значение.
Что нужно, для ввода нового значения в окне "Поле ввода"?
Если все сделано верно - просто, навести мышку и установить нужное значение.

PS.
Еще раз ознакомьтесь с кодом, который был предоставлен. Если Вам для понимания он не подходит - найдите любые другие файлы, где используются кнопки, поле ввода и разберитесь что к чему. Если по коду что-то не понятно, из того, что окрашено в любой цвет, кроме черного - наводим мышку и жмем на клаве "F1", тем самым попадете в справку - читаем внимательно, быть может и перечитываем. То, что Вам кажется верным - проверяем, опять таки, через справку. Это касается PERIOD_CURRENT - которое Вы соизволили вставить в своем коде.., это как зайцу стоп-сигнал...
В сети полно уроков, загляните на ютуб.
 

vladradon

Программист
Может знаете как исправить ошибки?
Выдержка из одного моего сова именно по обработке текста в объекте "поле ввода" - проверка на наличие только цифровых данных.
 

Вложения

medved76

Активный участник
Ребята подскажите как в советнике прописать машку привязанную к индикатору на графике типа "Previous Indicator`s Data"?
 

Ugar

Гуру форума
Ребята подскажите как в советнике прописать машку привязанную к индикатору на графике типа "Previous Indicator`s Data"?
Если речь идёт о MQL4, то:
Нужно создать массив, развернуть индексацию, заполнить его данными индикатора, вызвать iMAOnArray для получения данных МА, в аргументах указать массив с данными индикатора.
 

medved76

Активный участник
Если речь идёт о MQL4, то:
Нужно создать массив, развернуть индексацию, заполнить его данными индикатора, вызвать iMAOnArray для получения данных МА, в аргументах указать массив с данными индикатора.
Благодарю за ответ!
Я новичок в программировании (от слова совсем новичок), и попробовал это реализовать:

int i,limit;
int counted_bars=IndicatorCounted();
if (counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if(counted_bars==0) limit--;
{
for(i=limit; i>=0; i--)
CCI=iCCI(NULL, NULL,14,Price_Weighted,1);
for(i=limit; i>=0; i--)
RMa=iMAOnArray(CCI,Bars,MAPeriod,0,MAMethod, 1);
}
В правильном ли я направлении двигаюсь?
 

Ugar

Гуру форума
Благодарю за ответ!
Я новичок в программировании (от слова совсем новичок), и попробовал это реализовать:

int i,limit;
int counted_bars=IndicatorCounted();
if (counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if(counted_bars==0) limit--;
{
for(i=limit; i>=0; i--)
CCI=iCCI(NULL, NULL,14,Price_Weighted,1);
for(i=limit; i>=0; i--)
RMa=iMAOnArray(CCI,Bars,MAPeriod,0,MAMethod, 1);
}
В правильном ли я направлении двигаюсь?
Да, направление правильное, но до правильного кода далеко.
Речь, вроде, шла о советнике, а для примера взят код индикатора. Первые 5 строк применяются именно в индикаторах.
CCI это переменная, а должен быть массив.

Для начала надо правильно поставить задачу. Что надо получить. Сколько баров МА и какие надо. Соответственно и посчитать сколько баров CCI понадобится для вычисления данных МА. Соответствующего размера нужен массив CCI.
Вы цикле этот массив заполнить данными iCCI.
Потом вызвать iMAOnArray сколько раз, сколько баров надо МА.
Можно и в цикле вызывыать, но тогда RMa надо не переменную, а массив.
 
Последнее редактирование:

medved76

Активный участник
Да, направление правильное, но до правильного кода далеко.
Речь, вроде, шла о советнике, а для примера взят код индикатора. Первые 5 строк применяются именно в индикаторах.
CCI это переменная, а должен быть массив.

Для начала надо правильно поставить задачу. Что надо получить. Сколько баров МА и какие надо. Соответственно и посчитать сколько баров CCI понадобится для вычисления данных МА. Соответствующего размера нужен массив CCI.
Начинал с написания индикатора - чтобы попрактиковаться... И кое что получилось. Но теперь пытаюсь на платформе простого терминального советника реализовать эту привязку. И всё, дальше никак... Если можете какой нибудь простенький образец кода для связки CCI и MA. Заранее благодарю!
 

gravity

Местный знаток
Начинал с написания индикатора - чтобы попрактиковаться... И кое что получилось. Но теперь пытаюсь на платформе простого терминального советника реализовать эту привязку. И всё, дальше никак... Если можете какой нибудь простенький образец кода для связки CCI и MA. Заранее благодарю!
Наверное что-то подобное, но могу ошибаться.
Тут только Rsi строится по Roc.
И лучше скачать изначальный инд.
 

Ugar

Гуру форума
Начинал с написания индикатора - чтобы попрактиковаться... И кое что получилось. Но теперь пытаюсь на платформе простого терминального советника реализовать эту привязку. И всё, дальше никак... Если можете какой нибудь простенький образец кода для связки CCI и MA. Заранее благодарю!
Вот кусочек кода. МА1_1 считается по данным МА1.
Тут не всё. Как пример в каком направлении двигаться.
Код:
Expand Collapse Copy
double MA1[], MA1_1;
ArrayResize(MA1,LenMA1);
ArraySetAsSeries(MA1,true);
for(int i=0; i<LenMA1; i++)
      {
      MA1[i]=iMA(_symb,TF_MA,PeriodMA1,ShiftMA1,MethodMA1,PriceMA1,i);
      }
   MA1_1=iMAOnArray(MA1,0,PeriodMA1_1,ShiftMA1_1,MethodMA1_1,0);
 
Последнее редактирование:

griz

Активный участник
Здравствуйте. При появлении сигнала воспроизводится звуковой файл. Проблема в том, что при поступлении нового тика звуковой файл начинает воспроизводится заново, не успев полностью воспроизвестись. Как сделать проверку на полное воспроизведение звукового файла? Т.е. чтобы при поступлении нового тика, звуковой файл не начинал воспроизводиться, прока полностью не отыграла предыдущее воспроизведение.
 

Ugar

Гуру форума
Здравствуйте. При появлении сигнала воспроизводится звуковой файл. Проблема в том, что при поступлении нового тика звуковой файл начинает воспроизводится заново, не успев полностью воспроизвестись. Как сделать проверку на полное воспроизведение звукового файла? Т.е. чтобы при поступлении нового тика, звуковой файл не начинал воспроизводиться, прока полностью не отыграла предыдущее воспроизведение.
Воспроизведение многозадачное. Сколько запущено столько и воспроизводится.
Если известно время звучания файла, то можно не запускать воспроизведение нового файла, пока не закончится время с начала воспроизведения.
 
  • Like
Реакции: griz

gravity

Местный знаток
👋 И снова здравствуйте)

Как всегда, пробовал подправить инд. Надо было сделать гистограмму и стрелки на чарт. Гистограмму получил заменив
#property indicator_chart_window на #property indicator_separate_window.

Стрелки вставил, условия прописал, стрелки не отображаются. Сижу с час, пока так и не смог найти в чём причина.
Недоделка:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                   Supertrend.mq4 |
//|                   Copyright © 2005, Jason Robinson (jnrtrading). |
//|                                      http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link      "http://www.jnrtrading.co.uk"
#property strict

//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2

extern int History = 750;  // История
extern int CCIperiod =50;
extern int ATRperiod =5;
extern int applied_price=5;
extern int SIGNAL_BAR = 2;    //Номер бара, на котором будет искаться изменение сигнала //Alen_T
//= 1 -  пропускает иногда сигналы (из-за перерисовки)
extern bool B_S_B = true;     // Чередование сигналов, иначе все - подряд

extern bool    Arr_show   = true; // Отображение стрелок
extern int     Arr_width  = 1;    // Размер стрелок
extern string  ID         = "Supertrend_arrows";// Идентификатор

extern double             arrowsUpperGap   = 0.5; // Отступ верхних стрелок
extern double             arrowsLowerGap   = 0.5; // Отступ нижних стрелок
extern color              arrowsUpColor    = clrRed;// Цвет верхних стрелок
extern color              arrowsDnColor    = clrLime; // Цвет нижних стрелок
extern int                arrowsUpCode     = 234; // Код верхних стрелок
extern int                arrowsDnCode     = 233; // Код нижних стрелок




double TrLine[];
double trend[];
double TrendUp[];
double TrendDown[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(4);
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(0, TrendUp);
   SetIndexLabel(0,"Trend Up");
   SetIndexStyle(1, DRAW_HISTOGRAM);
   SetIndexBuffer(1, TrendDown);
   SetIndexLabel(1,"Trend Down");
   SetIndexBuffer(2, TrLine);
   SetIndexBuffer(3, trend);
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

     ObjectDelete(ID+"Supertrend_arr_up");
     ObjectDelete(ID+"Supertrend_arr_dn");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
 
   int limit, i;
   double cciTrendNow;

   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) counted_bars--;

   limit=Bars-counted_bars;
 
   if (limit > History)
   {
      limit = History;
   }
 
   for(i = limit; i >= 0; i--)
     {cciTrendNow = iCCI(NULL, 0, CCIperiod, applied_price, i);
     
      if (cciTrendNow >= 0)
        {TrLine[i] = NormalizeDouble(Low[i] - iATR(NULL, 0, ATRperiod, i),Digits);  
         if (TrLine[i] < TrLine[i+1])
            {TrLine[i] = TrLine[i+1];
            }
        }
      else if (cciTrendNow <= 0) {
         TrLine[i] = NormalizeDouble(High[i] + iATR(NULL, 0, ATRperiod, i),Digits);
         if (TrLine[i] > TrLine[i+1]) {
            TrLine[i] = TrLine[i+1];
         }
      }
   }
 
for (i=limit; i>=0; i--)
{

        trend[i] = trend[i+1];
        if (TrLine[i]> TrLine[i+1]) trend[i] =1;
        if (TrLine[i]< TrLine[i+1]) trend[i] =-1;
   
    if (trend[i]>0)
    { TrendUp[i] = TrLine[i];
      if (trend[i+1]<0) TrendUp[i+1]=TrLine[i+1];
      TrendDown[i] = EMPTY_VALUE;
    }
    else            
    if (trend[i]<0)
    {
      TrendDown[i] = TrLine[i];
      if (trend[i+1]>0) TrendDown[i+1]=TrLine[i+1];
      TrendUp[i] = EMPTY_VALUE;
    }
   
         //-------------------------------------------------------------------+
       
         if(Arr_show)

                  {
                        if(TrendUp[i] != EMPTY_VALUE && TrendUp[i+1] == EMPTY_VALUE)
                        drawArrow(i,"Supertrend_arr_up",arrowsUpColor,arrowsUpCode,Arr_width,false);
                        else ObjectDelete(ID+"Supertrend_arr_up"+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
                       
                        if(TrendDown[i] != EMPTY_VALUE && TrendDown[i+1] == EMPTY_VALUE)
                        drawArrow(i,"Supertrend_arr_dn",arrowsDnColor,arrowsDnCode,Arr_width,true);
                        else ObjectDelete(ID+"Supertrend_arr_dn"+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
       
                  }

         //-------------------------------------------------------------------+            
}
static int PrevSignal = 0;
static datetime PrevTime = 0;
//---- Если баром для анализа выбран не 0-й, нам нет смысла проверять сигнал
//---- несколько раз. Если не начался новый бар, выходим.
      if(SIGNAL_BAR > 0 && Time[0] <= PrevTime )
          return(0);  
//---- Отмечаем, что этот бар проверен
      PrevTime = Time[0];
//---- Если предыдущий сигнал был СЕЛЛ или это первый запуск (PrevSignal=0)
      if(PrevSignal <= 0 || !B_S_B)
      {
        if (TrendUp[SIGNAL_BAR]!= EMPTY_VALUE && TrendUp[SIGNAL_BAR+1] == EMPTY_VALUE)
        {
            PrevSignal = 1;
            Alert("Supertrend ",Period()," ",Symbol()," BUY");
//              Print("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  BUY!!!");   //Вывод в журнал
//              Comment("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  BUY!!!"); //Вывод на экран
//              PlaySound("Alert.wav");                                                //Проигрывание сигнала
       
        }
      }
      if(PrevSignal >= 0 || !B_S_B)
      {
        if (TrendDown[SIGNAL_BAR] != EMPTY_VALUE && TrendDown[SIGNAL_BAR+1] == EMPTY_VALUE)
        {
            PrevSignal = -1;
            Alert("Supertrend ",Period()," ",Symbol()," SELL");
//              Print("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//              Comment("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//              PlaySound("Alert.wav");

        }
      }
     
//----

   return(0);
  }
//+------------------------------------------------------+


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

void drawArrow(int i,string N,color theColor,int theCode, int ArrowSize,bool up)
{
   string name = ID+N+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);
   double gap  = iATR(NULL,0,20,i);  
 
      //
      //
      //
      //
      //
     
         ObjectCreate(name,OBJ_ARROW,0,Time[i],0);
         ObjectSet   (name,OBJPROP_ARROWCODE,theCode);
         ObjectSet   (name,OBJPROP_COLOR,theColor);
         ObjectSet   (name, OBJPROP_WIDTH,ArrowSize);
         if (up)
               ObjectSet(name,OBJPROP_PRICE1,Low[i] - arrowsLowerGap * gap);
         else  ObjectSet(name,OBJPROP_PRICE1,High[i]  + arrowsUpperGap * gap);
}

//---------------------------------------------------------------------+
 
Последнее редактирование:

DomovenokBrest

♔♕♖♗♘♙
👋 И снова здравствуйте)

Как всегда, пробовал подправить инд. Надо было сделать гистограмму и стрелки на чарт. Гистограмму получил заменив
#property indicator_chart_window на #property indicator_separate_window.

Стрелки вставил, условия прописал, стрелки не отображаются. Сижу с час, пока так и не смог найти в чём причина.
Недоделка:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                   Supertrend.mq4 |
//|                   Copyright © 2005, Jason Robinson (jnrtrading). |
//|                                      http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link      "http://www.jnrtrading.co.uk"
#property strict

//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2

extern int History = 750;  // История
extern int CCIperiod =50;
extern int ATRperiod =5;
extern int applied_price=5;
extern int SIGNAL_BAR = 2;    //Номер бара, на котором будет искаться изменение сигнала //Alen_T
//= 1 -  пропускает иногда сигналы (из-за перерисовки)
extern bool B_S_B = true;     // Чередование сигналов, иначе все - подряд

extern bool    Arr_show   = true; // Отображение стрелок
extern int     Arr_width  = 1;    // Размер стрелок
extern string  ID         = "Supertrend_arrows";// Идентификатор

extern double             arrowsUpperGap   = 0.5; // Отступ верхних стрелок
extern double             arrowsLowerGap   = 0.5; // Отступ нижних стрелок
extern color              arrowsUpColor    = clrRed;// Цвет верхних стрелок
extern color              arrowsDnColor    = clrLime; // Цвет нижних стрелок
extern int                arrowsUpCode     = 234; // Код верхних стрелок
extern int                arrowsDnCode     = 233; // Код нижних стрелок




double TrLine[];
double trend[];
double TrendUp[];
double TrendDown[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(4);
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(0, TrendUp);
   SetIndexLabel(0,"Trend Up");
   SetIndexStyle(1, DRAW_HISTOGRAM);
   SetIndexBuffer(1, TrendDown);
   SetIndexLabel(1,"Trend Down");
   SetIndexBuffer(2, TrLine);
   SetIndexBuffer(3, trend);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

     ObjectDelete(ID+"Supertrend_arr_up");
     ObjectDelete(ID+"Supertrend_arr_dn");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {

   int limit, i;
   double cciTrendNow;

   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) counted_bars--;

   limit=Bars-counted_bars;

   if (limit > History)
   {
      limit = History;
   }

   for(i = limit; i >= 0; i--)
     {cciTrendNow = iCCI(NULL, 0, CCIperiod, applied_price, i);
    
      if (cciTrendNow >= 0)
        {TrLine[i] = NormalizeDouble(Low[i] - iATR(NULL, 0, ATRperiod, i),Digits); 
         if (TrLine[i] < TrLine[i+1])
            {TrLine[i] = TrLine[i+1];
            }
        }
      else if (cciTrendNow <= 0) {
         TrLine[i] = NormalizeDouble(High[i] + iATR(NULL, 0, ATRperiod, i),Digits);
         if (TrLine[i] > TrLine[i+1]) {
            TrLine[i] = TrLine[i+1];
         }
      }
   }

for (i=limit; i>=0; i--)
{

        trend[i] = trend[i+1];
        if (TrLine[i]> TrLine[i+1]) trend[i] =1;
        if (TrLine[i]< TrLine[i+1]) trend[i] =-1;
  
    if (trend[i]>0)
    { TrendUp[i] = TrLine[i];
      if (trend[i+1]<0) TrendUp[i+1]=TrLine[i+1];
      TrendDown[i] = EMPTY_VALUE;
    }
    else           
    if (trend[i]<0)
    {
      TrendDown[i] = TrLine[i];
      if (trend[i+1]>0) TrendDown[i+1]=TrLine[i+1];
      TrendUp[i] = EMPTY_VALUE;
    }
  
         //-------------------------------------------------------------------+
      
         if(Arr_show)

                  {
                        if(TrendUp[i] != EMPTY_VALUE && TrendUp[i+1] == EMPTY_VALUE)
                        drawArrow(i,"Supertrend_arr_up",arrowsUpColor,arrowsUpCode,Arr_width,false);
                        else ObjectDelete(ID+"Supertrend_arr_up"+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
                      
                        if(TrendDown[i] != EMPTY_VALUE && TrendDown[i+1] == EMPTY_VALUE)
                        drawArrow(i,"Supertrend_arr_dn",arrowsDnColor,arrowsDnCode,Arr_width,true);
                        else ObjectDelete(ID+"Supertrend_arr_dn"+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
      
                  }

         //-------------------------------------------------------------------+           
}
static int PrevSignal = 0;
static datetime PrevTime = 0;
//---- Если баром для анализа выбран не 0-й, нам нет смысла проверять сигнал
//---- несколько раз. Если не начался новый бар, выходим.
      if(SIGNAL_BAR > 0 && Time[0] <= PrevTime )
          return(0); 
//---- Отмечаем, что этот бар проверен
      PrevTime = Time[0];
//---- Если предыдущий сигнал был СЕЛЛ или это первый запуск (PrevSignal=0)
      if(PrevSignal <= 0 || !B_S_B)
      {
        if (TrendUp[SIGNAL_BAR]!= EMPTY_VALUE && TrendUp[SIGNAL_BAR+1] == EMPTY_VALUE)
        {
            PrevSignal = 1;
            Alert("Supertrend ",Period()," ",Symbol()," BUY");
//              Print("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  BUY!!!");   //Вывод в журнал
//              Comment("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  BUY!!!"); //Вывод на экран
//              PlaySound("Alert.wav");                                                //Проигрывание сигнала
      
        }
      }
      if(PrevSignal >= 0 || !B_S_B)
      {
        if (TrendDown[SIGNAL_BAR] != EMPTY_VALUE && TrendDown[SIGNAL_BAR+1] == EMPTY_VALUE)
        {
            PrevSignal = -1;
            Alert("Supertrend ",Period()," ",Symbol()," SELL");
//              Print("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//              Comment("MTF_Supertrend (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//              PlaySound("Alert.wav");

        }
      }
    
//----

   return(0);
  }
//+------------------------------------------------------+


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

void drawArrow(int i,string N,color theColor,int theCode, int ArrowSize,bool up)
{
   string name = ID+N+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);
   double gap  = iATR(NULL,0,20,i); 

      //
      //
      //
      //
      //
    
         ObjectCreate(name,OBJ_ARROW,0,Time[i],0);
         ObjectSet   (name,OBJPROP_ARROWCODE,theCode);
         ObjectSet   (name,OBJPROP_COLOR,theColor);
         ObjectSet   (name, OBJPROP_WIDTH,ArrowSize);
         if (up)
               ObjectSet(name,OBJPROP_PRICE1,Low[i] - arrowsLowerGap * gap);
         else  ObjectSet(name,OBJPROP_PRICE1,High[i]  + arrowsUpperGap * gap);
}

//---------------------------------------------------------------------+
я запостил в теме код. правда правил не Ваш...
 

1_Lexa

Активный участник
Здравствуйте Уважаемые программисты! Можете это посмотреть и исправить для мт4?
 

Вложения

  • stup.mq4
    stup.mq4
    32,8 КБ · Просмотры: 13

griz

Активный участник
Здравствуйте. Не получается корректно сохранить значение в глобальную переменную GlobalVariables. Сохраняю в глобальную переменную значение 132583223415320869 - это ChartID. А в результате сохраняется 132583223415320864, последняя цифра другая.

Открыто два чарта, id первого чарта нормально сохраняется в глобальную переменную, а id второго чарта сохраняется с измененной последней цифрой. Подскажите, как нормально сохранить id второго чарта в глобальную переменную.
 

AlexeyVik

Программист mql4 mql5
Здравствуйте. Не получается корректно сохранить значение в глобальную переменную GlobalVariables. Сохраняю в глобальную переменную значение 132583223415320869 - это ChartID. А в результате сохраняется 132583223415320864, последняя цифра другая.

Открыто два чарта, id первого чарта нормально сохраняется в глобальную переменную, а id второго чарта сохраняется с измененной последней цифрой. Подскажите, как нормально сохранить id второго чарта в глобальную переменную.
Глобальные переменные терминала хранят значения типа double. По памяти я не помню значение DBL_MAX, но можно в документации посмотреть. Или просто раздели это число на миллион, например, и при чтении умножь с принудительным приведением типа.
 

griz

Активный участник
Глобальные переменные терминала хранят значения типа double. По памяти я не помню значение DBL_MAX, но можно в документации посмотреть. Или просто раздели это число на миллион, например, и при чтении умножь с принудительным приведением типа.
Если id чарта (поделенное на 1кк) сохранять с типом double в глобальную переменную, то в глобальной переменной окажется целое число, а весь хвост отвалится. Пока что, разделил id на две части и сохранил в двух глобальных переменных.
 

AlexeyVik

Программист mql4 mql5
Если id чарта (поделенное на 1кк) сохранять с типом double в глобальную переменную, то в глобальной переменной окажется целое число, а весь хвост отвалится. Пока что, разделил id на две части и сохранил в двух глобальных переменных.
Как отвалится? Это ведь не ящерица……… Поищи сколько знаков после запятой хранит double число. Просто надо правильно делить. Если ID чарта имеет тип long и делить на целочисленное число 1000000, то конечно получишь целочисленное значение. Но если long делить на 1000000.0 и сунуть это частное в переменную типа double с явным приведением типа, то получишь желаемое. И обратно, умножая на 1000000 явно привести к типу long.
 
Верх