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

 

Уважаемые програмисты,

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

ПО компиляции он проходит.

вот код.

//+------------------------------------------------------------------+
//|                                                         RotG.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//----
extern int    DistSL     = 15;   // StopLoss в пунктах
extern int    DistTP     = 35;   // TakeProfit в пунктах
extern int    Slippage   = 5;    // Проскальзывание
extern bool   StopLoss   = False; // Ставить или нет
extern bool   TakeProfit = False; // Ставить или нет
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start() 
  {
   int    Total, i, Pos, ticket, MinLotDgts;
   bool   Result;
   double MinLot = MarketInfo(Symbol(), MODE_MINLOT);   
   double SL = 0, TP = 0, Stake, BuyLots = 0, SellLots = 0;   
   Total = OrdersTotal();
   if(Total > 0) // Если есть ордера
     {
       for(i = Total - 1; i >= 0; i--) 
         {
           if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)  
             {
               Pos = OrderType();
               Stake = OrderLots();
               if (OrderMagicNumber()!= 1) continue;
                  if((OrderSymbol() == Symbol()) &&
                     (Pos == OP_BUY || Pos == OP_SELL)) // Смотрим только открытые Buy и Sell
                    {                                   // в активном окне
                      if(Pos == OP_BUY) 
                        {
                          BuyLots = BuyLots + Stake;    // Суммируем Лоты открытых Buy
                          Result = OrderClose(OrderTicket(), OrderLots(), Bid , Slippage);
                          if(Result != true) 
                               Sleep(3000);
                               BuyLots = BuyLots + Stake;    // Суммируем Лоты открытых Buy
                               Result = OrderClose(OrderTicket(), OrderLots(), Bid , Slippage);
                               if(Result != true) 
                               Alert("KeelOver: CloseBuyError = ", GetLastError()); 
                        }
                      else 
                        {
                          SellLots = SellLots + Stake;  // Суммируем Лоты открытых Sell
                          Result = OrderClose(OrderTicket(), OrderLots(), Ask , Slippage);
                          if(Result != true) 
                              Sleep(3000);
                              SellLots = SellLots + Stake;  // Суммируем Лоты открытых Sell
                              Result = OrderClose(OrderTicket(), OrderLots(), Ask , Slippage);
                              if(Result != true) 
                              Alert("KeelOver: CloseSellError = ", GetLastError()); 
                        }
                    }
                }
         }
       if(MinLot < 0.1) 
           MinLotDgts = 2;
       else
         {
           if(MinLot < 1.0) 
               MinLotDgts = 1;
           else
               MinLotDgts = 0;
         }
       Stake = NormalizeDouble(BuyLots - SellLots, MinLotDgts);
       if(Stake != 0) // Если есть что переворачивать
         {
           if(Stake > 0) // продажей
             {
               RefreshRates();
               if(StopLoss == true) 
                   SL = NormalizeDouble(Ask + DistSL*Point, Digits);
               if(TakeProfit == true) 
                   TP = NormalizeDouble(Bid - 2*DistTP*Point, Digits);
               ticket = OrderSend(Symbol(), OP_SELL, Stake, Bid , Slippage, SL, TP, "R1",1);
               if(ticket <= 0) 
                   Sleep(3000);
                     RefreshRates();
                     if(StopLoss == true) 
                     SL = NormalizeDouble(Ask + DistSL*Point, Digits);
                     if(TakeProfit == true) 
                     TP = NormalizeDouble(Bid - 2*DistTP*Point, Digits);
                     ticket = OrderSend(Symbol(), OP_SELL, Stake, Bid , Slippage, SL, TP, "R1",1);                   
                        if(ticket <= 0) 
                        Alert("KeelOver: OpenSellError: ", GetLastError());
             }
           else // покупкой
             {
               Stake = -Stake;
               RefreshRates();
               if(StopLoss == true) 
                   SL = NormalizeDouble(Bid - DistSL*Point, Digits);
               if(TakeProfit == true) 
                   TP = NormalizeDouble(Ask + 2*DistTP*Point, Digits);
               ticket = OrderSend(Symbol(), OP_BUY, Stake, Ask , Slippage, SL, TP, "R1",1);
               if(ticket <= 0) 
                        Sleep(3000);
                        Stake = -Stake;
                        RefreshRates();
                        if(StopLoss == true) 
                        SL = NormalizeDouble(Bid - DistSL*Point, Digits);
                        if(TakeProfit == true) 
                        TP = NormalizeDouble(Ask + 2*DistTP*Point, Digits);
                        ticket = OrderSend(Symbol(), OP_BUY, Stake, Ask , Slippage, SL, TP, "R1",1);
                              if(ticket <= 0) 
                              Alert("KeelOver: OpenBuyError: ", GetLastError()); 
             }
         }
       else 
           Alert("KeelOver: BuyLots = SellLots");
     }
   return;
  }
//+------------------------------------------------------------------+
 
1. Вверху тоже используй RefreshRates();
2.Второй раз выражение Stake = -Stake; изменит значение на противоположное.
 
Вот значит по теме написал функцию которая выполняет туже проверку и зацикливает при неудачном открытии или изменении ордеров
void xxx(bool index)
  {
//----
   while(index)
     {
      Print(ErrorDescription());
      Sleep(10000);
      RefreshRates();
     }
//----
   return(0);
  }
и поместил соответственно во включаемый файл. В параметр index понятное дело вставляем что-то типа вот этого:
xxx(0>OrderSend(Symbol(),OP_BUYSTOP,MINLOT,Ask+STOPLEVEL,10,Bid+STOPLEVEL-prd*Point,0));

Вопрос остается только в том, что до поры до времени все работает нормально, но потом в определенный момент (не знаю причин) функция зацикливается, ничего не происходит, ордера не открываются и все время (каждые 10 сек.) выдается сообщение с ошибкой "0".

Так вот собственно кто может обьяснить мне причинуту такого вот поведения этой функции?

 
STALKER:
Вот значит по теме написал функцию которая выполняет туже проверку и зацикливает при неудачном открытии или изменении ордеров
void xxx(bool index)
  {
//----
   while(index)
     {
      Print(ErrorDescription());
      Sleep(10000);
      RefreshRates();
     }
//----
   return(0);
  }
и поместил соответственно во включаемый файл. В параметр index понятное дело вставляем что-то типа вот этого:
xxx(0>OrderSend(Symbol(),OP_BUYSTOP,MINLOT,Ask+STOPLEVEL,10,Bid+STOPLEVEL-prd*Point,0));

Вопрос остается только в том, что до поры до времени все работает нормально, но потом в определенный момент (не знаю причин) функция зацикливается, ничего не происходит, ордера не открываются и все время (каждые 10 сек.) выдается сообщение с ошибкой "0".

Так вот собственно кто может обьяснить мне причинуту такого вот поведения этой функци

В сущности решаю тот же вопрос как автоматизировать без сбоев открытие или закрытие ордеров при любых ошибках. Только у меня знаний по програмированию в среде MQl практически нет. Отсюда и такие выкрутасы как повторение предыдущего блока вместо сообщения об обшибке в готовом скрипте.
Причина обращения: