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

wolder1
12
wolder1  
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
Oleg Bondarev
168
Oleg Bondarev  
Aleksey Mavrin:
Если вы говорите что практически ноль в программировании, то зачем вы берётесь за такие задачи нестандартные, может с простых начать? Ну или подтянуть знания базовые? Проще чтоб сделали тут за вас, да.

Я же не писал: "Сделайте мне индикатор". Просил помочь. Не стоит цели полностью освоить mql4. Просто проверяю идеи. С excel уже намучался)

Igor Makanu
9021
Igor Makanu  
Oleg Bondarev:

Я предупредил что "колхозник")

Вот так сделал.

Теперь рисует тиковый график, но есть какие-то разрывы линии.

Я в 4-ке делаю.

разрывы линий это значит, что в Label1Buffer[ХХХ] нет значений

и второе, я писал выше, еще раз - индикаторный буферLabel1Buffer ) управляется терминалом, если появится новый бар то значения все сдвинутся автоматически - на М1 код запустите и понаблюдайте

ЗЫ: не кохозник, а тот кто пытается самостоятельно научиться! ))))

Oleg Bondarev
168
Oleg Bondarev  
Igor Makanu:

разрывы линий это значит, что в Label1Buffer[ХХХ] нет значений

и второе, я писал выше, еще раз - индикаторный буферLabel1Buffer ) управляется терминалом, если появится новый бар то значения все сдвинутся автоматически - на М1 код запустите и понаблюдайте

ЗЫ: не кохозник, а тот кто пытается самостоятельно научиться! ))))

Label1Buffer[ХХХ] - это значит 3-х составное число?


Igor Makanu
9021
Igor Makanu  
Oleg Bondarev:

Label1Buffer[ХХХ] - это значит 3-х составное число?


нет, это я написал первые буквы что вспомнил

это цифра, которая номер элемента

посмотрите свой код, Вы по аналогии с моим циклом написали свой, где смещаете на один элемент индикаторный буфер Label1Buffer - заметьте каждый вызов индикатора (каждый тик)

и после того как сместили содержимое  Label1Buffer присваиваете Label1Buffer[0] новое значение 

а какие значения будут в остальных элементах? при первом запуске в них будет "пустое значение" (EMPTY_VALUE) , потом один раз сдвинете и присвоите новое значение.... а потом еще и сам терминал сдвинет ВСЕ значения  Label1Buffer когда появится новый бар


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

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=10;
//--- indicator buffers
double         line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   IndicatorDigits(Digits);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
  int i,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0){
      limit=rates_total-1;
   }else
      limit=rates_total-prev_calculated+1; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for(i=limit; i>=0; i--){
      line1Buffer[i]=close[i];
    }
//---
  return(rates_total);

  }
//+------------------------------------------------------------------+
Oleg Bondarev
168
Oleg Bondarev  
Я понял Вас. Нужно подумать. Спасибо!
Alexandr Sokolov
4295
Alexandr Sokolov  

Как записывать данные в Excel? - MQL5

Формат файла Excel - xlsx , а функция FileOpen создаёт и работает с файлами типа txt и csv


Мне нужно после тестирования в OnTester выгрузить данные из буферов, в которых содержатся история разных данных в момент когда была открыта позиция на каждом тике, и потом вывести данные всех сделок на один график
Как вы понимаете данных будет много даже для одной сделки, не говоря уже обо всех сделках - поэтому вариант "вручную переносить" не подходит


Что порекомендуете?

Alexandr Sokolov
4295
Alexandr Sokolov  
Alexandr Sokolov:

Как записывать данные в Excel? - MQL5

Формат файла Excel - xlsx , а функция FileOpen создаёт и работает с файлами типа txt и csv


Мне нужно после тестирования в OnTester выгрузить данные из буферов, в которых содержатся история разных данных в момент когда была открыта позиция на каждом тике, и потом вывести данные всех сделок на один график
Как вы понимаете данных будет много даже для одной сделки, не говоря уже обо всех сделках - поэтому вариант "вручную переносить" не подходит


Что порекомендуете?

Вообщем суть оказалась простой - с помощью MQL5 записать программно напрямую что либо в файл Excel не получится, но зато в самом Excel можно импортировать данные из текстового файла во вкладке "данные" >>> "из текста"

ukrop1203
29
ukrop1203  
Здравствуйте, после окончания теста експерта я получаю ошибку об неудаленных обьектах, при этом абсолютно все обьекты я создаю, насколько я понимаю, в стеке, тоесть без new. Обьясните пожалуйста данный вопрос.
Igor Makanu
9021
Igor Makanu  
Alexandr Sokolov:

Что порекомендуете?

пишите в .csv и открывайте в Excel