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

Milord

Местный знаток
Это как раз тот вариант где надо-бы применить третий вариант.
Типа:
type = условие ? Buy : Sell;
если открывать ордер (type == Buy )
price = Ask;
если открывать ордер (type == Sell)
price = Bid;
OrderSend(_Symbol, type, ……………………………)

Что касается RefreshRates() скажу так: Если открытие выполняется в OnTick() — значит пришёл новый тик и соответственно новые цены и необходимости в обновлении цен нету.
Если-же выполняется по времени, или в достаточно длительном цикле, то лучше цены обновлять.
На счет RefreshRates() более-менее понятно стало,а на счет всего остального ничего неясно,особенно про 3 вариант,про который я не говорил,а говорил чел с ником star603,точней он предлагал 2 своих варианта,а вы ему предложили 3 вариант,в моемслучае не было 2 вариантов от меня,а лишь кусок кода с вопросом..."как прописать в коде открытие ордеров на открытии НОВОЙ свечи?:))
 

star603

Новичок форума
Если нужно что бы проверялось условие или выполнялось действие с каждой интерацией, их надо поместить внутрь цикла, иначе вне цикла.
Например для действий в цикле нужна цена. Можно получит эту цену вне цикла и использовать внутри только если в цикле выполняется что то настолько быстрое что цена не успеет измениться.
А если в цикле что то медленное, открытие, модификация, закрытие ордеров, цена может успевать измениться. Стоит получать цену внутри цикла перед каждым использованием.
Мне бы таких хитростей побольше.
 

AlexeyVik

Программист mql4 mql5
На счет RefreshRates() более-менее понятно стало,а на счет всего остального ничего неясно,особенно про 3 вариант,про который я не говорил,а говорил чел с ником star603,точней он предлагал 2 своих варианта,а вы ему предложили 3 вариант,в моемслучае не было 2 вариантов от меня,а лишь кусок кода с вопросом..."как прописать в коде открытие ордеров на открытии НОВОЙ свечи?:))
Вопроса небыло, но был написан код в одном из вариантов в вопросе star603.
Об определении новой свечи поищи ответ на форуме.
 
Последнее редактирование модератором:

star603

Новичок форума
На счет RefreshRates() более-менее понятно стало,а на счет всего остального ничего неясно,особенно про 3 вариант,про который я не говорил,а говорил чел с ником star603,точней он предлагал 2 своих варианта,а вы ему предложили 3 вариант,в моемслучае не было 2 вариантов от меня,а лишь кусок кода с вопросом..."как прописать в коде открытие ордеров на открытии НОВОЙ свечи?:))
На новом баре:
Код:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                         Sova.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
extern int StopLoss = 2000;//убытки
extern int TakeProfit = 700;//прибыль
extern int Slippage = 3;//проскальзывание
bool ticketss;
int Magic = 677687;
int coeff,intBars;
int b;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//-----------------------Определение знаков ктировок-------------------
//--- Определение 4-х знак, или 5-и знак
   if(MarketInfo(Symbol(),MODE_DIGITS)==5)
      coeff = 10;
   if(MarketInfo(Symbol(),MODE_DIGITS)==3)
      coeff = 10;
   StopLoss  *= coeff;
   TakeProfit*= coeff;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(f_IsNewBar()) //это взял из интернета
      f_EveryBar();//это взял из интернета
  }//******************************************************************************************************
bool f_IsNewBar()//это взял из интернета
  {
   if(intBars != Bars)
     {
      intBars = Bars;
      return(true);
     }
   return(false);
  }
//###############################################################################################################
void f_EveryBar()//это взял из интернета, сам код мой Между @@ мой код
  {
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Все что будет здесь написано будет открываться на новом баре
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  }
//+------------------------------------------------------------------+
 

megapont

VIP-участник
А как в сову не имеющую параметра NewCycle вставить код из другой совы которая такой параметр имеет?
 

AlexeyVik

Программист mql4 mql5
Ты этим только доказал, что «мартышка к старости слаба глазами мозгами стала…». Это была твоя цель?
По интересующему тебя вопросу, посмотри вот этот класс -https://www.mql5.com/ru/code/768
Правда этот код достаточно старый и при просмотре вместо русских букв одни вопросики, но если скачать файл и открыть в редакторе, то буквы нормальные. И вообще рекомендую чаще пользоваться поиском на том сайте.
 

Milord

Местный знаток
Ты этим только доказал, что «мартышка к старости слаба глазами мозгами стала…». Это была твоя цель?
По интересующему тебя вопросу, посмотри вот этот класс -https://www.mql5.com/ru/code/768
Правда этот код достаточно старый и при просмотре вместо русских букв одни вопросики, но если скачать файл и открыть в редакторе, то буквы нормальные. И вообще рекомендую чаще пользоваться поиском на том сайте.
Ни в коем случае не хотел вас ничем обидеть,а привел скриншот исключительно для точности,того что вопрос я задавал,как и всякий себя уважающий программист всегда любит во всём точность,надеюсь вы с этим не станете спорить?!:)
Спасибо за ссылку,там файлы для МТ5,разве они будут открываться и правильно работать в МТ4?
 

AlexeyVik

Программист mql4 mql5
Ни в коем случае не хотел вас ничем обидеть,а привел скриншот исключительно для точности,того что вопрос я задавал,как и всякий себя уважающий программист всегда любит во всём точность,надеюсь вы с этим не станете спорить?!:)
Спасибо за ссылку,там файлы для МТ5,разве они будут открываться и правильно работать в МТ4?
Если-бы я обиделся, то кроме грубостей ничего не написал-бы.
Там файл библиотеки IsNewBar.mqh и в описании пояснения как этим пользоваться. Из mql4 тоже так-же подключается библиотека и к методам библиотеки можно обращаться.
 

mobidik

-----
Всем привет!
возник вопрос,как прописать в коде открытие ордеров на открытии свечи,того таймфрейма,в окне которого стоит советник(и чтобы его можно было в тестере погонять),набросал кусок кода ниже в общем виде и нужно ли перед OrderSend(...) вставлять RefreshRates();
Код:
Expand Collapse Copy
if (условие открытия ордера селл...)
  (
  RefreshRates();
  OrderSend(Symbol(),OP_SELL,Lot,......)
  }
if (условие открытия ордера бай...)
  {
  RefreshRates();
  OrderSend(Symbol(),OP_BUY,Lot,.........)
  }
Во многих кодах, что в свободном доступе, в которых выполняется установка по новому бару, выполнена именно так, как предложил star603. А как быть, если в советнике есть тралл или перевод в бу? Эти функции, так же, будут выполняться раз на бар? Ок, пусть их нет и рано или поздно, Вы поставите свой код на демку/реал. В тестере идеальное исполнение, а в реале - нет. Как быть, если на новом баре позиция по какой-то причине не установилась? Ждать следующего бара..? Поэтому, делать проверку в начале ф-ции OnTick() не целесообразно. Необходимо её выполнять там, где она необходима. Если получили сигнал на установку - только тут осуществляем её. Саму установку позиций лучше всего выполнить в отдельной ф-ции, в которой будет предусмотрены необходимые проверки и которая будет возвращать результат. Если он, результат, отрицательный, позиция не установилась - "новый бар" не засчитываем, что даст нам возможность на следующем тике повторить попытку установки позиции. Примерно, это будет вот так:
C-подобный:
Expand Collapse Copy
datetime TimeBar = 0;
//---
if(сигнал && TimeBar<Time[0])
 {
   if(ф-ция уст поз(сигнал))
    {
      TimeBar = Time[0];
    }
 }
Отсюда и ответ на Ваш вопрос о RefreshRates() - если за первой попыткой не удалось установить позиции - рефрешить обязательно.
 

AlexeyVik

Программист mql4 mql5

Поэтому, делать проверку в начале ф-ции OnTick() не целесообразно.

Отсюда и ответ на Ваш вопрос о RefreshRates() - если за первой попыткой не удалось установить позиции - рефрешить обязательно.
Если повторная попытка открытия делается на следующем тике, то обновление цен абсолютно бессмысленно.
 

AlexeNP

Гуру форума
сейчас я скажу какую-нибудь глупость, но меня уже не остановить... Помню обгладывали мы последнюю кость мамонта и обсуждали RefreshRates. Съели всех, кто был за нее и против. Зато всем остальным понравилась SymbolInfoTick, она хоть по смыслу подходит. Ну, и имхо, если с первого раза позиция не открылась - нечего ее теребонькать - сообщение об ошибке и едем дальше
 

star603

Новичок форума
Код:
Expand Collapse Copy
void OnlySell()//Функция открытия ордеров на продажу
  {
  //--------------1----------------
   if(Str==0)
      stgia1s();
   else
      if(Str==1)
         stgia2s();
     //--------------2----------------
    switch(Str)// ме кажется здесь тоже ошибки есть
     {
      case 0:stgia1s();break;
      case 1:stgia2s();break;
     }
  }
Подскажите пожалуйста.
 

AlexeyVik

Программист mql4 mql5
сейчас я скажу какую-нибудь глупость, но меня уже не остановить... Помню обгладывали мы последнюю кость мамонта и обсуждали RefreshRates. Съели всех, кто был за нее и против. Зато всем остальным понравилась SymbolInfoTick, она хоть по смыслу подходит. Ну, и имхо, если с первого раза позиция не открылась - нечего ее теребонькать - сообщение об ошибке и едем дальше
Что-то я не помню такого. Я в этом не участвовал, потому скажу сейчас: Нет абсолютно никакой разницы каким методом обновятся цены. Это пусть останется тем кто любит вылавливать разницу выполнения функций в микросекундах.
 

AlexeyVik

Программист mql4 mql5
Код:
Expand Collapse Copy
void OnlySell()//Функция открытия ордеров на продажу
  {
  //--------------1----------------
   if(Str==0)
      stgia1s();
   else
      if(Str==1)
         stgia2s();
     //--------------2----------------
    switch(Str)// ме кажется здесь тоже ошибки есть
     {
      case 0:stgia1s();break;
      case 1:stgia2s();break;
     }
  }
Подскажите пожалуйста.
Это абсолютно одинаковые варианты… Результат будет одинаков.
 

star603

Новичок форума
Это абсолютно одинаковые варианты… Результат будет одинаков.
Через свитч я слышалкак то быстро работать функция будет быстрее. Я предполагаю что скорость увеличивается что после броейк дальше не пойдет перебирать.
 

AlexeNP

Гуру форума
Что-то я не помню такого. Я в этом не участвовал, потому скажу сейчас: Нет абсолютно никакой разницы каким методом обновятся цены. Это пусть останется тем кто любит вылавливать разницу выполнения функций в микросекундах.
Снимок экрана20220923235829.png
 

star603

Новичок форума
Код:
Expand Collapse Copy
double LOT()//Функция по расчету лота
  {
   if(GetLastError()==0)
     {
      switch(Lot)
        {
         case 0:
            _Lot1=Lot0;
            break;
         case 1:
            _Lot1=NormalizeDouble(MathCeil(AccountBalance()/100)/100,2);
            break;
         case 2:
            _Lot1=NormalizeDouble(MathCeil(AccountEquity()/100)/100,2);
            break;
         case 3:
            _Lot1=NormalizeDouble(MathSin(AccountBalance())/100,2);
            break;
         case 4:
            _Lot1=NormalizeDouble(MathSin(AccountEquity())/100,2);
            break;
         case 5:
            _Lot1=NormalizeDouble((AccountFreeMargin()*RISK)/1000,2);
            break;
        }
     };
   if(GetLastError()==131)
      _Lot1=Lot0;
   return(_Lot1);
  };
При такой записи вернется _Lot1? К примеру если кейс 4.
 

mobidik

-----
Если повторная попытка открытия делается на следующем тике, то обновление цен абсолютно бессмысленно.
Так, щипачам нужно "сейчас" и по текущей цене. Сама ф-ция установки позиции находится в цикле. Если отмена установки позиции была вызвана изменением текущей цены на стороне брокера, не дожидаемся нового тика, рефрешим, возможна короткая пауза и отправляем запрос по новому.
 
Верх