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

 
Alexey Viktorov:

А ничего что указано

ничего, ветка для МТ4, соответственно и не обращаешь внимания на это

ладно, занимайтесь, скучно здесь

 

Приветствую всех. Удачи в жизни и профита в работе.

Обращаюсь с просьбой помочь(неожидано, да? :) ).

В Mql я нуб нубом, 2 дня "в теме". Риал заставляет перейти на автоматическую торговлю, пытаюсь "написать"(в реале собрать из разных частей) сову для своей флэтовой ТС и конечно на каждой строке запарки :). Вот уже часов 10 парюсь над очередной траблой и пока "а воз и ныне там". Если кто поможет советом или примером буду премного благодарен(устно и письменно, а главное в душЕ).

В общем так... Есть ТС, успешно используемая мной уже давненько. По торг.условиям на одном и том же инструменте возможны разнонаправленные рын.ордера(без отложенных). К просевшей позиции возможен долив при торг.сигнале, при условии, что позиция просела не менее чем на Х пипс, иногда бывает и долив к доливу(при тех же условиях (торг.сигнал + размер просадки)). Проблема(текущая) в открытии доп.позиций, а именно... как проверить и вернуть значение убытка по доливаемой позе. По  примеру  https://www.mql5.com/ru/forum/117061  подправил код для присвоение каждой позе своего Магика, но это и все. Как выбрать именно просевшую позу  и вернуть значение её убытка.... :(.

"мой" код открытия сделок.

//-----------------

      if (NumberOfPositions(Symbol(),OP_BUY, Magic)<1)

      {

        if (мои условия входа)

      {

        if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;

        if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;

ticket=OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),5,SL,TP,"BUY",Magic,0,Blue);

        if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError());}

      }}

      if (NumberOfPositions(Symbol(),OP_SELL, Magic)<1)

      { 

      if (мои условия входа)

      { 

      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;

      if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;

ticket=OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),5,SL,TP,"SELL",Magic,0,Red); 

    if(ticket < 0) { Print("Ошибка открытия ордера SELL #", GetLastError());}

}}    

//---------------

Дополнительные ордера планируется открывать по следующему коду...

//---------------

      if (NumberOfPositions(Symbol(),OP_BUY, Magic)==1 && NumberOfPositions(Symbol(),OP_BUY, Magic_2)<1) 

 

      if (мои условия входа && GetProfitOpenPosInPoint(Symbol(),OP_BUY,Magic)>= LEVEL_1)

        { 

ticket=OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),5,SL,TP,"доп. покупка",Magic_2,0,Blue);

if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError());  } 

} }

//---------------

И вот тут то я и встал :). Что использовать вместо GetProfitOpenPosInPoint(Symbol(),OP_BUY,Magic) . По идее надо Уровень_просадки(Symbol(),OP_BUY,Magic) заюзать, а вот как его получить...

Помогите плииз, будьте другами. 
З.Ы. Если будете советовать, очень прошу, учитывайте, что я пока нубяра еще тот, не поленитесь чуток подробнее направить меня, ну типа если: ЛЕС ТАМ, то не забудьте направление указать <------ || ------>.

Спс за внимание:). 

код----доливаем по тренду
код----доливаем по тренду
  • 2009.05.07
  • www.mql5.com
Я пытался написать советник с открытием дополнительных лотов по тренду. Суть заключается вот в чем...
 
Igor Makanu:

ничего, ветка для МТ4, соответственно и не обращаешь внимания на это

ладно, занимайтесь, скучно здесь

Подскажите где аналогичная ветка для МТ5, я там спрошу...

 
Alexander Layzerevich:

Подскажите где аналогичная ветка для МТ5, я там спрошу...

Здесь спрашивайте. Здесь по обоим языкам.
 
Alexey Viktorov:

А ничего что указано

Выделенное ничем не отличается от объявления функции. Получается во входных параметрах функции объявлена функция.

В МТ4 Вызов функции из Индикатора проходит без ошибок и работает как нужно (int handle=iEnvelopes(Symbol(), tf, period, method, shift, price, Deviation(kanal), buff);) Думал что и в МТ5 так же возможно.

Подскажите как правильно сделать ?

 
Alexander Layzerevich:

В МТ4 Вызов функции из Индикатора проходит без ошибок и работает как нужно (int handle=iEnvelopes(Symbol(), tf, period, method, shift, price, Deviation(kanal), buff);) Думал что и в МТ5 так же возможно.

Подскажите как правильно сделать ?

Так невозможно получить данные Envelopes в mql4
 
Artyom Trishkin:
Так невозможно получить данные Envelopes в mql4

Вот код из МТ4

//-------------------------------------------------------------------
extern string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

extern ENUM_TIME_FRAMES   TimeFrames     = 5;                     // Временной период
//-------------------------------------------------------------------
       int                Ma_Period     = 120;                   // Период
       ENUM_MA_METHOD     Ma_Method     = 2;                     // Mетод усреднения
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_APPLIED_PRICE Applied_Price = 0;                     // Tип цены
//************************************************************************************************/

int OnInit()
{
double Signal_Buy = iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Method, Ma_Shift, Applied_Price, Deviation(TimeFrames, Kanal), 2, 0); // Сигнал на Покупку
}
//+------------------------------------------------------------------+
double Deviation(int Time_Frames, int _Kanal)
{

int Simbol = SymbolMagic();
//-------------------------
if (Time_Frames == 0) Time_Frames = Period();

if (Time_Frames == 1)
   {
   if (_Kanal == 1)
      {
      switch (Simbol)
         {
         ...
         }
      }
   }
}
//+------------------------------------------------------------------+

Всё отлично работает. Хотелось бы аналогичное в МТ5 

 
Alexander Layzerevich:

Вот код из МТ4

Всё отлично работает. Хотелось бы аналогичное в МТ5 

Ну так потому, что это иной код, и он будет работать.
 
Artyom Trishkin:
Ну так потому, что это иной код, и он будет работать.

Исправил в МТ5 коде передачу данных Индикатору:

//-------------------------------------------------------------------
extern string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

extern ENUM_TIMEFRAMES    TimeFrames    = PERIOD_M5;             // Временной период
//-------------------------------------------------------------------
       int                Ma_Period     = 120;                   // Период
       ENUM_MA_METHOD     Ma_Method     = MODE_SMMA;             // Mетод усреднения
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;           // Tип цены
//************************************************************************************************/
void OnTick()
{
double Signal_Buy = (int)Envelopes(Symbol(), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, 2,  Deviation(1)); // Сигнал на Покупку
}
//************************************************************************************************/
double Envelopes(string symb, ENUM_TIMEFRAMES tf, int period, int shift, int method, int price, int buff, double Deviation(int kanal))
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), tf, period, shift, method, price, Deviation(kanal));
   if(handle<0)
   {
    Print("Failed to create handle ATR, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,buff,0,1,buf)<0)
    {
     Print("Failed to copy data from the indicator ATR, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Но ошибка та-же. 

 
Alexander Layzerevich:

Вот код из МТ4

//-------------------------------------------------------------------
extern string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

extern ENUM_TIME_FRAMES   TimeFrames     = 5;                     // Временной период
//-------------------------------------------------------------------
       int                Ma_Period     = 120;                   // Период
       ENUM_MA_METHOD     Ma_Method     = 2;                     // Mетод усреднения
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_APPLIED_PRICE Applied_Price = 0;                     // Tип цены
//************************************************************************************************/

int OnInit()
{
double Signal_Buy = iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Method, Ma_Shift, Applied_Price, Deviation(TimeFrames, Kanal), 2, 0); // Сигнал на Покупку
}
//+------------------------------------------------------------------+
double Deviation(int Time_Frames, int _Kanal)
{

int Simbol = SymbolMagic();
//-------------------------
if (Time_Frames == 0) Time_Frames = Period();

if (Time_Frames == 1)
   {
   if (_Kanal == 1)
      {
      switch (Simbol)
         {
         ...
         }
      }
   }
}
//+------------------------------------------------------------------+

Всё отлично работает. Хотелось бы аналогичное в МТ5 

Следите за руками:

В предыдущем моём сообщении выделено в вашем коде вот это

double Deviation(int Time_Frames, int _Kanal)

а в коде этого, цитируемого сообщения это объявление функции. Тоже выделил.

А вот это

Deviation(TimeFrames, Kanal)

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

Причина обращения: