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

 
законопослушный гражданин #:

здравствуйте всем!

имеется функция в советнике, закрывающая все ордера по профиту и удаляющая лимитки:

я хочу добавить закрытие всех ордеров по убытку:

попробовал сделать так:   if((OrdersProfit()>=ProfitClose)||(OrdersProfit()<=LossClose))

однако так не работает (пишет недостаточно средств ош. 134) -хотел бы понять в чем особенность функции?

возможно есть особенность в подсчете профита?

подсчет прибыли решен так:


А чему равно LossClose ?

 
Tretyakov Rostyslav #:

А чему равно LossClose ?

в настройках поставил так:

extern double lot=0.01;
extern int MAX_Lines       = 5;     //максимальное колличество отложенных ордеров каждого направления  
extern int plusDelta     =-5;        //коэффициент увеличения расстояния между отложенными ордерами
                                    //если значение отрицательное, то расстояние уменьшается на данное кол-во пунктов
extern double Delta1       =70;     //отступ от цены для выставения первой лимитки
extern int Delta           = 60;        //расстояние между отложенными ордерами  
extern double ProfitClose     = 0.8;        //закрывать все ордера при получении профита(в долларах)  
extern double LossClose    = 1.0;       //закрыть все ордера при получения убытка (в долларах)
extern double f            =40;  //параметр границы флета по ADX
extern double bar        = 2;   //сдвиг по барам ADX
extern double timeframe  = 1;  //таймфрейм для индикатора ADX 0-текущий,1-1минута, 2-5минут, 3-15минут, 4-30минут, 5-1час
                             //6-4часа, 7-день, 8-неделя, 9-месяц
extern int magic           = 12345; 
extern int StartHour=0;       //час начала работы советника
extern int EndHour=24;     //час окончания работы советника
extern int pop=3;//количество попыток закрыть ордер

любую цифру выставляю, все равно так же.

еще хотел понять для чего в подсчете профита это:

double OrdersProfit()
{
   
  double rezultSymb=0;
  string SMB=Symbol();
  int i;
  for (i=OrdersTotal()-1;i>=0;i--)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
     {
      if(OrderSymbol()!= SMB) continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
       {
        rezultSymb+=OrderProfit();
       } 
     }
   }
  return(rezultSymb);

если использовать такой подсчет то считает общий профит по всем открытым и сработавшим лимиткам и открытых Бай/Селл ордеров .

Если вставить другую функцию:

double GetProfitFromStart()
  {
   double cp=0;

   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(cp);
  }

то будет считать только профит открытых Бай/Селл ордеров

 
законопослушный гражданин #:

в настройках поставил так:

любую цифру выставляю, все равно так же.

еще хотел понять для чего в подсчете профита это:

если использовать такой подсчет то считает общий профит по всем открытым и сработавшим лимиткам и открытых Бай/Селл ордеров .

Если вставить другую функцию:

то будет считать только профит открытых Бай/Селл ордеров

LossClose должен быть отрицательным!

глобальные параметры
bool close_all=false;   
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if((OrdersProfit()>=ProfitClose)||(OrdersProfit()<=LossClose)) // если достигли профита или убытка
      close_all=true; // включаем закрытие
   if(CountOrders()==0) //если все закрыто - выключаем закрытие
      close_all=false;
   if(close_all) //если закрытие включено
     {
      DeletePending(); //удаляем отложенные ордера
      CloseOpen();     //удаляем открытые ордера
     }
//---
  }
