Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 759

 
Kapizdo4ka:

Здравствуйте! Подскажите пожалуйста, почему у меня иногда не срабатывает оператор if esle. 
Вот пример:  

 

 Где:
H3 - это ценовое значение уровня
price - текущая цена

В итоге выходит, что цена доходит до этого уровня (иногда даже останавливается на нем), а Алерт не срабатывает. 
Подскажите в чем ошибка?

В том, что цена редко может точно совпадать со значением уровня. Или price >= H3 или определить диапазон погрешности.
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double gPoint=0.001;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if(OrdersTotal()==0)
     {
      Print(" Открытие первой позиции ");
      double _Ask=MarketInfo("GBPUSD",MODE_ASK);
      int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0)
        {
         Print(" ОРДЕР ОТКРЫТ ",ticket);
        }
     }

   double _Bid=MarketInfo("GBPUSD",MODE_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
        {
         if(OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid,15);
            
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

           }
        }
     }
   return(0);
  }

Доброе утро.

Программа имеет такой вид.

При компиляции выдает:

'Ozero.mq4'                                                      Ozero.mq4      1        1
return value of 'OrderClose' should be checked     Ozero.mq4    46      13
implicit conversion from 'number' to 'string'          Ozero.mq4    49    117
0 error(s), 2 warning(s)                                                           1       3


Во вкладке "результаты" видно, что ордера открываются и закрываются.

1    2014.08.25 00:00    buy    1    0.10    1.6550    0.0000    0.0000    0.00    10000.00
2    2014.08.25 06:30    close    1    0.10    1.6562    0.0000    0.0000    0.12    10000.12
3    2014.08.25 06:31    buy    2    0.10    1.6564    0.0000    0.0000    0.00    10000.12
4    2014.08.25 10:00    close    2    0.10    1.6574    0.0000    0.0000    0.10    10000.22
5    2014.08.25 10:00    buy    3    0.10    1.6576    0.0000    0.0000    0.00    10000.22
6    2014.08.25 12:58    close    3    0.10    1.6586    0.0000    0.0000    0.10    10000.32
7    2014.08.25 12:58    buy    4    0.10    1.6590    0.0000    0.0000    0.00    10000.32
8    2014.08.26 13:13    close at stop    4    0.10    1.6576    0.0000    0.0000    -0.14    10000.18


8 - это я прервал работу закрыв тестер.


Далее,  смотрим "Журнал":

2014.10.31 07:46:44.837    GBPUSD,M15: 4453 tick events (5608 bars, 340128 bar states) processed within 312876 ms (total time 324436 ms)
2014.10.31 07:46:44.837    2014.08.26 13:13  Tester: order #4 is closed
2014.10.31 07:46:44.798    2014.08.26 13:13  Visual tester stopped
2014.10.31 07:43:15.315    2014.08.25 12:58  Ozero GBPUSD,M15:  ОРДЕР ОТКРЫТ 4
2014.10.31 07:43:15.315    2014.08.25 12:58  Ozero GBPUSD,M15: open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.315    2014.08.25 12:58  Ozero GBPUSD,M15:  Открытие первой позиции
2014.10.31 07:43:15.245    2014.08.25 12:58  Ozero GBPUSD,M15: Чё-та не закрылася позиция. Фигня вот такая происходит: 4108
2014.10.31 07:43:15.245    2014.08.25 12:58  Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:43:15.245    2014.08.25 12:58  Ozero GBPUSD,M15: unknown ticket 3 for OrderClose function
2014.10.31 07:43:15.245    2014.08.25 12:58  Ozero GBPUSD,M15: close #3 buy 0.10 GBPUSD at 1.6576 at price 1.6586
2014.10.31 07:42:51.123    2014.08.25 10:00  Ozero GBPUSD,M15:  ОРДЕР ОТКРЫТ 3
2014.10.31 07:42:51.123    2014.08.25 10:00  Ozero GBPUSD,M15: open #3 buy 0.10 GBPUSD at 1.6576 ok
2014.10.31 07:42:51.123    2014.08.25 10:00  Ozero GBPUSD,M15:  Открытие первой позиции
2014.10.31 07:42:51.059    2014.08.25 10:00  Ozero GBPUSD,M15: Чё-та не закрылася позиция. Фигня вот такая происходит: 4108
2014.10.31 07:42:51.059    2014.08.25 10:00  Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:51.059    2014.08.25 10:00  Ozero GBPUSD,M15: unknown ticket 2 for OrderClose function
2014.10.31 07:42:51.059    2014.08.25 10:00  Ozero GBPUSD,M15: close #2 buy 0.10 GBPUSD at 1.6564 at price 1.6574
2014.10.31 07:42:31.473    2014.08.25 06:31  Ozero GBPUSD,M15:  ОРДЕР ОТКРЫТ 2
2014.10.31 07:42:31.473    2014.08.25 06:31  Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473    2014.08.25 06:31  Ozero GBPUSD,M15:  Открытие первой позиции
2014.10.31 07:42:31.331    2014.08.25 06:30  Ozero GBPUSD,M15: Чё-та не закрылася позиция. Фигня вот такая происходит: 4108
2014.10.31 07:42:31.331    2014.08.25 06:30  Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:31.331    2014.08.25 06:30  Ozero GBPUSD,M15: unknown ticket 1 for OrderClose function
2014.10.31 07:42:31.331    2014.08.25 06:30  Ozero GBPUSD,M15: close #1 buy 0.10 GBPUSD at 1.6550 at price 1.6562
2014.10.31 07:41:31.966    2014.08.25 00:00  Ozero GBPUSD,M15:  ОРДЕР ОТКРЫТ 1
2014.10.31 07:41:31.966    2014.08.25 00:00  Ozero GBPUSD,M15: open #1 buy 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.966    2014.08.25 00:00  Ozero GBPUSD,M15:  Открытие первой позиции
2014.10.31 07:41:31.958    Ozero inputs: gLot=0.1; gPoint=0.001;

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

