[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 524

 
sss2019:

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

Вот этот кусок который должен закрывать сделки

Не пойму в чем дело, и почему закрываются только две сделки. Подскажите кто что знает.

if(OrderSelect(i, SELECT_BY_POS) == false) continue;
 
Vinin:


Цикл сделайте по другому


Хотя это тоже не помогло. Не перестройка цикла не подстановка continue не помогло, как будто советник не видит свои же три ордера, и удаляет только два.

 
Поменяйте направление пересчета цикла
 
Возьмите и пользуйтесь.
Файлы:
 
Иногда все бывает такое непонятное, совсем не логичное, мне кажется в самой терминальной среде тоже есть ошибки.
 
sss2019:
Иногда все бывает такое непонятное, совсем не логичное, мне кажется в самой терминальной среде тоже есть ошибки.
Чтобы меньше казалось нужно начинать с изучения учебника и руководства. Потом пытаться найти разъяснение схожих вопросов на форуме.
 
sss2019:

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

Нужно чтобы советник перестал работать, но начал снова работать после перезапуска или изменения параметров.


При инициализации эксперта можно в статическую переменную сохранить текущий баланс. И в функции stаrt проверять на сколько процентов текущий баланс просел от первоначального баланса, если процент больше допустимого - запрет торговли. Это если вкратце, без кода. После перезапуска эксперт запомнит новый первоначальный баланс...
 
MrSoros:

При инициализации эксперта можно в статическую переменную сохранить текущий баланс. И в функции stаrt проверять на сколько процентов текущий баланс просел от первоначального баланса, если процент больше допустимого - запрет торговли. Это если вкратце, без кода. После перезапуска эксперт запомнит новый первоначальный баланс...

Вы вникли в вопрос?
 
MrSoros:

1. При инициализации эксперта можно в статическую переменную сохранить текущий баланс. И в функции stаrt проверять на сколько процентов текущий баланс просел от первоначального баланса, если процент больше допустимого - запрет торговли. Это если вкратце, без кода.

2. После перезапуска эксперт запомнит новый первоначальный баланс...

1. Можно. У меня такой вариант (с кодом) - переменные сами проинициализуруете:

extern int MaxLoss = 90;          // Максимально допустимая просадка в процентах от баланса
int  orderIndex;
bool IsExpertFailed = false;
bool IsExpertStopped = false;
double lots;                       // вспомогательная переменная для расчета нового размера лота 
double Lots_New;                   // Количество лотов для новых ордеров
int ticket;                        // Номер ордера
double orderLots;                  // Lots   
double orderProfit;                // Profit
double Price;                      // Цена открытия рыночного ордера
double SL;                         // Значение StopLoss ордера
double  TP;                        // Значение TakeProfit ордера
static datetime prevtime = 0;       // по ценам открытия
int start()
{  
   if (IsExpertStopped)
   {
      Comment("Не удалось инициализировать советник!");
      return (0);
   }
   
   if (IsExpertFailed)
   {
      Comment("Критическая ошибка! Советник остановлен.");
      return (0);
   }
      Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );    
 
   int orderCount = 0;  
      // ------------------------------------------------Учет ордеров только ЭТОГО ЭКСПА---------------------------

   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
     {  
      if (!OrderSelect(orderIndex, SELECT_BY_POS))    continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))    continue;

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))     continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
          // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(magic);
         IsExpertFailed = true;
         return (0);
      }        
         
      orderCount++;                     // считаем ордера (не больше i)                   
     
    }   

2. Нет. Не запомнит тот уровень баланса, который был до старта этого ЭКСПА в первый раз. Запомнит только текущий уровень в переменной

AccountBalance()

.по данному счету.

 

Доброго времени суток! У меня возникал до этого вопрос, связанный с корректным представление котировок в Excel. На этот вопрос я получил ответ спасибо за это costy. Теперь у меня возник вопрос, а можно ли сделать так(без MQL5 и dll), чтобы выгружались данные по еще нескольким валютам? Схематичный вид представлен ниже, вместо "..." соответствующие значения даты, значения цены закрытия и текущий период.

Предполагаю, что ответ на вопрос будет предполагать возможное внесение корректив в мой код. Прилагаю код советника, который записывает в файл значения цен закрытия по одному, текущему фин. инструменту.

#property copyright "S.I.Shlikov"
#property link      ""
int init()  
  {
   string Name=Symbol();
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,"Date",Name,"Period",Period());
   FileClose(h);        
  }
int start()
  {
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   string Wtime=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,Wtime,NormalizeDouble(Close[0], Digits));
   FileClose(h);   
   return(0);
  }
Причина обращения: