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

 
igrok333:

написал вот  такой вот код

метаэдитор матюкается.



почему он матюкается?


стоит #property strict

А у вас pr инициализирована?

 
igrok333:

написал вот  такой вот код

метаэдитор матюкается.
почему он матюкается?


стоит #property strict

Там же ясно написано, что в 553 строке возможно использование переменной, у которой отсутствует значение. Попробуйте написать bool pr=false; Этим Вы обманете компилятор, но лучше все как следует проверить. Ведь если тип ордера будет отложка, то pr останется у Вас без значения...

 
Roman Sharanov:

на предыдущей, и что тут от mql4? функция OnTick()?

Просто вопрос задан в теме о языке mql4 и сразу бросилось в глаза Time[0]

Посмотрев повнимательней стало понятно, что это пользовательский массив.

И примечание из документации:

Примечание

Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.

Так как объект в одной координате цены может иметь несколько значений, то необходимо указать номер линии. Эта функция применима только для следующих объектов:

  • Трендовая линия (OBJ_TREND)
  • Трендовая линия по углу (OBJ_TRENDBYANGLE)
  • Линия Ганна (OBJ_GANNLINE)
  • Равноудаленный канал (OBJ_CHANNEL) - 2 линии
  • Канал на линейной регрессии (OBJ_REGRESSION) - 3 линии
  • Канал стандартного отклонения (OBJ_STDDEVCHANNEL) - 3 линии
  • Линия со стрелкой (OBJ_ARROWED_LINE)


 
Artyom Trishkin:

А у вас pr инициализирована?

а что, нужно обязательно инициализировать? а думал что достаточно объявить.
я думал, что при объявлении она инициилизируется нулем.
 
STARIJ:

Там же ясно написано, что в 553 строке возможно использование переменной, у которой отсутствует значение. Попробуйте написать bool pr=false; Этим Вы обманете компилятор, но лучше все как следует проверить. Ведь если тип ордера будет отложка, то pr останется у Вас без значения...

спасибо что напомнили мне про отложки)



вот так правильно делать?

 void zakritj_vse_sdelki()
 {
 bool pr;
 for (int i=OrdersTotal()-1; i>=0; i--)       
   {                                        
   if(OrderSelect(i,SELECT_BY_POS)==true)
      {  
         pr=false; 

         if (OrderType()==OP_BUY)    pr=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), 30 );                              
         if (OrderType()==OP_SELL)   pr=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), 30 );
         
         if (pr==false) Print("закрытие ордера ", OrderSymbol() ," завершилось с ошибкой #",GetLastError());
         if (pr==true) Print("ордер ", OrderSymbol() , " ЗАКРЫТ");
       }
    }
  }  
 
igrok333:

спасибо что напомнили мне про отложки)
вот так правильно делать?

if (pr==false)  эквивалентно if (!pr)
if (pr==true)   эквивалентно if (pr)

Вместо Print использую Alert  -  сразу появляется на экране без открытия журнала. И лишняя информация отсутствует

 
Вместо
if (OrderType()==OP_BUY)    pr=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), 30 );
if (OrderType()==OP_SELL)   pr=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), 30 );
короче
if (OrderType()==OP_BUY)    pr=OrderClose(OrderTicket(), OrderLots(), Bid, 30 );
if (OrderType()==OP_SELL)   pr=OrderClose(OrderTicket(), OrderLots(), Ask, 30 );
или просто
pr=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 30 );


 
STARIJ:

if (pr==false)  эквивалентно if (!pr)
if (pr==true)   эквивалентно if (pr)

Вместо Print использую Alert  -  сразу появляется на экране без открытия журнала. И лишняя информация отсутствует

я вообще-то про розмещение pr  в коде))
 
Дед пенсионер:
разве можно OrderClosePrice() так писать?

OrderClosePrice() мы же получаем после закрытия сделки.
 
igrok333:
разве можно OrderClosePrice() так писать?

OrderClosePrice() мы же получаем после закрытия сделки.

Можно. Но осторожно. У открытой позиции он возвращает цену её закрытия. Соответственно: для Buy - Bid, для Sell - Ask