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

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

#5226

Пробуйте. Только что-то не верится насчёт перерисовки... - на каждом тике вызывает сам-себя раз 300. Будет рисовать и вешать терем.

TMA_Fair.mq45 скач.
TMA_Fair.ex43 скач.

#5227

Новый урок:
http://tradelikeapro.ru/mql4-vremya-na-poisk-oshibok/

#5228

Как зделать приоритет на нажатие кнопки? Если на заднем плане есть обьект, то он обязательно вылезет при нажатий на кнопку?


сам код

  string S_button_2="Trade";
void F_Button_2()
{
ObjectCreate ("S_Buttom_2", OBJ_BUTTON, 0, 0, 0);
ObjectSetText("S_Buttom_2", S_button_2, 12, "LimeGreen11", clrBlack);
//ObjectSetInteger (0,"S_Buttom_2", OBJPROP_ZORDER, 10);
//ObjectSet ("S_Buttom_2", OBJPROP_BORDER_COLOR, clrBlack);
ObjectSet ("S_Buttom_2", OBJPROP_FONTSIZE, 12);
ObjectSet ("S_Buttom_2", OBJPROP_BGCOLOR, clrGold);
ObjectSet ("S_Buttom_2", OBJPROP_COLOR, clrBlack);
ObjectSet ("S_Buttom_2", OBJPROP_CORNER, 2);
ObjectSet ("S_Buttom_2", OBJPROP_STATE, state_2);
ObjectSet ("S_Buttom_2", OBJPROP_BACK, false);
ObjectSet ("S_Buttom_2" ,OBJPROP_XSIZE, 50);
ObjectSet ("S_Buttom_2", OBJPROP_YSIZE, 20);
ObjectSet ("S_Buttom_2", OBJPROP_XDISTANCE, 365);
ObjectSet ("S_Buttom_2", OBJPROP_YDISTANCE, 22);
//if(ObjectFind(0,"S_Buttom")==false)Print("Ошибка создание S_Buttom, код ошибки = ",GetLastError());
}
#5229

Как зделать приоритет на нажатие кнопки?


ObjectSetInteger свойство OBJPROP_ZORDER:
Приоритет графического объекта на получение события нажатия мышки на графике (CHARTEVENT_CLICK). По умолчанию при создании значение выставляется равным нулю, но при необходимости можно повысить приоритет. При наложении объектов друг на друга событие CHARTEVENT_CLICK получит только один объект, чей приоритет выше остальных.
#5230

Всем привет, у меня вопрос к программистам, написал советник, сам не профи а только изучаю. Советник торгует по машке, ради интереса вставил в него условие на противоположный ордер если будет просадка. Вроде все работает, проверял каждую строчку, а теперь наткнулся на то чего вообще не могу понять. Как бы нет никакой ошибки при компиляции но задуманное почему-то не работает. А работать должно так: противоположный ордер набирает профит и выключается при условии, на сумму заработанного профита отключаются первые ордера которые в просадке, ну и т.д. Но вот именно этот момент не работает, вычислил откуда идет как бы конфликт: если отключить функцию IfOrderYetOpen, то начинает все работать, но при этом открываются несколько противоположных ордеров что не желательно, и ещё возможен какой-то логический конфликт этой функции с функцией ClosePosBySizeProfit.
Помогите пож-та разобраться)

test_ma.mq47 скач.

#5231

Смысл не понятен, если заменить на другое слово, так должно быть?


Всем привет, у меня вопрос к программистам, написал советник, сам не профи а только изучаю. Советник торгует по машке, ради интереса вставил в него условие на противоположный ордер если будет просадка. Вроде все работает, проверял каждую строчку, а теперь наткнулся на то чего вообще не могу понять. Как бы нет никакой ошибки при компиляции но задуманное почему-то не работает. А работать должно так: противоположный ордер набирает профит и ЗАКРЫВАЕТСЯ при условии, на сумму заработанного профита ЗАКРЫВАЮТСЯ первые ордера которые в просадке, ну и т.д. Но вот именно этот момент не работает, вычислил откуда идет как бы конфликт: если отключить функцию IfOrderYetOpen, то начинает все работать, но при этом открываются несколько противоположных ордеров что не желательно, и ещё возможен какой-то логический конфликт этой функции с функцией ClosePosBySizeProfit.



Уважаемые комрады, вот строчка ведь неправильная же у товарища for(int i=OrdersTotal()-1; i>=0; i--), он последний ордер не учитывает, помоему нужно без -1 ?

Изменено 29 августа, 2018 пользователем vitek01

#5232

Уважаемые комрады, вот строчка ведь неправильная же у товарища for(int i=OrdersTotal()-1; i>=0; i--), он последний ордер не учитывает, помоему нужно без -1 ?



Да нет, все правильно. Выбор ордеров по позиции (SELECT_BY_POS) в списке всех открытых ордеров начинается с нуля. Таким образом, если OrdersTotal() вернул десять, то нумерация ордеров в списке будет идти от нуля до 9.
#5233

Мой вопрос вообще неразрешимый? =))

#5234

Мой вопрос вообще неразрешимый?

теоретически разрешимый, но практически интереса у публики не вызвал. Для начинающих - очень сложно, а для профи - скучно, ибо тупик там.
#5235


Мой вопрос вообще неразрешимый?

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

А я не собирался вводить в тупик, мой вопрос был технического характера, в процессе обучения пробовал менять условия и все получалось до этого момента, поэтому и попросил помощи. Это просто программный код в котором где-то что-то сломалось. Возможно он не принесет никакой выгоды, но мы же тут учимся и хотим все подняться на следующую ступеньку, так вот поэтому и хотелось бы знать где я споткнулся. Кто-то если поможет исправить ошибку, то я буду знать как это сделать и возможно этот советник уйдет в архив, а я получу опыт. Иначе зачем мы все здесь?!
#5236

Кто-то если поможет исправить ошибку, то я буду знать как это сделать и возможно этот советник уйдет в архив, а я получу опыт. Иначе зачем мы все здесь?!

Здесь никто никому не должен, ибо помощь не оплачивается, люди работают за интерес. Я гляну Вашу сову позже, может подскажу, сейчас времени нет.
#5237

Подскажите, пожалуйста, что в этой строке не так?
datetime VL = ObjectGet("name",OBJPROP_TIME);
Хочу присвоить переменной координату времени расположения объекта.
Спасибо!

#5238


Подскажите, пожалуйста, что в этой строке не так?
datetime VL = ObjectGet("name",OBJPROP_TIME);
Хочу присвоить переменной координату времени расположения объекта.
Спасибо!



"ObjectGet

Возвращает значение указанного свойства объекта.



double ObjectGet( "
прям в справке написано.
Приведите значение к datetime.

Изменено 27 сентября, 2018 пользователем djnet

#5239

Подскажите, пожалуйста, что в этой строке не так?

ObjectGetInteger(0,name,OBJPROP_TIME);
#5240
Здравствуйте, коллеги.

Подскажите, как в советнике сделать отображение в коментарии макс. просадку,
на которую проседал счёт, пока был запущен этот советник?
fcplm

Спойлер

Просадка (Эквити минус балланс) отображается в комментарии.
Если просадка ещё опустилась - новое значение заменяет старое, и будет отображаться, пока не опуститься ещё ниже. и т.д.

#5241

Подскажите, как в советнике сделать отображение в коментарии макс. просадку, на которую проседал счёт, пока был запущен этот советник?

в функции OnTick() :
static double MaxDD = 0;
if ( MaxDD это всё.
#5242

Извините. >D-b

#5243

В данном случае - нет разницы.

#5244

вместо a=b; такую запись: a=(b);. или вместо a=OrderLots(); a=(OrderLots());. В чём разница?

Единственное место, где нужно побольше скобочек это #define, подробнее в справке. Но в Вашем примере - разницы нет.
#5245

Подскажите, как в коде прописать так, чтобы ордера открывались только при открытии бара, а в безубыток ордера можно было бы перевести в любое время?

#5246

Подскажите, как в коде прописать так, чтобы ордера открывались только при открытии бара, а в безубыток ордера можно было бы перевести в любое время?

Например так:
OnTick(){

if ( OrderProfit() >= 0 ) SL2BU(); // переводим в БУ
if ( isNewBar() ) checkSignal(); // проверяем условия открытия
}
Ордер должен быть активен, функцию isNewBar() можно найти и здесь в теме и в инете.

#5247

всем привет! друзья помогите с решением как облегчить тяжелый советник.
заранее о оговорюсь что он использует расчеты нескольких индикаторов.
есть варианты того что бы могло помочь:
1. совместить все индикаторы в один?
2. переместить все расчеты в сову? но, хотя как я слышал от этого только хуже.
3.я использую 5-ти знак. может заставить расчеты считать по 4-му знаку?
пс. сам терминал облегчен. это, спасибо если что не интересует.
#5248

Универсальное решение- считывать показания индикаторов 1 раз в свечу.
Все остальное перечисленное , ИМХО, не поможет .(помещать код индикатора в свечу говорят поможет, но на сколько...)

#5249

2. переместить все расчеты в сову? но, хотя как я слышал от этого только хуже.

Зависит от того что и как переносить - возьмём машку: в советнике Вы используете 2 значения на 2 и на 1 баре, а в индикаторе хранятся 1000 значений машки - есть смысл перенести расчёт в сову.
#5250

в советнике Вы используете 2 значения на 2 и на 1 баре, а в индикаторе хранятся 1000 значений машки - есть смысл перенести расчёт в сову.


0ll, хранение в индикаторе 1000 значений разве влияет на производительность? Память- да, отъедает... Но расчет первой тысячи, как правило, в OnInit происходит...
Или нет?

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

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