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

Dobryj

Почетный гражданин
Вам следует изменить логику работы с линиями. В коде Вы прописываете имя конкретной линии, т.е., линии с именем "1" - установить на графике более двух линий с одинаковым именем не получится - легко проверяется в терминале. Вам следует к имени линии прибавить префикс, т.е., имя будет состоять из двух частей. В цикле следует перебирать все линии с заданным префиксом по времени. Как только текущие время совпадет с временем линии - ставите позицию, и именно эту линию, после установки позиции - удалить. У оставшихся линий время будет больше текущего - ничего не установится.
da no ja nanoshu na grafik linii samostojatelno i zadaju im imena (1..2..3..4.........8..9..10......)
posle w kode tolko s4itywaju wremia dlia ras4etow
perwaja sdelka s liniej 1 otkrywaetsia a 2aja s liniej 2 net....
 

mobidik

-----
Все верно, у Вас контроль происходит только для линии с именем "1", на любое другое имя не будет никакой реакции. Вот вам пример кода для вертикальных линий с именами от "0" до "99":
C-подобный:
Expand Collapse Copy
    string CurLine = "";
    string NameLine = "";
    
    int l = 0;
    for(int i=0; i<ObjectsTotal()-1; i++)
     {
       NameLine = ObjectName(i);
        
       if(ObjectType(NameLine)!=OBJ_VLINE) continue;
       if(ObjectGetInteger(0,NameLine,OBJPROP_TIME)==Time[0])
        while(l<100)
         {
           if(NameLine==(string)l)
            {
              CurLine = NameLine;
              break;
            } 
           l++;
         }
          
       if(CurLine!="") break;
     }
    
    int ticket = 0;
    
    if(CurLine!="")
     {
       Alert("Yes, Now time my line !!!");
      
       if(Open[1]>Close[1])
        ticket = OrderSend(Symbol(),OP_BUY,NormalizeDouble(0.1,2),NormalizeDouble(Ask,Digits),0,0,0,"SetLine-"+CurLine,123,0,clrBlue);
        
       if(Open[1]<Close[1])
        ticket = OrderSend(Symbol(),OP_SELL,NormalizeDouble(0.1,2),NormalizeDouble(Bid,Digits),0,0,0,"SetLine-"+CurLine,123,0,clrRed);
      
       if(Open[1]==Close[1] || ticket>0)  ObjectDelete(CurLine);
     }
  }
 

1_Lexa

Активный участник
Здравствуйте!
У меня такой код
void init()
{
Symb=Symbol();
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01)
DG=2;
if(MarketInfo(Symb,MODE_LOTSTEP)==0.1)
DG=1;
if(CommetSize>0)
ArrayResize(CommentBox,CommetSize);
for(i=0; i<CommetSize; i++)
CommentBox="";
lt[0]=NormalizeDouble(lot,DG);
step[0]=step_1;
for(i=1; i<30; i++)
{
if(i<set_2)
{
lt=NormalizeDouble(lt[i-1]*lot_factor_1,DG);
if(lt>lt[0]*Layer_Multiplier)
lt=lt[0]*Layer_Multiplier;
step=step_1;
}
else
{
lt=NormalizeDouble(lt[i-1]*lot_factor_2,DG);
if(lt>lt[0]*Layer_Multiplier)
lt=lt[0]*Layer_Multiplier;
step=step_2;
}
if(i>=set_3-1)
lt_h=NormalizeDouble(lt*(hedje_factor+hedje_plus*(set_3-1-i)),DG);
if(lt_h>lt[0]*Layer_Multiplier)
lt_h=lt[0]*Layer_Multiplier;
}
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb)
{
if(OrderMagicNumber()==magic && TimeB<OrderOpenTime())
TimeB=OrderOpenTime();
if(OrderMagicNumber()==magic2 && TimeS<OrderOpenTime())
TimeS=OrderOpenTime();
}
}
return;
}
И выдает
'-' - integer expression expected

'i' - integer expression expected
ошибки. Как это исправить?
string Symb,CommentBox[],cm2; это записано в основании
 

1_Lexa

Активный участник
Я нашел, у меня datetime i, Ticket, DG, LastError, TimeB, TimeS; здесь была ошибка
 

1_Lexa

Активный участник
При строгом компилировании у меня выходят другие ошибки,
'k' - undeclared identifier эта и предупреждения, можете в этом помочь?
 

Вложения

Dersu

Местный знаток
iCustom(NULL,0,"SampleInd",13,1,0);
вызывает из общей папки Индикаторы
а как вызвать из вложеной папки?
Например Новая папка
Чет призабыл
 

gravity

Местный знаток
iCustom(NULL,0,"SampleInd",13,1,0);
вызывает из общей папки Индикаторы
а как вызвать из вложеной папки?
Например Новая папка
Чет призабыл
iCustom(NULL,0,"Новая папка\\SampleInd",13,1,0);
 

Вложения

  • Screenshot_2.jpg
    Screenshot_2.jpg
    78,4 КБ · Просмотры: 10

AutomaticJ

Местный знаток
iCustom(NULL,0,"SampleInd",13,1,0);
вызывает из общей папки Индикаторы
а как вызвать из вложеной папки?
Например Новая папка
Чет призабыл
Имя пользовательского индикатора, содержащее путь относительно корневой директории индикаторов (MQL4/Indicators/). Если индикатор находится в поддиректории, например, в MQL4/Indicators/Examples, то имя должно выглядеть соответственно, а именно – "Examples\\имя_индикатора" (обязательно указание двойного обратного слеша вместо одиночного в качестве разделителя).
ПыСы. Взято из справки. Читайте справку, там ответы на все вопросы.
 

Xuligan

Интересующийся
Как определить на истории баров вертикальную линию в диапазоне 1 - 30 свечей от текущего бара на текущем периоде и на периоде выше и ниже?
если линия имеется, указать номер бара.
подозреваю, что будет 2 варианта.
1 - Линия установлена другим индикатором.
2 - Линия установлена своим индикатором.
При наведении курсора на линию видно имя линии время, цена.
Спасибо.линия2.jpg
 

Ugar

Гуру форума
Как определить на истории баров вертикальную линию в диапазоне 1 - 30 свечей от текущего бара на текущем периоде и на периоде выше и ниже?
если линия имеется, указать номер бара.
подозреваю, что будет 2 варианта.
1 - Линия установлена другим индикатором.
2 - Линия установлена своим индикатором.
При наведении курсора на линию видно имя линии время, цена.
Спасибо.Посмотреть вложение 429968
У вертикальной линии цена не имеет значения, значимо время.
Получить список объектов на графике.
В цикле перебирать все объекты пропуская те что не являются вертикальной линией.
Из времени вертикальных линий вычислить номер бара.
Игнорировать линии на барах за более 30.
 

Xuligan

Интересующийся
У вертикальной линии цена не имеет значения, значимо время.
Получить список объектов на графике.
В цикле перебирать все объекты пропуская те что не являются вертикальной линией.
Из времени вертикальных линий вычислить номер бара.
Игнорировать линии на барах за более 30.
Замечательно! и код бы еще в придачу для примера...
 

Ugar

Гуру форума
Замечательно! и код бы еще в придачу для примера...
int obj_total=ObjectsTotal(), line_bar;
string name;
for(int i=0;i<obj_total;i++)
{
name = ObjectName(i);
if(ObjectType(name)!=OBJ_VLINE)continue;
line_bar=iBarShift(NULL,0,(int)ObjectGet(name,OBJPROP_TIME1));
if(line_bar>30)continue;
Print(name," Bar=",line_bar);
}
 

Xuligan

Интересующийся
Просто великолепно!!! Теперь буду пытать код в хвост и в гриву. (y)(y)(y)
 

Xuligan

Интересующийся
Теперь буду пытать код
Код рабочий, на текущем периоде определяет без замечаний. Теперь стесняюсь спросить, а можно ли не переключая периоды определить номер бара на периоде выше и ниже? Пытал разные варианты и не получилось.
Вписывал периоды типа:
line_bar=iBarShift(NULL,PERIOD_M15,(int)ObjectGet(namx,OBJPROP_TIME1)); int zx1 = line_bar;
line_bar=iBarShift(NULL,PERIOD_M30,(int)ObjectGet(namx,OBJPROP_TIME1)); int zx2 = line_bar;
line_bar=iBarShift(NULL,PERIOD_H1,(int)ObjectGet(namx,OBJPROP_TIME1)); int zx3 = line_bar;
.........
Print (zx1 + zx2 + zx3);
Совсем другие числа выводит, кроме текущего периода.:(
 

AlexeyVik

Программист mql4 mql5
Код рабочий, на текущем периоде определяет без замечаний. Теперь стесняюсь спросить, а можно ли не переключая периоды определить номер бара на периоде выше и ниже? Пытал разные варианты и не получилось.
Вписывал периоды типа:
line_bar=iBarShift(NULL,PERIOD_M15,(int)ObjectGet(namx,OBJPROP_TIME1)); int zx1 = line_bar;
line_bar=iBarShift(NULL,PERIOD_M30,(int)ObjectGet(namx,OBJPROP_TIME1)); int zx2 = line_bar;
line_bar=iBarShift(NULL,PERIOD_H1,(int)ObjectGet(namx,OBJPROP_TIME1)); int zx3 = line_bar;
.........
Print (zx1 + zx2 + zx3);
Совсем другие числа выводит, кроме текущего периода.:(
Чаще читай документацию.
Bars
Запросить количество баров на заданном интервале
Код:
Expand Collapse Copy
int  Bars(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time        // по какую дату
   );

Возвращаемое значение

Если указаны параметры start_time и stop_time, то функция возвращает количество баров в диапазоне дат. Если эти параметры не указаны, то функция возвращает общее количество баров.
 

Xuligan

Интересующийся
Это схема функции Bar. И как ее применить к вышеизложенному с конкретными параметрами? Я в начале пути, мне нужна помощь, а не подзатыльники. Умников много, а учителей единицы.
 

AlexeyVik

Программист mql4 mql5
Это схема функции Bar. И как ее применить к вышеизложенному с конкретными параметрами? Я в начале пути, мне нужна помощь, а не подзатыльники. Умников много, а учителей единицы.
Код:
Expand Collapse Copy
  uint barShift = Bars(_Symbol, PERIOD_CURRENT, iTime(_Symbol, PERIOD_D1, 0), TimeCurrent());
Это будет количество баров от начала текущего дня до нулевого бара текущего ТФ.
То-есть, если сейчас время сервера 10:00 и считать бары будем на ТФ Н1, то barShift будет равен 11. Так как бар 00:00 — это 1, 01:00 — 2 ……… 09:00 — 10 и 10:00 будет одиннадцатым баром.
 

Xuligan

Интересующийся
Благодарствую AlexeyVik !
Так вопрос остался открытым, можно ли не переключая периоды определить номер бара на периоде выше и ниже?
Или это не реально?
 

AlexeyVik

Программист mql4 mql5
Благодарствую AlexeyVik !
Так вопрос остался открытым, можно ли не переключая периоды определить номер бара на периоде выше и ниже?
Или это не реально?
МОЖНО!!! Я ведь дал полностью рабочую строку кода для определения номера бара начала суток на любом ТФ.
Вот индикатор, поставь его на график и посмотри число в комментарии графика, посчитай от начала суток сколько баров.
Все остальные вариации только самостоятельно.
 

Вложения

  • 00.mq4
    00.mq4
    3,8 КБ · Просмотры: 18
Верх