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

 
// Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
 
      if (Tip==1 && Cls_S==true)                // Открыт ордер Sell..
        {                                       // и есть критерий закр
         Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Ask,2);      // Закрытие Sell
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Sell ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
 
   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Не хватает денег на ", Lts," лотов");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
    // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total==0 && Opn_B==true)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      if (Total==0 && Opn_S==true)              // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=Ask + New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
 
Tretyakov Rostyslav #:

Ошибку надо искать не здесь.

1) Проверьте функцию закрытия ордеров, которую я дал. Я там исправил ошибку.

2) если первый пункт не поможет, то покажите код где идет обработка Opn_B и Cls_B

Спасибо, но как эту функцию закрытия ордеров вставить в мои условия закрытия ордера с помощью RSI?
 
Maxim Kuznetsov #:
if (iBarShift(OrderSymbol(),TIMEFRAME,OrderOpenTime()) > BARS_TO_CLOSE)
Спасибо Максим! Это мне более понятно! То есть в BARS_TO_CLOSE я могу вставить нужное мне для закрытия сделки количество баров и все должно заработать? То есть если мне просто нужен минимальный промежуток времени, могу и так написать:  if (iBarShift(OrderSymbol(),TIMEFRAME,OrderOpenTime()) > 1)
 
Ratmirfat #:
Спасибо Максим! Это мне более понятно! То есть в BARS_TO_CLOSE я могу вставить нужное мне для закрытия сделки количество баров и все должно заработать? То есть если мне просто нужен минимальный промежуток времени, могу и так написать:  if (iBarShift(OrderSymbol(),TIMEFRAME,OrderOpenTime()) > 1)

ну да, проверить +-1 бар,  чтобы учесть что ордер не обязан открываться ровно на границе баров. Знак > или >=

 
Ratmirfat #:
Спасибо, но как эту функцию закрытия ордеров вставить в мои условия закрытия ордера с помощью RSI?


Просто вставьте перед RSI

CloseExpOrder();

if (R_1 < RSI_level_1 && R_2 > RSI_level_1 ) Cls_B=true; 

if (R_1 > RSI_level_2 && R_2 < RSI_level_2 ) Cls_S=true;
 
Tretyakov Rostyslav #:


Просто вставьте перед RSI

void CloseExpOrder() 
  {
   int i=OrdersTotal()-1;
   datetime t=0;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
           {
            t=OrderOpenTime()+_Period*5*60;
            if(t<=TimeCurrent())
              {
               if(OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,3,clrRed);
               if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,clrRed);
              } 
           }
        }
     }
  }



if (R_1 < RSI_level_1 && R_2 > RSI_level_1 ) Cls_B=true; 

if (R_1 > RSI_level_2 && R_2 < RSI_level_2 ) Cls_S=true;
То есть вот так?
 
Ratmirfat #:
void CloseExpOrder()   {    int i=OrdersTotal()-1;    datetime t=0;    for(int pos=i;pos>=0;pos--)      {       if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))         {          if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)            {             t=OrderOpenTime()+_Period*5*60;             if(t<=TimeCurrent())               {                if(OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,3,clrRed);                if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,clrRed);               }            }         }      }   }

'CloseExpOrder' - function declarations are allowed on global, namespace or class scope only

'Magic' - undeclared identifier



 
Maxim Kuznetsov #:

ну да, проверить +-1 бар,  чтобы учесть что ордер не обязан открываться ровно на границе баров. Знак > или >=

Спасибо, попробую
 
Ratmirfat #:

'CloseExpOrder' - function declarations are allowed on global, namespace or class scope only

'Magic' - undeclared identifier



Простите, я думал Вы лучше ориентируетесь в коде...

надо так:

Это помещаете в самый низ кода

void CloseExpOrder() 
  {
   int i=OrdersTotal()-1;
   datetime t=0;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
           {
            t=OrderOpenTime()+_Period*5*60;
            if(t<=TimeCurrent())
              {
               if(OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,3,clrRed);
               if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,clrRed);
              } 
           }
        }
     }
  }

а перед расчетом RSI добавляете строку

CloseExpOrder();

if (R_1 < RSI_level_1 && R_2 > RSI_level_1 ) Cls_B=true; 

if (R_1 > RSI_level_2 && R_2 < RSI_level_2 ) Cls_S=true;

и все будет работать

 
Ratmirfat #:

'CloseExpOrder' - function declarations are allowed on global, namespace or class scope only

'Magic' - undeclared identifier



Если Вы не используете Magiс, то просто удалите то что выделено желтым

if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
Причина обращения: