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

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

#2526


В первом уроке нет описания как обратиться к внешней переменной.

к любой переменной обращаются по имени (названию). Я не буду делать задание за Вас.
Не обращайте внимания на мелочи, задание такое: ввести в программу любое число, проанализировать и вывести сообщение на экран. Как ввести число читайте в справке.
#2527

уважаемые, подскажите, что я делаю не так - дважды отправлял запрос на скачивание КУРСА, стаканчик симпатичный с уведомлением ГОТОВО тоже дважды получил, а КУРСА все нет :|
спасибо


Добавлено: 06-09-2015 23:22:02

в спаме смотрел, если что

Изменено 7 сентября, 2015 пользователем Дмитрий_2008

#2528

Я тоже не смог скачать нашёл какой то левый торрент по названию

#2529

Oll я нашел ошибку...только не знаю как ее исправить...вот кусок кода который вы скидывали:
static double minBB = 0;
if (curtime >= Start_calculation * 60 && curtime {
if (IsNewBar())
{
double bb = iCustom(NULL, 0, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
if ( bb
}
}
else
{
if ( minBB > 0 ) Comment("Min BB =", NormalizeDouble(minBB,_Digits) );
minBB = 0;
}
ошибка в выделенной строке...этот индюк просто выводит минимальное растояние между верхней и нижней лентами Боллинджера...т е там не может быть отрицательного значения...я попытался сам чтото придумать, но не вышло...

#2530
kempo сделай static double minBB = 99999999; и потом minBB = 99999999
#2531

if (curtime >= Start_calculation * 60 && curtime {
if (IsNewBar())
{
double bb = iCustom(NULL, 0, "Bollinger BandWidth", BBPeriod, StdDeviation, 0, 1);
if ( bb }
}
else
{
if ( minBB > 0 ) Comment("Min BB =", NormalizeDouble(minBB,_Digits) );
minBB = 0;
}
а эти скобки стоят на месте???а то логика тогда не понятна...

#2532
kempo скобки на месте. логика следующая: если время наше, то раз в бар проверяем индюк и сравниваем с минимумом, если время не наше, то публикуем минимум и переменную в исходное.
#2533

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

#2534

Вопрос наверно тупой, но все же задам. Возможно ли в mql описать умный указатель?
Пока придумал только убогий вариант через макросы :*(

#define declare_smart_pointer(type_name, type) \
class type_name { \
type *_obj; \
public: \
type_name(type *obj) { _obj = obj; } \
~type_name() { delete _obj; } \
type* get() { return _obj; } \
};

class order_count_t {
public:
int count;
int stop_count;

int all_count() {
return count + stop_count;
}

order_count_t() {
count = 0;
stop_count = 0;
}
};

declare_smart_pointer(order_count_t_sp, order_count_t)

Изменено 9 сентября, 2015 пользователем Qj

#2535

В тестере? т.е. Вы хотите замедлить тест? - попробуйте GetTickCount(), правда я не знаю как он в тестере работает, или нужен цикл бестолковых вычислений.

#2536

Можно реализовать таймер, и опрашивать его не прошло ли определенное время. Все удобство в том что даже в тестере будет работать.

class timer_t {
private:
int _interval_in_sec;
datetime _start;

public:
timer_t() {
reset();
}

void reset() {
_start = TimeCurrent();
}

bool is_elapsed() {
return get_distance() >= _interval_in_sec;
}

int get_distance() {
return ( int ) ( TimeCurrent() - _start );
}

static timer_t *create ( int interval_in_sec ) {
return timer_t::create ( TimeCurrent(), interval_in_sec );
}

static timer_t *create ( datetime start, int interval_in_sec ) {
timer_t *result = new timer_t();
result._start = start;
result._interval_in_sec = interval_in_sec;
return result;
}
};

Изменено 8 сентября, 2015 пользователем Qj

#2537
Qj прав, я почему-то подумал, что надо тест приостановить... :d
#2538

Спасибо, сделал чуть по другому, if(TimeCurrent()

#2539

Подскажите пожалуйста , если использовать вместо блока void OnTick() , блок void OnTimer(). Я так понимаю в блоке инициализации ставим функцию EventSetTimer(60); где значение 60 это интервал времени в секундах, через сколько секунд выполняется программа void OnTimer(). Соответственно, если я поставлю большее значение например 100 секунд, будет ли в таком случае меньше затрачиваться ресурсов компьютера или ВПС сервера? Т.е. сделать так, чтобы бот работал не по тикам, а по таймеру, будет ли в таком случае меньше тратиться ресурсов железа на работу советника?

#2540
Pavel_Bass будет меньше нагружать. но дело не в способе запуска - сова написана не рационально или используется тяжёлый индюк.
#2541

Приветствую! есть вот такой индикатор который рисует вертикальные линии в заданные часы, но хотелось бы чтобы линии он рисовал на перспективу хотя бы на день а не за пять минуть до приближения цены. Можно ли это в нем как то поправить?

10_Vert_Line.mq413 скач.

#2542

Подскажите, как прописать условие:
если последний открытый ордер был бай, то следующий только сел, и наоборот, чтоб тип окрываемого ордера чередовался.
Я записал это так:
if(Type!=-1 && Type!=Last_Type)
{
ticket=OrderSend(Symbol(),Type,LOT,oprice,Slip,0,0,NULL,Magic,0);
if(ticket>0)
{
OrderModify(ticket,OrderOpenPrice(),SL1,TP1,0);
Last_Type=Type;
}
}

Начало выдавать ошибку (131)

#2543


Подскажите, как прописать условие:
если последний открытый ордер был бай, то следующий только сел, и наоборот, чтоб тип окрываемого ордера чередовался.
Я записал это так:
if(Type!=-1 && Type!=Last_Type)
{
ticket=OrderSend(Symbol(),Type,LOT,oprice,Slip,0,0,NULL,Magic,0);
if(ticket>0)
{
OrderModify(ticket,OrderOpenPrice(),SL1,TP1,0);
Last_Type=Type;
}
}

Начало выдавать ошибку (131)


Order:131:Invalid Trade Volume у вас не правильно задан лот.
#2544

Подскажите, как бороться с ошибкой: 4204: no object name
Создаю на каждом новом баре трендовые линии, перед каждым созданием удаляю все линии с графика. Все линии создаются. В чем может быть проблема?

#2545

Перед удалением нужно проверять на существование объекта:
if (ObjectFind("объект") >= 0)
ObjectDelete("объект");

#2546


Перед удалением нужно проверять на существование объекта:
if (ObjectFind("объект") >= 0)
ObjectDelete("объект");



В этом то и загвоздка, потому что я вначале нахожу свои объекты, а потом удаляю



ObjectsDelete("имя");

void ObjectsDelete(string search){ //Удаление определенных объектов с графика
for (int i = ObjectsTotal() - 1; i >= 0; i--) {
if (StringFind(ObjectName(i), search) != -1) ObjectDelete(ObjectName(i));
}
}


upd
Разобрался. Ошибка была не в удалении вовсе. Добавил в if ObjectFind(k) - все заработало. Но не понятно, почему он выдавал ошибку, если шла все равно проверка на тип существующего объекта. Возможно как то поизящнее написать эту часть кода?
for (int k = ObjectsTotal(); k >= 0; k--) { 
if (ObjectFind(k) != -1 && ObjectType(ObjectName(k))==OBJ_TREND {NearLine = true; break;}
}


upd2
Запутал всех, включая себя )
Ошибка была из-за этой строчки:
for (int k = ObjectsTotal(); k >= 0; k--) 

исправив ее на
for(int k=0; k
- она пропала и не понадобилась проверка на существование линий

Изменено 13 сентября, 2015 пользователем Rever27

#2547

Может кто подскажет, как усреднить TakeProfit для всех открытых позиций (OP_BUY и OP_SELL могут быть открыты одновременно)?

#2548
Rever27 в цикле по перебору от 0 только не удаляйте объекты. кстати в процедуре удаления всё сделано правильно.

rom_kaxxx вопрос не понял - Вы хотите закрыть разнонаправленные ордера по общему тейку? Ваш вопрос в расчёте уровня закрытия или алгоритме выставления СЛ/ТР?
#2549


rom_kaxxx вопрос не понял - Вы хотите закрыть разнонаправленные ордера по общему тейку? Ваш вопрос в расчёте уровня закрытия или алгоритме выставления СЛ/ТР?



Алгоритм выставления я написал, некорректно идет расчет уровня закрытия. Надо для всех открытых ордеров посчитать уровень бу и + учесть ТР, чтоб сова в холостую не торговала.
#2550



rom_kaxxx вопрос не понял - Вы хотите закрыть разнонаправленные ордера по общему тейку? Ваш вопрос в расчёте уровня закрытия или алгоритме выставления СЛ/ТР?

Алгоритм выставления я написал, некорректно идет расчет уровня закрытия. Надо для всех открытых ордеров посчитать уровень бу и + учесть ТР, чтоб сова в холостую не торговала.
Задачка хорошая. Тут будет 2 решения (имхо):
- надо вычислить общий объём ордеров в каждую сторону и отдельно уровни БУ для каждой стороны.
- объёмы должны быть разные, иначе общего уровня БУ либо не будет, либо будет очень далеко...
- потом вычислить общий БУ для "бай в +" и общий БУ для "селл в +" по формуле:
если (бай в +) то общБУ = (Лотс*БУс - Лотб*БУб) / (Лотс-Лотб)

перепроверь и дальше сам...

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

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