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

 
Maxim Kuznetsov:

if (time[i]>=time_m1 && time[i]<time_m1+PeriodSeconds(PERIOD_M1) {

  // время time[i] попало внутрь бара открытого в time_m1

}

Хорошо) одна стрелка, но по этому условию на М15 и выше стрелка ставится в 21:00

 if(time[i]>=StringToTime("2019.04.22 20:55:00") && time[i]<StringToTime("2019.04.22 20:55:00")+Period()*PeriodSeconds(PERIOD_M1))

а если просто +PeriodSeconds(PERIOD_M1) без Period()* то вообще не ставится)

 
yiduwi:

Хорошо) одна стрелка, но по этому условию на М15 и выше стрелка ставится в 21:00

а если просто +PeriodSeconds(PERIOD_M1) без Period()* то вообще не ставится)

документацию почитайте уже :-) Period() возвращает просто id текущего периода - зачем вы на него умножаете ?

его надо вместо PERIOD_M1 (который дан для примера), передавать в PeriodSeconds( Period() ) - тогда получите сколько секунд в 1 баре текущего периода.

 
kopeyka2:

Вот такая вот загадка "бермудского параллепипеда" 

У меня работает :) Даже попробовал открыть/закрыть терминал.

PS: Артём, вы перенесли вопрос по пятёрке в четвёрошную тему... Случайно нашёл.

 
kopeyka2:


Линия ЕМА 20 23.04.2019 00:00 

При включении МТ5, БЕЗ онлайн подключения, СРАЗУ ЖЕ появляется сообщение "array out...."

Ошибки меняются, но присутствуют всегда. Могут размножаться в онлайне, но чаще присутствуют при включении МТ.


Вот такая вот загадка "бермудского параллепипеда" 

в сообщении об ошибке указан номер строки где она произошла. Начните копать оттуда
 
Igor Zakharov:

У меня работает :) Даже попробовал открыть/закрыть терминал.

PS: Артём, вы перенесли вопрос по пятёрке в четвёрошную тему... Случайно нашёл.

Эта тема общая - тут помогаем не только по MQL4, но и для перехода на MQL5. Так что - в тему.

 
Подскажите пожалуйста, как концептуально правильно написать код советника, который берет цены сделок из текстового .csv файла. Почему возник такой вопрос: на каждом тике советник будет сравнивать  текущую цену с ценой в .csv файле, который целиком читается циклом в функции fileopen, если я правильно понимаю. Но в файле более 5000 строк за последний год, в каждой строке есть название инструмента, цена, тип сделки (покупка/продажа),дата записи, дата отмены ордера. При тестировании на каждом тике советник будет циклом перебирать все строки файла, что бы понять пора выставлять ордер? Или для тестирования сделать, что бы советник при инициализации разом установил все ордера с датой отмены, а для реальной торговли проверял актуальные ордера по цене  по времени истечения по каждому тику? Может быть я вообще неправильно это все себе представляю, насколько это правильно с точки зрения ресурсов или есть другие варианты (например сделать графические объекты и сравнивать текущую цену с ними, но там по ходу тоже цикл), не понимаю, посоветуйте пожалуйста.  
 

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


Скачал видео уроки по программированию MQL4.

ну и создал советника согласно урока.

Но во время торговли чего не работает.

При компиляции ошибок нет.

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

Прошу помочь, если кто может.

Спасибо!

Код:

/+----Входные параметры----------------+

extern int BarCount=10;

extern int HourStart=14;

extern double Lots=0.1;

extern int StopLoss=120;

extern int TakeProfit=300;

extern int Magic=1456;

//+------------Глобальные переменные----------------+

double minprice=999999,mp,

maxprice=-99999,SL,TP;

int ticket;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {


  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

   GetMinPrice();

   GetMaxPrice();


   if(TimeHour(TimeCurrent())==HourStart)

     {

      if(BuyLimitCount()&& BuyCount() ==0)

        {

         SL=NormalizeDouble(minprice-StopLoss*Point,5);

         TP=NormalizeDouble(minprice+TakeProfit*Point,5);

         ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,minprice,5,SL,TP,"",Magic,0,Blue);

         if(ticket<0)

            Print("НЕУДАЧА при открытии бай лимита");

        }

      if(SellLimitCount()&& SellCount()==0)

        {

         SL=NormalizeDouble(maxprice+StopLoss*Point,5);

         TP=NormalizeDouble(maxprice-TakeProfit*Point,5);

         ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,maxprice,5,SL,TP,"",Magic,0,Red);

         if(ticket<0)

            Print("НЕУДАЧА при открытии селл лимита");

        }

     }



   Comment("MinPrice: "+DoubleToStr(minprice,5)+"\n"+"MaxPrice: "+DoubleToStr(maxprice,5));


  }

//+-фУНКЦИЯ ОПРЕДЕЛЕНИЯ МИНИМАЛЬНОЙ ЦЕНЫ НА КОЛИЧЕСТВЕ BARCOUNT БАРОВ

void GetMinPrice()

  {

   for(int i=0; i<BarCount; i++)

     {

      mp=iLow(Symbol(),PERIOD_CURRENT,i);

      if(mp<minprice)

         minprice=mp;

     }

   return;

  }

//+-фУНКЦИЯ ОПРЕДЕЛЕНИЯ МАКСИМАЛЬНОЙ ЦЕНЫ НА КОЛИЧЕСТВЕ BARCOUNT БАРОВ

void GetMaxPrice()

  {

   for(int i=0; i<BarCount; i++)

     {

      mp=iHigh(Symbol(),PERIOD_CURRENT,i);

      if(mp>maxprice)

         maxprice=mp;

     }

   return;

  }

//+-фУНКЦИЯ ОПРЕДЕЛЕНИЯ КОЛИЧЕСТВА ОТКРЫТЫХ лимитных ОРДЕРОВ НА ПОКУПКУ

int BuyLimitCount()

  {

   int count=0;

   for(int i=OrdersTotal()-1; i>=0; i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && 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()==Magic && 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()==Magic && 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()==Magic && OrderType()==OP_SELL)

        {

         count++;

        }

     }

   return(count);

  }

//+------------------------------------------------------------------+


//+------------------------------------------------------------------+

 

Seric29

Спасибо, добавлю вашу информацию в свой багаж.

 
WinProject:
Подскажите пожалуйста, как концептуально правильно написать код советника, который берет цены сделок из текстового .csv файла. Почему возник такой вопрос: на каждом тике советник будет сравнивать  текущую цену с ценой в .csv файле, который целиком читается циклом в функции fileopen, если я правильно понимаю. Но в файле более 5000 строк за последний год, в каждой строке есть название инструмента, цена, тип сделки (покупка/продажа),дата записи, дата отмены ордера. При тестировании на каждом тике советник будет циклом перебирать все строки файла, что бы понять пора выставлять ордер? Или для тестирования сделать, что бы советник при инициализации разом установил все ордера с датой отмены, а для реальной торговли проверял актуальные ордера по цене  по времени истечения по каждому тику? Может быть я вообще неправильно это все себе представляю, насколько это правильно с точки зрения ресурсов или есть другие варианты (например сделать графические объекты и сравнивать текущую цену с ними, но там по ходу тоже цикл), не понимаю, посоветуйте пожалуйста.  

обычно чтение (запись) в файл стараются делать минимальное кол-во раз

для Вашей задачи оптимальнее при загрузке считать данные в массив (хотя наверное удобнее в структуру) и потом сравнивать значение текущих цен и времени с эл-ми массива

ЗЫ: поиском по codebase "файл" или "csv" были когда то такие готовые советники - читают из файла  торгуют по этим данным

 
Igor Makanu:

обычно чтение (запись) в файл стараются делать минимальное кол-во раз

для Вашей задачи оптимальнее при загрузке считать данные в массив (хотя наверное удобнее в структуру) и потом сравнивать значение текущих цен и времени с эл-ми массива

ЗЫ: поиском по codebase "файл" или "csv" были когда то такие готовые советники - читают из файла  торгуют по этим данным

Спасибо большое, получил тот ответ, который хотел.

Причина обращения: