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

 
procom #:
Выручайте чайника.
Нужен код mql4 :
1. если ( условие )  BuySell = 2  - открыть 2 лота BUY
2. если ( условие )  BuySell =  -1 - закрыть 1 лот  BUY

3. если ( условие )  BuySell = -2 - открыть 2 лота Sell
4. если ( условие )  BuySell =  1 - закрыть 1 лот Sell

5. если ( условие )  BuySell =  0 - закрыть все открытые ордера
Буду премного благодарен.

Это неуважительно

... да и на ТЗ это не похоже, так как само "условие" не прописано
 
procom #:
Выручайте чайника.
Нужен код mql4 :
1. если ( условие )  BuySell = 2  - открыть 2 лота BUY
2. если ( условие )  BuySell =  -1 - закрыть 1 лот  BUY

3. если ( условие )  BuySell = -2 - открыть 2 лота Sell
4. если ( условие )  BuySell =  1 - закрыть 1 лот Sell

5. если ( условие )  BuySell =  0 - закрыть все открытые ордера
Буду премного благодарен.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit(const int reason)
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // Предположим, что переменная BuySell задана каким-то условием (например, индикатором)
   
   if(BuySell == 2)
      OrderSend(Symbol(), OP_BUY, 2, MarketInfo(Symbol(), MODE_ASK), 5, 0, 0, "", MagicNumber, 0, clrGreen); // Открыть два лота BUY
      
   else if(BuySell == -1)
   {
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
               OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 5, clrRed); // Закрыть один лот BUY
      }
   }
   
   else if(BuySell == -2)
      OrderSend(Symbol(), OP_SELL, 2, MarketInfo(Symbol(), MODE_BID), 5, 0, 0, "", MagicNumber, 0, clrBlue); // Открыть два лота SELL
   
   else if(BuySell == 1)
   {
      for(int j=OrdersTotal()-1;j>=0;j--)
      {
         if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
            if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
               OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_ASK), 5, clrYellow); // Закрыть один лот SELL
      }
   }
   
   else if(BuySell == 0)
   {
      for(int k=OrdersTotal()-1;k>=0;k--)
      {
         if(OrderSelect(k, SELECT_BY_POS, MODE_TRADES))
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
               OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), ORDER_TYPE_BUY==OrderType()?MODE_BID:MODE_ASK), 5, clrOrange); // Закрыть все ордера
      }
   }
}
//+------------------------------------------------------------------+
 

условие самое простое :

int BuySell = 0 ;

if BuySell = 2 

{  bool OrderClose (int ticket, double lots, double price, int slippage, color Color=CLR_NONE) }  ;

 

У меня просто перестал работать этот код, не могу понять почему.


// -------------------------------   открываем 2 Лота  BUY   ----------------- 
   if( BuySell == 2) {
      if (_sell==true || (_buy==false && _sell==false )) {
         for(i=0;i<sell_orders;i++) CloseOrder(sell_tickets[i]);
         SendOrder(last_ticket,0,Lots*2,-1,1,0,0,0, ORDERS_COMMENT_on?ORDERS_COMMENT:(string)magic);
         }
      }
   // --------------------------  Закрывем  1  Лот  BUY  -----------------------
   if(BuySell == -1) {
      for(i=0;i<buy_orders;i++) if(OrderSelect(buy_tickets[i],SELECT_BY_TICKET) && NormalizeDouble(OrderLots(),dg) == NormalizeDouble(Lots*2,dg)) {
         CloseOrder(OrderTicket(),Lots);
         
         }
      }

Когда выполняется BuySell == -1 - закрываются 2 лота .

 
procom #:
// -------------------------------   открываем 2 Лота  BUY   ----------------- 
   if( BuySell == 2) {
      if (_sell==true || (_buy==false && _sell==false )) {
         for(i=0;i<sell_orders;i++) CloseOrder(sell_tickets[i]);
         SendOrder(last_ticket,0,Lots*2,-1,1,0,0,0, ORDERS_COMMENT_on?ORDERS_COMMENT:(string)magic);
         }
      }
   // --------------------------  Закрывем  1  Лот  BUY  -----------------------
   if(BuySell == -1) {
      for(i=0;i<buy_orders;i++) if(OrderSelect(buy_tickets[i],SELECT_BY_TICKET) && NormalizeDouble(OrderLots(),dg) == NormalizeDouble(Lots*2,dg)) {
         CloseOrder(OrderTicket(),Lots);
         
         }
      }

Когда выполняется BuySell == -1 - закрываются 2 лота .

вот держи, должно работать без ошибок

// Закрытие 1-го лота из двух открытых (BUY)
if (BuySell == -1) {
   bool found = false;
   
   for(int i=0; i<buy_orders; i++) {      
       OrderSelect(buy_tickets[i], SELECT_BY_TICKET);        
       
       double lotsInOrder = NormalizeDouble(OrderLots(), dg);
       if (lotsInOrder >= Lots * 2) {            
           // Частично закрываем ордер на 1 лот
           CloseOrder(OrderTicket(), Lots);    
           found = true;
           break; // Выходим из цикла, чтобы избежать повторных операций над одним ордером
       }
   }
}
ошибка была в условии 

BuySell == -1

 

МТ4/MetaEditor
Раньше все коммитилось.
От хранилища не отключался
Как присоединиться к хранилищу ?
Раньше в меню была команда...

Из справки

 
МТ4 подключенный к серверу показывает минимальный лот = 0.01. 
Но будучи подключенным он обновляет котировки, в итоге ошибки рассогласования и куча всего непредсказуемого. 
А после отключения лот становится 0.1. 
Сильно пока в этом не копался, но может кто-нибудь знает - как для Тестера получить мин. лот = 0.01 ?
 

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

Если вы не можете перерисовывать весь стек объектов, то проблема сохраняется.
Если вы не можете перерисовывать весь стек объектов, то проблема сохраняется.
  • 2026.02.09
  • www.mql5.com
Не могли бы вы прислать все необходимое для воспроизведения этой проблемы. Я заметил крайнюю изменчивость между минимальными и максимальными значениями. И тестер опять сбрасывается в начало что тестировать можно - кнопка зеленым цветом
 
Roman Shiredchenko #:

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

Попробуйте, точку останова в самом начале поставить. А потом продолжить...

(Мне помогало)

 
Putnik #:

Попробуйте, точку останова в самом начале поставить. А потом продолжить...

(Мне помогало)

Спс. Проверю.... т.е. запускать тестер в режиме debugging? Не в режиме, но с этой опцией в коде?