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

strannik-ps

VIP-участник
Приветствую.
Есть индикатор X, обновляется только при смене таймфрейма или при перезапуске терминала.
Подскажите, что нужно вставить, чтобы обновлялся (перестраивался) в необходимое время терминала, скажем 00:00?
То есть не каждый бар/тик, а только в назначенное время.
#include <WinUser32.mqh> в шапку индикатора

Попробуйте такую функцию пропишите после функции работы по времени.
PHP:
  int hwnd =WindowHandle(Symbol(),Period());
     if(hwnd != 0 && (time==0 || TimeCurrent()-time>10)) 
       { 
         PostMessageA(hwnd, WM_COMMAND, 33324, 0); 
         time=TimeCurrent();
       }
 

AlexeyVik

Программист mql4 mql5
Начало и конец мне ясны if(OrderClose() > 0 && OrderProfit() > 0) вот тут нужно вписать - после этого - и дальше тоже понятно if(OrderClose() > 0 && OrderProfit() < 0)
Видимо это понятно только тебе. Почитай здесь.
_http://docs.mql4.com/ru/trading/OrderClose
_http://docs.mql4.com/ru/trading/OrderProfit
Может и тебе будет НЕпонятно.
 
Последнее редактирование модератором:

Алекc1234

Местный житель
Видимо это понятно только тебе. Почитай здесь.
_http://docs.mql4.com/ru/trading/OrderClose
_http://docs.mql4.com/ru/trading/OrderProfit
Может и тебе будет НЕпонятно.

Ой-ой-ой я дико извиняюсь - не OrderClose(), а OrderCloseTime() > 0. Что-то я совсем туплю и ввожу в заблуждение. То есть if(OrderCloseTime() > 0 && OrderProfit() > 0) вот тут нужно вписать - после этого - и дальше if(OrderCloseTime() > 0 && OrderProfit() < 0)
 

Алекc1234

Местный житель
Напишу простыми словами. Ордер закрылся в плюсе - после него(следующий) ордер закрылся в минусе - и выполнение. Как сделать, чтобы обозначить этот следующий ордер?
 
Последнее редактирование:

alexshell

Элитный участник
Напишу простыми словами. Ордер закрылся в плюсе - после него(следующий) ордер закрылся в минусе - и выполнение. Как сделать, чтобы обозначить этот следующий ордер?

Организуй цикл выбор по истор. ордерам выбираешь последний закрытый ордер. Если он в плюсе,то присваевай допустим переменной bool типа Условие=false.Если минусовой то =true. Пока ордера плюсовые оно равно false. Как только появиться минусовой дальше после цикла будет
If(Условие==true) выполнить то то. Определять булевую переменную нужно до старта. Короче не всё так однозначно словами писать запарился. Завтра вечером с работы прийду если у тебя ничего не получится напишу этот цикл.
 

Алекc1234

Местный житель
Организуй цикл выбор по истор. ордерам выбираешь последний закрытый ордер. Если он в плюсе,то присваевай допустим переменной bool типа Условие=false.Если минусовой то =true. Пока ордера плюсовые оно равно false. Как только появиться минусовой дальше после цикла будет
If(Условие==true) выполнить то то. Определять булевую переменную нужно до старта. Короче не всё так однозначно словами писать запарился. Завтра вечером с работы прийду если у тебя ничего не получится напишу этот цикл.

Спасибо, я точно сам не смогу написать, так что буду ждать тебя.
 

hoz

Активный участник
Спасибо, я точно сам не смогу написать, так что буду ждать тебя.

Как я понял, тебе нужно открывать позу, если последняя поза закрылась с убытком?

Тогда вот я накидал на скорую руки:
PHP:
//+-------------------------------------------------------------------------------------+
//| Определяем тип последней закрытой позы                                              |
//+-------------------------------------------------------------------------------------+
bool IsItProfitPos()
{
   int total = OrdersTotal()-1;
   double lastCloseProfit;
   
   for (int i = total; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
      {
         lastCloseProfit = OrderProfit();
         
         if (lastCloseProfit < OrderProfit())
             lastCloseProfit = OrderProfit();
      }
   }

   if (lastCloseProfit < 0)
       return(true);
}


Чтоб открыть позу, проверяем тип позы, если поза в лосе, значит открываем новую позу:
PHP:
if (!IsItProfitPos())
    ОТКРЫВАЕМ ПОЗУ....
 

Алекc1234

Местный житель
Как я понял, тебе нужно открывать позу, если последняя поза закрылась с убытком?

Тогда вот я накидал на скорую руки:
PHP:
//+-------------------------------------------------------------------------------------+
//| Определяем тип последней закрытой позы                                              |
//+-------------------------------------------------------------------------------------+
bool IsItProfitPos()
{
   int total = OrdersTotal()-1;
   double lastCloseProfit;
   
   for (int i = total; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
      {
         lastCloseProfit = OrderProfit();
         
         if (lastCloseProfit < OrderProfit())
             lastCloseProfit = OrderProfit();
      }
   }

   if (lastCloseProfit < 0)
       return(true);
}


Чтоб открыть позу, проверяем тип позы, если поза в лосе, значит открываем новую позу:
PHP:
if (!IsItProfitPos())
    ОТКРЫВАЕМ ПОЗУ....

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

hoz

Активный участник
Прошлое сообщение когда я писал, думал не о том. Вот так правильно:
PHP:
//+-------------------------------------------------------------------------------------+
//| Определяем тип последней закрытой позы                                              |
//+-------------------------------------------------------------------------------------+
bool IsItProfitPos()
{
   int total = OrdersTotal()-1;
   double lastCloseProfit;
   datetime lastClosePosTime;
   
   for (int i = total; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
      {
         lastCloseProfit = OrderCloseTime();

         if (lastClosePosTime < OrderCloseTime())
         {
             lastClosePosTime = OrderCloseTime();
             lastCloseProfit = OrderProfit();
         }
      }
   }

   if (lastCloseProfit > 0)
       return(true);
}
 
Последнее редактирование:

hoz

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

Как я понимаю, тут всё так же. Находит профит для заданного ордера через выборку.

PHP:
if (OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))


Тут если ордер предпоследний то:
PHP:
i = OrdersTotal()-2;


А если последний то:

PHP:
i = OrdersTotal()-1;
 
Последнее редактирование:

Алекc1234

Местный житель
Прошлое сообщение когда я писал, думал не о том. Вот так правильно:
PHP:
//+-------------------------------------------------------------------------------------+
//| Определяем тип последней закрытой позы                                              |
//+-------------------------------------------------------------------------------------+
bool IsItProfitPos()
{
   int total = OrdersTotal()-1;
   double lastCloseProfit;
   datetime lastClosePosTime;
   
   for (int i = total; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
      {
         lastCloseProfit = OrderCloseTime();

         if (lastClosePosTime < OrderCloseTime())
         {
             lastClosePosTime = OrderCloseTime();
             lastCloseProfit = OrderProfit();
         }
      }
   }

   if (lastCloseProfit > 0)
       return(true);
}

А разве правильно, что lastCloseProfit = OrderCloseTime(); и тут же lastCloseProfit = OrderProfit(); ?
 
Последнее редактирование модератором:

alexshell

Элитный участник
Спасибо, я точно сам не смогу написать, так что буду ждать тебя.

Ну как то так.
PHP:
 //========================================================================   
 bool Uslovie=false; // Вынести за старт
 bool Uslovie1=false; // Вынести за старт
 
 
    int  Times=0;double profit;
    for( int y=0;y<OrdersHistoryTotal();y++) //   
   { 
     if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY)) 
       if(OrderSymbol()==Symbol()&&OrderMagicNumber( ) ==magik )
         if (OrderType()<2&&OrderCloseTime( ) > Times)
         { 
          Times==OrderCloseTime( );
          profit= OrderProfit( )+OrderSwap()+OrderCommission( ) ;
         } 
   } 
   if (profit>0)Uslovie1=true;
   
    if (Uslovie1==true&&profit<0)
    {
    Uslovie=true;
    Uslovie1=false;
    }
    
      if (Uslovie==true)
      {
     // нужное действие;
      Print("команда");
      Uslovie=false;
      }
      
   //========================================================================
Print после отладки можно убрать.
 

hoz

Активный участник
А разве правильно, что lastCloseProfit = OrderCloseTime(); и тут же lastCloseProfit = OrderProfit(); ?


Нет. Вот так:

PHP:
lastClosePosTime = OrderCloseTime();


Мы же ордера по времени отбираем. У самого просто своих головняков много, вот и..
 

hoz

Активный участник
alexshell, зачем ты ордера по типу отбираешь в строке?

PHP:
 if (OrderType()<2&&OrderCloseTime( ) > Times)


Это лишняя операция. Отложенник в истории же не будет иметь профит или лося никак. Значит нет нужды фильтровать..
И со временем так же. Если мы перебираем ордера в истории, то время закрытия будет точно больше нуля. Значит и это выражение в выше указанной строке лишнее:

PHP:
OrderCloseTime( ) > Times


Я не утверждаю, но можно обсудить этот момент. Так как бросился в глаза сразу...
 
Последнее редактирование:

alexshell

Элитный участник
alexshell, зачем ты ордера по типу отбираешь в строке?

PHP:
 if (OrderType()<2&&OrderCloseTime( ) > Times)


Это лишняя операция. Отложенник в истории же не будет иметь профит или лося никак. Значит нет нужды фильтровать..
И со временем так же. Если мы перебираем ордера в истории, то время закрытия будет точно больше нуля. Значит и это выражение в выше указанной строке лишнее:

PHP:
OrderCloseTime( ) > Times


Я не утверждаю, но можно обсудить этот момент. Так как бросился в глаза сразу...

Отложка естественно не будет иметь лося или профит. Поэтому и задано в условиях что отложки пропускаем и не делаем лишних вычислений.Со временем там мы сравниваем с нулём только один раз на первом ордере.Потом время меняется на время ордера и уже следующий ордер сравнивается с этим временем.Вообще можно Times=0; тоже вынести за старт. Тогда у нас в программе всегда будет присутсвовать время последнего закрытого ордера. И в цикле будем сравнивать с этим временем.Соответственно вычислений будет меньше.
 

eevviill

Заблокирован
Отложка естественно не будет иметь лося или профит. Поэтому и задано в условиях что отложки пропускаем и не делаем лишних вычислений.Со временем там мы сравниваем с нулём только один раз на первом ордере.Потом время меняется на время ордера и уже следующий ордер сравнивается с этим временем.Вообще можно Times=0; тоже вынести за старт. Тогда у нас в программе всегда будет присутсвовать время последнего закрытого ордера. И в цикле будем сравнивать с этим временем.Соответственно вычислений будет меньше.
А ещё проще задом на перёд перебрать. Я уже говорил номер в переборе соответсвует времени открытия(порядку).
 

expforex

Программиров
А ещё проще задом на перёд перебрать. Я уже говорил номер в переборе соответсвует времени открытия(порядку).

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

Может быть МТ что-то уже нахимичили переправили. Но года два назад - номер не соответствует последней сделке.

:facepalm:
 

eevviill

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

Может быть МТ что-то уже нахимичили переправили. Но года два назад - номер не соответствует последней сделке.

:facepalm:
PHP:
for(int i=OrdersTotal()-1; i>=0; i--)
 {
 if(OrderSelect(i, SELECT_BY_POS))
 {
 break;
 }   
 }
Alert(OrderType());
Скрипт выдаёт последний открытый ордер при любой сортировке ордеров.
 
Последнее редактирование:

expforex

Программиров
хм. ну я ж говорю раньше так нельзя было выбирать , я по старинке, свои функции использую последние года 3.
 
Верх