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

 
Aleksandr Slavskii #:
Просто так совпало. На тесте первого советника была связь, а потом, когда поставили тестировать второй пропала.
Понял.Спасибо.
 
Igor Nagorniuk #:
Косяк вот в чём, в логике условий закрытия 

Вы хотите реализовать следующую схему: когда сетка ордеров по Мартину (магик MagikMrtn ) закрывается по суммарному профиту, нужно принудительно «подчистить» график от остальных зависших ордеров (магики Magik и MagikPrmd ), у которых нет Тейк Профита.

Условия должны быть такими:

  1. Считаем общий финансовый результат (Прибыль + Своп) только для позиций с магиком MagikMrtn .
  2. Если этот результат достигает целевого значения ( Mart ), мы запускаем функцию очистки графика.
  3. Функция очистки должна проходить по всем позициям на символе _Symbol и закрывать те, где магическое число совпадает со списком [Magik, MagikPrmd] . При этом фильтр типа позиции ( BUY или SELL ) лучше убрать, чтобы гарантированно закрыть всё сразу одной функцией, либо вызывать её дважды — отдельно для Buy и Sell.


Спасибо большое, что Вы указали на мои ошибки в функции PosClos.

Но к сожалению Вы не совсем поняли о чем я писал, и в этом моя вина.

Я не полностью выложил все функции и по этому произошло недопонимание.


//+--------------------------------------------------------------------------------------------------------------------------------------------+//
//|                                                      Пользовательская функция MartSym                                                      |//
//|                                                          усреднение по Мартину                                                             |//
//+--------------------------------------------------------------------------------------------------------------------------------------------+//
void MartSym() // название функции
  {
   double Mart_B = 0.0; // создаем переменную Mart_B с нулевым значением для общего профита и свопа - в Buy
   double Mart_S = 0.0; // создаем переменную Mart_S с нулевым значением для общего профита и свопа - в Sell
     {
      for(int ip = PositionsTotal() -1; ip >= 0; ip--) // колличесво циклов (ордеров), условие выполнения цыкла, счетчик циклов
        {
         if(PositionGetSymbol(ip) == _Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && PositionGetInteger(POSITION_MAGIC) == MagikMrtn) // выбираем позицию для дальнейшего доступа к ее свойствам
            Mart_B += c_posit.Profit() + c_posit.Swap(); // прибавляем к Mart_BS общий профит плюс общий своп
         //---
         if(PositionGetSymbol(ip) == _Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && PositionGetInteger(POSITION_MAGIC) == MagikMrtn) // выбираем позицию для дальнейшего доступа к ее свойствам
            Mart_S += c_posit.Profit() + c_posit.Swap(); // прибавляем к Mart_BS общий профит и общий своп
        }
     }
   if(Total_ByMn > 1) // если кол-во позиций в Buy по Мартину - больше одной
      LinePrib_By_Sl(Mart, 33); // то исполняем функцию построения Tейк Профита в Buy
//---
   if(Total_SlMn > 1) // если кол-во позиций в Sell по Мартину - больше одной
      LinePrib_By_Sl(Mart, 44); // то исполняем функцию построения Tейк Профита в Sell
//----------------------------------------------------------------------------------------------------------------------------------------------//

А ВОТ ЭТА ЧАСТЬ ЭТОЙ ФУНКЦИИ (если закрылись все позиции по магику MagikMrtn (неважно как и не обязательно по Тейк Профиту), то должны закрыться и все позиции с магиками Magik и  MagikPrmd )  - НЕ РАЬОТАЕТ
 и я не могу придумать, как написать условие для закрытия остальных магиков Magik и  MagikPrmd при закрытии всех позиций по магику MagikMrtn
//----------------------------------------------------------------------------------------------------------------------------------------------//

   if(Total_ByMn > 0 && Mart_B >= Mart)  // если кол-во позиций в Buy больше нуля и общий ппрофит больше, или ровно закрытию по Мартину
      PosClos(POSITION_TYPE_BUY); // то используем функцию для закрытия позиций
      PosClos(POSITION_TYPE_SELL); // то используем функцию для закрытия позиций
  } // MartSym

//+--------------------------------------------------------------------------------------------------------------------------------------------+//
//|                                                      Пользовательская функция LinePrib                                                              |//
//|                             общего построение и модификации всех Tейк Профитов по Мартину                                    |//
//+--------------------------------------------------------------------------------------------------------------------------------------------+//
void LinePrib_By_Sl(double UrPrb, int Kod) // название функции c переменной для закрытия позиций
  {
   double iSwap = 0; // создаем переменные для увеличения свопа с нулевым значением
   double iAverage = 0; // создаем переменные для увеличения начальной цены - умноженной на объем лота с нулевым значением
   double ii_Lt = 0; // создаем переменные для увеличения объема лота с нулевым значением
   double iPrib = 0; // создаем переменную для общей цены
   int total = PositionsTotal(); // создаем переменную для общего количества открытых позиций
   SymbolInfoTick(_Symbol, M_Tick); // получаем текущие цены для текущего символа

   if(Kod == 33) // если код тридцать три
     {
      for(int qt = PositionsTotal()-1; qt >= 0; qt--) // то объявляем цикл, где колличесво позиций, условие выполнения цыкла и счетчик циклов
        {
         if(PositionGetSymbol(qt) ==_Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && PositionGetInteger(POSITION_MAGIC) == MagikMrtn) // выбираем позицию для дальнейшего доступа к ее свойствам
           {
            iSwap += c_posit.Swap(); // суммируем накопленный своп
            ii_Lt += c_posit.Volume(); // суммируем накопленный объем лота
            iAverage += c_posit.PriceOpen() * c_posit.Volume(); // суммируем - цену позиции умноженную на объем лота
           }
        }
      iPrib = NormalizeDouble((iAverage + ((UrPrb - iSwap) / TickVAL) * _Point) / ii_Lt, _Digits); // расчитываем общую цену в валюте
      //---
      for(int qt = PositionsTotal()-1; qt >= 0; qt--) // то объявляем цикл, где колличесво позиций, условие выполнения цыкла и счетчик циклов
        {
         if(PositionGetSymbol(qt) ==_Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && PositionGetInteger(POSITION_MAGIC) == MagikMrtn && ii_Lt > 0) // выбираем позицию для дальнейшего доступа к ее свойствам
           {
            double currentTP = c_posit.TakeProfit(); // cравнение цены
            if(currentTP == 0 || MathAbs(currentTP - iPrib) > _Point) // Модифицируем, если Тейк Профит, если он не установлен или отличается от рассчитанного
              {
               c_trade.PositionModify(c_posit.Ticket(), c_posit.StopLoss(), iPrib); // TakeProfit устанавливаем новый
              }
           }
        }
     }
//----------------------------------------------------------------------------------------------------------------------------------------------//
   if(Kod == 44) // если код сорок четыре
     {
      for(int qt = PositionsTotal()-1; qt >= 0; qt--) // объявляем цикл, где колличесво позиций, условие выполнения цыкла и счетчик циклов
        {
         if(PositionGetSymbol(qt) ==_Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && PositionGetInteger(POSITION_MAGIC) == MagikMrtn) // выбираем позицию для дальнейшего доступа к ее свойствам
           {
            iSwap += c_posit.Swap(); // суммируем накопленный своп
            iAverage += c_posit.PriceOpen() * c_posit.Volume(); // суммируем - цену позиции умноженную на объем лота
            ii_Lt += c_posit.Volume(); // суммируем накопленный объем лота
           }
        }
      iPrib = NormalizeDouble((iAverage - ((UrPrb - iSwap) / TickVAL) * _Point) / ii_Lt, _Digits); // расчитываем общую цену в валюте
      //---
      for(int qt = PositionsTotal()-1; qt >= 0; qt--) // то объявляем цикл, где колличесво позиций, условие выполнения цыкла и счетчик циклов
        {
         if(PositionGetSymbol(qt) ==_Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && PositionGetInteger(POSITION_MAGIC) == MagikMrtn && ii_Lt > 0) // выбираем позицию для дальнейшего доступа к ее свойствам
           {
            double currentTP = c_posit.TakeProfit();
            if(currentTP == 0 || MathAbs(currentTP - iPrib) > _Point)
              {
               c_trade.PositionModify(c_posit.Ticket(), c_posit.StopLoss(), iPrib);
              }
           }
        }
     }
  } // LinePrib


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

А вот закрытие при этом других магиков - я не могу почему то реализовать (что то переклинело и все - стопор).

Помогите выйти из стопора.


 
Sprut 185 #:

Спасибо большое, что Вы указали на мои ошибки в функции PosClos.

Но к сожалению Вы не совсем поняли о чем я писал, и в этом моя вина.

Я не полностью выложил все функции и по этому произошло недопонимание.



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

А вот закрытие при этом других магиков - я не могу почему то реализовать (что то переклинело и все - стопор).

Помогите выйти из стопора.


void MartSym()
  {
   double Mart_B = 0.0;
   double Mart_S = 0.0;
   int    cnt_Mrtn = 0; // сколько всего позиций (Buy+Sell) сейчас открыто по MagikMrtn

   for(int ip = PositionsTotal() - 1; ip >= 0; ip--)
     {
      if(PositionGetSymbol(ip) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MagikMrtn)
        {
         cnt_Mrtn++; // считаем ВСЕ позиции по MagikMrtn, а не только Buy или только Sell

         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
            Mart_B += c_posit.Profit() + c_posit.Swap();

         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
            Mart_S += c_posit.Profit() + c_posit.Swap();
        }
     }

   if(Total_ByMn > 1)
      LinePrib_By_Sl(Mart, 33);

   if(Total_SlMn > 1)
      LinePrib_By_Sl(Mart, 44);

//--- закрытие своих позиций по достижении цели
   if(Total_ByMn > 0 && Mart_B >= Mart)
      PosClos(POSITION_TYPE_BUY);

   if(Total_SlMn > 0 && Mart_S >= Mart)
      PosClos(POSITION_TYPE_SELL);

//----------------------------------------------------------------------------------------------//
//  Ловим момент "все позиции MagikMrtn были и вот только что закрылись" и тянем за собой
//  позиции с магиками Magik и MagikPrmd — независимо от того, ПОЧЕМУ закрылись MagikMrtn.
//----------------------------------------------------------------------------------------------//
   static bool WasMrtnOpen = false;

   if(cnt_Mrtn > 0)
     {
      WasMrtnOpen = true; // фиксируем, что позиции были открыты
     }
   else if(WasMrtnOpen) // были открыты, а сейчас их 0 -> момент закрытия поймали
     {
      WasMrtnOpen = false; // сбрасываем, чтобы не сработать повторно на следующем тике
      CloseByMagic(Magik);
      CloseByMagic(MagikPrmd);
     }
  } // MartSym

//+--------------------------------------------------------------------------------------------------------------------------------------------+//
//|  Вспомогательная функция: закрыть все позиции текущего символа с заданным магиком          |//
//+--------------------------------------------------------------------------------------------------------------------------------------------+//
void CloseByMagic(ulong magic)
  {
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      if(PositionGetSymbol(i) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magic)
        {
         ulong ticket = PositionGetTicket(i); // именно PositionGetTicket(i), не c_posit.Ticket() — позиция уже выбрана PositionGetSymbol выше, но тикет надёжнее брать так
         c_trade.PositionClose(ticket);
        }
     }
  } // CloseByMagic
 
Sprut 185 #:

Спасибо большое, что Вы указали на мои ошибки в функции PosClos.

Но к сожалению Вы не совсем поняли о чем я писал, и в этом моя вина.

Я не полностью выложил все функции и по этому произошло недопонимание.



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

А вот закрытие при этом других магиков - я не могу почему то реализовать (что то переклинело и все - стопор).

Помогите выйти из стопора.


К сожелению, это мой пока предел, на данный момент времени) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Igor Nagorniuk #:
К сожелению, это мой пока предел, на данный момент времени) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

быстро как то вы сдуваетесь и соскакиваете... ) с темы помощи..... ) надо продолжать!!!! )))

срочно - пересмотрите свои пределы!!!)))) 

 
Roman Shiredchenko #:

быстро как то вы сдуваетесь и соскакиваете... ) с темы помощи..... ) надо продолжать!!!! )))

срочно - пересмотрите свои пределы!!!)))) 

Пределы не в понимании кода, а пределы в человеческих отношениях. Я не понимаю, что хотят люди). С начало одно, потом другое ! Одним, словом "................. тут читать, а тут не читать, а тут была жирная вяленая рыба, завёрнута", нет, контекстного понятного тех задания, тогда нечего заниматься написанием кода !  
 
Igor Nagorniuk #:
Пределы не в понимании кода, а пределы в человеческих отношениях. Я не понимаю, что хотят люди). С начало одно, потом другое ! Одним, словом "................. тут читать, а тут не читать, а тут была жирная вяленая рыба, завёрнута", нет, контекстного понятного тех задания, тогда нечего заниматься написанием кода !  

да я то сразу понял  - спс - просто улыбнуло и не  смог пройти мимо )

 

Здравствуйте, нужна помощь зала.

В общем есть один стрелочный индикатор, исходника нет. Индикатор рисует и перерисовывает стрелки. А еще выдает алерты и записи о них в журнал. 

Сам вопрос: можно ли чтоб робот читал алерты из журнала, или другим способом? Чтоб торговать по алертам а не стрелкам.

 
Trader3000 #:

Здравствуйте, нужна помощь зала.

В общем есть один стрелочный индикатор, исходника нет. Индикатор рисует и перерисовывает стрелки. А еще выдает алерты и записи о них в журнал. 

Сам вопрос: можно ли чтоб робот читал алерты из журнала, или другим способом? Чтоб торговать по алертам а не стрелкам.

А чем стрелки не устраивают? 
 
Vitaly Muzichenko #:
А чем стрелки не устраивают? 

Некоторые стрелки удаляет, а те что с алертами - уже не удаляет. Буферы при этом одни и те-же.

Нужны именно те сигналы которые идут по алертам (дублирует в журнал), а не по стрелкам. 

Это возможно или нет?