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

vladradon

Программист
можно, имхо умножение быстрее, чем вызов функции
Метаквотовцы постоянно что-то меняют (не всегда в правильном направлении) и _Period в 5-м языке, начиная с таймфрейма Н1, возвращает совсем не количество минут (что очень усложняет переписку на МТ5). В любой момент могут что-то подобное сделать на МТ4 и куча прог просто перестанет работать на половине таймфреймов. Функция PeriodSeconds() одинаково работает в обоих языках и вряд ли можно что-то с ней такое сделать. чтобы расчеты с ее участием внесли неразбериху в расчет программы.
 

srtsrt

Активный участник
они аффтары
в любой момент могут совсем бросить поддержку mql
питон же прикрутили
уже сейчас себе замену на сайте набирают
:О)
 

vladradon

Программист
они аффтары
в любой момент могут совсем бросить поддержку mql
питон же прикрутили
уже сейчас себе замену на сайте набирают
:О)
Иногда даже очень хочется. чтобы бросили поддержку - а то от этой поддержки иногда больше проблем, чем пользы.
А Питона как прикрутили, так и забыли... Питон так и остался на уровне "прикручен"...:rolleyes::ROFLMAO:
 

fxbo

Активный участник
Привет, гуру прогерам!
Кто подскажет где и что поправить.
При выполненных условиях индикатора советник открывает ордер(а) на закрытии текущей свечи за линией канала, а нужно что бы советник открывал НЕ на закрытии текущей свечи, а открывал ордер при достижении предыдущего хая свечи за линией канала в BAY. Для SELL в обратном порядке.

Прмер:
1707301905374.png
 
Последнее редактирование:

MakarFX

Элитный участник
Привет, гуру прогерам!
Кто подскажет где и что поменять.
При выполненных условиях индикатора советник открывает ордер(а) на закрытии текущей свечи за каналом, а нужно что бы советник открывал НЕ на закрытии текущей свечи, а открывал ордер при достижении хая предыдущего хая свечи за каналом.

Прмер6
Посмотреть вложение 535652

if(Bid<=Low[1]) - открыть ордер
 
  • Like
Реакции: fxbo

MakarFX

Элитный участник
А как она знает, что нужно открывать на хаях за линией канала?
Вы писали
При выполненных условиях индикатора советник открывает ордер(а) на закрытии текущей свечи за линией канала
т.е. уже известно что цена за линией канала.
 
  • Like
Реакции: fxbo

MakarFX

Элитный участник
да, индюк канальный, цена вышла за линию канала...
Цена вышла за линию канала и на закрытии свечи Вам известен High/Low закрытой свечи, а дальше проверяете, если Bid коснулся High/Low закрытой свечи, то можно открывать ордер.
 
  • Like
Реакции: fxbo

tolik2008

Почетный гражданин
надо просто, при пробитии канала, записать High/Low в переменную.
открывать ордер, когда цена пробъет переменную.
 

fxbo

Активный участник
if(Bid<=Low[1]) - открыть ордер SELL
if(Bid>=High[1]) - открыть ордер Buy
Сильно не бейте, я только учусь, сделал наверное не то... (((.

У меня прописано как указано ниже. Я менял выделенное жирным на if(Bid>=High[1]) и if(Bid<=Low[1]). При компиляции ошибок НЕ выдало. Но изменений выставление ордеров я не увидел. Ордера выставлялись по старому, на закрытии бара...(((

//----- Глобальные переменные
double op,cl,hi,lo,pr,line,lineup,linedn;

{int spread = (int)MarketInfo(_Symbol,MODE_SPREAD);op = iOpen(_Symbol,tfs,1);cl = iClose(_Symbol,tfs,1);hi = iHigh(_Symbol,tfs,1);lo = iLow(_Symbol,tfs,1);
lineup = iCustom(_Symbol, tfs, indnames, mboof1, mzd);linedn = iCustom(_Symbol, tfs, indnames, mboof2, mzd);line = iCustom(_Symbol, tfs, indnames, mboof3, 0);
if(cl < op && cl < linedn && op > linedn) return(1);if(cl > op && cl > lineup && op < lineup) return(-1);if(Bid >= lineup)return(8);if(Bid <= linedn)return(9);
if( (Bid >= line && Bid < NormalizeDouble(line + spread*_Point,Digits)) || (Bid <= line && Bid > NormalizeDouble(line - spread*_Point,Digits)))return(5);if( (op < line && cl > line) || (op > line && cl < line) ) return(6);if(Bid < lineup && Bid > linedn)return(7);
return(0);}int Signals()
 
Последнее редактирование:

MakarFX

Элитный участник
Сильно не бейте, я только учусь, сделал наверное не то... (((.

У меня прописано как указано ниже. Я менял выделенное жирным на if(Bid>=High[1]) и if(Bid<=Low[1]). При компиляции ошибок НЕ выдало. Но изменений выставление ордеров я не увидел. Ордера выставлялись по старому, на закрытии бара...(((

//----- Глобальные переменные
double op,cl,hi,lo,pr,line,lineup,linedn;

{int spread = (int)MarketInfo(_Symbol,MODE_SPREAD);op = iOpen(_Symbol,tfs,1);cl = iClose(_Symbol,tfs,1);hi = iHigh(_Symbol,tfs,1);lo = iLow(_Symbol,tfs,1);
lineup = iCustom(_Symbol, tfs, indnames, mboof1, mzd);linedn = iCustom(_Symbol, tfs, indnames, mboof2, mzd);line = iCustom(_Symbol, tfs, indnames, mboof3, 0);
if(cl < op && cl < linedn && op > linedn) return(1);if(cl > op && cl > lineup && op < lineup) return(-1);if(Bid >= lineup)return(8);if(Bid <= linedn)return(9);
if( (Bid >= line && Bid < NormalizeDouble(line + spread*_Point,Digits)) || (Bid <= line && Bid > NormalizeDouble(line - spread*_Point,Digits)))return(5);if( (op < line && cl > line) || (op > line && cl < line) ) return(6);if(Bid < lineup && Bid > linedn)return(7);
return(0);}int Signals()
Это похоже на гадание на кофейной гуще)
Здесь нет условий для открытия ордеров.
 
  • Like
Реакции: fxbo

mobidik

-----
Сильно не бейте, я только учусь, сделал наверное не то... (((.
Согласно Вашего скрина выше:
C-подобный:
Expand Collapse Copy
double levelup = 0;
double leveldn = 0;

double lineup  = 0;
double linedn  = 0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

//---
    lineup = iCustom(_Symbol, tfs, indnames, mboof1, mzd);
    linedn = iCustom(_Symbol, tfs, indnames, mboof2, mzd);

    if(Open[1]>linedn && Close[1]<linedn)  // Пробой нижней линии канала
     levelup = Low[1];                     // Запомним значение по Low пробойной свечи

    if(Open[1]<lineup && Close[1]>lineup)  // Пробой верхней линии канала
     leveldn = High[1];                    // Запомним значение по High пробойной свечи
 
    double Signal = 0;
 
    if(Low[0]<=levelup)   Signal = 1;      // Сигнал на бай
    if(High[0]>=leveldn)  Signal =-1;      // Сигнал на сел
 
    if(Signal!=0)
     {
       // Установка позиции.
     }
//---
Пробуйте.
 

v-tree

Интересующийся
Подскажите пожалуйста, как можно вытащить подвальный индикатор из окна мт4, чтобы он просто на графике отображался по примеру стандартных обьемов?
 

AlexeyVik

Программист mql4 mql5
Подскажите пожалуйста, как можно вытащить подвальный индикатор из окна мт4, чтобы он просто на графике отображался по примеру стандартных обьемов?
А это поможет зарабатывать? С какой целью появилось такое желание?
Гистограммный индикатор попроще будет сделать, но остаётся один вопрос… А нахрена это надо?
 

OnsTheme

Прохожий
Здравствуйте. Подскажите пожалуйста, что нужно прописать в (важно) советнике, чтобы изменить цвета на графике. Вот это в код превратить?IMG_20240223_145404.png
 

Dobryj

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

С уважением , и заранее спасибо !



//============================================================================================================================
double currentOffset = 400; // Глобальная переменная для текущего значения
double currentHigh =-0.03; // Глобальная переменная для текущего значе
double currentLow = -0.11; // Глобальная переменная для текущего значения

int OnInit()
{
EventSetMillisecondTimer(1); // Установка таймера с интервалом в 1 миллисекунду

return(INIT_SUCCEEDED);
}

//============================================================================================================================
//============================================================================================================================
void OnTimer()
{
for (int i = ObjectsTotal() - 1; i >= 0; i--)
{
string objName = ObjectName(i);

if (ObjectType(objName) == OBJ_TREND)
{
datetime timeStart = (datetime)ObjectGetInteger(0, objName, OBJPROP_TIME1);
double priceStart = ObjectGetDouble(0, objName, OBJPROP_PRICE1);
datetime timeEnd = (datetime)ObjectGetInteger(0, objName, OBJPROP_TIME2);
double priceEnd = ObjectGetDouble(0, objName, OBJPROP_PRICE2);




double priceDifference = priceEnd - priceStart;
double percentageDifference = (priceDifference / priceStart) * 100;
int timeDiff = timeEnd - timeStart;
double timeDifference = (double)timeDiff;

//============================================================================================================================
double labelOffsetAdjusted = priceStart < priceEnd ? currentHigh : currentLow;
double verticalOffsetUp = currentOffset * _Point;
double verticalOffsetDown = currentOffset * _Point;

double verticalOffsetAdjusted = priceStart < priceEnd ? verticalOffsetUp : verticalOffsetDown;


//============================================================================================================================
string displayTexts[5];

displayTexts[1] = StringFormat("Цена: %.5f Пункты (%.5f%)(%.2f%%)", priceEnd, priceDifference, percentageDifference);
//============================================================================================================================


//============================================================================================================================
for (int j = 5; j >= 0; j--)
{

string labelName = objName + IntegerToString(5 - j);
ObjectDelete(0, labelName);
double positionY = priceEnd + labelOffsetAdjusted + ((5 - j) * verticalOffsetAdjusted);

// Проверяем, существует ли уже объект. Если да, то просто обновляем его свойства.
if (ObjectFind(0, labelName) != -1)
{
// Объект существует, обновляем его свойства
ObjectSetString(0, labelName, OBJPROP_TEXT, displayTexts[j]);
ObjectSetInteger(0, labelName, OBJPROP_COLOR, (j == 1 ) ? clrRed : clrBlack);
ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 9);
}
else
{
// Объект не существует, создаем новый
if (ObjectCreate(0, labelName, OBJ_TEXT, 0, timeEnd, positionY))
{
ObjectSetString(0, labelName, OBJPROP_TEXT, displayTexts[j]);
ObjectSetInteger(0, labelName, OBJPROP_COLOR, (j == 1 ) ? clrRed : clrBlack);
ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 9);
}
}
}

}
}

}
 

MakarFX

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

С уважением , и заранее спасибо !
Можно так сделать...
создали трендовую - появился текст, удали - текст исчез.
C-подобный:
Expand Collapse Copy
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   int cnt_trend=0,cnt_text=0;
   for (int i = ObjectsTotal() - 1; i >= 0; i--)
     {
      if (ObjectType(ObjectName(i)) == OBJ_TREND) cnt_trend++;
      if (ObjectType(ObjectName(i)) == OBJ_TEXT) cnt_text++;
     }
   if(cnt_trend<cnt_text)
   for (int i = ObjectsTotal() - 1; i >= 0; i--)
     {
      if (ObjectType(ObjectName(i)) == OBJ_TEXT) ObjectDelete(0,ObjectName(i));
     }
   for (int i = ObjectsTotal() - 1; i >= 0; i--)
     {
      if (ObjectType(ObjectName(i)) == OBJ_TREND)
        {
         int x=(int)ObjectGetInteger(0,ObjectName(i),OBJPROP_TIME2);
         double y=ObjectGetDouble(0,ObjectName(i),OBJPROP_PRICE2);
         if (ObjectFind(0,ObjectName(i)+"text") != 0)
            ObjectCreate(0,ObjectName(i)+"text", OBJ_TEXT, 0, x, y);
        }
     }
  }
 
Верх