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

 
Taras Slobodyanik #:

а зачем вам 3 метода?
достаточно все делать в одном

  • проверили ордер 

- модифицировали
- не модифицировали

Интересно!

Тарас, допустим есть три ордера бай с TP и SL, далее в одном ордере изменили SL.

Вопрос: Как найти ордер который изменен?

 
Taras Slobodyanik #:

а зачем вам 3 метода?
достаточно все делать в одном

  • проверили ордер 

- модифицировали
- не модифицировали

Уже два, один контролирует размер массива через OrdersTotal() где хранятся тикеты модифицированных ордеров, а в другом этот массив перебирается на предмет тикета. Но сейчас я изменил код в другом месте никоим образом не связанный со всем этим и почему-то ловлю ошибку (выход за границу массива).
 
MakarFX #:

Интересно!

Тарас, допустим есть три ордера бай с TP и SL, далее в одном ордере изменили SL.

Вопрос: Как найти ордер который изменен?

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

то есть при следующей проверке это условие будет определено как "выполнено" - ордер уже модифицирован.


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

 
Taras Slobodyanik #:

а зачем вам 3 метода?
достаточно все делать в одном

  • проверили ордер 

- модифицировали
- не модифицировали

Ордер же не 1, их допустим 10. Тикет каждого модифцированного я записываю в массив. Но пока с этим проблемка.
 
MakarFX #:

Убрал

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

 
Nerd Trader #:
Ордер же не 1, их допустим 10. Тикет каждого модифцированного я записываю в массив. Но пока с этим проблемка.

не имеет значения сколько там ордеров - если изменять ТП/СЛ, согласно условиям, уже не нужно = ордер уже модифицирован.

 
SanAlex #:

тот - для развлечения в тестере хорош.

а этот Вам, в подарок - для зарабатывания денег.

\\\\\\\\\\\\\\\\\\\\\\\\\\

запустил на проверку - вечером посмотрим как отработает

 

\\\\\\\\\\\\\\\\\\\\\\\\\\\

проверил как меняет шаблон на всех графиках - всё сработало! -как общий профит достиг цели.


SanAlex, очень интересно, обязательно подробно рассматрю данного эксперта, спасибо! 

 

Рябята, дня доброго по коду подскажите, вот график на справа двух сделках минусовых бай - кроется селлом, селл баем, по алгоритму надо входить в бай, но почему - то эти две ф-ии, которые смотрят и выдают минусовую сделку самую свежую в истории - показывают обе в плюса! Как правильно написать и где ошибка - эта ТС переворотная, на усреднялке - эти же ф-ии работают исправно, короче, после минусового селла - должен открыться бай, а он не открывается, т.к. ф-ии выдают обе true,  хотя  bool Calc_Loss_BUY() должна выдавать false, ведь я же в ф-иях считаю, что если самая крайняя сделка убыточная, то эта ф-ия выдает ИСТИНА, иначе ЛОЖЬ, а они обе выдают ИСТИНА. Прошу помочь решить.



// проверка предыдущего минусового селл
bool Calc_Loss_SELL()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) ==  DEAL_TYPE_BUY)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в селл разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В БАЙ разрешен ",TotalLot);
            break;
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


// проверка предыдущего минусового бай
bool Calc_Loss_BUY()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) == DEAL_TYPE_SELL)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в бай разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В СЕЛЛ разрешен ", TotalLot);
            break;          
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


    //----------------------------------------------
      // проверка условий ПЕРЕВОРОТА В СЕЛЛ
      // нет поз рыночных и предыдущая сделка В БАЙ была минусовая и не было минусового селла
       Print(" Calc_Loss_BUY(): ",Calc_Loss_BUY(), " Calc_Loss_SELL(): ",Calc_Loss_SELL());
      
      if(!PositionSelect(Symbol()) && Calc_Loss_BUY() && !Calc_Loss_SELL())
        {
         m_trade.Sell(CalcLot(),_Symbol,LastTick.bid,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point - _Spread*_Point);
         Print(" ПЕРЕВОРОТ БАЯ В СЕЛЛ, Calc_Loss_BUY(): ",Calc_Loss_BUY());
        }

 
      // проверка условий ПЕРЕВОРОТА в SELL
      // нет поз рыночных и предыдущий селл был минусовой И НЕ БЫЛО МИНУСОВОГО БАЙ
      
      if(!PositionSelect(Symbol()) && Calc_Loss_SELL() && !Calc_Loss_BUY())
        {
         m_trade.Buy(CalcLot(),_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point + _Spread*_Point);
         Print(" ПЕРЕВОРОТ СЕЛЛА В БАЙ, Calc_Loss_SELL(): ",Calc_Loss_SELL());
        }

в общем он не открывает бай, хотя должен после убуточного селла его открывать!!!!!!!!!


По сути задача сводится к тому, чтобы определять профитная или в лосс была закрыта КРАЙНЯЯ позиция, ставшая сделкой в бай или в селл и смотреть далее по ее типу!

ПОМОГИТЕ! ПЛЗ!

 

Доброго времени суток!

Имеются две функции: функция калькуляции всей сетки ордеров и функция закрытия ордеров 

//+------------------------------------------------------------------+
double CalculiteProfit()
{
    double oProfit = 0;
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
          if (OrderType() == OP_BUY || OrderType() == OP_SELL)
          {
            oProfit += OrderProfit();
          }
        }
      }
    }
    return(oProfit);
}
//+------------------------------------------------------------------+
 double FindLastBuyPrice()
{
   int oldticket, ticket = 0;
   double oldopenprice = 0;
   
   for(int cnt = OrdersTotal()-1; cnt>=0; cnt--)
   {
    if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
     {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
          oldticket = OrderTicket();
          if (oldticket > ticket)
          {
            ticket = oldticket;
            oldopenprice = OrderOpenPrice();
          } 
        }
     }
   }
   return(oldopenprice);
 }
//+------------------------------------------------------------------+

 Ещё есть условия для закрытия ордеров 

 double op = CalculiteProfit(); 
     if (op >= Profit)
     {
       ClosseAll();
     }

Profit - в настройках в валюте депо

Смысл всего этого: После того как калькуляция сетки ордеров будет равна нулю плюс Profit  в валюте депозита закрывается вся сетка ордеров 

Помогите изменить код так что бы вместо   Profit были пункты. Спасибо.

 
Taras Slobodyanik #:

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

то есть при следующей проверке это условие будет определено как "выполнено" - ордер модифицирован.


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

Я уже и забыл... а ведь в самом начале так и сделал (хорошо что закомитил) но способ от условия показался ненадежным, захотелось чтобы на измененный ордер указывало нечто более явное.

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