Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1245

 
Denis Diakonov:

не, к примеру передать вначале case 1, следом case 2 и т.д.

кейсы исполняют открытие ордеров

Да там не в одном месте идёт открытие. В таком коде разобраться, надо мыслить точно как вы мыслите, а это сложно.

 
Если внутри OnTick эксперта есть цикл, занимающий прилично времени, то он будет выполняться полностью или приход нового тика все это перебьет?
 
Alexey Viktorov:

Да там не в одном месте идёт открытие. В таком коде разобраться, надо мыслить точно как вы мыслите, а это сложно.

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
Если внутри OnTick эксперта есть цикл, занимающий прилично времени, то он будет выполняться полностью или приход нового тика все это перебьет?

да я вот чет тоже не пойму, у меня цикл исполняется по открытию ордеров и не все открываются, некоторые уже по второму кругу идут открываться, а некоторые пропущенными остаются, я так понимаю что новый тик как запускает в работу старт и код приостанавливает выполнение свое и начинает выполняться заново 

 
Denis Diakonov:

 я так понимаю что новый тик как запускает в работу старт и код приостанавливает выполнение свое и начинает выполняться заново 

не выдумывайте

почитайте справку, там однозначно написано, что если в ЕА присутствуют сложные расчеты, то новый тик будет пропущен

где то в статье про функции обработки событий или, возможно, в торговых операциях или в RefreshRates

ищите ошибку в логике в своем коде


ЗЫ: switch() - case не используют для сложных логических условий, лучше комбинации if() else - так более однозначные логические  ветвления получаются

 
Igor Makanu:

не выдумывайте

почитайте справку, там однозначно написано, что если в ЕА присутствуют сложные расчеты, то новый тик будет пропущен

где то в статье про функции обработки событий или, возможно, в торговых операциях или в RefreshRates

ищите ошибку в логике в своем коде


ЗЫ: switch() - case не используют для сложных логических условий, лучше комбинации if() else - так более однозначные логические  ветвления получаются

ага, спасибо, я уже тоже решил через if-else прописывать все

 
Denis Diakonov:

Зачем вообще switch прикрутили тут? Проще получить в функцию направление сделки и количество необходимых открытий и в цикле открыть сколько задано.

Потому я и говорю, что понять вашу логику не для моего ума. Зачем такие заморочки?

 
Alexey Viktorov:

Зачем вообще switch прикрутили тут? Проще получить в функцию направление сделки и количество необходимых открытий и в цикле открыть сколько задано.

Потому я и говорю, что понять вашу логику не для моего ума. Зачем такие заморочки?

Ну у меня по итогу код просто в объеме вырос, а так думал несколько проще будет.

Как рас таки - будь возможность вызывать case сколько угодно раз в ходе выполнения одной функции, было бы проще и код компактнее.

Мне не нужно открывать в цикле одинаковые сделки, они открываются по разным инструментам одновременно(на сколько это возможно) при появлении сигнала.

case 1 - audusd buy

case 5 - gbpusd buy

case 9 - eurusd buy

и т.д.

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

Второй-имеющийся вариант подразумевает прописывать конкретное открытие ордера внутри функции с анализом, что вытягивается в пеленку и общие строки вышли в 1200+, что в конечном счете сыграет на скорости выполнения программы

 

Спецы, подскажите пожалуйста! В эксперте используется индикатор Envelopes c динамическим расчетом отклонения. Но при отображении на графике он рисует всю динамику изменений отклонений индикатора на всех прошлых барах.

динамический envelopes

1. Можно ли как-то сделать, чтобы индикатор рисовался корректно? Т.е. рисовал индикатор со своим отклонением только на своем баре.

2. Ну и как можно в эксперте отключить отрисовку индикатора а оставить только расчеты? Хочу в настройках эксперта прикрутить возможность отключения рисовалки )

 
Denis Diakonov:

Ну у меня по итогу код просто в объеме вырос, а так думал несколько проще будет.

Как рас таки - будь возможность вызывать case сколько угодно раз в ходе выполнения одной функции, было бы проще и код компактнее.

Мне не нужно открывать в цикле одинаковые сделки, они открываются по разным инструментам одновременно(на сколько это возможно) при появлении сигнала.

case 1 - audusd buy

case 5 - gbpusd buy

case 9 - eurusd buy

и т.д.

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

Второй-имеющийся вариант подразумевает прописывать конкретное открытие ордера внутри функции с анализом, что вытягивается в пеленку и общие строки вышли в 1200+, что в конечном счете сыграет на скорости выполнения программы

Чем вы набираете столько строк кода? Вот один из последних моих советников, работает с набором бумаг на ФОРТС

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

Сколько бумаг будет перечислено в этом списке, столько и будет торговать. И в этом советнике с контролем двух торговых периодов времени, с трейлингом и естественно с анализом всего 326 строк.

Если вам нестерпимо хочется попользовать switch то ведь не обязательно в каждый вариант вписывать открытие позиций. Ведь достаточно определить имя символа, тип торговой операции и

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

Но всё-же лучше, на мой взгляд, всё это завернуть в пользовательскую функцию.

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }
Причина обращения: