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

 
jarikn #:

Всем привет. Ребята подскажите где ошибка в коде и как исправить? уже двое суток ...сь и не знаю как решить проблему. Выдает такие ошибки - '0' - cannot convert enum.  '1' - cannot convert enum



Строка же указывается компилятором с ошибкой.

Предположу, что дело в этом

IndicatorSetDouble(0, l, TopBuffer[rates_total - l - 1]);

IndicatorSetDouble

Задаёт значение соответствующего свойства индикатора. Свойство индикатора должно быть типа double. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool  IndicatorSetDouble(
   int     prop_id,           // идентификатор
   double  prop_value         // устанавливаемое значение
   );

Вызов с указанием  идентификатора и модификатора свойства.

bool  IndicatorSetDouble(
   int     prop_id,           // идентификатор
   int     prop_modifier,     // модификатор 
   double  prop_value         // устанавливаемое значение
   )

Параметры

prop_id

[in]  Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_DOUBLE.

prop_modifier

[in]  Модификатор указанного свойства. Только свойства уровней требуют модификатора. Нумерация уровней идет с 0, то есть для задания свойства второму уровню нужно указать единицу (на 1 меньше, чем при использовании директивы компилятора).

prop_value

[in]  Значение свойства.

 
PapaYozh #:

Тоже используется без начальной инициализации.

Вроде инициализирована, как внешняя переменная: int i, j, LastError, TimeS[],symbnum;

 
rabanik #:

Вроде инициализирована, как внешняя переменная: int i, j, LastError, TimeS[],symbnum;

Вроде нашел, ошибку, строка: int nSmb=FileSize(hFile)/1936;  nSmb = 0, поэтому не создается массив. Можете подсказать причину, почему? Спасибо.

 
rabanik #:

Вроде инициализирована, как внешняя переменная: int i, j, LastError, TimeS[], symbnum ;


Ей надо присвоить 0, тогда это будет инициализацией. Нельзя предполагать, что компилятор сделает это по умолчанию.

 
rabanik #:

Вроде нашел, ошибку, строка: int nSmb=FileSize(hFile)/1936;  nSmb = 0, поэтому не создается массив. Можете подсказать причину, почему? Спасибо.

А реальный размер файла какой?

 
jarikn #:

Здравствуйте. такой вопрос. Индикатор не выводит стрелки и не возможно прогнать на тестере, выдает ошибку - GBPUSD,M1: array out of range in 'test.mq4' (97,24)

что я не так написал и как это исправить?


int counted_bars = IndicatorCounted()-3;
 
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1  2
#property indicator_width2  2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_label1  "Double Top"
#property indicator_label2  "Double Bottom"
#property indicator_maximum  1


input int TopBottomStrength = 10;
input bool AlertsOn = true;
static double TopBuffer[];
static double BottomBuffer[];

// Константы для индексов буферов
enum {TOP_BUFFER, BOTTOM_BUFFER};

void calculateTopBottom(const double &currentHigh, const double &currentLow, const double &prevHigh, const double &prevLow, const double &prev2High, const double &prev2Low, const double &high[], const double &low[], const int &index, const int &strength, double &top, double &bottom, const int &i) {
    bool topCrossed = false, bottomCrossed = false;
    int j, k;
    if (prevHigh > prev2High && prevHigh > currentHigh) {
        for (j = index - strength + 1; j <= index; j++) {
            if (j < 0 || j >= ArraySize(high)) {
                return; // неверные входные данные
            }
            if (high[j] <= prevHigh) {
                topCrossed = false;
                break;
            }

            if (j == index && high[j] > prevHigh) {
                topCrossed = true;
                break;
            }
        }

        if (topCrossed) {
            top = prevHigh;
            if (AlertsOn && top != EMPTY_VALUE) {
                Alert("Top arrow at bar " + (string)i);
            }
        }
        else {
            top = EMPTY_VALUE;
        }
    }
    else {
        top = EMPTY_VALUE;
    }

    if (prevLow < prev2Low && prevLow < currentLow) {
        for (k = index - strength + 1; k <= index; k++) {
            if (k < 0 || k >= ArraySize(low)) {
                return; // неверные входные данные
            }
            if (low[k] >= prevLow) {
                bottomCrossed = false;
                break;
            }
            if (k == index && low[k] < prevLow)
            {
                bottomCrossed = true;
                break;
            }
        }

        if (bottomCrossed)
        {
            bottom = prevLow;
            if (AlertsOn && bottom != EMPTY_VALUE) {
                Alert("Bottom arrow at bar " + (string)i);
            }
        }
        else {
            bottom = EMPTY_VALUE;
        }
    }
    else {
        bottom = EMPTY_VALUE;
    }
}


int OnInit()
{
    ArrayResize(TopBuffer, 0);
    ArrayResize(BottomBuffer, 0);
    int maxBars = Bars - IndicatorCounted();
    ArrayResize(TopBuffer, maxBars);
    ArrayResize(BottomBuffer, maxBars);
    SetIndexBuffer(TOP_BUFFER, TopBuffer, INDICATOR_DATA);
    SetIndexBuffer(BOTTOM_BUFFER, BottomBuffer, INDICATOR_DATA);
    SetIndexStyle(TOP_BUFFER, DRAW_ARROW, STYLE_SOLID, 4, clrBlue);
    SetIndexArrow(TOP_BUFFER, 159);
    SetIndexLabel(TOP_BUFFER, "Top arrow");
    SetIndexStyle(BOTTOM_BUFFER, DRAW_ARROW, STYLE_SOLID, 4, clrRed);
    SetIndexArrow(BOTTOM_BUFFER, 160);
    SetIndexLabel(BOTTOM_BUFFER, "Bottom arrow");
    IndicatorSetInteger(INDICATOR_DIGITS, _Digits + 1);
    return(INIT_SUCCEEDED);
}

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[])
{
    if (rates_total < 1 || prev_calculated < 0 || prev_calculated >= rates_total) {
        return 0; // неверные входные данные
    }

    int counted_bars = IndicatorCounted();
    if (counted_bars < 0) {
        return 0; // не удалось получить количество ранее рассчитанных баров
    }
    if (counted_bars > 0) {
        counted_bars--; // учитываем последний бар, по которому уже произошли расчёты
    }

    double currentHigh, currentLow, prevHigh, prevLow, prev2High, prev2Low;

    for (int i = counted_bars; i < rates_total; i++) {
        if (i < TopBottomStrength + 2) {
            TopBuffer[i] = EMPTY_VALUE;
            BottomBuffer[i] = EMPTY_VALUE;
            continue;
        }

        currentHigh = high[i];
        currentLow = low[i];

        prevHigh = high[i - 1];
        prevLow = low[i - 1];

        prev2High = high[i - 2];
        prev2Low = low[i - 2];

        double top = EMPTY_VALUE, bottom = EMPTY_VALUE;

        calculateTopBottom(currentHigh, currentLow, prevHigh, prevLow, prev2High, prev2Low, high, low, i, TopBottomStrength, top, bottom, i);

        TopBuffer[i] = top;
        BottomBuffer[i] = bottom;
    }

    return (rates_total);
}

 
jarikn #:
Здравствуйте. Подскажите пожалуйста где я дал маху. Индикатор не выдает сигналы. Должны появляться стрелки и алерт но полная тишина.

Подходит бабка у деду и говорит: «Ой дед, я сегодня маху дала»…

— Кому, кому?

— Да никому, просто сто рублей потеряла…

— От дура, лучше-б ты Ваське дала…

 

Народ привет!

Сносил ось на Айфоне, теперь в АппСторе нету терминала МТ4.

Его удалили оттуда? Как то можно скачать?

Или есть что-то, чтобы по данным брокера можно было зайти.

 

здравствуйте всем!

имеется функция в советнике, закрывающая все ордера по профиту и удаляющая лимитки:

     if(OrdersTotal()>0)
    {
     Comment("          Balance  ",AccountBalance(),"\n          Equity  ",AccountEquity(),"\n          Profit  ",OrdersProfit());
     
      if(OrdersProfit()>=ProfitClose)
      {
         for (int i=OrdersTotal()-1;i>=0;i--)
         {
            bool closed;
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
           
            if(OrderType()==OP_BUY) 
            {
                  for(q=0;q<pop;q++)
                  {
                  closed=false;
                  closed=OrderClose(OrderTicket(),lot,Bid,3,Blue);
                  if(closed==true)q=pop;
                  }
            }
           
            if(OrderType()==OP_SELL) 
            {
                  for(q=0;q<pop;q++)
                  {
                  closed=false;
                  closed=OrderClose(OrderTicket(),lot,Ask,3,Red);
                  if(closed==true)q=pop;
                  }
            }
            Sleep(1000);
            if(OrderType()>1 ) OrderDelete(OrderTicket());
         }
      }
    }
   

я хочу добавить закрытие всех ордеров по убытку:

попробовал сделать так:   if((OrdersProfit()>=ProfitClose)||(OrdersProfit()<=LossClose))

однако так не работает (пишет недостаточно средств ош. 134) -хотел бы понять в чем особенность функции?

возможно есть особенность в подсчете профита?

подсчет прибыли решен так:

// функция подсчета прибыльности открытых ордеров 
double OrdersProfit()
{
   
  double rezultSymb=0;
  string SMB=Symbol();
  int i;
  for (i=OrdersTotal()-1;i>=0;i--)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
     {
      if(OrderSymbol()!= SMB) continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
       {
        rezultSymb+=OrderProfit();
       } 
     }
   }
  return(rezultSymb);


Причина обращения: