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

 

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


extern int      TimeCandle   = 1440;      //таймфрейм свечи, которую пробиваем 
extern int      HourStart=10; // час начала торговли
extern double   Lots=0.1;     // лот торговли   
extern int      StopLoss=100; // стоплосс
extern int      TakeProfit=100; // тайкпрофит
extern int      znak=5;     // количество знаков котировки
extern int      magik=54321;     // магик 

double minprice; // минимальная цена
double maxprice;// максимальная цена


void OnTick()
  {
  double SL, TP;
  int ticket;
 
   minprice = iLow(Symbol(),TimeCandle,1);
   maxprice = iHigh(Symbol(),TimeCandle,1);   
   
   if (TimeHour(TimeCurrent()==HourStart))
   { 
    if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
    TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
    
    if (ticket <0)
    Print ("Не удалось открыть ордер на покупку");
    }
    
    
     if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(minprice + StopLoss*Point,znak);
    TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
        
    if (ticket <0)
    Print ("Не удалось открыть ордер на продажу");
    }
    
    }
    Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak)); 
  }
   
  // проверяем есть ли байлимит ордера с конца
  int BuyLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
    return(count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
  int SellLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
   // проверяем есть ли бай ордера с конца
  int BuyCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
  // проверяем есть ли селл ордера с конца
  int SellCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
    return(count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby:

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


Не открывает - в смысле и не пытается или пытается но не получается ? Что пишут в журнале ?

 
nelenaby:

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


Проанализируйте вот это Ваше выражение

if (TimeHour(TimeCurrent()==HourStart))
        {
          ........
        }

Мне трудно осознать смысл этого выражения, возможно я не прав, но как минимум замените "(TimeCurrent()==HourStart)" на "(TimeCurrent() - HourStart)".

 

Дальше, если я Вас правильно понял - Вы пытаетесь выставить БайЛимит ордер, если нету БайЛимитОрдера И БайПозиции. Обратите внимание именно "И". То-есть наличие любого из них в отдельности Вас устраивает, таким образом, при нужном положении текущей цены Вы получите бесконечно кол-во БайЛимитов, по одному на каждом тике, пока хотя-бы один из них не сработает и не откроется первая позиция. Ещё - Вам не важно где сейчас находится цена. Как только выполнится странное условие по времени (чуть выше постом), думаю там ошибка, ну да ладно. Так вот, если его не учитывать, советник с первого же тика начнет выставлять ошибочные ордера, пока цена не уйдет выше вчерашнего максимума, так как в качестве цены для выставления ордера Вы используете  Вчерашний максимум. БайЛимит выставляется под текущей ценой, значит текущая цена должна быть выше вчерашнего максимума, а до тех пор будут отказы в исполнении.

Таким образом Вам подходит только ситуация когда цена ушла выше вчерашнего максимума, нет БайЛимитов и нет открытых покупок. Довольно редкая комбинация. К тому же она не на пробитие получится, а на откат после пробития (потому-что БайЛИМИТ), да еще к тому-же долго будет закидывать Вас ошибками, начиная с первого тика, выше цены вчерашнего максимума (это уже другая ошибка). Условие уже выполняется, советник кидает заявку, но ведь есть еще спред, минимальное разрешённое расстояние от рынка и тд.

 
Sergey Voytsekhovsky:

Мне трудно осознать смысл этого выражения, возможно я не прав, но как минимум замените "(TimeCurrent()==HourStart)" на "(TimeCurrent() - HourStart)".

Все верно тут ошибка. Нужно if (TimeHour(TimeCurrent())==HourStart)

Теперь открывает сделки иногда, но больше ошибками закидывает(OrderSend error 130).

Насчет лимитных ордеров тут не правильно.

 
nelenaby:

Все верно тут ошибка. Нужно if (TimeHour(TimeCurrent())==HourStart)

Теперь открывает сделки иногда, но больше ошибками закидывает(OrderSend error 130).

Насчет лимитных ордеров тут не правильно.

Вот вам скрипт, для работы со временем.

Старенький, но  работает корректно.

Файлы:
 

Здравствуйте.

Прошу Вас помочь мне разобраться в работе с файлами.

При работе программы полученные данные сохраняю в файл и считываю CSV.

Файл увеличивается. скорость падает. Попробовал обновить (переписать) некоторые элементы в строках. Не вышло!

Удалить выбранную строку- невозможно! Дописать новый элемент в старую строку не получается!

Очень странно! Можно легко удалить файл, графический объект и т.п. А когда касается работы с созданным файлом, полный тупик!

На форумах только одна рекоммендация : "Считать файл в память , поменять или стереть строку, и сокранить новый файл под старым названием".

Мне кажется это не верным решением. Вероятно я что-то упустил. Прошу помочь разобраться.

 
im-zvv:

Мне кажется это не верным решением. Вероятно я что-то упустил. Прошу помочь разобраться.

Вас срочно нужно нанимать на работу в Microsoft, что бы они наконец-то исправили это "не верное решение" по работе с файлами.


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

Если не ошибаюсь, то единственное, чего не хватает в MQL при работе с файлами - это возможность обрезать длину файла до необходимого размера.


 
Alekseu Fedotov:

Вот вам скрипт, для работы со временем.

Старенький, но  работает корректно.

я тож раньше Кимовской ф-цией пользовался, потом нашел время написал себе так:

//_______________________________________________________________________
class CWorkTime
  {
private:
   int               mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime          mstarttime,mstoptime;
   bool              UseThisSession;
   void inittime()
     {
      mday=Day();
      MqlDateTime dtstart,dtstop;
      TimeToStruct(TimeCurrent(),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime(dtstart);
      mstoptime=StructToTime(dtstop);
     }
public:
   void              CWorkTime(void){};
   void              ~CWorkTime(void){};
   void              CWorkTime(int hstart,int mstart,int hstop,int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour<0 || mstophour<0 || mstarthour>23 || mstophour>23) ? false : true;
      UseThisSession=(mstartmin<0 || mstopmin<0 || mstartmin>59 || mstopmin>59) ? false : true;
      if(UseThisSession) inittime(); else Print("Время работы советника не используется");
     };

   bool              Disable()
     {
      bool result=false;
      if(UseThisSession)
        {
         if(mday!=Day()) inittime();
         datetime t=TimeCurrent();
         result=t>=mstarttime && t<=mstoptime ? false : true;
        }
      return(result);
     };
  }
*Work;


.....

int OnInit()
{
   Work=new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick()
  {

if(Work.Disable())
{
 Comment("Не торговое время!!! Сопровождение открытых ордеров");
 }
else
{......
отключать время работы - нужно ввести некоректные данные при инициализации конструктора, например 25 часов или 70 минут
 
Sergey Dzyublik:

Вас срочно нужно нанимать на работу в Microsoft, что бы они наконец-то исправили это "не верное решение" по работе с файлами.


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

Если не ошибаюсь, то единственное, чего не хватает в MQL при работе с файлами - это возможность обрезать длину файла до необходимого размера.


Спасибо. Хорошее объяснение. К сожалению мой файл очень большой и поэтому придется поработать с "кубиками".
Причина обращения: