Ваши вопросы по языку MQL4

NTuner

Интересующийся
Вопрос: возможно ли в файл CSV записать трехмерный массив?
 

Ugar

Гуру форума
Добрый вечер, я наверное не правильно выразился, возможно ли удалять из истории закрытые ордера, допустим при каких-то условиях история по данному символу стирается, если да, то как это прописать?
История ордеров хранится на сервере. Ордера из неё удалить нельзя.
 

volodymyr67

Гуру форума
Всем приет !

Подскажите пожалоста !
Что это за ерунда и как с ней боротса ?
b0215ca1b8ef7292531a2fd4d3e24eb2.png
Работаю на 509
 

Ugar

Гуру форума
Вопрос: возможно ли в файл CSV записать трехмерный массив?
Нельзя в файл csv записать массив. Можно писать содержимое массива последовательно ячейку за ячейкой. А уже в каком порядке ячейки писать, зависит от того как потом удобнее будет читать.
 

Ugar

Гуру форума
Всем доброго дня ,подскажите как вернуть время открытия открытого ордера и время закрытия предыдущего ордера, а затем сравнить это время между собой?
Для начала надо выбрать открытый ордер, например по тикету. Если тикет неизвестен, перебрать в цикле все открытые и выбрать нужный.
Потом OrderOpenTime() вернёт время открытия ордера. Присвоить это значение datetime переменной.
Дальше в цикле перебрать все закрытые ордера присваивая datetime переменной время закрытия OrderCloseTime() и сравнивать их время закрытия. Самое большое время это время закрытия последнего ордера.

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

ansol

Местный знаток
Вроде бы(я так понял) в TimeCurrent() время в секундах с 1970 года. Можно ли тупо вычесть 300 из TimeCurrent()? чтобы узнать, что было 5 минут назад?
Типа:
PHP:
if(OrderOpenTime() > TimeCurrent()-300) ...
 

ansol

Местный знаток

Вопрос связан с настойчивостью хелпа метаэдитора по поводу формата datetime. Вроде как число секунд - 32разрядное целое, зачем мозги парить этим datetime, когда и так все работает? У меня связанные переменные объявлены int и используются для хранения секунд, например, разность Time[0] и TimeCurrent() - мне вроде как по барабану этот datetime или там какая-то подлость спрятана? :D
 

alexshell

Элитный участник
Вопрос связан с настойчивостью хелпа метаэдитора по поводу формата datetime. Вроде как число секунд - 32разрядное целое, зачем мозги парить этим datetime, когда и так все работает? У меня связанные переменные объявлены int и используются для хранения секунд, например, разность Time[0] и TimeCurrent() - мне вроде как по барабану этот datetime или там какая-то подлость спрятана? :D

Я все таки стараюсь datetime использовать ,чтоб компилятор предупреждения не выдавал. А так то наверно без разницы. Все таки это целое число.
 

sergey1989

Интересующийся
Для начала надо выбрать открытый ордер, например по тикету. Если тикет неизвестен, перебрать в цикле все открытые и выбрать нужный.
Потом OrderOpenTime() вернёт время открытия ордера. Присвоить это значение datetime переменной.
Дальше в цикле перебрать все закрытые ордера присваивая datetime переменной время закрытия OrderCloseTime() и сравнивать их время закрытия. Самое большое время это время закрытия последнего ордера.

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

Добрый день, у меня такая же проблема, все делал именно так, как вы подсказали, вместо тикета использую магик:
PHP:
start()
(
   if(LastCloseTime()>LastOpenTime())
  {Выполняемое действие}
return(0);
)
//----------
datetime LastOpenTime() 
{
   datetime time = 0;int i=0;
   for( i = OrdersTotal()-1; i >= 0; i--)          
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
      {                                       
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType()==OP_BUY)
            {
               if (OrderOpenTime()>0) 
               {
                  time=OrderOpenTime();
               }
            }
         }
      }
   }
 return(time);
}
//-----------
datetime LastCloseTime() 
{
   datetime time = 0;int i=0;
   for( i = OrdersTotal()-1; i >= 0; i--)          
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
      {                                       
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic1)
         {
            
               if (OrderCloseTime()>0) 
               {
                  time=OrderCloseTime();
                  
               }
            
         }
      }
   }
 return(time);
}
Вот такой вариант почему-то не работает, подскажите пожалуйста в чем ошибка?
 
Последнее редактирование:

alexshell

Элитный участник
Добрый день, у меня такая же проблема, все делал именно так, как вы подсказали, вместо тикета использую магик:
PHP:
start()
(
   if(LastCloseTime()>LastOpenTime())
  {Выполняемое действие}
return(0);
)
//----------
datetime LastOpenTime() 
{
   datetime time = 0;int i=0;
   for( i = OrdersTotal()-1; i >= 0; i--)          
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
      {                                       
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType()==OP_BUY)
            {
               if (OrderOpenTime()>0) 
               {
                  time=OrderOpenTime();
               }
            }
         }
      }
   }
 return(time);
}
//-----------
datetime LastCloseTime() 
{
   datetime time = 0;int i=0;
   for( i = OrdersTotal()-1; i >= 0; i--)          
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
      {                                       
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic1)
         {
            
               if (OrderCloseTime()>0) 
               {
                  time=OrderCloseTime();
                  
               }
            
         }
      }
   }
 return(time);
}
Вот такой вариант почему-то не работает, подскажите пожалуйста в чем ошибка?
Ну во первых подсказали вам не так сделать. Вы сравниваете с нулем, что не имеет смысла. Надо так :
PHP:
if (OrderOpenTime()>time) 
               {
                  time=OrderOpenTime();
               }
И в принципе непонятно критерий выбора открытого ордера. Какой вам нужен то ли последний открытый то ли первый по времени. Или он всего у вас один.
По истории аналогично.
Во вторых использовать разные магики для проверки открытых и закрытых ордеров то же абсурд. Ведь магик открытого ордера при закрытии не меняется. Магик нужен советнику для отличия своих ордеров от чужих. Оставьте так && OrderMagicNumber() == Magic и для цикла по открытым и для цикла по закрытым ордерам. И не забудьте установить магик при открытии ордеров в функции OrderSend() Иначе опять вся эта конструкция не будет иметь смысла.
 
Последнее редактирование:

sergey1989

Интересующийся
Ну во первых подсказали вам не так сделать. Вы сравниваете с нулем, что не имеет смысла. Надо так :
PHP:
if (OrderOpenTime()>time) 
               {
                  time=OrderOpenTime();
               }
И в принципе непонятно критерий выбора открытого ордера. Какой вам нужен то ли последний открытый то ли первый по времени. Или он всего у вас один.
По истории аналогично.
Во вторых использовать разные магики для проверки открытых и закрытых ордеров то же абсурд. Ведь магик открытого ордера при закрытии не меняется. Магик нужен советнику для отличия своих ордеров от чужих. Оставьте так && OrderMagicNumber() == Magic и для цикла по открытым и для цикла по закрытым ордерам. И не забудьте установить магик при открытии ордеров в функции OrderSend() Иначе опять вся эта конструкция не будет иметь смысла.

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

alexshell

Элитный участник
Спасибо, сравниваю с нулем, потому что уже прописывал то что вы мне посоветовали, но результат такой же... А насчет магика, то это разные ордера, я беру последний закрытый ордер из истории и сравниваю с временем открытого с другим магиком, он у меня кстати один с таким магиком, соответственно путаницы не должно быть, но это условие все равно не срабатывает(((
Ну тогда попробуйте разные переменные time сделать, типа time1 и time2. Возможно они у вас путаются так как одинаковые. А вообще трудновато подсказывать когда не видишь полный код.
 

sergey1989

Интересующийся
Ну тогда попробуйте разные переменные time сделать, типа time1 и time2. Возможно они у вас путаются так как одинаковые. А вообще трудновато подсказывать когда не видишь полный код.

все работает, но вот именно это условие отказывается, вот часть которая срабатывает по этому условию:
PHP:
start()
(
   if(LastCloseTime()>LastOpenTime())
  {
    datetime o;
  double   l=-1,r=0;
  int k=OrdersHistoryTotal(),t=-1;

  for (int i=0; i<k; i++) 
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
    {
      if (OrderSymbol()==Symbol()) 
      {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) 
        {
           if (o<OrderCloseTime())
           {
              o=OrderCloseTime();
              l=OrderLots();
              t=OrderType();
              r=OrderOpenPrice();
           }  
        }
      }
    }
  }
  
  bool exists = false;
  i=0;
  for(i=OrdersTotal()-1; i>-1; i--)
  if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == Magic8)
  {
    if(OrderType()>=0)
    {
      if(NormalizeDouble(OrderOpenPrice(), Digits) == NormalizeDouble(r, Digits))
      {
        exists  = true;
        break;
      }
    }
  }
  

  
  
  if(t==OP_BUY && !exists)// CountOrder(Magic8,OP_BUYLIMIT)==0)
  {
     OrderSend(Symbol(), OP_BUYLIMIT, l, NormalizeDouble(r,Digits), Slippage, 0, 0, "Покупка", Magic8, 0, Green);
  }
  if(t==OP_SELL && !exists)//CountOrder(Magic8,OP_SELLLIMIT)==0)
  {
     OrderSend(Symbol(), OP_SELLLIMIT, l, NormalizeDouble(r,Digits), Slippage, 0, 0, "Продажа", Magic8, 0, Green);
  }
  }
return(0);
)
//----------
datetime LastOpenTime() 
{
   datetime time1 = 0;int i=0;
   for( i = OrdersTotal()-1; i >= 0; i--)          
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
      {                                       
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType()==OP_BUY)
            {
               if (OrderOpenTime()>time1) 
               {
                  time1=OrderOpenTime();
               }
            }
         }
      }
   }
 return(time1);
}
//-----------
datetime LastCloseTime() 
{
   datetime time = 0;int i=0;
   for( i = OrdersTotal()-1; i >= 0; i--)          
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) 
      {                                       
         if(OrderSymbol()==Symbol())
         {
            
               if (OrderCloseTime()>time) 
               {
                  time=OrderCloseTime();
                  
               }
            
         }
      }
   }
 return(time);
}
Сама функция работает отлично, проверял, она возвращает параметры последнего закрытого ордера и выставляет на его месте точно такой же, но проблема в том, что когда ордера закрыты по общему профиту, то эта функция все равно вытаскивает ордер из истории, хочу ограничить, поэтому и сравниваю время закрытого ордера с временем открытого, уже разные варианты опробовал, но при таком сравнении показывает всегда ложь
 

zverdj

Прохожий
Народ как сделать чтобы линейный индикатор показывал зеркально как "GRAALUn"
 

sergey1989

Интересующийся
переписал функцию по возврату времени закрытия ордера, проблема исправлена, спасибо за желание помочь, профита вам
PHP:
datetime LastCloseTime()
{
  datetime time = 0;int i=0;
  for( i=OrdersHistoryTotal()-1; i>-1; i--)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
       && OrderType()<2 && OrderSymbol()==Symbol())
    {
      time = MathMax(OrderCloseTime(), time);
    }
  }
  return (time);
}
 
Последнее редактирование:

qqmber

Почетный гражданин
Я все таки стараюсь datetime использовать ,чтоб компилятор предупреждения не выдавал. А так то наверно без разницы. Все таки это целое число.
Через 25 лет 32-разрядный счетчик секунд переполнится, и кто не спрятался, окажется опять в 1970 году.
 

ansol

Местный знаток
Через 25 лет 32-разрядный счетчик секунд переполнится, и кто не спрятался, окажется опять в 1970 году.

Не через 25, а несколько раньше ;)
А вообще, представляю трейдера, сидящего на МТ4/х86 через 25 лет... Да, тут-то он все и сольет нафиг! :D
 

kozim

Новичок форума
Помогите пожалуйста исправит код
от текущей цены пример (1.3000+0.0015=1.3015 ) пропускал другому блоку
if (Ask >= PRICE_OPEN + 0.0015)
{
~next~
}
 

bot14

┳━┳
Прикольную штуку обнаружил в новом МТ. Ну должно же быть в нем хоть что-то лучше, чем в старом )))
Если в начало кода индикатора добавить строчку
#property icon "\\Images\\любой_файл.ico";
то при вызове свойств индикатора эта иконка будет видна на первой вкладке.
Например, добавляем в код QQE_arr от младена строку:
#property icon "\\Images\\mladen.ico";
Саму иконку кладем в папку MQL4\Images, получаем:

865b8def824c0e803f09fca2bc3842fc.png


При компиляции иконка "вписывается" в *.ex4 навечно ))
Конечно, едитор не понимает других файлов, кроме *.ico (кто бы сомневался))) Для моментального конвертирования файлов
рекомендую мелкую полезняшку, портированную с iOs:

07597aa0d9ac01902c7f029893c2ffb9.png


_http://gfile.ru/a711t

Инсталяции не требуется, как пользоваться разберется и ребенок в 5 сек ))

Эту ветку сильно не изучал, может про эту фишку уже все знают кроме меня. Тогда с уважением, ваш кэп )))
 
Последнее редактирование:
Верх