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

Ugar

Гуру форума
При исполнении по Market цену открытия Buy, Sell можно задать любую. Она игнорируется. Брокер открывает по своей цене Buy по Ask, Sell по Bid в момент выполнения приказа на сервере, а не в момент отправки из терминала. Можно при отправке ордера цену открытия вообще не указывать. На ECN счетах должно быть по Market.
На счетах с исполнением по Instant гарантируется точность исполнения приказа в пределах заданного проскальзывания, но не гарантируется само исполнение в случае отклонения цены больше.
На счетах с исполнением по Market гарантируется исполнение по любой цене. Задаваемое проскальзывание игнорируется. Исполняем даже если цена улетела на километр. Так же принято не давать открывать позицию сразу со стопом и тейком. Так как в момент отправки ордера не известно по какой цене откроется сделка, а значит и стоп или тейк могут оказаться не корректными.
Открывая счёт с исполнением по Market соглашаетесь на любой отклонение цены открытия.
Но в Альпари ECN какой то странный. Они, вроде, позволяют открывать позицию сразу со стопами и тейками. И при большом отклонении цены не дают открыть.
Тестер в МТ4 примитивный. Вряд ли он поймёт правильно, если в качестве цены открытия указать 0. Что бы тестер понял надо открывать Buy по Ask, Sell по Bid.
 

ИванМН

Местный знаток
Нет, я не ошибаюсь. Если Вы попробуете подставить, например, в функцию OrderSend цену открытия, например, Open[1], то ошибки при компиляции не будет даже при strict'е, а это значит, что формально такой торговый приказ допустим. А вот как его "переварит" торговый сервер - это уже другой вопрос. Именно это я и хотел сказать.
 

S.McDuck

Почетный гражданин
Уважаемые программисты.
Можно ли где то в терминале изменить этот текст (Label) в параметрах /Рисование текстовой метки/?
 

Вложения

  • Безымянный.png
    Безымянный.png
    14,6 КБ · Просмотры: 19

zhserg

Местный знаток
Нет, я не ошибаюсь. Если Вы попробуете подставить, например, в функцию OrderSend цену открытия, например, Open[1], то ошибки при компиляции не будет даже при strict'е, а это значит, что формально такой торговый приказ допустим. А вот как его "переварит" торговый сервер - это уже другой вопрос. Именно это я и хотел сказать.
Я к тому что официальная документация все таки накладывает ограничение.
 

S.McDuck

Почетный гражданин
Так прямо тут и меняй. И имя лейбла можно изменить по желанию…
Я хочу чтоб надпись изначально была другая и не заморачиваться с её прописанием.
Ведь где то находится этот файл в терминале.
Просто надо знать где он и там изменить надпись.
 

MakarFX

Элитный участник
Добрый вечер.
Подскажите, пожалуйста, написал функцию с использованием массивов
все работает правильно, но возможно я не знаю о каких-то подводных камнях
C-подобный:
//+------------------------------------------------------------------+
void AveragePrice()
  {
   price_b[0]=0;
   price_b[1]=0;
   price_b[2]=0;
   price_s[0]=0;
   price_s[1]=0;
   price_s[2]=0;
   double result=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               price_b[0] += OrderOpenPrice()*OrderLots();
               price_b[1] += OrderLots();
              }
            if(OrderType()==OP_SELL)
              {
               price_s[0] += OrderOpenPrice()*OrderLots();
               price_s[1] += OrderLots();
              }
           }
        }
     }
   if(price_b[1]!=0) price_b[2]=price_b[0]/price_b[1];
   if(price_s[1]!=0) price_s[2]=price_s[0]/price_s[1];
  }
//+------------------------------------------------------------------+
 

ИванМН

Местный знаток
Подскажите, пожалуйста, написал функцию с использованием массивов
все работает правильно, но возможно я не знаю о каких-то подводных камнях
Что именно нужно подсказать, да ещё если всё работает правильно? :unsure:
 

_SERG_

Активный участник
Добрый вечер.
Подскажите, пожалуйста, написал функцию с использованием массивов
все работает правильно, но возможно я не знаю о каких-то подводных камнях
C-подобный:
//+------------------------------------------------------------------+
void AveragePrice()
  {
   price_b[0]=0;
   price_b[1]=0;
   price_b[2]=0;
   price_s[0]=0;
   price_s[1]=0;
   price_s[2]=0;
   double result=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               price_b[0] += OrderOpenPrice()*OrderLots();
               price_b[1] += OrderLots();
              }
            if(OrderType()==OP_SELL)
              {
               price_s[0] += OrderOpenPrice()*OrderLots();
               price_s[1] += OrderLots();
              }
           }
        }
     }
   if(price_b[1]!=0) price_b[2]=price_b[0]/price_b[1];
   if(price_s[1]!=0) price_s[2]=price_s[0]/price_s[1];
  }
//+------------------------------------------------------------------+
Вместо ифов мне нравиться свич в варианте накопления значений.
Код:
switch(OrderType())
{
  //---
  case OP_BUY:
     price_b[0] += OrderOpenPrice()*OrderLots();
     price_b[1] += OrderLots();
  //---
  case OP_SELL:
     price_s[0] += OrderOpenPrice()*OrderLots();
     price_s[1] += OrderLots();
}

Ну и про камни, добавь на всякий случай учет комиссии и свопа в расчет б/у.
 

MakarFX

Элитный участник
Вместо ифов мне нравиться свич в варианте накопления значений.
Код:
switch(OrderType())
{
  //---
  case OP_BUY:
     price_b[0] += OrderOpenPrice()*OrderLots();
     price_b[1] += OrderLots();
  //---
  case OP_SELL:
    {
     price_s[0] += OrderOpenPrice()*OrderLots();
     price_s[1] += OrderLots();
    }
}

Ну и про камни, добавь на всякий случай учет комиссии и свопа в расчет б/у.
Спасибо. А расчет б/у идет в отдельной функции с учетом комиссии и свопа.
 

AlexeyVik

Программист mql4 mql5
Добрый вечер.
Подскажите, пожалуйста, написал функцию с использованием массивов
все работает правильно, но возможно я не знаю о каких-то подводных камнях
C-подобный:
//+------------------------------------------------------------------+
void AveragePrice()
  {
   price_b[0]=0;
   price_b[1]=0;
   price_b[2]=0;
   price_s[0]=0;
   price_s[1]=0;
   price_s[2]=0;
   double result=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               price_b[0] += OrderOpenPrice()*OrderLots();
               price_b[1] += OrderLots();
              }
            if(OrderType()==OP_SELL)
              {
               price_s[0] += OrderOpenPrice()*OrderLots();
               price_s[1] += OrderLots();
              }
           }
        }
     }
   if(price_b[1]!=0) price_b[2]=price_b[0]/price_b[1];
   if(price_s[1]!=0) price_s[2]=price_s[0]/price_s[1];
  }
//+------------------------------------------------------------------+
Я-бы сделал всё это в один массив
Код:
price[2][3];
// тут цикл перебора ордеров с отсеиванием своих
// заполнение массива
price[OrderType()][0] += OrderOpenPrice()*OrderLots();
price[OrderType()][1] += OrderLots();
// после цикла
price[OP_BUY][2] = price[0][0]/price[0][1];
price[OP_SELL][2] = price[1][0]/price[1][1];
 

MakarFX

Элитный участник
Я-бы сделал всё это в один массив
Код:
price[2][3];
// тут цикл перебора ордеров с отсеиванием своих
// заполнение массива
price[OrderType()][0] += OrderOpenPrice()*OrderLots();
price[OrderType()][1] += OrderLots();
// после цикла
price[OP_BUY][2] = price[0][0]/price[0][1];
price[OP_SELL][2] = price[1][0]/price[1][1];
Спасибо! Как-то про двумерный массив даже не подумал.
 

_SERG_

Активный участник
Это как-то ускоряет работу функции или просто предпочтения?
Ускоряет. Если ифы у тебя, как в сказке, направо пойдещь..., прямо пойдешь..., налево... (это другое дело))) ), то со свичем, как в мультике, "уж послала, так послала", все за один раз.
Плюс куча встроенных проверок именно по направленю, не смешиваются с другими вариантами развития событий. ИМХО.
 

Ugar

Гуру форума
В принципе, работает и ладно. Для новичка в программировании, с очень большим количеством пива, потянет. Со временем, может быть, после многочисленных переделок, придёт понимание что не так.
Но отказ от локальных переменных и массивов в пользу глобальных, это не просто дурной тон, это ФУУУ.
Не стоит привыкать так делать.
По большому секрету, у функций могут быть аргументы и они могут возвращать значение.
Написав if иногда полезно вспомнить про else.
 
Последнее редактирование модератором:

MakarFX

Элитный участник
В принципе, работает и ладно. Для новичка в программировании, с очень большим количеством пива, потянет. Со временем, может быть, после многочисленных переделок, придёт понимание что не так.
Но отказ от локальных переменных и массивов в пользу глобальных, это не просто дурной тон, это ФУУУ.
Не стоит привыкать так делать.
По большому секрету, у функций могут быть аргументы и они могут возвращать значение.
Написав if иногда полезно вспомнить про else.
По поводу else - понял, учту, а вот по поводу глобальных я не понял. Как мне обратиться к локальному массиву и любой точки кода?
 

vladradon

Программист
Как мне обратиться к локальному массиву и любой точки кода?
Не обращай внимание - это каждый сам выбирает как использовать глобальные и локальные, в том числе массивы. У меня в одном сове около 26 глобальных многомерных динамических массивов, которые используются в разных функциях - я сума бы сошел в каждой функции еще столько же локальных массивов создавать и передавать их в параметрах.
 
Последнее редактирование:
Верх