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

 
Artyom Trishkin:
Недавно я здесь выкладывал шаблон кроссплатформенного индикатора. В нём гляньте.
IndicatorBuffers()

блог тебе нужно и там выложить ответы на одни и те же вопросы.... мне б такое терпение!

вот https://www.mql5.com/ru/forum/160683/page670#comment_9054670

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2018.10.18
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Igor Makanu:

блог тебе нужно и там выложить ответы на одни и те же вопросы.... мне б такое терпение!

Может и нужно. Да некогда. А вопросы будут всегда одни те же +/- 

 
Проблема решена- если вспомогательным переменным присваивать последние порядковые номера буферов, но при этом не прописывать настройки отображения. До этого ненужные буфера находились в середине списка.
 

Помогите.

Хочу поставить отложенные ордера на места закрытых позиций за сутки. 

Функция ставит ордер на цену последней закрытой позиции.

Что сделать чтобы ставить отложки на цены всех закрытых за сутки позиций?

oid PriceTimePos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 ||OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);
                       }
                    }
                 }
              }
           }
        }
     }
// ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
   daa=false;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()>1 && OrderType()<6) 
              {
               d=MarketInfo(OrderSymbol(), MODE_DIGITS);
               r=NormalizeDouble(r, d);
               if(r==NormalizeDouble(OrderOpenPrice(),d)) {daa=true;}
              }
           }
        }
     }
   if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
     {
      double opprord=0;
      for(i=0; i<k_; i++) 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
              {
               if(OrderType()>1 && OrderType()<6) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  opprord=OrderOpenPrice();
                  // r=NormalizeDouble(r, d);
                  if(r!=NormalizeDouble(opprord,d))
                    {
                     if(r>Ask)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYSTOP",r);
                           SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLLIMIT",r);
                           SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                          }
                       }

                     //
                     if(Bid>r)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYLIMIT",r);
                           SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLSTOP",r);
                           SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                       }
                    }
                 }
              }
           }
        }
     }
//return(r);
  }
 
PolarSeaman:

Помогите.

Хочу поставить отложенные ордера на места закрытых позиций за сутки. 

Функция ставит ордер на цену последней закрытой позиции.

Что сделать чтобы ставить отложки на цены всех закрытых за сутки позиций?

  1. Пройдитесь в цикле по списку закрытых позиций, выбирая те, время закрытия которых больше времени начала нужных вам суток (и меньше времени начала следующих за ними суток, если за позавчера например)
  2. Сложите в простой массив или массив структур все цены закрытия (открытия - не знаю на какие именно цены хотите ставить) всех позиций, которые нашлись
  3. Пройдите в цикле по созданному массиву и выставляйте отложенные ордера по ценам из массива (проверяя уже наличие ордера на этой цене - чтобы несколько не ставить на одну цену)
  4. Можете попутно удалять из массива цены уже выставленных ордеров, но тут чуть сложнее...
 

Начал изучать MQL4 по книге  С. Ковалева, там несостыковки по коду т.к. книга писалось для старых билдов МТ4. 


Подскажите как нужно обработать этот код, чтобы не было ошибки. 

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return;                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return;                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return;                                                                                 // Выход из deinit()
   }

ошибка 

'return' - function must return a value

1. Правильным ли будет сделать так?

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return(0);                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return(0);                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return(0);                                                                                 // Выход из deinit()
   }


2. Вопрос , насколько проблематично потом писать код для новых билдов используя знания изложенные в учебнике (имею ввиду фактор старости информации)?



Файлы:
 
Sergey Branin:

Начал изучать MQL4 по книге  С. Ковалева, там несостыковки по коду т.к. книга писалось для старых билдов МТ4. 


Подскажите как нужно обработать этот код, чтобы не было ошибки. 

ошибка 

'return' - function must return a value

1. Правильным ли будет сделать так?


2. Вопрос , насколько проблематично потом писать код для новых билдов используя знания изложенные в учебнике (имею ввиду фактор старости информации)?



Используйте OnInit(), OnDeinit(), OnTick(), и прочие из списка:

Документация по MQL5: Обработка событий
Документация по MQL5: Обработка событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sergey Branin:

Начал изучать MQL4 по книге  С. Ковалева, там несостыковки по коду т.к. книга писалось для старых билдов МТ4. 


Подскажите как нужно обработать этот код, чтобы не было ошибки. 

ошибка 

'return' - function must return a value

1. Правильным ли будет сделать так?


2. Вопрос , насколько проблематично потом писать код для новых билдов используя знания изложенные в учебнике (имею ввиду фактор старости информации)?



  1. Правильно возвращаете значения из не void-функций, но всё же лучше переходить на новые рельсы - там ничего сложного.
  2. Пишите, не забывайте вставлять директиву #property strict в самом начале кода - где прописаны все директивы, читайте коды ошибок - их описания есть в документации, и всё будет нормально и не сложно.
 
Artyom Trishkin:
  1. Пройдитесь в цикле по списку закрытых позиций, выбирая те, время закрытия которых больше времени начала нужных вам суток 

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

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

Этак, ставит на цену самого старого из нужных, как перейти к следующей найденной цене?
void PriceTimePos(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);

                        // ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
                        daa=false;
                        for(i=0; i<k; i++)
                          {
                           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                             {
                              if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
                                {
                                 if(OrderType()>1 && OrderType()<6)
                                   {
                                    d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                                    r=NormalizeDouble(r, d);
                                    if(r==NormalizeDouble(OrderOpenPrice(),d)) daa=true; //else continue;
                                   }
                                }
                             }
                          }
                        if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
                          {

                           if(r>Ask)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYSTOP",r);
                                 SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLLIMIT",r);
                                 SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                                }
                             }

                           //
                           if(Bid>r)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYLIMIT",r);
                                 SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLSTOP",r);
                                 SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                             }

                          }
                        //return(r);
                       }
                    }
                 }
              }
           }
        }
     }
//
  }
 
PolarSeaman:

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

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

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

Тем более, что массивы - это не просто, а очень просто.

Магазин АК вмещает 30 патронов - это массив размером 30. А патроны - это данные, хранящиеся в массиве.

Правда это не очень хороший пример - достать третий вы не сможете, пока не достанете 0, 1 и 2.

Ну представьте себе табличку:

Индекс 0
Индекс  1
Индекс  2
Индекс  3
Индекс  4
 Индекс5 Индекс6Индекс  7
Индекс  8
Индекс  9
Значение 1
Значение 2
Значение 3
Значение 4
Значение 5
Значение 6
Значение 7
Значение 8
Значение 9
Значение 10

Вот вам простой одномерный массив размером 10.

Значение 1 хранится в ячейке с индексом 0, значение 2 хранится в ячейке с индексом 1, значение 3 хранится в ячейке с индексом 2, ...
...
Значение 8 хранится в ячейке с индексом 7, значение 9 хранится в ячейке с индексом 8, значение 10 хранится в ячейке с индексом 9

Всё просто. Чтобы получить значение 3, нужно обратиться к массиву - в его ячейку 2: Value3=Array[2];

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