Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2559

 
Ну, в принципе, Вы сами можете написать для себя функцию OnClick(). Клик по очередному (неактивному ранее) окну графика позволит Вам получить ID окна графика. Этот ID можно передать в переменную глобального уровня терминала (список которых вызывается по F3). Ну а индикатор обеспечить алгоритмом принятия решения, что ему делать, когда он считает из глобальной переменной тот или иной ID. Если реально нужно, то можно заморочиться. Пожалуй, это сработает. СтОит ли оно того?
 

Всем привет. Нужна помощь. Есть индюк в мт4. Работа его заключается в том, что, когда его Вы кидаете на график где открыта Ваша позиция, то рисуется линия. При перетаскивании которой Вы можете узнать Вашу прибыль или убыток. При этом профит можете не устанавливать.

Оригинал  рабочего кода (файл 4) и что получилось у меня (файл 5) я прикрепил в виде файлов (для экономии места).

Вот какие ошибки выдаёт исправленный код.


Файлы:
4.mq4  21 kb
5.mq5  20 kb
 
Igor Nagorniuk #:

Всем привет. Нужна помощь. Есть индюк в мт4. Работа его заключается в том, что, когда его Вы кидаете на график где открыта Ваша позиция, то рисуется линия. При перетаскивании которой Вы можете узнать Вашу прибыль или убыток. При этом профит можете не устанавливать.

Оригинал  рабочего кода (файл 4) и что получилось у меня (файл 5) я прикрепил в виде файлов (для экономии места).

Вот какие ошибки выдаёт исправленный код.


Хочется заметить, что это код не исправленный, а перекинут с файл mq4 в файл mq5

 
Vitaly Murlenko #:
Пожалуй, это сработает. СтОит ли оно того?

Подумаю над этим.
В любом случае Спасибо!

 
Vitaly Muzichenko #:

Хочется заметить, что это код не исправленный, а перекинут с файл mq4 в файл mq5

Да, странно, в 4 у меня 67 критических ошибок, а в 5 только 24.

 
Igor Nagorniuk #:

Да, странно, в 4 у меня 67 критических ошибок, а в 5 только 24.

По ошибкам видно, что была некоторая маленькая попытка сделать для мт5

 
Vitaly Muzichenko #:

По ошибкам видно, что была некоторая маленькая попытка сделать для мт5

Да бы ещё кто нибудь направил по нужному вектору направления). Цены не было. А то читаешь справку, а там "исправить 0", а в коде, даже намёка на 0 нет.

 
Igor Nagorniuk #:

Да бы ещё кто нибудь направил по нужному вектору направления). Цены не было. А то читаешь справку, а там "исправить 0", а в коде, даже намёка на 0 нет.

Vitaly Muzichenko #:

По ошибкам видно, что была некоторая маленькая попытка сделать для мт5

Igor Nagorniuk #:

Да бы ещё кто нибудь направил по нужному вектору направления). Цены не было. А то читаешь справку, а там "исправить 0", а в коде, даже намёка на 0 нет.

К примеру 

      if(StringFind(vName, name_n) != -1) ObjectDelete(vName);

В справке написано "Удаляет объект с указанным именем с указанного графика". Что мне делать в данном случае.

 ObjectDele

 

Вот на этом у меня стопор (нет не идей, ни знаний). В справку лезу, а там "ж..а")

Вот мой максимум

//+------------------------------------------------------------------+
//|                                                  Line_Profit.mq5 |
//|                                               Yuriy Tokman (YTG) |
//|                       https://www.mql5.com/ru/users/satop/seller |
//+------------------------------------------------------------------+
#property copyright "Yuriy Tokman (YTG)"
#property link      "https://www.mql5.com/ru/users/satop/seller"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2

#property indicator_plots   2
double AccountCurrency;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//----
void OnDeinit(const int reason) 
   {
    GetDellName();
    Comment("");
   }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   LineProfit(); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 void LineProfit()
  {
 //---
 double sum = 0;
  for(int cnt=0; cnt < PositionsTotal(); cnt++) {
    if(PositionGetSymbol(cnt)){
        if(PositionGetString(POSITION_SYMBOL)){
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY || PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
                sum++;
        }
    }
  }  
  //---- 
  if(sum > 0)
   {
    if(ObjectFind(0,"ytg_line_pf") < 0)
        HLine(0,"ytg_line_pf",0,bid,clrBlue,0,2,false,true);
    double pric_line = 0;
    if(ObjectFind(0,"ytg_line_pf") != -1)
        pric_line = ObjectGetDouble(0,"ytg_line_pf",OBJPROP_PRICE);
    double profit_ln = ProfitByPrice(-1,-1,pric_line);

    TextCreate2(0,"ytg_p_l",0,Time[0] + Period() * 60 * 5, pric_line,
    DoubleToStr(profit_ln,1) + " " + AccountCurrency(),"Arial",14,clrBlue,0.0,0);        
   }
    else 
     {
      if(ObjectFind(0,"ytg_line_pf") != -1) ObjectDelete(0,"ytg_line_pf");
      if(ObjectFind(0,"ytg_p_l") != -1) ObjectDelete(0,"ytg_p_l");
     }
  //----
}
//----
void GetDellName(string name_n="ytg_")
  {
   string vName;
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      vName = ObjectName(i);
      if(StringFind(vName, name_n) != -1) ObjectDelete(vName);
     }
  }

//+------------------------------------------------------------------+ 
//| Creates a "Text" object                                           | 
//+------------------------------------------------------------------+ 
bool TextCreate2(const long              chart_ID=0,               // Chart ID 
                const string            name="Text",              // Object name 
                const int               sub_window=0,             // Sub-window number 
                datetime                time=0,                   // Anchor time 
                double                  price=0,                  // Anchor price 
                const string            text="Text",              // Text content 
                const string            font="Arial Black",        // Font type 
                const int               font_size=10,             // Font size 
                const color             clr=clrDodgerBlue,        // Color 
                const double            angle=0.0,                 // Text angle 
                const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT,         // Anchor point 
                const bool              back=false,               // Display behind chart 
                const bool              selection=false,          // Allow selection
                const bool              hidden=false,              // Hide from object list
                const long              z_order=0)                // Mouse click priority 
  { 
//--- Check if object exists and delete if necessary
   if(ObjectFind(chart_ID,name) >= 0) ObjectDelete(chart_ID,name);
//--- Reset error code
   ResetLastError(); 
//--- Create text object
   if(!ObjectCreate(chart_ID, name, OBJ_TEXT, sub_window, time, price)) 
     { 
      Print(__FUNCTION__, ": Failed to create text object! Error code = ", GetLastError()); 
      return false; 
     } 
//--- Set text content
   ObjectSetString(chart_ID, name, OBJPROP_TEXT, text); 
//--- Set font type
   ObjectSetString(chart_ID, name, OBJPROP_FONT, font); 
//--- Set font size
   ObjectSetInteger(chart_ID, name, OBJPROP_FONTSIZE, font_size); 
//--- Set text angle
   ObjectSetDouble(chart_ID, name, OBJPROP_ANGLE, angle); 
//--- Set anchor point
   ObjectSetInteger(chart_ID, name, OBJPROP_ANCHOR, anchor); 
//--- Set color
   ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr); 
//--- Display on front (false) or back (true)
   ObjectSetInteger(chart_ID, name, OBJPROP_BACK, back); 
//--- Enable/Disable selection mode
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTABLE, selection); 
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTED, selection); 
//--- Hide/Show object name in object list
   ObjectSetInteger(chart_ID, name, OBJPROP_HIDDEN, hidden); 
//--- Set mouse click priority
   ObjectSetInteger(chart_ID, name, OBJPROP_ZORDER, z_order); 
//--- Successful execution
   return true; 
  } 

//+------------------------------------------------------------------+ 
//| Creates a horizontal line                                        | 
//+------------------------------------------------------------------+ 
bool HLine(const long            chart_ID=0,        // Chart ID 
                 const string          name="HLine",      // Line name 
                 const int             sub_window=0,      // Sub-window number 
                 double                price=0,           // Line price 
                 const color           clr=clrRed,        // Line color 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // Line style 
                 const int             width=1,           // Line width 
                 const bool            back=false,        // Display behind chart 
                 const bool            selection=false,    // Allow selection
                 const bool            hidden=false,       // Hide from object list
                 const long            z_order=0)         // Mouse click priority 
  { 
//--- Reset error code
   ResetLastError(); 
//--- Create horizontal line
   if(!ObjectCreate(chart_ID, name, OBJ_HLINE, sub_window, 0, price)) 
     { 
      Print(__FUNCTION__, ": Failed to create horizontal line! Error code = ", GetLastError()); 
      return false; 
     } 
//--- Set line color
   ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr); 
//--- Set line style
   ObjectSetInteger(chart_ID, name, OBJPROP_STYLE, style); 
//--- Set line width
   ObjectSetInteger(chart_ID, name, OBJPROP_WIDTH, width); 
//--- Display on front (false) or back (true)
   ObjectSetInteger(chart_ID, name, OBJPROP_BACK, back); 
//--- Enable/Disable selection mode
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTABLE, selection); 
   ObjectSetInteger(chart_ID, name, OBJPROP_SELECTED, selection); 
//--- Hide/Show object name in object list
   ObjectSetInteger(chart_ID, name, OBJPROP_HIDDEN, hidden); 
//--- Set mouse click priority
   ObjectSetInteger(chart_ID, name, OBJPROP_ZORDER, z_order); 
//--- Successful execution
   return true; 
  } 

//+------------------------------------------------------------------+
//|          Создает горизонтальную линию                            |
//|                                                                  |
//+------------------------------------------------------------------+
double ProfitByPrice(int op=-1, int mn=-1, double cp=0) {
  double pr = 0;
  double po, sp, tv;
  int k = PositionsTotal();
  double bid; // ???
  
  // Получение рыночной информации
  SymbolInfoDouble(Symbol(), SYMBOL_POINT, po);
  SymbolInfoDouble(Symbol(), SYMBOL_SPREAD, sp);
  SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE, tv);
  
  //Установка текущей цены
  if (cp <= 0) cp = bid;
  
  // 
  for (int i = 0; i < k; i++) {
    if (PositionGetSymbol(i)) {
      // 
      string symbol = PositionGetString(POSITION_SYMBOL);
      int magic = PositionGetInteger(POSITION_MAGIC);
      int position_type = PositionGetInteger(POSITION_TYPE);
      
      // 
      if (symbol == Symbol() && (op < 0 || position_type == op) && (mn < 0 || magic == mn)) {
        double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
        double lots = PositionGetDouble(POSITION_VOLUME);
        
        // 
        if (position_type == POSITION_TYPE_BUY) {
          pr += (cp - openPrice) / po * lots * tv;
        } else if (position_type == POSITION_TYPE_SELL) {
          pr += (openPrice - cp) / po * lots * tv;
        }
        
        // 
        pr += PositionGetDouble(POSITION_COMMISSION);
        pr += PositionGetDouble(POSITION_SWAP);
      }
    }
  }
  
  return pr;
}

21 кретическая ошибка, а было свыше 50.

 

Здравствуйте.

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

каркас советника состоит из вшитого в терминал советника на одном мувинге. 

можете убрать MaximumRisk и DecreaseFactor из кода и открывал позиции по фиксированному лоту?

заранее спасибо! 

Файлы:
2MA-pr.mq4  6 kb
 
Daulet_113 #:

Здравствуйте.

 она не ждет пересечения мувингов и опять открывает сделку.

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

Файлы:
2MA-pr_1.mq4  18 kb