Ozero.

 
Ты два раза пытаешься закрыть один и тот же ордер. Убери верхний.
 
Roger:
Ты два раза пытаешься закрыть один и тот же ордер. Убери верхний.
Лучше нижний. Ордер предварительно надо выбрать.
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

Доброе утро.

Исключил две строки. Все работает. И на графике все правильно отображается, и в результатах и в журналах.

Вопрос: при компиляции выдает


'Ozero.mq4'                                                        Ozero.mq4     1    1
return value of 'OrderClose' should be checked    Ozero.mq4    46    13
0 error(s), 1 warning(s)                                                           1    2



О чем предупреждает компилятор? 46 строка это OrderClose(OrderTicket(),OrderLots(),_Bid,15);


Ozero.

 
tuner:

Ребяты подскажите из-за чего может быть глюк, возникший сегодня.

В советнике есть возможность остановки торговли за 15 минут до закрытия рынка в пятницу.

При появлении нового дня советник проверяет, если это пятница, то сегодня перестаем торговать в StringToTime("23:59")-15*60

В тестере стратегий эта функция работает правильно, но на реале наблюдаю совсем другую картину - советник перестает торговать с первым тиком при наступлении пятницы. 

Вот принты из журнала экспертов:

Брокер №1, демо:

0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00

Брокер №2, реал:

0 03:00:11.999 Scalper EURUSD,M1: Finish In Friday = 2014.10.23 23:44:00

То есть при появлении сегодняшнего дневного бара (24 окт, пятница) на первом же тике советник 

преобразует строку "23:59" во время со вчерашним днем, за место того чтобы присваивать день сегодняшний.

Но если советник перезапустить в пятницу в середине дня, то он корректно определит время завершения работы.

Нашел причину этой проблемы: https://forum.mql4.com/33023

Как и предполагалось, это практически баг функции StringToTime. Все симптомы сходятся. Данная функция преобразует строку "23:59" в datetime с датой локального ПК, а не с датой МТ4. А в тестере, как известно, дата локального ПК эмулируется и приравнивается ко времени терминала. Поэтому в тестере все работает как надо, а на демо/реале получается глюк и убытки. В документации конечно не сказано откуда берется дата и по ссылке выше видно что данная проблема озвучивалась еще 4 года назад, но видимо метаквотам все равно.

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD",MODE_BID);

      if (_Bid>=gPoint1)
        {
           for(pos=OrdersTotal();pos>=0;pos--)
             {
                OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
             }      
       
        }

Еще вопрос. Я правильно понимаю, что:

1. нумерация ордеров начинается от "0".

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


Ozero.

 

Кто нибудь делал скроллинг текста на экране? К примеру - ордер такой то открыт/закрыт/модифицирован и т.п.. Новости там такие то... ?

Если не жалко, покажите пожалуйста кусок кода.

Сенкс!

 
Vinin:
Лучше нижний. Ордер предварительно надо выбрать.

Лучше так:

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

Кто нибудь делал скроллинг текста на экране? К примеру - ордер такой то открыт/закрыт/модифицирован и т.п.. Новости там такие то... ?

Если не жалко, покажите пожалуйста кусок кода.

Сенкс!

Делал вертикальный скроллинг в окне пустого индикатора. Вот функция:

//+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(string mess1, int sz=9, color color1=clrDarkGray, 
            string mess2="", color color2=clrDarkGray, 
            string mess3="", color color3=clrDarkGray, 
            string mess4="", color color4=clrDarkGray, 
            bool draws=true) {
   string   NameGrafText, message, nm;
   int      i, y, k, shift, Win_Num=-1, num=0;
   color    cl;
   Win_Num=WindowFind("Win_Inform");
   if (mess1=="") {
      //Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   if (!draws || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0) {
         if (ObjectFind(NameGrafText)==Win_Num) {
            if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete(NameGrafText);  
               Mass_Name_Message[i]="";
               }
            else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE);          // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR, clrDimGray);       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v);   // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {  // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: message=mess4; cl=color4; break;
         default:message=mess1; cl=color1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

Как пример использования одноцветного сообщения (можно 4 цвета в одной строке для разных слов):

if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
   string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
   iPrint(mess1,9,clrBlue);
   trade.OpenS(sy,lots,mn,0.0,0.0,co);
   }

На графике должен быть пустой индикатор с именем Win_Inform.

Причина обращения: