Доработка ботов (советников, индикаторов) vol. 2

IngBar

Интересующийся
Здравствуйте!
В который раз обращаюсь в данную ветку за помощью и надеюсь, что снова успешно.

В недрах сети обнаружил универсального советника exp_iCustom_v11. Чудеснейшая штука, реально работает с почти всеми индикаторами и снимает множество проблем для таких профанов в коде, как я. Но не идеальная, хотелось бы его доработать до v12.

1) В советнике есть функции только Buy или Sell, хотелось бы сделать так, чтобы их включение было видно в окне графика.

extern bool Buy = true;
extern bool Sell = true;
В окне графика под значком советника:
Buy = true/false
Sell = true/false

Есть планы использовать данный советник для полуавтоматической торговли и отсутствие этой информации на графике ... напрягает, каждый раз лезешь в настройки проверять, сплошной нервоз. Вроде это простой вопрос, видел решения во многих советниках, но своими мозгами додумать не смог.

Если кто заморочится сделать кнопки - было бы ещё лучше, но это уже наглёжь с моей стороны.

2) В советнике есть функции стоплосс и тейкпрофит для каждого отдельного ордера, но нет подобных функций для совокупности ордеров. В пунктах или валюте депозита, лучше и то и другое.

3) Аналогично п. 2 можно также сделать стоплосс и тейкпрофит для всего счёта в валюте депозита, а не только текущей пары, с которой работает советник.

Пожеланий в итоге немало, но мне главнее первое, хотя оно и самое простое. И второе)

Заранее спасибо за любую помощь.

PS Я немного лез в код советника, но это чисто косметические перестановки для лучшего доступа к важнейшим функциям.
 

Вложения

  • exp_iCustom_v11.mq4
    323,8 КБ · Просмотры: 61

Genry_05

Отдыхает
Спасибо вам огромное!!! Я попробовала придвинуть стрелки ближе и ничего не получилось. Можно сделать чтобы стрелки были вплотную к графику?
Для настройки отступа верхней стрелки используйте dist
 

Вложения

  • TDIs3.mq4
    29,9 КБ · Просмотры: 74
Последнее редактирование:

rainthegod

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

Создал таки панель и две кнопки в ней (пока без функций)
При добавлении советника на график, одна кнопка появляется криво поверх панели. Как только я делаю клик на графике или попытаюсь захватить панель, эта кнопка исчезает или перемещается и в панели появляются обе мои кнопки в нужном положении (и панель готова к перемещению). Пытался и так и сяк редактировать параметры X/Y кнопок, что-то не помогает, кнопка или кнопки вообще выплывают из панели и двигаются по каким-то своим осям при перемещении панели.
В настройках осей панели я выставил так, чтобы она появлялась в правой части экрана ближе к центру.
Уже в процессе переноса работы с панелью все в порядке, панель перемещается и кнопки за ней (чтобы кнопки следы не оставляли, это потом уже сделаю)
Как это исправить? что я там напутал с X/Y и прочим? Спасибо!
upd. Продублировал параметры из OnChartEvent в OnInit, теперь сразу панель с двумя кнопками появляется, но что-то же здесь все равно не так сделано? Код нужно подправить?
Если я пытаюсь убрать те же строки из OnChartEvent, то панель перемещается уже без кнопок), а они остаются на месте что ли.
Также при добавлении команды Ordersend в onchartevent, попытка покупки идет даже если я нажал на панель, а не на кнопки... как это исправить?
 

Вложения

  • 999.mq4
    21,2 КБ · Просмотры: 39

olegkom

Активный участник
Да вы правы -мтф изначально не работал.Извиняюсь.Нашел нормальный.
 

Вложения

  • NrpuSuperTrendxarrows_mtfvalerts.mq4
    6,9 КБ · Просмотры: 73
Последнее редактирование:

MrGreen86

Гуру форума

Вложения

  • NrpuSuperTrendxarrows_mtfvalerts n2.mq4
    6,9 КБ · Просмотры: 90

MrGreen86

Гуру форума
upd. Продублировал параметры из OnChartEvent в OnInit, теперь сразу панель с двумя кнопками появляется, но что-то же здесь все равно не так сделано? Код нужно подправить?
Если я пытаюсь убрать те же строки из OnChartEvent, то панель перемещается уже без кнопок), а они остаются на месте что ли.
Также при добавлении команды Ordersend в onchartevent, попытка покупки идет даже если я нажал на панель, а не на кнопки... как это исправить?
Панель и кнопки реализованы более менее нормально, ничего критичного нет.
Некоторые замечания:
1. В названии объектов одного советника используйте одинаковые префиксы. например "tp_" (trade panel). А в OnDeinit используйте одну функцию для удаления обьектов ObjectsDeleteAll(0,"tp_").
Таким образом вам не нужно будет прописывать удаление каждого объекта по отдельности и 2 и более советников/индикаторов на одном графике точно не перепутают свои обьекты.
2. Событие OnChartEvent генерируется только по событию с графика. Перемещение обьекта, не завершенное не является событием. А вот перемещение мышки можно сделать событием.
Для этого в OnInit добавьте такую строчку:
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
Тогда перемещение панели будет плавным.

Теперь по поводу OrderSend. Отслеживайте состояние кнопок BUY и SELL.
Если кнопка нажата - пытаемся открыть ордер и отжимаем кнопку, выглядит это примерно так:
if(ObjectGetInteger(0,"buttonbuy",OBJPROP_STATE) == TRUE) {
if(OrderSend(Symbol(), OP_BUY, 0.5, NormalizeDouble( Ask,_Digits), 3, 0, 0, "", 0, 0, clrBlue) <0) {
Alert("Ошибка открытия ордера "+GetLastError());
}
ObjectSetInteger(0,"buttonbuy",OBJPROP_STATE,false);
}

if(ObjectGetInteger(0,"buttonsell",OBJPROP_STATE) == TRUE) {
if(OrderSend(Symbol(), OP_SELL, 0.5, Bid, 3, 0, 0, "", 0, 0, clrRed) <0) {
Alert("Ошибка открытия ордера "+GetLastError());
}
ObjectSetInteger(0,"buttonsell",OBJPROP_STATE,false);
}

конечно стоит нормализовывать не только цену но и лот и вообще проверять ошибки и правильно на них реагировать.
 

rainthegod

Интересующийся
конечно стоит нормализовывать не только цену но и лот и вообще проверять ошибки и правильно на них реагировать.
Спасибо, что отозвались и помогаете) а то на других форумах тишина)
Уже неплохо так оформил панельку сегодня + с вашими исправлениями, выглядит уже хорошо)

Мне осталось добавить команду на закрытие всех ордеров в текущем графике и потом хочу добавить сверху 3 окошка с мелкими стрелками+/- для быстрого редактирования лота, SL и TP.

Вот с командой на закрытие ордеров сложновато. Можете подсказать как команду дописать правильно? (на покупку и продажу кнопки уже работают)
Или может нужно отдельно через Void или другую команду это делать для закрытия ордеров?

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

if (id==CHARTEVENT_OBJECT_CLICK) {

if (sparam=="buttonbuy") {
OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, "Opened by Advisor", 0, 0, clrBlue); //add your buy order here
}
if (sparam=="buttonsell") {
OrderSend(Symbol(), OP_SELL, lots, Bid, 3, 0, 0, "Opened by Advisor", 0, 0, clrYellow); //add your sell order here
}
if (sparam=="buttoncloseall") {


}
}

}
 

gEvor777777

Прохожий
Друзья подскажите пожалуйста есть у кого нибудь индикатор ZONE со стрелками на заплывание в зону , кто сотворит сейо чудо увековечится на долго)))
 

Вложения

  • Zone.ex4
    19,4 КБ · Просмотры: 25
  • Zone.mq4
    14 КБ · Просмотры: 42

Understanding

Активный участник
Здравствуйте! Очень нужна ваша помощь. Нужно модифицировать индикатор AllHeikin-Ashi_v2.6 600+.mq4 его нужно изменить, а именно - добавить в него различные фильтры и функции из других индикаторов, отрывки кода и сами индикаторы из которых брать этот код, залил в архив ниже. Сейчас все распишу.


1) Из индикатора AllHeikin-Ashi_v2.4.mq4 нужно скопировать расчет MinMove (в коде input double MinMove и остальной связанный код), добавить, например, так: extern bool use_AllHeikin-Ashi_v2.4_MinMove_method = false; )


2) Из индикатора ema variation + filter 3 mtf_edit.mq4
enum enPrices
{
pr_close, // Close
pr_open, // Open
pr_high, // High
pr_low, // Low
pr_median, // Median
pr_typical, // Typical
pr_weighted, // Weighted
pr_average, // Average (high+low+open+close)/4
pr_medianb, // Average median body (open+close)/2
pr_tbiased, // Trend biased price
pr_tbiased2, // Trend biased (extreme) price
pr_haclose, // Heiken ashi close
pr_haopen , // Heiken ashi open
pr_hahigh, // Heiken ashi high
pr_halow, // Heiken ashi low
pr_hamedian, // Heiken ashi median
pr_hatypical, // Heiken ashi typical
pr_haweighted, // Heiken ashi weighted
pr_haaverage, // Heiken ashi average
pr_hamedianb, // Heiken ashi median body
pr_hatbiased, // Heiken ashi trend biased price
pr_hatbiased2, // Heiken ashi trend biased (extreme) price
pr_habclose, // Heiken ashi (better formula) close
pr_habopen , // Heiken ashi (better formula) open
pr_habhigh, // Heiken ashi (better formula) high
pr_hablow, // Heiken ashi (better formula) low
pr_habmedian, // Heiken ashi (better formula) median
pr_habtypical, // Heiken ashi (better formula) typical
pr_habweighted,// Heiken ashi (better formula) weighted
pr_habaverage, // Heiken ashi (better formula) average
pr_habmedianb, // Heiken ashi (better formula) median body
pr_habtbiased, // Heiken ashi (better formula) trend biased price
pr_habtbiased2 // Heiken ashi (better formula) trend biased (extreme) price


2.2
extern double Divisor = 3; // Divisor to use for "ema" calculation
extern double Filter = 1; // Filter
extern int Precision = 5; // Precision
extern bool Interpolate = true; // Interpolate multi time frame data?

- всё то, что совместимо из этого индикатора ema variation + filter 3 mtf_edit.mq4, чтоб было перенесено и корректно работало.


3) Из индикатора AMkA.mq4
"//---- периоды
extern int periodAMA = 9; //период расчёта к-та эффективности
extern double nfast = 2; //период EMA для эффективного рынка
extern double nslow = 30; //период EMA для неэффективного рынка
//---- расчёт сглаживающей константы
extern double Pow = 2.0; //степень эффективности
//---- фильтр сигналов
extern double dK = 1.0; //коэффициент для фильтра
extern bool use_stdev = true; //использовать стандартное отклонение


Очень важно, чтоб добавленное не конфликтовало в расчетах между собой. Добавьте, пожалуйста, что реально добавить из этого что я указал в просьбе. Хочется чтоб "верха" и "низы" лучше опознавались индикатором. Прилагаю сет-файл настроек на версию AllHeikin-Ashi_v2.4.mq4 Этот файл настроек подходит и для AllHeikin-Ashi_v2.6 600+.mq4. Использую AllHeikin-Ashi_v2.6 600+.mq4 индикатор с настройками из .set на периоде М1. Очень граальный индикатор может получиться. Заранее благодарю и надеюсь на вашу помощь в указанной доработке этого индикатора. Если у вас есть желание и время помочь - очень доброе дело сделаете. Надеюсь на вашу помощь. Всех благ!)
 

Вложения

  • Compressed.zip
    21,4 КБ · Просмотры: 39

MrGreen86

Гуру форума
Спасибо, что отозвались и помогаете) а то на других форумах тишина)
Уже неплохо так оформил панельку сегодня + с вашими исправлениями, выглядит уже хорошо)

Мне осталось добавить команду на закрытие всех ордеров в текущем графике и потом хочу добавить сверху 3 окошка с мелкими стрелками+/- для быстрого редактирования лота, SL и TP.
не совсем понял что вам нужно. кнопка чтобы закрыть все на текущем графике? или чтобы панель ставила всем ордера на графике заданный ТП и СЛ? общий по сумме ордеров или для каждого ордера свой?

Поле для редактирования OBJ_EDIT. А вот 2 стрелочки для редактирования это 2 OBJ_BUTTON которыеразместите рядом.
И чтобы оно работало нужно прописать управление этими стрелочками в OnChartEvent:
Код:
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
  ) {
   if(id==CHARTEVENT_OBJECT_CLICK && sparam=="panel_sl_plus_button") {
      // отожмем кнопку
      ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
      // прочитаем какое число сейчас в OBJ_EDIT
      int   current_value = (int)ObjectGetString(0,"panel_sl_edit",OBJPROP_TEXT);
      // увеличим значение на 1
      current_value++;
      // изменим поле OBJ_EDIT
      ObjectSetString(0,"panel_sl_edit",OBJPROP_TEXT,(string)current_value);
   }
   if(id==CHARTEVENT_OBJECT_CLICK && sparam=="panel_sl_minus_button") {
      // отожмем кнопку
      ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
      // прочитаем какое число сейчас в OBJ_EDIT
      int   current_value = (int)ObjectGetString(0,"panel_sl_edit",OBJPROP_TEXT);
      // уменьшим значение на 1
      current_value--;
      // проверим что значение не опустилось ниже допустимого уровня
      if(current_value < 5) current_value = 5;
      // изменим поле OBJ_EDIT
      ObjectSetString(0,"panel_sl_edit",OBJPROP_TEXT,(string)current_value);
   }
}
Вообще, сложно еще из-за того, что в примерах, все делают по-разному, поэтому не поймешь как правильно
Воспринимайте это не как сложность, а как возможность ) Ведь одну и ту же задачу можно решить десятками способов.
Например можно отслеживать нажата кнопка или нет, а можно отслеживать события клика по обьекту, в этом вы уже убедились.

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

rainthegod

Интересующийся
не совсем понял что вам нужно. кнопка чтобы закрыть все на текущем графике? или чтобы панель ставила всем ордера на графике заданный ТП и СЛ? общий по сумме ордеров или для каждого ордера свой?
На закрытие открытых ордеров нужна была команда) но я тут ее уже нашел) хотя еще люди давали коды, но они не сработали, то ошибки были какие-то как обычно, то просто не работала команда, а тут найденная сработала) с этим разобрался. закрывает теперь все открытые лонг и шорт ордера и при этом лимитки не трогает, что нужно!

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

extern double lots = 0.01;
extern int stoploss = 40;
extern int takeprofit = 80;

//---
int x = (int) ObjectGetInteger(0,"RectLabel",OBJPROP_XDISTANCE);
int y = (int) ObjectGetInteger(0,"RectLabel",OBJPROP_YDISTANCE);

ObjectSetInteger(0,"buttonbuy",OBJPROP_XDISTANCE,x+5);
ObjectSetInteger(0,"buttonbuy",OBJPROP_YDISTANCE,y+35);
if(ObjectGetInteger(0,"buttonbuy",OBJPROP_STATE) == true) {
if(OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, "", 0, 0, clrBlue) <0) {

Alert("Ошибка открытия ордера "+GetLastError());
}
ObjectSetInteger(0,"buttonbuy",OBJPROP_STATE,false);
}


ObjectSetInteger(0,"buttonsell",OBJPROP_XDISTANCE,x+75);
ObjectSetInteger(0,"buttonsell",OBJPROP_YDISTANCE,y+35);
if(ObjectGetInteger(0,"buttonsell",OBJPROP_STATE) == true) {
if(OrderSend(Symbol(), OP_SELL, lots, Bid, 3, 0, 0, "", 0, 0, clrRed) <0) {

Alert("Ошибка открытия ордера "+GetLastError());
}
ObjectSetInteger(0,"buttonsell",OBJPROP_STATE,false);
}
ObjectSetInteger(0,"buttonclose",OBJPROP_XDISTANCE,x+5);
ObjectSetInteger(0,"buttonclose",OBJPROP_YDISTANCE,y+77);


