Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#6376
1 час назад, usver73 сказал:

Нужно убедиться, что ордер с магиками 555 или 777 и нашим символом только один?
Или нужно понять, что у нас в рынке всего один ордер?

да, что он в рынке один именно, и с любым из этих магиков

А в журнале написано:

Close Position retry no: 5

Close Position retry no: 4

Close Position retry no: 3

Close Position retry no: 2

И это повторяется постоянно, как мне закрыть этот ордер???

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

Изменено 13 августа, 2021 пользователем diodio

#6377
51 минуту назад, diodio сказал:

У меня в рынке один ордер остается, он как страховочный идет с определенным магиком, его просто надо закрыть.

ну так убери проверку

1 час назад, usver73 сказал:
 if (counted == 1 && totalord == counted)

напиши:
 

if(OrdersTotal()==1)
{
 for(....) 
  
}

логика: если в рынке всего один ордер, то проверяем его на соответствие условию по символу/магику.
Все.

#6378
50 минут назад, usver73 сказал:

логика: если в рынке всего один ордер, то проверяем его на соответствие условию по символу/магику.
Все.

Вот так сделал:

 

#define TRADE_RETRY_COUNT 4

----------------------------------------------
void CloseOrder()
  {
   if(OrdersTotal() == 1)
     {
      for(int tempo=0; tempo<TRADE_RETRY_COUNT; tempo++)
        {
         if(OrderSelect(tempo,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && (OrderMagicNumber() == 777 || OrderMagicNumber() == 555))
              {
               if(OrderType() == OP_BUY) bool buyb = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
               if(OrderType() == OP_SELL) bool sells = OrderClose(OrderTicket(), OrderLots(), Ask, Slippage);
              }
           }
        }
     }
  }

... не закрыл. Может на реале проверить, тестер не закрывает.:(

#6379

Напиши закрытие типа

if(!OrderClose(...))

Print(GetLastError());

Если не закрывается, то будет ошибка

 

 

#6380

Добрый день. Не могу понять, почему у меня цикл не выполняет подсчет. К примеру нужно посчитать самый низкий Лоу за заданное количество свечей. Подскажите пожалуйста, почему у меня не вычисляется. Цикл не работает, или условие если не выполняется?

Test.ex40 скач. Test.mq43 скач.

#6381
45 минут назад, Vovan777 сказал:

Подскажите пожалуйста, почему у меня не вычисляется.

Для поиска самого низкого лоу есть отдельная функция: https://docs.mql4.com/ru/series/ilowest

В твоей же формуле не правильно поставлен знак <
 

#property copyright "Vovan"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int b = 100;  //Кол-во баров
double L = 100;
void OnTick()
    {
         {
          for(int i = b + 2 ; i > 0 ; i--) //Берем последнее кол-во баров + 2
              {
               if(iLow(NULL, 0, i) < L) //Если есть наименьший Лоу
                    L = iLow(NULL, 0, i);  //Запомнить этот Лоу
              }
          Comment(DoubleToStr(L, Digits));
          L = 100;
         }
    }

 

Изменено 22 августа, 2021 пользователем Rever27

#6382
1 час назад, Rever27 сказал:

Для поиска самого низкого лоу есть отдельная функция: https://docs.mql4.com/ru/series/ilowest

В твоей же формуле не правильно поставлен знак <
 

#property copyright "Vovan"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int b = 100;  //Кол-во баров
double L = 100;
void OnTick()
    {
         {
          for(int i = b + 2 ; i > 0 ; i--) //Берем последнее кол-во баров + 2
              {
               if(iLow(NULL, 0, i) < L) //Если есть наименьший Лоу
                    L = iLow(NULL, 0, i);  //Запомнить этот Лоу
              }
          Comment(DoubleToStr(L, Digits));
          L = 100;
         }
    }

 

Спасибо большое за ответ) Если все же возвращаться к моему коду, скажите пожалуйста, а какой именно знак у меня стоит не верно и почему. Потому что еще раз проверил - вроде бы все верно и логично...

#6383
7 часов назад, Vovan777 сказал:

какой именно знак у меня стоит не верно и почему.

Должно быть i > 0

Направление цикла от самой дальней свечи до самой новой при условии, что i > 0.

#6384

image.thumb.png.a2b02f21ce272e456081cd5736412085.png

111.docx4 скач.

#6385
6 часов назад, Евгений72 сказал:

10 минут- это не стандартный ТФ...

Переменную timeframe нужно объявить как ENUM_TIMEFRAMES.

#6386
3 часа назад, usver73 сказал:

10 минут- это не стандартный ТФ...

Переменную timeframe нужно объявить как ENUM_TIMEFRAMES.

 

image.thumb.png.51ad869e6a525ad1d469aea4646b3bdd.png

#6387

Подскажите пожалуйста правильно ли я понимаю код советника:

if (OrderSymbol() != Symbol() || (OrderMagicNumber() != MagicNumber&&OrderMagicNumber()!=0)) continue;

"При наличии открытых ордеров другого инструмента или с другим магиком в терминале" - Советник ордера открывать не будет???  

Заранее спасибо!!!

image.thumb.png.eff23977bf096481fce957273dab98f4.png

#6388
57 минут назад, Евгений72 сказал:

Подскажите пожалуйста правильно ли я понимаю код советника:

Это код подсчета ордеров, открытых данным советником или вручную. 
Если ордер открыт по текущему символу и он либо открыт советником с этим магиком, либо вручную, то он участвует в расчете.

Твоя строчка пропускает все другие ордера и они не участвуют в расчете переменной count.

На открытие ордеров эта функция не влияет.

#6389
7 часов назад, Rever27 сказал:

Это код подсчета ордеров, открытых данным советником или вручную. 
Если ордер открыт по текущему символу и он либо открыт советником с этим магиком, либо вручную, то он участвует в расчете.

Твоя строчка пропускает все другие ордера и они не участвуют в расчете переменной count.

На открытие ордеров эта функция не влияет.

Спасибо

#6390
22 минуты назад, Евгений72 сказал:

Спасибо

SPASIBO-BOLSOE---SYDA.png

#6391

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

Настройки советника отвечающие за динамический шаг.

Исходный код советника отвечающий за расчет динамического шага в зависимости от волатильности рынка.

Чтобы разобраться самому я ввел промежуточную переменную Pip и комментарии. Также я хотел посмотреть как меняется результат от переменной  TimeframesVolatility. 

Суть моего вопроса в том может ли разница массивах быть отрицательная.

High[iHighest(NULL,TimeframesVolatility,MODE_HIGH,Glubina,1)];                           
 Low[iLowest(NULL,TimeframesVolatility,MODE_LOW,Glubina,1)];  

TimeframesVolatility = 60 мин; а оптимизирую о тестирую на 5 мин.

А и 1 в конце это сдвиг 60мин;  или 5 мин.

image.thumb.png.314d5e1110800e0546cb7a1c8421148a.png

image.thumb.png.18bd444a832978884090e6b4f59b1e58.png

image.thumb.png.8b62725824bf4c7ac669e26d0f957c87.png

#6392

 if(OrdersTotal()==0) DontOpen=false;
   
 if (DynamicPips)  
   {
     double hival=High[iHighest(NULL,TimeframesVolatility,MODE_HIGH,Glubina,1)];                             // Находим максимум за выбранный период
     double loval=Low[iLowest(NULL,TimeframesVolatility,MODE_LOW,Glubina,1)];                                // Находим минимум за выбранный период
     Pip=NormalizeDouble((hival-loval)/Point,0);  
     PipStep=NormalizeDouble((hival-loval)/DEL/Point,0);                                                                      // Разница между максимумом и минимумом 
     if (PipStep<DefaultPips/DEL) PipStep = NormalizeDouble(DefaultPips/DEL,0);                                  // Расчет PipStep
     if (PipStep>DefaultPips*DEL) PipStep = NormalizeDouble(DefaultPips*DEL,0);                              // Расчет PipStep
         Comment("hival: " + DoubleToStr(hival, 4) + "\n" +
                 "loval: " + DoubleToStr(loval, 4) + "\n" +
                 "Pip: " + DoubleToStr(Pip, 0)     + "\n" +
                 "PipStep: " + DoubleToStr(PipStep, 0));                                                                           
   }
 

#6393

Доброго времени суток! Подскажите, возможно ли средсвами mql4 отправить письмо с вложением? Интересует отправка скриншота графика.

#6394
2 часа назад, Gamakiv сказал:

Доброго времени суток! Подскажите, возможно ли средсвами mql4 отправить письмо с вложением? Интересует отправка скриншота графика.

Нет, только с использованием дополнительных танцев с бубном. 
Можешь почитать эту статью: https://www.mql5.com/ru/articles/6975
Я не стал разбираться в итоге, не хватает знаний по ООП.

#6395

Подскажите пожалуйста какой смысл этого выражения

 if (timeprev == Time[0]) return;
       timeprev = Time[0];

 

 

#6396
59 минут назад, Евгений72 сказал:

Подскажите пожалуйста какой смысл этого выражения

 if (timeprev == Time[0]) return;
       timeprev = Time[0];

 

 

Это проверка на новую свечу.

Если время свечи не изменилось, то прерывание функции

#6397
7 минут назад, usver73 сказал:

Это проверка на новую свечу.

Если время свечи не изменилось, то прерывание функции

Какое преимущество эта проверка дает при написании кода 

 

#6398
3 часа назад, Евгений72 сказал:

Подскажите пожалуйста какой смысл этого выражения

Совершать все последующие действие советника раз в выбранный таймфрейм, чтобы не делать расчеты каждый тик и не тормозить работу кода. ТФ зависит от того, какой он выбран на графике.

#6399

Подскажите пожалуйста вот счетчик ордеров

int CountTrade()
{
    int count = 0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
                if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                   count++;
         }
    }
    return(count);
}

Вопрос в том что счётчик насчитывает на один ордер меньше чем есть в терминале. В чем здесь может быть проблема????? 

Сбой в учете ордеров происходит между первым и вторым ордером. 

image.thumb.png.695563482bbe8593182290f75552937a.png

#6400
4 часа назад, Евгений72 сказал:

В чем здесь может быть проблема?????

Попробуй условие добавить в фигурные скобки:
 

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
	if(OrderType() == OP_BUY || OrderType() == OP_SELL) count++;
}

Возможно терминал не может выделить ордер, поэтому его пропускает. Редкая ошибка, но может быть.

 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025