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

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

В недрах сети обнаружил универсального советника 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 Я немного лез в код советника, но это чисто косметические перестановки для лучшего доступа к важнейшим функциям.
 

Вложения

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

Вложения

  • TDIs3.mq4
    TDIs3.mq4
    29,9 КБ · Просмотры: 80
Последнее редактирование:
ребят, можете помочь с простым кодом, плиз? а то я застрял... хотел себе сделать небольшую панель.

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

Вложения

  • 999.mq4
    999.mq4
    21,2 КБ · Просмотры: 43
Да вы правы -мтф изначально не работал.Извиняюсь.Нашел нормальный.
 

Вложения

Последнее редактирование:

Вложения

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);
}

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

Мне осталось добавить команду на закрытие всех ордеров в текущем графике и потом хочу добавить сверху 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") {


}
}

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

Вложения

  • Zone.ex4
    Zone.ex4
    19,4 КБ · Просмотры: 27
  • Zone.mq4
    Zone.mq4
    14 КБ · Просмотры: 44
Здравствуйте! Очень нужна ваша помощь. Нужно модифицировать индикатор 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. Очень граальный индикатор может получиться. Заранее благодарю и надеюсь на вашу помощь в указанной доработке этого индикатора. Если у вас есть желание и время помочь - очень доброе дело сделаете. Надеюсь на вашу помощь. Всех благ!)
 

Вложения

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

Мне осталось добавить команду на закрытие всех ордеров в текущем графике и потом хочу добавить сверху 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);
   }
}
Вообще, сложно еще из-за того, что в примерах, все делают по-разному, поэтому не поймешь как правильно
Воспринимайте это не как сложность, а как возможность ) Ведь одну и ту же задачу можно решить десятками способов.
Например можно отслеживать нажата кнопка или нет, а можно отслеживать события клика по обьекту, в этом вы уже убедились.

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

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

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);
}
 
Теперь момент такой выявил, открывается двойной ордер по нажатию кнопки.
вы оставили оба варианта работы с кнопкой в коде, оба они отрабатывают.
либо удалите верхний вариант, либо нижний.
логичней конечно оставить код в 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);
 
логичней конечно оставить код в OnChartEvent , только отжатие кнопки перенесите туда.
хорошо, вроде сделал, хотя отжатие кнопок так нормально и не работает) ну ладно, с этим потом, наверное я даже уберу это и сделаю кнопку плоской. так будет лучше смотреться.

Тут такое дело, почему-то не работает команда на + прибавление лота.
Создал OBJ_EDIT, рядом с ней кнопку+, вписал команду для нее, но реакции на это поле нет. Также нет реакции вообще на это поле, если даже вручную пропишу 0.02. открывает также 0.01). как быть?
 
А вот выдрал, точнее нашел команду и воткнул к себе в код, сработало 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);
}
}


}
}

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

Посмотрели (2114) Посмотреть

Смотрят сейчас (5) Посмотреть

Отслеживают (1857) Посмотреть

Назад
Верх