if (id==CHARTEVENT_OBJECT_CLICK) {

if (sparam=="buttonbuy") {
OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, "Opened by Advisor", 0, 0, clrBlue); //add your buy order here
}
if (sparam=="buttonsell") {
OrderSend(Symbol(), OP_SELL, lots, Bid, 3, 0, 0, "Opened by Advisor", 0, 0, clrYellow); //add your sell order here
}
if (sparam=="buttonclose") {
{
CloseOrder();
ObjectSetInteger(0,"buttoncloseall",OBJPROP_STATE,false);
}
 

MrGreen86

Гуру форума
Теперь момент такой выявил, открывается двойной ордер по нажатию кнопки.
вы оставили оба варианта работы с кнопкой в коде, оба они отрабатывают.
либо удалите верхний вариант, либо нижний.
логичней конечно оставить код в OnChartEvent , только отжатие кнопки перенесите туда.

Код:
int x = (int) ObjectGetInteger(0,"RectLabel",OBJPROP_XDISTANCE);
int y = (int) ObjectGetInteger(0,"RectLabel",OBJPROP_YDISTANCE);

ObjectSetInteger(0,"buttonbuy",OBJPROP_XDISTANCE,x+5);
ObjectSetInteger(0,"buttonbuy",OBJPROP_YDISTANCE,y+35);
ObjectSetInteger(0,"buttonsell",OBJPROP_XDISTANCE,x+75);
ObjectSetInteger(0,"buttonsell",OBJPROP_YDISTANCE,y+35);
ObjectSetInteger(0,"buttonclose",OBJPROP_XDISTANCE,x+5);
ObjectSetInteger(0,"buttonclose",OBJPROP_YDISTANCE,y+77);


if (id==CHARTEVENT_OBJECT_CLICK) {

if (sparam=="buttonbuy") {
OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, "Opened by Advisor", 0, 0, clrBlue); //add your buy order here
ObjectSetInteger(0,"buttonbuy",OBJPROP_STATE,false);
}
if (sparam=="buttonsell") {
OrderSend(Symbol(), OP_SELL, lots, Bid, 3, 0, 0, "Opened by Advisor", 0, 0, clrYellow); //add your sell order here
ObjectSetInteger(0,"buttonsell",OBJPROP_STATE,false);
}
if (sparam=="buttonclose") {
{
CloseOrder();
ObjectSetInteger(0,"buttoncloseall",OBJPROP_STATE,false);
 

rainthegod

Интересующийся
логичней конечно оставить код в OnChartEvent , только отжатие кнопки перенесите туда.
хорошо, вроде сделал, хотя отжатие кнопок так нормально и не работает) ну ладно, с этим потом, наверное я даже уберу это и сделаю кнопку плоской. так будет лучше смотреться.

Тут такое дело, почему-то не работает команда на + прибавление лота.
Создал OBJ_EDIT, рядом с ней кнопку+, вписал команду для нее, но реакции на это поле нет. Также нет реакции вообще на это поле, если даже вручную пропишу 0.02. открывает также 0.01). как быть?
 

rainthegod

Интересующийся
А вот выдрал, точнее нашел команду и воткнул к себе в код, сработало Lot_Extract

if (id==CHARTEVENT_OBJECT_CLICK) {

if (sparam=="buttonbuy") {
double Lot_Extract = StrToDouble (ObjectGetString (0, "lotsize", OBJPROP_TEXT, 0));
OrderSend(Symbol(), OP_BUY, Lot_Extract, Ask, 3, 0, 0, "Opened by Advisor", 0, 0, clrBlue); //add your buy order here
}
if (sparam=="buttonsell") {
double Lot_Extract = StrToDouble (ObjectGetString (0, "lotsize", OBJPROP_TEXT, 0));
OrderSend(Symbol(), OP_SELL, Lot_Extract, Bid, 3, 0, 0, "Opened by Advisor", 0, 0, clrYellow); //add your sell order here
}
if (sparam=="buttonclose") {
{
CloseOrder();
ObjectSetInteger(0,"buttonclose",OBJPROP_STATE,false);
}
if(id==CHARTEVENT_OBJECT_CLICK) {

if (sparam=="button+") { // отожмем кнопку
ObjectSetInteger(0,sparam,OBJPROP_STATE,false); // прочитаем какое число сейчас в OBJ_EDIT
int current_value = (int)ObjectGetString(0,"button+",OBJPROP_TEXT); // увеличим значение на 1
current_value++; // изменим поле OBJ_EDIT
ObjectSetString(0,"button+",OBJPROP_TEXT,(string)current_value);
}
}


}
}

}
 

rainthegod

Интересующийся
Еще один момент по панели. В код нужно что-то добавить, потому что если я жму + или любую кнопку больше двух раз, выделяется панель и соответственно ее можно случайно захватить и перенести, чего быть конечно не должно. хотя в другом советнике такое же видел)
 
Верх