Ошибки, баги, вопросы - страница 2458

 
Vladimir Pastushak:

При смене графика / периода PBB получает значение 10, не зависимо от того какое значение вы указали в поле ввода.

В момент переинициализации происходит так как будто это первый запуск.

Решить Вашу задачу можно двумя спсобами

1 - хранить значение PBB в глобальных переменных терминала и получать период оттуда

2 - В момент срабатывания ОнЧартЕвент делать переинициализацию индикатора MA и получать новый хендл...

Проверил все варианты. Не работает.

Недоработка в программе MQL5.

 Не инициализируются новые значения. Только с параметром input int PBB_=. Других вариантов нет. Совсем плохо.

 
Uladzimir Izerski:

Проверил все варианты. Не работает.

Недоработка в программе MQL5.

 Не инициализируются новые значения. Только с параметром input int PBB_=. Других вариантов нет. Совсем плохо.

В MQL все хорошо, просто Вы не понимаете что делаете в коде и как все работает...

Еще раз повторяю, при вызове ChartSetSymbolPeriod(0,_Symbol,_Period);   

Вы сбрасываете все на по умолчанию...

Как вариант попробуйте в ините запросить значение из Вашего текстового поля.

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

 
Vladimir Pastushak:

В MQL все хорошо, просто Вы не понимаете что делаете в коде и как все работает...

Еще раз повторяю, при вызове ChartSetSymbolPeriod(0,_Symbol,_Period);   

Вы сбрасываете все на по умолчанию...

Как вариант попробуйте в ините запросить значение из Вашего текстового поля.

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

Пробовал и из текстового поля и через GlobalVariable и что только не пробовал. Глухо как в танке.

В другом варианте OnCalculate работает без проблем.

 
Uladzimir Izerski:

Пробовал и из текстового поля и через GlobalVariable и что только не пробовал. Глухо как в танке.

В другом варианте OnCalculate работает без проблем.

Значит что то не то делаете

 
В службу поддержки уже обращался.Посоветовали написать в форум.При подключении к счету открывается окошко и пишется,что я не должен читать не подготовленные "ряды",хотя и написано,что авторизация разрешает подключение к счету...Что делать?Посоветуйте...
 
Vladimir Pastushak:

Значит что то не то делаете

Так уже код выложил.

Если Я неумека, кто то должен быть профи. Покуда не вижу.

Принимаю ваше старание найти ответ. Тут глубже в понимании. Т.е. на уровне разработчиков.

 
Uladzimir Izerski:

Что?

Никто мой вопрос  не осилит?

А чего там осиливать? Вынеси всё что в OnInit в отдельную функцию, пусть будет MyOnInit. Из OnInit вызывайте MyOnInit и из OnChartEvent после изменения поля ввода.

Это основное, может ещё чего-то понадобится. У меня в маркете есть бесплатный индикатор который красит бары или свечи по условию что MACD выше или ниже нуля. А вот если переключить график на линию, то уже меняется количество необходимых буферов. Решение найдено именно таким способом.

 
Uladzimir Izerski:

Так уже код выложил.

Если Я неумека, кто то должен быть профи. Покуда не вижу.

Принимаю ваше старание найти ответ. Тут глубже в понимании. Т.е. на уровне разработчиков.


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

//+------------------------------------------------------------------+
//|                                                      Probe_2.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property description "The MA "
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot MA1
#property indicator_label1  "MA 1"

#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1


//--- input parameters
extern int PBB=10;  //  период МА
//--- indicator buffers
double         BufferMA1[];
//--- global variables
int            period_ma1;
int            period_max;

int            handle_ma1;
string sn,sPBB;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

   sPBB=IntegerToString(PBB);
   if(ObjectFind(0,"P2edit")!=0)
     {
      ObjectCreate(0,"P2edit",OBJ_EDIT,0,0,0);
      ObjectSetInteger(0,"P2edit",OBJPROP_XDISTANCE,300);
      ObjectSetInteger(0,"P2edit",OBJPROP_YDISTANCE,1);
      ObjectSetInteger(0,"P2edit",OBJPROP_XSIZE,70);
      ObjectSetInteger(0,"P2edit",OBJPROP_YSIZE,40);
      ObjectSetInteger(0,"P2edit",OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,"P2edit",OBJPROP_BGCOLOR,clrBlack);
      ObjectSetString(0,"P2edit",OBJPROP_TEXT,sPBB);
      ObjectSetInteger(0,"P2edit",OBJPROP_FONTSIZE,16);
      ObjectSetInteger(0,"P2edit",OBJPROP_COLOR,clrGray);
      ObjectSetInteger(0,"P2edit",OBJPROP_ALIGN,ALIGN_CENTER);
      ObjectSetInteger(0,"P2edit",OBJPROP_READONLY,false);
     }
//=================//
//
   else
     {
      string get_text=ObjectGetString(0,"P2edit",OBJPROP_TEXT);
      PBB=(int)StringToInteger(get_text);
     }
//
//=================//

//--- set global variables
   period_ma1=int(PBB<1 ? 1 : PBB);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMA1,INDICATOR_DATA);
   ArraySetAsSeries(BufferMA1,true);
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- create handle
   ResetLastError();

   Comment("Должна соответствовать зеленой, а равна= ",period_ma1);

   handle_ma1=iMA(Symbol(),PERIOD_CURRENT,period_ma1,0,1,PRICE_CLOSE);
   if(handle_ma1==INVALID_HANDLE)
     {
      Print("The iMA(",(string)period_ma1,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT)
     {
      string obj_name=sparam;
      if(StringCompare(obj_name,"P2edit")==0)
        {
         string novPBB=NULL;
         if(ObjectGetString(0,obj_name,OBJPROP_TEXT,0,novPBB))
           {
            if(StringCompare(novPBB,sPBB,false))
              {
               PBB=(int)StringToInteger(novPBB);
               ObjectSetInteger(0,"P2edit",OBJPROP_BGCOLOR,clrBlack);
               ObjectSetInteger(0,"P2edit",OBJPROP_COLOR,clrLime);
              }
           }

         //=================//
         //
         OnInit();
         //
         //=================//

         Print(TimeLocal(),"   ",ChartSetSymbolPeriod(0,Symbol(),PERIOD_CURRENT),"  ",BufferMA1[0]);
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//    Пробовал от сюда запускать.
//   sPBB=IntegerToString(PBB);
//   if(ObjectFind(0,"P2edit")!=0)
//    {
//       ObjectCreate(0,"P2edit",OBJ_EDIT,0,0,0);
//       ObjectSetInteger(0,"P2edit",OBJPROP_XDISTANCE,300);
//       ObjectSetInteger(0,"P2edit",OBJPROP_YDISTANCE,1);
//       ObjectSetInteger(0,"P2edit",OBJPROP_XSIZE,70);
//       ObjectSetInteger(0,"P2edit",OBJPROP_YSIZE,40);
//       ObjectSetInteger(0,"P2edit",OBJPROP_SELECTABLE,false);
//       ObjectSetInteger(0,"P2edit",OBJPROP_BGCOLOR,clrBlack);
//       ObjectSetString (0,"P2edit",OBJPROP_TEXT,sPBB);
//       ObjectSetInteger(0,"P2edit",OBJPROP_FONTSIZE,16);
//       ObjectSetInteger(0,"P2edit",OBJPROP_COLOR,clrGray);
//       ObjectSetInteger(0,"P2edit",OBJPROP_ALIGN,ALIGN_CENTER);
//       ObjectSetInteger(0,"P2edit",OBJPROP_READONLY,false);
//    } 
//   
//   if(PBB==0) PBB=(int)StringToInteger(sPBB);
// 
//   if(PBB<5) period_ma1=5; else  period_ma1=PBB;
//   if(PBB>300) period_ma1=300; else  period_ma1=PBB;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

   ArraySetAsSeries(close,true);//--- Установка массивов буферов как таймсерий
//--- Проверка количества доступных баров
   if(rates_total<fmax(period_max,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferMA1,EMPTY_VALUE);
     }

//--- Подготовка данных
   int count=(limit>0 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_ma1,0,0,count,BufferMA1);
   if(copied!=count) return 0;

//Comment("ошибка = ");

//--- возвращаемое значение prev_calculated для следующего вызова
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|            deinit                                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   int i;
   int obj_total=ObjectsTotal(0,0,-1);
   for(i=obj_total-1;i>=0;i--)
     {
      sn=ObjectName(0,i,0,-1);
      if(ObjectFind(0,sn)==0)
        {
         if(StringFind(sn,"P2edit",0)==0) ObjectDelete(0,sn);
        }
     }

   Comment("");
   return;
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak:

Уважаю за старания.

Удачно. 

Благодарен. Откровенно.

 
Vladimir Pastushak:

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


Да. Порой этот простой свободных ядер занимает много времени при оптимизации по реальным тикам.

Может разработчики смогут решить эту проблему?