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

matro3

Почетный гражданин
countOrders() - функция подсчета ордеров.
В ней бы я считал ордера с фильтрами по символу, магику и т.д.
Если все равно что он будет считать чужие ордера, то OrdersTotal()

В Comment() выводите пробегая в цикле по массиву series.
Тут все просто. Почему такой вопрос вообще возник? ))
 

gince

Местный знаток
Я видел в одном советнике, что во входных параметрах есть строчки, которые нельзя менять, они описывают следующие за этой строкой параметры, потом опять строчка описания и опять параметры. Например "Параметры индикатора стохастик", пос этого идет например K = 5, D = 3, Z =3. Вот как сделать, чтобы строка "Параметры индикатора стохастик" не подлежала изменениям и была серым цветом выделена?

input string stoch="opisaninie stochastika";
 

Milord

Местный знаток
....Взять готовую функцию безубытка. Разместить её за пределами функции start, вызвать её внутри функции start, как раз можно в начале.....
СПАСИБО за подсказку,1-ну функцию подключить получилось, вызов на нее например Function_A() пишу сразу после команды Start(), но мне еще нужно из самой функции сделать вызов на другую функцию Function_B(), будет ли правильно,как я написал ниже, как считаете???

PHP:
int Start()
{

if(..условие....) Function_A(); 

return(0);
}
//-------------------------------------
void Function_A() 
{
if(...условие......)
 {
  if(...условие...)
   { 
   if(...условие...) Function_B(); 
   }
 }
}
//--------------------------------------
void Function_B() 
{
if(...условие...) 
   
}
//--------------------end--------------
 
Последнее редактирование:

matro3

Почетный гражданин
Будет.
Но если вы вызываете ее из функции безубытка, значит вы подсчитываете БУ сетки или что-то подобное.
На Ваше месте я бы получил все необходимые данные до, а потом их применял.
 

max020780

Новичок форума
В Comment() выводите пробегая в цикле по массиву series.
Тут все просто. Почему такой вопрос вообще возник? ))

пишу вот так в столбик не выводит да и выдает ошибку что выход за пределы массива как написать правильно чтоб длина массива увеличивалась в зависимости от количества серий то есть если было семь серий то и размер массива был равен количеству серий и соответственно в Comment() тоже добавлялись строки
PHP:
ushort seriess[];

ushort series_current = 0;
input int magic=345461;
int NumberOfPositions(string sy="" , int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if(mn<0|| OrderMagicNumber()==magic)  kp++;
          }
        }
    }
  }
  return(kp);
}
void OnTick()
{
int count = NumberOfPositions(Symbol(),-1);
   if(count == 0)
      series_current = 0;
   if(series_current != count)
   {
      series_current = (ushort)count;
      if(count == 1)
         seriess[0]++;
      if(count > 1)
      {
         seriess[count-1]++;
         seriess[count-2]--;
      }
   }
   int i; 
   int k=12;
   for(  i=0; i<=k ; i++)
   {
   Comment(StringFormat("Серия из  %d ордеров =  %d\n ",i,seriess[i+1]));
   }
}
 

AlexeyVik

Программист mql4 mql5
пишу вот так в столбик не выводит да и выдает ошибку что выход за пределы массива как написать правильно чтоб длина массива увеличивалась в зависимости от количества серий то есть если было семь серий то и размер массива был равен количеству серий и соответственно в Comment() тоже добавлялись строки

В цикле формируй строку в переменную глобального уровня и её суй в Comment();
 

Ladzius

Элитный участник
Большое просьба уговарить пациента болтать ;)спасибо*hi*
 

Вложения

  • RenkoBot_EA_only_for_tester.ex4
    386,5 КБ · Просмотры: 38

AlexeyVik

Программист mql4 mql5
Я конечно дико извиняюсь в программировании не селен поэтому можно помочь куском кода как Ув. matro3 а не словами как вы
Я не сторонник таких подсказок. Можно воспользоваться шпаргалкой, а можно понять происходящее и больше не задавать похожих вопросов.
Ну ты сам-то прочти что будет в комментарии при очередной итерации цикла
Код:
[COLOR=#000000][COLOR=#007700]  [COLOR=Black] for(  [/COLOR][/COLOR]i=0; i<=k ; i++)
   {
   Comment(StringFormat("Серия из  %d ордеров =  %d\n ",i,seriess[i+1]));
   }[/COLOR]
Изменится только i и значение series[i+1] но то что было в предыдущей итерации будет потеряно.
Код:
string comm;

for(i = 0; i < k; i++)
comm = StringConcatenate(comm, i, series[i+1], "\n\r");

Comment(comm);
 

max020780

Новичок форума
Я не сторонник таких подсказок. Можно воспользоваться шпаргалкой, а можно понять происходящее и больше не задавать похожих вопросов.
Ну ты сам-то прочти что будет в комментарии при очередной итерации цикла
Код:
[COLOR=#000000][COLOR=#007700]  [COLOR=Black] for(  [/COLOR][/COLOR]i=0; i<=k ; i++)
   {
   Comment(StringFormat("Серия из  %d ордеров =  %d\n ",i,seriess[i+1]));
   }[/COLOR]
Изменится только i и значение series[i+1] но то что было в предыдущей итерации будет потеряно.
Код:
string comm;

for(i = 0; i < k; i++)
comm = StringConcatenate(comm, i, series[i+1], "\n\r");

Comment(comm);
Спасибо , но вот другая проблема как правильно вписать туда текст пробую вот так и снова начинает выводить в одну строку
PHP:
int i; 
   int k=12;
   string comm;
   string comm1;

for(i = 0; i < k; i++){
comm = StringConcatenate( "Серия из "  , i );
comm1= StringConcatenate( "ордеров = ",seriess[i+1], "\n\r");

Comment(comm+comm1);
}
подправьте пожалуйста
 

planod

Интересующийся
Подскажите как реализовать следующую ситуацию: несколько советников считывают объем лота из текстового файла и периодически советник записывает туда новое значение.
 

eevviill

Заблокирован
Подскажите как реализовать следующую ситуацию: несколько советников считывают объем лота из текстового файла и периодически советник записывает туда новое значение.
Может легче через GlabalVariableSet() GlabalVariableChek()?
 

matro3

Почетный гражданин
PHP:
comm = "";
for(i = 0; i < k; i++)
   comm += StringConcatenate("Серия из " + i + " ордеров = ", seriess[i+1], "\n");

Comment(comm);
 

Milord

Местный знаток
Профи - подскажите плиз что добавить в код???

Вопрос такой как сделать, чтобы при наступлении условия, советник не открывал кучу ордеров один на одном, а только 1-н,а то происходит следующее, при числе ордеров на счете разрешенном для открытия параметром MaxOrders=5,советник и открывает 5ть ордеров, но все в одной точке...как убрать такой "глюк"???:facepalm:
ниже кусок кода:

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < MaxOrders)
  {
//---------------------

   if(A>B)
    {
     OrderSend(....);
    }

//---------------------
  }
return(0);
}
 
Последнее редактирование:

mobidik

-----
Вопрос такой как сделать, чтобы при наступлении условия, советник не открывал кучу ордеров один на одном, а только 1-н,а то происходит следующее, при числе ордеров на счете разрешенном для открытия параметром MaxOrders=5,советник и открывает 5ть ордеров, но все в одной точке...как убрать такой "глюк"???:facepalm:
ниже кусок кода:

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < MaxOrders)
  {
//---------------------

   if(A>B)
    {
     OrderSend(....);
    }

//---------------------
  }
return(0);
}

Тут зависит еще от поставленных целей, если нужно только один ордер на свечу, тогда делать проверку на новый бар. При этом могут 5 ордеров открыться подряд, на открытии каждого бара, т.е., открылся ордер - установить: TimeBar=Time[0]. Тогда в условие открытия ордера добавить проверку на новый бар: TimeBar!=Time[0].
Можно запомнить цену последнего открытого ордера и уже через заданный шаг открывать следующий ордер - вариант сетки.
Вообщем, как то так, может Гуру предложат еще варианты...
 

Gnn-life

Местный знаток
Тут зависит еще от поставленных целей, если нужно только один ордер на свечу, тогда делать проверку на новый бар. При этом могут 5 ордеров открыться подряд, на открытии каждого бара, т.е., открылся ордер - установить: TimeBar=Time[0]. Тогда в условие открытия ордера добавить проверку на новый бар: TimeBar!=Time[0].
Можно запомнить цену последнего открытого ордера и уже через заданный шаг открывать следующий ордер - вариант сетки.
Вообщем, как то так, может Гуру предложат еще варианты...

а есть ли такая возможность открывать следующий ордер по сигналу, но не ранее заданного шага? Как это прописать в коде?
 

mobidik

-----
а есть ли такая возможность открывать следующий ордер по сигналу, но не ранее заданного шага? Как это прописать в коде?

Как вариант, я бы сделал так:

PHP:
int мин_дист = 25;                            // минимальная дистанция между ордерами
int возможен бай;                             // переменная для бай
OrderOpenLast()                               // функция определения цены открытия последнего ордера

if(Ваше условие на бай) возможен бай = 1   ;  // есть выполнение условия на вход бай, приваиваем перем. "возможен бай" - 1
if(возможен бай == 1 && Ask - OrderOpenLast()>мин_дист) // есть условие на бай и текущая цена больше за дистанцию, то
  { 
    ticket=OrderSend(Symbol(),OP_BUY,Lots ... // открываем ордер ...
    if(ticket>0) возможен бай = 0;            // если ордер открылся, присваиваем переменной "возможен бай" - 0.
  }
 ...
 

Milord

Местный знаток
Как вариант, я бы сделал так:

PHP:
int мин_дист = 25;                            // минимальная дистанция между ордерами
int возможен бай;                             // переменная для бай
OrderOpenLast()                               // функция определения цены открытия последнего ордера

if(Ваше условие на бай) возможен бай = 1   ;  // есть выполнение условия на вход бай, приваиваем перем. "возможен бай" - 1
if(возможен бай == 1 && Ask - OrderOpenLast()>мин_дист) // есть условие на бай и текущая цена больше за дистанцию, то
  { 
    ticket=OrderSend(Symbol(),OP_BUY,Lots ... // открываем ордер ...
    if(ticket>0) возможен бай = 0;            // если ордер открылся, присваиваем переменной "возможен бай" - 0.
  }
 ...

а можно ли как то закодить логику открытия ордеров в моем случае, чтобы ордера открывались по началу сигнала(условие A>B),смотрите ниже рисунок
 

Вложения

  • forex01.JPG
    forex01.JPG
    10 КБ · Просмотры: 15

mobidik

-----
а можно ли как то закодить логику открытия ордеров в моем случае, чтобы ордера открывались по началу сигнала(условие A>B),смотрите ниже рисунок

Сигнал будет когда выполнится условие на новом тике, если условие не было верным на предыдущем тике. Т.е., как только А>B сова дает запрос на открытие ордера (если нет никаких слипов и таймеров), а тут уже вступает в работу проскальзывание, пинг (провайдер интернета), козни брокера (время исполнения) и т.д...
 

Milord

Местный знаток
Сигнал будет когда выполнится условие на новом тике, если условие не было верным на предыдущем тике. Т.е., как только А>B сова дает запрос на открытие ордера (если нет никаких слипов и таймеров), а тут уже вступает в работу проскальзывание, пинг (провайдер интернета), козни брокера (время исполнения) и т.д...
вы не поняли мой вопрос, предложенный вами метод с дистанцией или выше открытием на барах мне не подойдет, так как если условие сигнала A>B, будет на новом баре, то снова ордер откроется(чего мне и не нужно), или ваша дистанция может быть тоже мало эффективной, если сигнал будет присутствовать при этом, ордер снова откроется...а мне не нужно его снова открывать при первом сигнале, у меня логика работы - 1 сигнал - 1 ордер, и он должен открываться по переднему фронту сигнала! и вопрос - как это написать в коде???:facepalm:
 
Верх