Kanoobee
Kanoobee

 
Уровень 9


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Просьба помощи по коду MQL4 без убытка.

Ув. программисты, я столкнулся с проблемой вычисления ТР. Допустим есть два ордера BUY (открытые по разной цене и с разными объемами). Такой же вариант будет и с SELL.

Как высчитать цену TP без убытка с учетом комиссии и спреда?

Если будет возможность прописать в коде комментарии пошагово.

Заранее огромная благодарность!!!
  • 0
  • Просмотров: 715
  • 21 сентября 2024, 12:15
  • Kanoobee
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник на индикаторе Forex Pulse Comodo
Следующая запись в группе  
2 MACD
20 сентября 2024
22 сентября 2024

Брокер для ваших роботов, 15 лет на рынке

Комментарии (9)

+
+1
здесь все на пальцах расписано)
комменты из топика тоже будут полезны.
Редактирован: 21 сентября 2024, 22:40
avatar

  14  verta81 Сообщений: 388

  • 21 сентября 2024, 22:38
+
0
Большое спасибо!!! *good* 
avatar

  9  Kanoobee Автор Сообщений: 42 - Kanoobee

  • 22 сентября 2024, 01:48
+
0
Подобной статьи описывающей кнопки управления советником на графике пары нет случайно?
avatar

  9  Kanoobee Автор Сообщений: 42 - Kanoobee

  • 27 сентября 2024, 00:48
+
0
Какие функции у кнопки должны быть?
avatar

  14  verta81 Сообщений: 388

  • 27 сентября 2024, 01:05
+
0
Кнопка должна активировать функцию которая закрывает все ордера на паре. После нажатия на кнопку мышью появляется окно с вопросом «Действительно вы хотите закрыть все ордера?» да, нет (защита от случайного нажатия). (Если я не ошибаюсь это окно вызывается через Alert, поправьте меня если ошибаюсь ;)  ).

И если будет возможно перемещение кнопки мышью по графику.

Надеюсь то что я написал не сложно делается. :) 

Заранее большое спасибо!
avatar

  9  Kanoobee Автор Сообщений: 42 - Kanoobee

  • 27 сентября 2024, 01:52
+
+2
Первый вариант.
дабл-клик по кнопке и тащи ее куда хочешь.
//+------------------------------------------------------------------+
//|                                                       Button.mq4 |
//|                                               Copyright 2024, Ve |
//|                                             kupiscript@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Ve"
#property link      "kupiscript@yandex.ru"
#property version   "1.00"
#property strict

int Magic      = 0;
int Slip       = 10;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ButtonCreate("ButtonClose",40,50,80,30,"Close All",clrYellowGreen,false);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ObjectGetInteger(0,"ButtonClose",OBJPROP_STATE)==1)
     {
      if(MessageBox("Действительно вы хотите закрыть все ордера?",NULL,MB_YESNO)==6)
        {
         CloseAll();
        }
      ObjectSetInteger(0,"ButtonClose",OBJPROP_STATE,false);
     }
   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+ 
//| Создает кнопку                                                   | 
//+------------------------------------------------------------------+ 
bool ButtonCreate(string name,int x,int y,int width,int height,string text,color back_clr,bool state)
  {
   long chart_ID=0;               // ID графика 
   int sub_window=0;             // номер подокна 
   ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER; // угол графика для привязки 
   string font="Arial";
   int fonts_size=12;             // размер шрифта 
   color clr=clrBlack;             // цвет текста 
   color border_clr=back_clr;       // цвет границы 
   bool back=false;               // на заднем плане 
   bool selection=true;          // выделить для перемещений 
   bool selected =false;
   bool hidden=true;              // скрыт в списке объектов 
   long z_order=0;                // приоритет на нажатие мышью 
   
   if(ObjectFind(name)<0)
    {
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим кнопку 
   ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);
//--- установим координаты кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
//--- установим размер кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
//--- установим шрифт текста 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
//--- установим размер шрифта 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,fonts_size); 
//--- установим цвет текста 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим цвет фона 
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 
//--- установим цвет границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- переведем кнопку в заданное состояние 
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); 
//--- включим (true) или отключим (false) режим перемещения кнопки мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selected); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   }
   return(true); 
  } 
avatar

  14  verta81 Сообщений: 388

  • 27 сентября 2024, 18:13
+
+2
Второй вариант, с прямоугольником.
координаты кнопки привязаны к прямоугольнику, тащишь прямоугольник — тащится и кнопка.
//+------------------------------------------------------------------+
//|                                                       Button.mq4 |
//|                                               Copyright 2024, Ve |
//|                                             kupiscript@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Ve"
#property link      "kupiscript@yandex.ru"
#property version   "1.00"
#property strict

int Magic      = 0;
int Slip       = 10;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
   RectLabelCreate("Main",20,20,120,100,clrSilver);
   ButtonCreate("ButtonClose",40,50,80,30,"Close All",clrYellowGreen,false);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ObjectGetInteger(0,"ButtonClose",OBJPROP_STATE)==1)
     {
      if(MessageBox("Действительно вы хотите закрыть все ордера?",NULL,MB_YESNO)==6)
        {
         CloseAll();
        }
      ObjectSetInteger(0,"ButtonClose",OBJPROP_STATE,false);
     }
   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+ 
//| Создает кнопку                                                   | 
//+------------------------------------------------------------------+ 
bool ButtonCreate(string name,int x,int y,int width,int height,string text,color back_clr,bool state)
  {
   long chart_ID=0;               // ID графика 
   int sub_window=0;             // номер подокна 
   ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER; // угол графика для привязки 
   string font="Arial";
   int fonts_size=12;             // размер шрифта 
   color clr=clrBlack;             // цвет текста 
   color border_clr=back_clr;       // цвет границы 
   bool back=false;               // на заднем плане 
   bool selection=true;          // выделить для перемещений 
   bool selected =false;
   bool hidden=true;              // скрыт в списке объектов 
   long z_order=0;                // приоритет на нажатие мышью 
   
   if(ObjectFind(name)<0)
    {
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим кнопку 
   ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);
//--- установим координаты кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
//--- установим размер кнопки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
//--- установим шрифт текста 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
//--- установим размер шрифта 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,fonts_size); 
//--- установим цвет текста 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим цвет фона 
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 
//--- установим цвет границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- переведем кнопку в заданное состояние 
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); 
//--- включим (true) или отключим (false) режим перемещения кнопки мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selected); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   }
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Создает прямоугольную метку                                      | 
//+------------------------------------------------------------------+ 
bool RectLabelCreate(string name,int x,int y,int width,int height,color back_clr)
  {
   long chart_ID=0;               // ID графика 
   int sub_window=0;             // номер подокна 
   ENUM_BORDER_TYPE border=BORDER_SUNKEN;     // тип границы 
   ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER; // угол графика для привязки 
   color clr=clrRed;               // цвет плоской границы (Flat) 
   ENUM_LINE_STYLE  style=STYLE_SOLID;        // стиль плоской границы 
   int line_width=1;             // толщина плоской границы 
   bool back=false;               // на заднем плане 
   bool selection=true;          // выделить для перемещений 
   bool selected =true;
   bool hidden=true;              // скрыт в списке объектов 
   long z_order=0;                // приоритет на нажатие мышью 
   
   if(ObjectFind(name)<0)
    {
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим прямоугольную метку 
   ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0);
//--- установим координаты метки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
//--- установим размеры метки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 
//--- установим цвет фона 
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 
//--- установим тип границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border); 
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- установим цвет плоской рамки (в режиме Flat) 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линии плоской рамки 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину плоской границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим перемещения метки мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selected); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
     }
   return(true); 
  } 
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE && sparam=="1")
     {
      int x=(int)ObjectGetInteger(0,"Main",OBJPROP_XDISTANCE);
      int y=(int)ObjectGetInteger(0,"Main",OBJPROP_YDISTANCE);
      ObjectSetInteger(0,"ButtonClose",OBJPROP_XDISTANCE,x+20);
      ObjectSetInteger(0,"ButtonClose",OBJPROP_YDISTANCE,y+30);
     }
   if(id==CHARTEVENT_OBJECT_CLICK && sparam=="ButtonClose")
     {
      int x=(int)ObjectGetInteger(0,"Main",OBJPROP_XDISTANCE);
      int y=(int)ObjectGetInteger(0,"Main",OBJPROP_YDISTANCE);
      ObjectSetInteger(0,"ButtonClose",OBJPROP_XDISTANCE,x+20);
      ObjectSetInteger(0,"ButtonClose",OBJPROP_YDISTANCE,y+30);
     }
  }
//+------------------------------------------------------------------+
avatar

  14  verta81 Сообщений: 388

  • 27 сентября 2024, 18:15
+
0
Огромнейшая благодарность!!! *good* 

Да прибудет с Вами сила программиста!!!
avatar

  9  Kanoobee Автор Сообщений: 42 - Kanoobee

  • 27 сентября 2024, 20:13
+
0
Знатоки, могут поделиться своим вариантом)
avatar

  14  verta81 Сообщений: 388

  • 27 сентября 2024, 18:16

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий