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

 
Vyacheslav Kornev:

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

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

 
Artyom Trishkin:

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


Такс, у меня еще вопросик. получился офигенный советник.   Но  нужно сделать так.вообщем,   когда он пересекает линию, то открывается дополнительный ордер в эту сторону,     а потом закрывается по профиту..     Как сделать так,  чтобы после закрытия по профиту,    Дополнительный ордер не открывался снова? пока не обновится линия индикатора?

//==================Установка дополнительного ордера ============
         double Lots2;
         if((PriceHigh>PriceLow && Ask>PriceHigh && LBUY<LSELL)|| (PriceLow>PriceHigh && Ask>PriceLow && LBUY<LSELL) )
 

Добрый день! нужна небольшая помощь с кодом, который:

открывает BUY если в файле 11112222.txt записана 1;

открывает SELL если в файле 11112222.txt записана -1;

закрывает все ордера если в файле 11112222.txt записан 0;


Дан файл 11112222.txt, в котором может быть всего три варианта записи: 1, -1 или 0


почему-то при 0 в файле 11112222.txt, открывается ордер на BUY, а должен срабатывать код закрытия ордеров, не могу понять в чем ошибка.

так, же есть проблема, когда советник запущен, то практически всегда невозможно открыть 11112222.txt - пишет что файл занят другим приложением, поэтому для решения этой проблемы понатыкал везде где можно " FileClose(handle2); // закрытие текстового файла", но это не помогает, а мне нужно чтобы после того как советник открыл файл 11112222.txt проверил его содержимое на 1, -1 или 0, затем тут же закрыл, так как этот файл периодически использует другая программа для записи в него 1, -1 или 0.

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек:

Добрый день! нужна небольшая помощь с кодом, который:

открывает BUY если в файле 11112222.txt записана 1;

открывает SELL если в файле 11112222.txt записана -1;

закрывает все ордера если в файле 11112222.txt записан 0;


Дан файл 11112222.txt, в котором может быть всего три варианта записи: 1, -1 или 0


почему-то при 0 в файле 11112222.txt, открывается ордер на BUY, а должен срабатывать код закрытия ордеров, не могу понять в чем ошибка.

так, же есть проблема, когда советник запущен, то практически всегда невозможно открыть 11112222.txt - пишет что файл занят другим приложением, поэтому для решения этой проблемы понатыкал везде где можно " FileClose(handle2); // закрытие текстового файла", но это не помогает, а мне нужно чтобы после того как советник открыл файл 11112222.txt проверил его содержимое на 1, -1 или 0, затем тут же закрыл, так как этот файл ежесекундно использует другая программа для записи в него 1, -1 или 0.

Потому, что хендл файла это не содержимое файла.

Сначала надо прочесть содержимое файла, и только потом ставить условие. А у вас наоборот, условие по хендлу, потом чтение файла и закрытие.

 
Alexey Viktorov:

Потому, что хендл файла это не содержимое файла.

Сначала надо прочесть содержимое файла, и только потом ставить условие. А у вас наоборот, условие по хендлу, потом чтение файла и закрытие.

1) - Эта часть открывает файл 11112222.txt для чтения с него данных:

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - Далее идет условие, если handle2>0


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3) - Вот эта часть для чего я не понял:


       Print(FileReadString(handle2));

4) - Эта часть закрывает файл:


       FileClose(handle2); // закрытие текстового файла

5) - Так как условие handle2>0 выполнено, то есть файл 11112222.txt содержит в себе 1, то открывается ордер на покупку:

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

Какие части я перепутал местами?
 

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

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   bool reasult;
   for (int i = OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS)>0)
      {
         if (OrderSymbol() != Symbol())
            continue;
         
         switch (OrderType())
         {
            case OP_BUY  :
               reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
               if (!reasult) Print ("Ошибка закрытия ордера на покупку", GetLastError());
               break;
            case OP_SELL :
               reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
               if (!reasult) Print ("Ошибка закрытия ордера на продажу", GetLastError());
               break;
         }   
         
      }
   }
}

Если открыть попеременно несколько ордеров на продажу и покупку и пытаться закрыть их этим ордером то только несколько закрываются, на остальные выдает ошибку 129 (Неправильная цена).

Пытался сделать скрипт который делает, к примеру, делает 10 попыток * на количество ордеров, с паузой в случае ошибки. 

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ 
   int c=CountTrades()*10;
   
   for ( int a=1 ; a<=c; a++)
   {
   if (CountTrades()==0) { Print ("Orders are successfully closed! Break."); break;}
    Print("Try ", a, " out of ", c);
      
      bool reasult;
      for (int i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol()) 
            
            {      
            
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }              
            }   
            
         }
      }Sleep(1000);
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol())
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 count++;
        }
    }
    
    return(count);
}

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

Что я делаю не так?

 
Andrey Sokolov:

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

Если открыть попеременно несколько ордеров на продажу и покупку и пытаться закрыть их этим ордером то только несколько закрываются, на остальные выдает ошибку 129 (Неправильная цена).

Пытался сделать скрипт который делает, к примеру, делает 10 попыток * на количество ордеров, с паузой в случае ошибки. 

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

Что я делаю не так?

            RefreshRates(); // Попробуйте добавить
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }  

А вообще, то что вы пишите, нельзя допускать к торговле на реальном счёте, это только для тестера

 
Vitaly Muzichenko:

А вообще, то что вы пишите, нельзя допускать к торговле на реальном счёте, это только для тестера

            RefreshRates(); // Попробуйте добавить

Помогло, спасиб.

 
Vitaly Muzichenko:

А вообще, то что вы пишите, нельзя допускать к торговле на реальном счёте, это только для тестера


Можно подробнее почему "нельзя допускать к торговле.."?

 
Andrey Sokolov:

Можно подробнее почему "нельзя допускать к торговле.."?

Нет проверок на ошибки, и если вдруг будет закрытие и сервер выдаст критическую ошибку, то советник всё-равно будет продолжать долбить сервер, а это пахнет баном со стороны ДЦ на последующую автоторговлю.