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

При исполнении по Market цену открытия Buy, Sell можно задать любую. Она игнорируется. Брокер открывает по своей цене Buy по Ask, Sell по Bid в момент выполнения приказа на сервере, а не в момент отправки из терминала. Можно при отправке ордера цену открытия вообще не указывать. На ECN счетах должно быть по Market.
На счетах с исполнением по Instant гарантируется точность исполнения приказа в пределах заданного проскальзывания, но не гарантируется само исполнение в случае отклонения цены больше.
На счетах с исполнением по Market гарантируется исполнение по любой цене. Задаваемое проскальзывание игнорируется. Исполняем даже если цена улетела на километр. Так же принято не давать открывать позицию сразу со стопом и тейком. Так как в момент отправки ордера не известно по какой цене откроется сделка, а значит и стоп или тейк могут оказаться не корректными.
Открывая счёт с исполнением по Market соглашаетесь на любой отклонение цены открытия.
Но в Альпари ECN какой то странный. Они, вроде, позволяют открывать позицию сразу со стопами и тейками. И при большом отклонении цены не дают открыть.
Тестер в МТ4 примитивный. Вряд ли он поймёт правильно, если в качестве цены открытия указать 0. Что бы тестер понял надо открывать Buy по Ask, Sell по Bid.
 
Нет, я не ошибаюсь. Если Вы попробуете подставить, например, в функцию OrderSend цену открытия, например, Open[1], то ошибки при компиляции не будет даже при strict'е, а это значит, что формально такой торговый приказ допустим. А вот как его "переварит" торговый сервер - это уже другой вопрос. Именно это я и хотел сказать.
 
Уважаемые программисты.
Можно ли где то в терминале изменить этот текст (Label) в параметрах /Рисование текстовой метки/?
 

Вложения

  • Безымянный.png
    Безымянный.png
    14,6 КБ · Просмотры: 19
Нет, я не ошибаюсь. Если Вы попробуете подставить, например, в функцию OrderSend цену открытия, например, Open[1], то ошибки при компиляции не будет даже при strict'е, а это значит, что формально такой торговый приказ допустим. А вот как его "переварит" торговый сервер - это уже другой вопрос. Именно это я и хотел сказать.
Я к тому что официальная документация все таки накладывает ограничение.
 
Так прямо тут и меняй. И имя лейбла можно изменить по желанию…
Я хочу чтоб надпись изначально была другая и не заморачиваться с её прописанием.
Ведь где то находится этот файл в терминале.
Просто надо знать где он и там изменить надпись.
 
Добрый вечер.
Подскажите, пожалуйста, написал функцию с использованием массивов
все работает правильно, но возможно я не знаю о каких-то подводных камнях
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:
 
Добрый вечер.
Подскажите, пожалуйста, написал функцию с использованием массивов
все работает правильно, но возможно я не знаю о каких-то подводных камнях
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();
}

Ну и про камни, добавь на всякий случай учет комиссии и свопа в расчет б/у.
 
Вместо ифов мне нравиться свич в варианте накопления значений.
Код:
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();
    }
}

Ну и про камни, добавь на всякий случай учет комиссии и свопа в расчет б/у.
Спасибо. А расчет б/у идет в отдельной функции с учетом комиссии и свопа.
 
Добрый вечер.
Подскажите, пожалуйста, написал функцию с использованием массивов
все работает правильно, но возможно я не знаю о каких-то подводных камнях
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];
 
Я-бы сделал всё это в один массив
Код:
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];
Спасибо! Как-то про двумерный массив даже не подумал.
 
Это как-то ускоряет работу функции или просто предпочтения?
Ускоряет. Если ифы у тебя, как в сказке, направо пойдещь..., прямо пойдешь..., налево... (это другое дело))) ), то со свичем, как в мультике, "уж послала, так послала", все за один раз.
Плюс куча встроенных проверок именно по направленю, не смешиваются с другими вариантами развития событий. ИМХО.
 
В принципе, работает и ладно. Для новичка в программировании, с очень большим количеством пива, потянет. Со временем, может быть, после многочисленных переделок, придёт понимание что не так.
Но отказ от локальных переменных и массивов в пользу глобальных, это не просто дурной тон, это ФУУУ.
Не стоит привыкать так делать.
По большому секрету, у функций могут быть аргументы и они могут возвращать значение.
Написав if иногда полезно вспомнить про else.
 
Последнее редактирование модератором:
В принципе, работает и ладно. Для новичка в программировании, с очень большим количеством пива, потянет. Со временем, может быть, после многочисленных переделок, придёт понимание что не так.
Но отказ от локальных переменных и массивов в пользу глобальных, это не просто дурной тон, это ФУУУ.
Не стоит привыкать так делать.
По большому секрету, у функций могут быть аргументы и они могут возвращать значение.
Написав if иногда полезно вспомнить про else.
По поводу else - понял, учту, а вот по поводу глобальных я не понял. Как мне обратиться к локальному массиву и любой точки кода?
 
Как мне обратиться к локальному массиву и любой точки кода?
Не обращай внимание - это каждый сам выбирает как использовать глобальные и локальные, в том числе массивы. У меня в одном сове около 26 глобальных многомерных динамических массивов, которые используются в разных функциях - я сума бы сошел в каждой функции еще столько же локальных массивов создавать и передавать их в параметрах.
 
Последнее редактирование:

Посмотрели (406) Посмотреть

Отслеживают (499) Посмотреть

Назад
Верх