Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#6526
1 час назад, DUBROV сказал:

PS: доступа к коду торгующего советника нет. 

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

1 час назад, DUBROV сказал:

А команды, чтобы из одного советника выгрузить параметры другого в *.set-файл и потом загрузить отредактированные обратно, есть?

Можете пробовать сделать через DLL на 90% уверен что это можно сделать, например через WinApi открываете свойства нужного советника, и подсовываете ему нужный сет файл.

Но скорее всего это будет ненадежно. 

 

Так же можете открывать новый шаблон/профиль с закрытием старого.

#6527
В 19.11.2021 в 22:13, ademen сказал:

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

Можете пробовать сделать через DLL на 90% уверен что это можно сделать, например через WinApi открываете свойства нужного советника, и подсовываете ему нужный сет файл.

Но скорее всего это будет ненадежно. 

 

Так же можете открывать новый шаблон/профиль с закрытием старого.

Благодарю!!! Показали определённое направление выхода из тупика. Будем развиваться, осваивать новое, копать дальше.

#6528

Доброго времени. Такой вопрос, советник работает по индикаторам, есть индикатор, при сигнале которого ордер должен закрыться на следующей свече, если прописываем сдвиг. Да, он закрывается если ордер в плюсе, но иногда бывают моменты когда ордер в минусе и индикатор сигнализирует закрытие, но ордер в этом случае не закрывается. Вопрос почему? Сигнал на закрытие есть, ну да, он в минусе, но минус то растет, и ему бы лучше закрыться при сигнале. Можно что-то добавить в код чтоб закрытие при минусе и по сигналу было принудительным? Может цикл спасет из нескольких проходов? А то цикл работает один раз и все, ордер то один выставляется.

#6529
2 часа назад, diodio сказал:

Да, он закрывается если ордер в плюсе, но иногда бывают моменты когда ордер в минусе и индикатор сигнализирует закрытие, но ордер в этом случае не закрывается. Вопрос почему?

Без кода тяжело что то подсказать.

Есть ошибки в журнале при попытке закрыть?

#6530

Помогите пожалуйста, пишу вот индикатор и не получается написать код. Мне нужно взять отрезок на графике что бы индикатор посчитал разность high и low каждой свечи на данном отрезке и затем дал среднее арифметическое. 

#6531
4 часа назад, Гладиoлус сказал:

Помогите пожалуйста, пишу вот индикатор и не получается написать код. Мне нужно взять отрезок на графике что бы индикатор посчитал разность high и low каждой свечи на данном отрезке и затем дал среднее арифметическое. 

int RangePeriod = 100; //считаем по 100 последним барам
double high = iHigh(Symbol(), Period(), iHighest(Symbol(), Period(), MODE_HIGH, RangePeriod));
double low = iLow(Symbol(), Period(), iLowest(Symbol(), Period(), MODE_LOW, RangePeriod));
double range  =  high - low;

 

#6532
4 часа назад, Rigal сказал:
double range  =  high - low;

@Rigal, не осилил цикл дописать? :))

#6533
8 часов назад, Rigal сказал:
int RangePeriod = 100; //считаем по 100 последним барам
double high = iHigh(Symbol(), Period(), iHighest(Symbol(), Period(), MODE_HIGH, RangePeriod));
double low = iLow(Symbol(), Period(), iLowest(Symbol(), Period(), MODE_LOW, RangePeriod));
double range  =  high - low;

 

спасибо большое но все равно не получается(

#6534

#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      
#property version   "1.00"
#property strict


extern int    BarCountOpen    = 10; //Меняем значение при добавлении
extern int    BarCountClose   = 10; //Меняем значение при добавлении
extern int    КолвоСвечей     = 1;  //Меняем значение при добавлении


double minprice = 999999, mp,
       maxprice = -999999, range, total;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{


    GetMaxPrice();
    GetMinPrice();
    GetMiddleCount();
    
    Comment("MinPrice: " + DoubleToStr(minprice) + "\n" +
            "MaxPrice: " + DoubleToStr(maxprice) + "\n" +
            "MiddleCount: " + DoubleToStr(range) + "\n" +
            DoubleToStr(total));
  

}
//+------------------------------------------------------------------+
void GetMinPrice()
{
    for (int i = BarCountOpen; i < BarCountClose; i++)
    {
         mp = iLow(Symbol(), PERIOD_CURRENT, i);
         if (mp < minprice)
             minprice = mp;
    }
    return;
}
//+------------------------------------------------------------------+
void GetMaxPrice()
{
    for (int i = BarCountOpen; i < BarCountClose; i++)
    {
        mp = iHigh(Symbol(), PERIOD_CURRENT, i);
        if (mp > maxprice)
            maxprice = mp;
    }
    return;
}
//+------------------------------------------------------------------+  
void GetMiddleCount()
{
    for (int i = BarCountOpen; i < BarCountClose; i++)
    {
         int RangePeriod = i; //считаем по 100 последним барам
         double high = iHigh(Symbol(), Period(), iHighest(Symbol(), Period(), MODE_HIGH, i));
         double low = iLow(Symbol(), Period(), iLowest(Symbol(), Period(), MODE_LOW, i));
         range  =  high - low;
         total = range/КолвоСвечей; 
         
    }
    return;
}

#6535

Я хочу задать период например с 20 свечи по 45 и в этом периоде посчитать сумму всех high а затем сумму всех low затем суммаhigh - суммаlow = total, и в конечном итоге total поделить на количество свечей.

 

#6536
17 минут назад, Гладиoлус сказал:

спасибо большое но все равно не получается(

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double total = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         double high = iHigh(Symbol(), Period(), i);
         double low = iLow(Symbol(), Period(), i);
         double range  =  high - low;
         total += range; 
    }
    return(total/CountBars);
}

По-моему все решали разные задачи :)

Изменено 23 декабря, 2021 пользователем usver73

#6537
1 час назад, usver73 сказал:
extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double total = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         double high = iHigh(Symbol(), Period(), i);
         double low = iLow(Symbol(), Period(), i);
         double range  =  high - low;
         total += range; 
    }
    return(total/CountBars);
}

По-моему все решали разные задачи :)

к сожаление работает не корректно, неправильно значение выдает

#6538
3 минуты назад, Гладиoлус сказал:

к сожаление работает не корректно, неправильно значение выдает

слишком мало информации.ю
Вставьте Print, задайте стартовое значение-1, количество 2, посчитайте калькулятором, сравните с расчетным значением...

#6539
31 минуту назад, usver73 сказал:

слишком мало информации.ю
Вставьте Print, задайте стартовое значение-1, количество 2, посчитайте калькулятором, сравните с расчетным значением...

я вот тоже хотел сказать: "не работает", "работает неправильно" - это так себе формулировка проблемы.

Но если следовать ТЗ вот тут

2 часа назад, Гладиoлус сказал:

Я хочу задать период например с 20 свечи по 45 и в этом периоде посчитать сумму всех high а затем сумму всех low затем суммаhigh - суммаlow = total, и в конечном итоге total поделить на количество свечей.

то, вот так:

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double sumHigh = 0.0;
	double sumLow = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/CountBars);
}

Исторические значения могут быть недоступны, начиная с некоторого индекса (настройки терминала). В идеале нужно проверять каждый полученный iHigh и iLow на > DBL_EPSILON и != EMPTY_VALUE и если оно не проверилось - тут же возвращать, например, EMPTY_VALUE, или ноль.

 

#6540
46 минут назад, usver73 сказал:

слишком мало информации.ю
Вставьте Print, задайте стартовое значение-1, количество 2, посчитайте калькулятором, сравните с расчетным значением...

А, все, спасибо, получилось 

#6541
6 минут назад, Rigal сказал:

я вот тоже хотел сказать: "не работает", "работает неправильно" - это так себе формулировка проблемы.

Но если следовать ТЗ вот тут

то, вот так:

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double sumHigh = 0.0;
	double sumLow = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/CountBars);
}

Исторические значения могут быть недоступны, начиная с некоторого индекса (настройки терминала). В идеале нужно проверять каждый полученный iHigh и iLow на > DBL_EPSILON и != EMPTY_VALUE и если оно не проверилось - тут же возвращать, например, EMPTY_VALUE, или ноль.

 

Вот как, понял, спасибо большое.

#6542
21 час назад, Rigal сказал:

я вот тоже хотел сказать: "не работает", "работает неправильно" - это так себе формулировка проблемы.

Но если следовать ТЗ вот тут

то, вот так:

extern int StartBar = 1;
extern int CountBars = 100;

double GetMiddleSize()
{
    double sumHigh = 0.0;
	double sumLow = 0.0;

    for (int i = StartBar; i < StartBar + CountBars; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/CountBars);
}

Исторические значения могут быть недоступны, начиная с некоторого индекса (настройки терминала). В идеале нужно проверять каждый полученный iHigh и iLow на > DBL_EPSILON и != EMPTY_VALUE и если оно не проверилось - тут же возвращать, например, EMPTY_VALUE, или ноль.

 

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

#6543

или же на графике провести трендовую линию от одной свечи к другой и за этот промежуток индикатор посчитал (ну это будет уже в идеале). Я кстати пытался сделать это с помощью OBJ_TREND но что то ничего не получилось

#6544

#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern datetime OpenDate=D'2021.12.01 00:00';
extern datetime CloseDate=D'2021.12.31 00:00';
extern int Amount = 19;
   double sumHigh;
    double sumLow;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
 
    
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   int StartBar = 1;
   int CountBars = 100;
   
   GetMiddleSize();
   Comment((sumHigh - sumLow)/Amount);
   
}
//+------------------------------------------------------------------+
double GetMiddleSize()
{
    sumHigh = 0.0;
     sumLow = 0.0;

    for (int i = CloseDate; i < OpenDate; i++)
    {
         //int RangePeriod = i; //считаем по CountBars начиная с StartBar
         sumHigh += iHigh(Symbol(), Period(), i);
         sumLow += iLow(Symbol(), Period(), i);
    }
    return((sumHigh - sumLow)/Amount);
}
//+------------------------------------------------------------------+
 

#6545

вот я вместо StartBar и CountBar вписал datetime но к сожалению выдает ошибку

#6546
10 минут назад, Гладиoлус сказал:

вот я вместо StartBar и CountBar вписал datetime но к сожалению выдает ошибку

даты, конечно, не заменяют простой счетчик.

Функции iHigh  и iLow принимают номер бара, не дату.

Вам нужно превратить даты в номера баров. Для этого есть метод iBarShift

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

На любом языке.

#6547
7 минут назад, Rigal сказал:

даты, конечно, не заменяют простой счетчик.

Функции iHigh  и iLow принимают номер бара, не дату.

Вам нужно превратить даты в номера баров. Для этого есть метод iBarShift

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

На любом языке.

Безмерно благодарен, даа так и есть, знания по программированию у меня совсем скудные к сожалению. НО это пока что) 

#6548
5 минут назад, Гладиoлус сказал:

Безмерно благодарен, даа так и есть, знания по программированию у меня совсем скудные к сожалению. НО это пока что) 

ну вот здесь в ветке есть видеоуроки, например

#6549
14 минут назад, Rigal сказал:

ну вот здесь в ветке есть видеоуроки, например

Да я вот смотрю

#6550
2 часа назад, Rigal сказал:

ну вот здесь в ветке есть видеоуроки, например

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025