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

AlexeyVik

Программист mql4 mql5
Пазл начал складываться.
Без #property strict ошибки нет, значит надо просто очистить массив.
Теперь у меня тупик, как это сделать.
Может есть у кого варианты?
Без #property strict ошибка никуда не делась, только лишь игнорируется. Типа, получили хрень какую-то, ну и хрен с ней... пойдём дальше...
Очищать массив нет никакого смысла. Проблема не в том, что массив заполнен, а в том что индекс массива при заполнении или чтении превышает максимальное значение.
Пример получения ошибки array out of range

Код:
#property strict

int arr[5]; // индекс такого массива может принимать значения 0, 1, 2, 3, 4

void OnTick()
{
  for(int i = 0; i <= 10; i++)
   {
     arr[i] = i; // как только i станет равным 5 мы получим ошибку array out of range
   }
}
Если убрать #property strict то цикл продолжится до i = 10. Не получилось записать в массив, ну и хрен с ним... Как программист написал так и получит результат...
Директива #property strict выполняет роль помошника, при таких ошибках предупреждает о получении, возможно не такого результата какой ожидается и требует привести код в надлежащий вид исключив неоднозначные варианты. Это и есть одно из отличий нового mql4.

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

Код:
MqlDateTime dt1;

// Заполнение структуры
TimeToStruct(Time[0], dt1); // Можно любое другое время и дату.

int CurrentDay = dt1.day;

А вот что ты имеешь ввиду под аккумуляцией и импульсной функцией? Увы...
 
Последнее редактирование:

Milord

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

у меня возник вопрос как разделить по магику число открытых ордеров, если в советнике использовано две ТС, то есть на каждую ТС свой магик, то как сделать так, чтобы во внешних настройках задавать максимальное число открытых ордеров независимо в каждой ТС, ниже кусок кода как я его вижу, добавьте что и как нужно в него,я не хочу сложное решение, а как можно проще и короче в коде...да, я написал начало, и просил добавить что нету в моем коде... пишу в старом билде МЕ, извиняйте новый еще не освоил...
ЗАРАНЕЕ СПАСИБО!

PHP:
extern int MaxTrades1 = 10;
extern int MaxTrades2 = 10;
extern int magic1 = 111;
extern int magic2 = 333;


int start() 
{
//---------TC1------------------
if(A>B)
 {
 OrderSend(...);
 }

//----------TC2-----------------
if(C>D)
 {
 OrderSend(...);
 }
//-----
}
//-----------end-------------
 

gince

Местный знаток
Привет .

Нажав на маленкую кнопочку "Move" можно перетащить все кнопки и "Label" в нам удобное место для дальнейшей работы. Но так неполучаеться.

Хочу сделать, чтобы "Label" при перетаскувании кнопок тоже паралельно перетаскивался, но он перетаскивается в противоположную сторонуи по высоте и по ширине. На сколько я понимаю, так тут проблема в параметрх

OBJPROP_XDISTANCE
OBJPROP_YDISTANCE
OBJPROP_CORNER
и еще, проблема в том, что перетаскивание и смена текста происходит с разных функций.Смена текста происходит при нажатий кнопки "change".

И еще вопрос, как изменит на кнопке "change" текст при ее нащатие ?



Будте добры, помогите разобратся.
 

Вложения

  • but.mq4
    11,3 КБ · Просмотры: 26

Milord

Местный знаток
"у меня возник вопрос как разделить по магику число открытых ордеров, если в советнике использовано две ТС, то есть на каждую ТС свой магик, то как сделать так, чтобы во внешних настройках задавать максимальное число открытых ордеров независимо в каждой ТС, ниже кусок кода как я его вижу, добавьте что и как нужно в него,я не хочу сложное решение, а как можно проще и короче в коде...да, я написал начало, и просил добавить что нету в моем коде... пишу в старом билде МЕ, извиняйте новый еще не освоил...
ЗАРАНЕЕ СПАСИБО!"


Снимаю свой вопрос - он уже решен!
как говорится - получи ответ, и реши проблему еще лучше...
 
Последнее редактирование:

Baburek

Прохожий
Помогите написать советника

Добрый день!

Уважаемые господа программисты. Столкнулся с проблемой при написании советника. я в это деле новичок, по этому ума не хватает)). Кто чем может помогите).
Моей целью является написание советника, что бы он подсчитывал объем лотов отрытых ордеров другого советника (с имеющимся магиком) и при превышении этого объема лотов он открывал локовый ордер в обратную сторону, что бы защитить депозит от слива. Что бы при возвращении с работы домой можно было все это дело руками разрулить).
Начал писать. Наткнулся на команду "GetAmountLotFromOpenPos".
Начал с ней магические действия делать, но она все равно не заработала.
Помогите плиз. Может кто то, что то подобное делал уже.
 

matro3

Почетный гражданин
Код:
int i, k = OrdersTotal();
double r = 0.0;

for(i = 0; i < k; i++)
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      if(OrderSymbol() == _Symbol)
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            if(OrderMagicNumber() == mn)
               r += OrderLots();

Это код для посчета лотов по MagicNumber
 

kamilkz

Почетный гражданин
HTML:
int lia_unused_20[][];
Подскажите, в новом билде при компиляции выдает ошибку:
'[' - invalid index value
Как исправить?
 

AlexeyVik

Программист mql4 mql5
HTML:
int lia_unused_20[][];
Подскажите, в новом билде при компиляции выдает ошибку:
'[' - invalid index value
Как исправить?
Ну если попытаться потелепатить, то получается что этот массив передаётся в функцию, а в новом билде массивы должны передаваться ссылкой на массив.
Но это всего лишь проверка моих телепатических способностей.
 

djasper

Интересующийся
Доброе время суток Уважаемые. Подскажите пожалуйста как прописать следующее условие: Если N-е количество баров назад находятся в определённом диапозоне пунктов тогда...
Например: если от 3 до 7 баров находятся в диапазоне 20 пипсов тогда...
 

Вложения

  • eurusd-h1-fibo-group-ltd-2.jpg
    eurusd-h1-fibo-group-ltd-2.jpg
    7,3 КБ · Просмотры: 10

matro3

Почетный гражданин
Доброе время суток Уважаемые. Подскажите пожалуйста как прописать следующее условие: Если N-е количество баров назад находятся в определённом диапозоне пунктов тогда...
Например: если от 3 до 7 баров находятся в диапазоне 20 пипсов тогда...

Код:
ushort backBars = 7;
ushort pointDistance = 200;
double highBar = 0, lowBar = 0;
for(int i = 0; i <= backBars; i++)
{
   if(High[i] > highBar)
      highBar = High[i];
   if(Low[i] < lowBar || lowBar == 0)
      lowBar = Low[i];
   if((highBar - lowBar) / _Point > pointDistance)
      return(true);
}
return(false);
 

vetallic

Местный знаток
всем привет!
помогите дописать плиз,
- нужен размер открытых ордеров разных пар

напр:
EURUSD - лот 0,02
ПИЗUSD - лот 0,01

...
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderType() == OP_BUY && OrderSymbol() == "USDCAD" && OrderMagicNumber() == MN)
...
 

Ugar

Гуру форума
всем привет!
помогите дописать плиз,
- нужен размер открытых ордеров разных пар

напр:
EURUSD - лот 0,02
ПИЗUSD - лот 0,01

...
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderType() == OP_BUY && OrderSymbol() == "USDCAD" && OrderMagicNumber() == MN)
...
Сколько пар и какие известно, или это нужно вычислять?
 

Ugar

Гуру форума
желательно вычислить открытую :)
Кого открытую?
По скольким парам считать известно? Строго 2 пары, строго 5 пар, или количество пар может меняться и его надо вычислить?
Названия пар по которым надо считать известно? Торговля ведётся по определённым парам или набор пар может меняться в процессе торговли?
 

vetallic

Местный знаток
Кого открытую?
По скольким парам считать известно? Строго 2 пары, строго 5 пар, или количество пар может меняться и его надо вычислить?
Названия пар по которым надо считать известно? Торговля ведётся по определённым парам или набор пар может меняться в процессе торговли?

- пара может быть любая (в зависимости от сигнала на открытие по любой паре)
- пар может быть много (так же - в зависимости от сигнала на открытие по любой паре)
- набор пар может меняться в процессе
- на каждой паре может быть только 1 ордер (либо бай либо селл)
- нужно суто снять лоты с открытых позиций всех открытых пар, чтоб потом работать с данными дальше...
 

Ugar

Гуру форума
- пара может быть любая (в зависимости от сигнала на открытие по любой паре)
- пар может быть много (так же - в зависимости от сигнала на открытие по любой паре)
- набор пар может меняться в процессе
- на каждой паре может быть только 1 ордер (либо бай либо селл)
- нужно суто снять лоты с открытых позиций всех открытых пар, чтоб потом работать с данными дальше...
Тогда так:
Код:
uint StructLen=0;
   //Структура массив для символов и лотов
   struct Lots{string symbol; double lots;};
   Lots lots[];
   ArrayResize(lots,1);
   lots[0].symbol="";
   //Цикл перебора ордеров
   for(int i=OrdersTotal()-1; i>=0; i--)
      {
      ResetLastError();
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         Print("Ордер не выбран, ошибка ", _LastError);
         continue;
         }
      //Пропустить ордера чужих маджиков
      if(OrderMagicNumber()!=Magic)continue;
      StructLen++;
      //Если длина массива не =1, увеличить длину
      if(StructLen>1)ArrayResize(lots,StructLen);
      //Записать данные в структуру
      lots[StructLen-1].symbol=OrderSymbol();
      lots[StructLen-1].lots=OrderLots();
      }
В итоге, в структуре будут символы и лоты. Длина структуры соответствует количеству ордеров и символов. Если нет ордеров длина структуры будет =1, а в ячейке с названием символа будет пусто.
 

Palesandr

Интересующийся
всем привет
помогите с кодом

ТП фиксированный, без СЛ, лот фиксированный

открывается сразу два ордера, бай и селл. если, к примеру, бай закрылся по тейку, то открывается новый бай-ордер. если снова закрылся бай по тейку, то снова открываем бай-ордер.

вот такая простая логика.

как реализовать в коде? как смотреть какой ордер закрылся (баевский или селловский)?

спасибо
 
Верх