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

 
trader781:
Я не знаю как это объяснить. Но однозначно тянет на шедевр.
Я же говорю тут по язвить любят )) А Тришкин еще обиделся на это ..Сказал .что  будет код тут помогут ..
 
Movlat Baghiyev:
Я же говорю тут по язвить любят )) А Тришкин еще обиделся на это ..Сказал .что  будет код тут помогут ..

Я такой же новичок как и ты но даже у меня возникает куча вопросов

for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        if (OrderType()==OP_BUYSTOP)
             if (сигнал_bue) OrderDelete(OrderTicket());
                 else b++;
        if (OrderType()==OP_SELLSTOP)
             if (сигнал_sell) OrderDelete(OrderTicket());
                 else s++;
      }   

    } 

 

1) откуда ты взял  b++

2)  откуда ты взял s++

3)   if (сигнал_bue)  это еще что?

 ну и по остальному коду. Извини если обидел.

 
вот так наверное правильнее 
//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if (TrailingStop!=0) Trailing();
  
   //ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
  
   int b = 0, s = 0, p = 0, res = 0;

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
   for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        if (OrderType()==OP_BUYSTOP)
        {
           if(RSI0<50&&RSI1>50)
                OrderDelete(OrderTicket());
            else
                b++;
        }
        if (OrderType()==OP_SELLSTOP)
        {
           if(RSI0>50&&RSI1<50)
                OrderDelete(OrderTicket());
              else
                s++;
        }
      }
    }

   double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить

//---- buy stop
   if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----
   return(0);
}
 
Movlat Baghiyev:
Я же говорю тут по язвить любят )) А Тришкин еще обиделся на это ..Сказал .что  будет код тут помогут ..

Так попроще:

void OrderDelete_(int Type)
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            OrderDelete(OrderTicket());
        }
     }
  }

Это где нибуть за пределами функции       void OnTick()

if (сигнал_bue) OrderDelete_(OP_SELLSTOP);

if (сигнал_sell)OrderDelete_(OP_BUYSTOP);

А это в теле функции     void OnTick()

 

 
Alekseu Fedotov:


А это в теле функции     void OnTick()

 

Пожалуйста в коде сделайте исправления 
 
trader781:

Ок.

Вроде как добил что мог. Описание сделал. Цель  - понять почему он не работает так как хочется.

Там else ВНУТРИ блока if(). Неужели так и задумывалось???

Далее. В функцию Counts() передаётся неинициализированная глобальная переменная count, которая к тому же объявлена ещё раз в самой функции.

Функция  Counts() пересчитывает ордера, но сравнивает их с каким-то тикетом, который в главной функции аж несколько раз меняется. Но значение тикета-то одно во время срабатывания функции. Так сколько ордеров насчитает функция? Неужели больше одного?

Эта функция в таком виде не нуждается в аргументах, просто вызывайте её и пусть возвращает результат. 

Далее. Функция FindLastOType() - опять сравнение с тикетом. Вы можете гарантировать, что там с правильным тикетом сравнивается? Не проще ли прервать цикл, когда найден первый ордер с нужным магиком и символом, а затем вернуть тип ордера?

То же самое с FindLastOrderOpenPrice() и FindLastLot().

Функция ModifyOrders() меня ужаснула настолько, что я долго в неё смотреть не стал, чтобы ночью спать без кошмаров...

 
Movlat Baghiyev:
Пожалуйста в коде сделайте исправления 

Пробуй ^_~

extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  int  res = 0;

//ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
//---- buy stop
   if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----  
  
  
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);

if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);

  }

//+------------------------------------------------------------------+
void OrderDelete_(int Type)
  {
  bool  r;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
          r = OrderDelete(OrderTicket());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
  {
  int kp=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            kp++;
        }
     }
  return(kp);  
  }
//+------------------------------------------------------------------+


 

 
Alekseu Fedotov  спасибо .Да Хранит ВАС Господь ..
 
Vitalie Postolache:

Там else ВНУТРИ блока if(). Неужели так и задумывалось???

Далее. В функцию Counts() передаётся неинициализированная глобальная переменная count, которая к тому же объявлена ещё раз в самой функции.

Функция  Counts() пересчитывает ордера, но сравнивает их с каким-то тикетом, который в главной функции аж несколько раз меняется. Но значение тикета-то одно во время срабатывания функции. Так сколько ордеров насчитает функция? Неужели больше одного?

Эта функция в таком виде не нуждается в аргументах, просто вызывайте её и пусть возвращает результат. 

Далее. Функция FindLastOType() - опять сравнение с тикетом. Вы можете гарантировать, что там с правильным тикетом сравнивается? Не проще ли прервать цикл, когда найден первый ордер с нужным магиком и символом, а затем вернуть тип ордера?

То же самое с FindLastOrderOpenPrice() и FindLastLot().

Функция ModifyOrders() меня ужаснула настолько, что я долго в неё смотреть не стал, чтобы ночью спать без кошмаров...

Поправлю

 ее по-другому вообще никуда не засунуть, будет wrong parameters

 Должна учитывать самый последний

я попробую поменять

Насчет последней, ну да) я пробовал обойтись стандартной OrderModify()  но счет банят если кучу ордеров одновременно и постоянно двигать

Спасибо за критику. 

 
spoiltboy:
Да, со скобкой опечатался. В остальном вопрос актуален.

bool condition;

if(condition) {}

равносильно

if(condition==true) {}

и

if(!condition) {}

равносильно

if(condition==false) {}

Просто запись короче и привычнее.

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