//+------------------------------------------------------------------+
//| Профит открытых ордеров                                          |
//+------------------------------------------------------------------+
double OrdersProfit()
  {
   double profit = 0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY||OrderType()==OP_SELL)
              {
               profit+=OrderProfit()+OrderSwap()+OrderCommission();
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров                                         |
//+------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0, i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic) cnt++;
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
//| Удаление отложенного ордера                                      |
//+------------------------------------------------------------------+
void DeletePending()
  {
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
           {
            if(OrderType()>1)
              {
               if(OrderDelete(OrderTicket())) Print("Отложенный ордер удален");
               else Print("Ошибка удаления отложеного ордера: ", GetLastError());
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Закрытие открытого ордера                                        |
//+------------------------------------------------------------------+
void CloseOpen() 
  {
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderClose(OrderTicket(),OrderLots(),Bid,0,clrBlue)) {Print("Close Buy!");}
               else {Print("Error Close Buy: ",GetLastError());}
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderClose(OrderTicket(),OrderLots(),Ask,0,clrRed)) {Print("Close Sell!");}
               else {Print("Error Close Sell: ",GetLastError());}
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
 
Tretyakov Rostyslav #:

LossClose должен быть отрицательным!

спасибо! всё просто и понятно.

должен быть отрицательным! - об этом я даже не подумал, а ведь точно, если OrdersProfit()<0?  то сравнивать нужно с отрицательным значением

век живи, век учись

 
Здравствуйте, коллеги

Прошу помочь с кодом, сам не справляюсь..

Дано
 - Имеющийся у меня советник для МТ4 (во вложении), который отображает на графике новости с investing.com - линиями с текстовыми комментариями (есть файл mq4)

Что необходимо:
 - Переписать код так, чтобы советник отображал не только новости текущей недели (ссылка на источник), но и исторические данные с 2020 года.
 - Есть архив новостей с investing.com в том же формате, с небольшими различиями (ссылка на сохраненный архив новостей)
 - Не хватает пока собственных навыков MQL, чтобы разобраться в операциях с текстом.

Прошу помощи от более опытного коллеги - вместе подумаем, в идеале созвонимся и перепишем код 💪
Есть необходимость сделать это оперативно...

И конечно готов отблагодарить материально за уделённое время.

Связь или тут, или лучше всего в телеграм, мой - @mihpal
Файлы:
News_EA.mq4  10 kb
 
Mike Weiss #:
Здравствуйте, коллеги

Прошу помочь с кодом, сам не справляюсь..

Дано
 - Имеющийся у меня советник для МТ4 (во вложении), который отображает на графике новости с investing.com - линиями с текстовыми комментариями (есть файл mq4)

Что необходимо:
 - Переписать код так, чтобы советник отображал не только новости текущей недели (ссылка на источник), но и исторические данные с 2020 года.
 - Есть архив новостей с investing.com в том же формате, с небольшими различиями (ссылка на сохраненный архив новостей)
 - Не хватает пока собственных навыков MQL, чтобы разобраться в операциях с текстом.

Прошу помощи от более опытного коллеги - вместе подумаем, в идеале созвонимся и перепишем код 💪
Есть необходимость сделать это оперативно...

И конечно готов отблагодарить материально за уделённое время.

Связь или тут, или лучше всего в телеграм, мой - @mihpal

Нарушение кучи правил, ознакомтесь с правилами ресурса,   правила найдете сами. а вообще вам сюда https://www.mql5.com/ru/job

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • 2023.02.18
  • www.mql5.com
Самый большой фриланс c разработчиками программ на MQL5
 
Tretyakov Rostyslav #:

LossClose должен быть отрицательным!

здравствуйте!

вопрос для общего развития как к специалисту видевшему мой код с тралением лимиток.

лимитки тралятся за ценой на расстоянии N. Тралятся вместе со стопами и тейками.

а есть ли в этом необходимость?

можно ли тралить лимитку без стопа/тейка, и как сработает и выставится ордер бай/селл, только тогда выставить 

к ним стоп и тейк?

какие могут возникнуть проблемы?

 
законопослушный гражданин #:

здравствуйте!

вопрос для общего развития как к специалисту видевшему мой код с тралением лимиток.

лимитки тралятся за ценой на расстоянии N. Тралятся вместе со стопами и тейками.

а есть ли в этом необходимость?

можно ли тралить лимитку без стопа/тейка, и как сработает и выставится ордер бай/селл, только тогда выставить 

к ним стоп и тейк?

какие могут возникнуть проблемы?

Можно, но и устанавливать надо без стопа/тейка

Никаких)

 
Tretyakov Rostyslav #:

Можно, но и устанавливать надо без стопа/тейка

Никаких)

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

спасибо!

 
законопослушный гражданин #:

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

спасибо!

Если во время срабатывания лимитного ордера не будет связи с сервером, то он останется без стопа и тейка. На сколько это рисковано решать Вам.