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

malojorsk

Новичок форума
:)
PHP:
double isCloseLastPosByStopTrade(string sy,int op,int mn)
  {
   datetime t=0;
   double   profit;
   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()==sy) // || sy=="")
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(t<OrderCloseTime())
                       {
                        t=OrderCloseTime();
                        profit=OrderProfit();
                       }
                    }
                 }
              }
           }
        }
     }
    return(profit);
  } [/SPOILER] [/QUOTE]

Спасибо, подскажите я правильно вызываю эту функцию?
нужно умножение лота на 2 при убытке.
в данной конструкции лот с 0,01 сразу умножает до 0,08
переменная lots - идет в настройках
переменная Lot - стоит в параметрах ордеров

[CODE]
 if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)>0)
         {Lot=lots;
        
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)<0)
         {Lot=Lot*2;
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)>0)
         {Lot=lots;
         
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)<0)
         {Lot=Lot*2;
         
         }
[/CODE]
 
Последнее редактирование:

mobidik

-----
Спасибо, подскажите я правильно вызываю эту функцию?
нужно умножение лота на 2 при убытке.
в данной конструкции лот с 0,01 сразу умножает до 0,08
переменная lots - идет в настройках
переменная Lot - стоит в параметрах ордеров

Код:
 if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)>0)
         {Lot=lots;
        
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic)<0)
         {Lot=Lot*2;
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)>0)
         {Lot=lots;
         
         }
         if(isCloseLastPosByStopTrade(Symbol(),OP_SELL,Magic)<0)
         {Lot=Lot*2;
         
         }

Нет, малость не то. Ф-ция isCloseLastPosByStopTrade(Symbol(),OP_BUY,Magic) возвращает профит последнего закрытого ордера, вопрос в том, что Вы хотите: что бы увеличение лотности происходило разово, т.е., поймали лося и следующий вход будет увеличенным лотом, при этом, если снова поймали лося, то вход будет лотом стартовый лот * 2, т.е., каждый последующий вход при непрерывном получении лося будет только в размере стартовый лот * 2 или увеличивать размер лота после последней закрытой позиции на лот закрытой позиции * 2? Если второй вариант, то предыдущую ф-цию нужно изменить, а именно: получать значение лота при убытке последней закрытой позиции и от этого значения устанавливать лотность для нового ордера.
 

aonisya

Активный участник
Господа, возможно пишу не в тему, так что сильно не пинайте. А если захотите, то пинайте в нужном мне направлении.
Кто-нибудь сможет переделать индикатор с mql5 в mql4?
 

Vladimir90

Прохожий
Ребята, привет. Подскажите пожалуйста.
Не могу сообразить:
Вот задача:
К примеру цена Bid находится на уровне 1,56 (считаем что это круглый уровень) и запоминаем последнее время нахождения цены Bid на отметке 1,56 - к примеру будет точка Х1. Далее цена к примеру пошла вверх и задела Bid уровень 1,57 - создаем точку Х2, и сравниваем время точки Х2 и точки Х1, чтобы разница в секундах была не больше времени t1 и не меньше времени t3, и проверяем чтобы цена на этом уровне Х2(1,57) была больше времени t2(тоесть ищем этот уровень в прошлом, и находим для него время(это найденное время вычитаем из настоящего и разница должна быть больше t2(задаем вручную)).
ыыыы.png
 

panand

Местный знаток
Господа,день добрый!
Приложите готовый или напишите код фильтра для советника,пожалуйста, который позволит советнику открывать сделку,любую, при условии - если в течения указанной доли в секундах подряд появляется тик(Volume),советнику разрешается открывать сделку, но если тик не появляется,то запрещает сделку.
Например,указываю 1 секунду,где (до 1 секунды) при появления тика за каждое указанное время подряд,начиная с первой секунды,то допускает сделку при его сигнале.
Если тик не совпадает со временем,делая паузу,пропускает время - сделка запрещена.
Это как аналог фильтра ограничения сделки при расширяющем спреде.
Спасибо за внимание.
 

mobidik

-----
Господа,день добрый!
Приложите готовый или напишите код фильтра для советника...
Ветка то, о вопросах, а заказы в другом месте.
Смотри в сторону ф-ции: GetTickCount(), в справке есть пример, логика в нем та же, что тебе нужно.
 

блондинка

Элитный участник
Доброй ночи!
Вопрос такой с вашего позволения)
Стрелочный индикатор.Если условие для стрелки выполняется в основном цикле вычислений,то на закрытии свечи рисуется стрелка(вверх или вниз в зависимости от совпадения условий)
Надо организовать внутренний цикл, что бы после каждой стрелки на следующих N барах стрелок этого же направления не было (не отображалось)
Вот пример основного (обычного)цикла стрелки:
int start() {
int limit, i, counter;
double Range, AvgRange;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(i = 1; i <= limit; i++) {

counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;

r0=RSI(Symbol(),0,Rsi_period,RSIpriceType,i);

CrossUp = 0;
CrossDown = 0;

if (r < 20)
{
CrossUp = Low - Range*0.75;
}
else if (r > 80)
{
CrossDown = High + Range*0.75;
}
}
return(0);
}

Это означает, что когда RSI будет выше уровня 80, то на всех свечах будут стрелки вниз (серии подряд). Для вверх уровень 20.
В этот цикл и вставить ещё запрет на отображение N стрелок сразу после первой(не важно выполнение условия основного цикла).Если бы было 2-3 стрелки подряд, это понятно как сделать(каждый раз проверят буфер на предыдущем баре)
А для большего количества(до 10 штук) это надо более красиво сделать.
Как?Посоветуйте.
Спасибо за внимание!Удачи!:)
 
Последнее редактирование:

vladradon

Программист
А для большего количества(до 10 штук) это надо более красиво сделать.
Как?Посоветуйте.
Привет! Попробуй такой вариант. Код не полный, поэтому не проверял на графике, но смысл, думаю, понятен. Параметр N, предположительно, внешний.
PHP:
   int N1=0,N2=0;
   int limit,i,counter;
   double Range,AvgRange;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   for(i=1; i<=limit; i++) 
     {
      counter=i;
      Range=0;
      AvgRange=0;
      for(counter=i;counter<=i+9;counter++)
        {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
        }
      Range=AvgRange/10;

      r0=RSI(Symbol(),0,Rsi_period,RSIpriceType,i);

      CrossUp[i]=0;
      CrossDown[i]=0;
      if(N1>0) N1--;
      if(N2>0) N2--;
      if(r<20 && N1<1)
        {
         CrossUp[i]=Low[i]-Range*0.75;
         N1=N;
        }
      if(r>80 && N2<1)
        {
         CrossDown[i]=High[i]+Range*0.75;
         N2=N;
        }
     }
Или такой вариант:
PHP:
   int limit,i,counter;
   double Range,AvgRange;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   int N1=limit, N2=limit;
   for(i=limit; i>=1; i--) 
     {
      counter=i;
      Range=0;
      AvgRange=0;
      for(counter=i+9;counter>=i;counter--)
        {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
        }
      Range=AvgRange/10;

      r0=RSI(Symbol(),0,Rsi_period,RSIpriceType,i);

      CrossUp[i]=0;
      CrossDown[i]=0;

      if(r<20 && N1-i>=N)
        {
         CrossUp[i]=Low[i]-Range*0.75;
         N1=i;
        }
      if(r>80 && N2-i>=N)
        {
         CrossDown[i]=High[i]+Range*0.75;
         N2=i;
        }
     }
В первом варианте, скорее всего, тоже нужно перенаправить основной и внутренний циклы с конца на начало.
 
Последнее редактирование:

блондинка

Элитный участник
Привет! Попробуй такой вариант. Код не полный, поэтому не проверял на графике, но смысл, думаю, понятен.
Ого!И это называется простой язык?)))Мне бы не догадаться.
Второй код работает!!!
Большое спасибо!
 
Последнее редактирование:

vladradon

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

Vladimir90

Прохожий
Ребят, подскажите, как программно посмотреть круглый уровень в прошлом:нужно:
к примеру уровень(последний бид)
1,56000 05,12,2017 11-59 (время определяет сам)
1,55000 05,12,2017 09-00 (время определяет сам)
 

_SERG_

Активный участник
Ребят, подскажите, как программно посмотреть круглый уровень в прошлом:нужно:
к примеру уровень(последний бид)
1,56000 05,12,2017 11-59 (время определяет сам)
1,55000 05,12,2017 09-00 (время определяет сам)

С какой точностью по времени тебе это надо?

Для примера:

1. Выбрал котировку. (Ценовой уровень.)
2. Выбрал ТФ.
3. Пролистал историю баров.
4. Нашел интервал времени (бар), где котировка попадает в этот интервал времени (бар).
5. Если надо более точное значение времени, перешел на более мелкий ТФ,
и в рамках найденного ранее интервала старшего ТФ, уточнился по времени.
Так до "минуты", если надо.

Всё простенько.
 
Последнее редактирование:

Vladimir90

Прохожий
С какой точностью по времени тебе это надо?

Для примера:

1. Выбрал котировку. (Ценовой уровень.)
2. Выбрал ТФ.
3. Пролистал историю баров.
4. Нашел интервал времени (бар), где котировка попадает в этот интервал времени (бар).
5. Если надо более точное значение времени, перешел на более мелкий ТФ,
и в рамках найденного ранее интервала старшего ТФ, уточнился по времени.
Так до "минуты", если надо.

Всё простенько.
Спасибо большое, буду пытаться реализовать код
 

Артмен

Новичок форума
Здравствуйте! Помогите пожалуйста исправить ошибку - return value of 'OrderClose' should be checked.
int start()
{
//----
for (int j = 0; j < OrdersTotal(); j++){
if (OrderSelect(j, SELECT_BY_POS)){
if (OrderSymbol() == Symbol()&& (OrderMagicNumber()==magic || magic==0)){
if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT) && Bid-OrderOpenPrice()>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT) && OrderOpenPrice()-Ask>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Ask,slip,0);
}
}
}
//----
return(0);
}
 

_SERG_

Активный участник
Здравствуйте! Помогите пожалуйста исправить ошибку - return value of 'OrderClose' should be checked.
int start()
{
//----
for (int j = 0; j < OrdersTotal(); j++){
if (OrderSelect(j, SELECT_BY_POS)){
if (OrderSymbol() == Symbol()&& (OrderMagicNumber()==magic || magic==0)){
if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT) && Bid-OrderOpenPrice()>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT) && OrderOpenPrice()-Ask>=tp*Point) OrderClose(OrderTicket(), OrderLots(),Ask,slip,0);
}
}
}
//----
return(0);
}

дет так:

#include <stdlib.mqh>
#include <stderror.mqh>
int ERR_CODE = 0;
//----
bool ERR = OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
ERR_CODE = GetLastError(); // Это чтобы наверняка отловить ошибку.
if(ERR == FALSE) { // Ну а тут, что сней дальше делать.
Print ("Ошибочка вышла, однако: [" + InegerToString(ERR_CODE) +"][" ErrorDiscription(ERR_CODE)+"]");
}

Ну а остальное, по аналогии.
 
Последнее редактирование:

max020780

Новичок форума
День добрый .
нужна помощь.
есть индикатор рисующий стрелки подскажите как узнать какая стрелка на данный момент выводится на экран.
как это реализовать таким образом чтоб индикатор не устанавливать в окно терминала
 

Вложения

  • индикатор стрелочник.jpg
    индикатор стрелочник.jpg
    17 КБ · Просмотры: 12

Артмен

Новичок форума
дет так:

#include <stdlib.mqh>
#include <stderror.mqh>
int ERR_CODE = 0;
//----
bool ERR = OrderClose(OrderTicket(), OrderLots(),Bid,slip,0);
ERR_CODE = GetLastError(); // Это чтобы наверняка отловить ошибку.
if(ERR == FALSE) { // Ну а тут, что сней дальше делать.
Print ("Ошибочка вышла, однако: [" + InegerToString(ERR_CODE) +"][" ErrorDiscription(ERR_CODE)+"]");
}

Ну а остальное, по аналогии.
Здравствуйте _SERG_. Попробовал, но не вызывает библиотеку, "разрешить DLL" - галочка стоит, но всё равно выдаёт ошибку - can't open "C:\Users\Dell\AppData\Roaming\MetaQuotes\Terminal\7EA15B8B5AFB10E43823DC33101722BA\MQL4\include\stdlib.mqh" include file
 
Верх