[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 412

 

в учебнике по MQL в главе Стандартные функции в разделе Операции с графиками приведена функция WindowHandle со следующим описанием: "… возвращает системный дескриптор окна (window handle), содержащего указанный график".

Вопрос: что означает (что такое) "системный дескриптор окна" и для чего он нужен?

P.S. Чтобы не захламлять форум, заранее благодарю за ответ

 
7777877:

в учебнике по MQL в главе Стандартные функции в разделе Операции с графиками приведена функция WindowHandle со следующим описанием: "… возвращает системный дескриптор окна (window handle), содержащего указанный график".

Вопрос: что означает (что такое) "системный дескриптор окна" и для чего он нужен?

P.S. Чтобы не захламлять форум, заранее благодарю за ответ


Ответ:

дескриптор окна - это число

дескриптор окна нужен для последующей работы с окном

 
int start()
{
  for (int i=OrdersHistoryTotal()-1;i>=0; i--)
  {
    if( OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
       if (TimeDay (OrderOpenTime())==Day()
        && TimeMonth(OrderOpenTime())==Month()
        && TimeYear (OrderOpenTime())==Year())
         if(OrderType()==OP_SELL && OrdersTotal()==0 || OrdersHistoryTotal()==0)
         {
            OrderSend( Symbol(), OP_BUY, 0.1, Ask, 5,Bid-25*Point,Bid+25*Point, "", 0, 0, Blue );
         }
         if( OrderType()==OP_BUY && OrdersTotal()==0 || OrdersHistoryTotal()==0)
         {
            OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5,Ask-25*Point,Ask+25*Point, "", 0, 0, Red );
         }
    }
  }
  return(0);
}

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

 
подскажите, как правильно сделать.
хочу, чтобы при наступлении нового дня закрывались отложенные ордера, если не исполнились... написал, но что-то не выходит. ошибка 4051
  if (iTime(Symbol(),PERIOD_D1,0) != New_Day_DateTime)
   {
         New_Day_DateTime = iTime(Symbol(),PERIOD_D1,0); 
         GlobalVariableSet("gNew_Day_DateTime",New_Day_DateTime); 
  
for( i=1;i<=OrdersTotal(); i++)         
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {                                      

         if (OrderSymbol()!= Symb) continue;    
          Tip=OrderType();                   
         if (Tip==0) continue;           

            Limit_Stop=Tip;
             if (OrderMagicNumber()==3)                     
            {Ticket_B=OrderTicket();}
        }                                    
     }                                       

   while(true)                                
     {
      if (Limit_Stop==-1)                      
        {
         break;                                      
        }
       Ans_B=OrderDelete(Ticket_B);             

      if (Ans_B==true)                          
        {
         break;                                 
     }   }
        
for ( i=1; i<=OrdersTotal(); i++)         
     {        
    if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {                                      

         if (OrderSymbol()!= Symb) continue;    
          Tip=OrderType();                   
         if (Tip==1) continue;                 

      if (OrderMagicNumber()==4) 
      {Ticket_S=OrderTicket();}              
     }
     }
   while(true)                                
     {
      if (Limit_Stop==-1)                      
        {
         break;                                      
        }
        Ans_S=OrderDelete(Ticket_S);            

      if (Ans_S==true) 
        {
         break; 
        }
}
 
Egori4:


Так при открытие отложенного ордера задайте время истечения отложенного ордера, скажем 23:59, он сам и закроется.

nt OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

 
lowech:

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


А почему он должен открывать ордера, особенно если в история пустая. И научитесь код вставлять по человечески, мне не нравится редактировать чужие посты.
 
Sepulca:
благодарю! попробую...
 

Как в этом советнике дополнить

//+------------------------------------------------------------------+

//| CCI.mq4 |

//| Copyright 2012, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright 2012, MetaQuotes Software Corp."

#property link "http://www.metaquotes.net"



extern double LotTrend = 0.1;

extern int TP=100;

extern int SL=250;


//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)

{

if (Bid>iMA(Symbol(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_BUY,LotTrend,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Green);

}

if (Bid<iMA(Symbol(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_SELL,LotTrend,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Green);

}

}



//----

return(0);

}

//+------------------------------------------------------------------+

1.Чтобы Сделка открывалась только по закрытию свечи.(Когда цена пересекает SMA)

 

Здравствуйте! Меня вот волнует один вопрос по индикаторам на MQL4, и никак не могу до конца понять... Например, есть несложный индикатор фракталов:

//+===========================================================================+ 
//|                                                                  FRAC.mq4 | 
//+===========================================================================+ 
// Параметры: 
// 
// По умолчанию frac_5 - оранжевый, frac_3 - темно-синий. 
//----- 
// History    - определяет на сколько глубоко в историю вам нужно отображение  
//              индикатора (в количестве свечей). Минимальное значение = 2. 
//-----  
// frac_3     - если значение "on", то frac_3 отображается, иначе нет. 
//-----  
// frac_5     - если значение "on", то frac_5 отображается, иначе нет. 
//+===========================================================================+ 
#property indicator_chart_window 
#property indicator_buffers            4     
#property indicator_color1  MidnightBlue 
#property indicator_color2  MidnightBlue  
#property indicator_color3        Orange 
#property indicator_color4        Orange 
//-----         
extern int         history     =     500; 
extern string       frac_3     =    "on";   
extern string       frac_5     =    "on";
extern int          metka      =      20;
//-----         
double FRAC_3_POS[]; 
double FRAC_3_NEG[]; 
double FRAC_5_POS[]; 
double FRAC_5_NEG[]; 

//+===========================================================================+ 

int init() 
   { 
     SetIndexBuffer (0, FRAC_3_POS);  
              
     SetIndexStyle  (0, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (0, 217); 
   //-----         
     SetIndexBuffer (1, FRAC_3_NEG);    
            
     SetIndexStyle  (1, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (1, 218); 
   //-----         
     SetIndexBuffer (2, FRAC_5_POS);      
          
     SetIndexStyle  (2, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (2, 217); 
   //-----         
     SetIndexBuffer (3, FRAC_5_NEG);        
        
     SetIndexStyle  (3, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (3, 218); 
      
    return(0); 
   } 

//+===========================================================================+ 

int start() 
   { 
    int i,Counted_bars; 
     
    Counted_bars = IndicatorCounted(); 
     
     i = Bars - Counted_bars - 1; 
     
     if (history < 2) 
      
         history = 2; 
                   
     if (i > history - 1) 
      
         i = history - 1;
         //i=Bars -  1;
    //----- 
     if (Digits <= 3) 
       
         double K = 0.01; 
       
     else       K = 0.0001;     
              
    while (i >= 0) 
          { 
           double FR_3P=0, FR_3N=0, 
                  FR_5P=0, FR_5N=0; 
          //-----         
           if (High[i+1] >= High[i+2] && High[i+1] >= High[i]) 
            
               FR_3P = High[i+1] + metka*K; 
          //-----         
           if (Low[i+1] <= Low[i+2] && Low[i+1] <= Low[i]) 
            
               FR_3N = Low[i+1] - metka*K; 
          //-----         
           if (High[i+2] >= High[i+4] && High[i+2] >= High[i+3] && High[i+2] >= High[i+1] && High[i+2] >= High[i]) 
            
               FR_5P = High[i+2] + metka*K; 
          //-----         
           if (Low[i+2] <= Low[i+4] && Low[i+2] <= Low[i+3] && Low[i+2] <= Low[i+1] && Low[i+2] <= Low[i]) 
            
               FR_5N = Low[i+2] - metka*K; 
          //-----  
           if (frac_3 != "on") 
              { 
               FR_3P = EMPTY; 
                 
               FR_3N = EMPTY; 
              }  
          //-----  
           if (frac_5 != "on") 
              { 
               FR_5P = EMPTY; 
                 
               FR_5N = EMPTY; 
              }       
          //-----  
            
               FRAC_3_POS[i+1] = FR_3P; 
                
               FRAC_3_NEG[i+1] = FR_3N; 
                
               FRAC_5_POS[i+2] = FR_5P; 
                
               FRAC_5_NEG[i+2] = FR_5N; 
               
               i--; 
          } 
      return(0); 
   } 
//+===========================================================================+ 

Если его компилировать в этом виде, то при расширении левой границы графика и подгрузке истории он начинает глючить и показывать метки там, где их быть не должно (см. скрин во вложении). Если закомментировать часть кода:

if (history < 2) 
      
         history = 2; 
                   
     if (i > history - 1) 
      
         i = history - 1;

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

Почему это происходит? Почему, получается, обязательно надо при подгрузке истории пересчитывать весь индикатор? И почему надо обнулять значения "пустых" элементов инд. массива?

Если бы бары индексировались слева направо, то при подгрузке истории индексы баров сменялись бы и индикатор без перерасчёта отображался бы неверно, тогда был бы понятен такой глюк... Но ведь в МТ4 бары индексируются справа налево, значит, при подгрузке истории, индексы тех баров, которые были, должны были остаться теми же (и значения индикатора тоже), тогда зачем перерасчитывать индикатор и откуда берутся эти сдвиги меток?

 

Коллеги подскажите ответ на следующий вопрос.
Открываю руками 4 ордера на бай, запускаю советник который удаляет установленные ордера по цене бид, проскальзывание поставил 100 пунктов, удаление в цикле, проверка занятости потока и обновление котировок присутствует. Почему ордера не удаляются в цикле все ? по логу видно что удаление идёт за несколько инициализаций функции start()
код советника

int start()  
  {
   Print("Пришёл новый тик");
   int total=OrdersTotal();
   Print("Всего ордеров = "+total);
   for (int i=0;i<total;i++)
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         //Print("Всего ордеров = "+OrdersTotal());
         Print("удаляем ордер = "+i+" тикет ордера = "+OrderTicket());
         while(IsTradeContextBusy())
            {
            Print("Торговый поток занят");
            Sleep(100);
            }
         RefreshRates();       
         OrderClose(OrderTicket(),OrderLots(),Bid,100,0);
         Print("ошибка="+GetLastError());
         }  
   return(0);
  }
       

вот лог советника:

17:16:59 temp EURUSD,M1: loaded successfully
17:17:51 temp EURUSD,M1: Пришёл новый тик
17:17:51 temp EURUSD,M1: Всего ордеров = 4
17:17:51 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808657
17:17:52 temp EURUSD,M1: close #2808657 buy 1.00 EURUSD at 1.28969 at price 1.28973
17:17:52 temp EURUSD,M1: ошибка=0
17:17:52 temp EURUSD,M1: удаляем ордер = 1 тикет ордера = 2808659
17:17:52 temp EURUSD,M1: close #2808659 buy 1.00 EURUSD at 1.28974 at price 1.28975
17:17:52 temp EURUSD,M1: ошибка=0
17:17:54 temp EURUSD,M1: Пришёл новый тик
17:17:54 temp EURUSD,M1: Всего ордеров = 2
17:17:54 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808658
17:17:54 temp EURUSD,M1: close #2808658 buy 1.00 EURUSD at 1.28969 at price 1.28976
17:17:54 temp EURUSD,M1: ошибка=0
17:17:56 temp EURUSD,M1: Пришёл новый тик
17:17:56 temp EURUSD,M1: Всего ордеров = 1
17:17:56 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808660
17:17:56 temp EURUSD,M1: close #2808660 buy 1.00 EURUSD at 1.28976 at price 1.28977
17:17:56 temp EURUSD,M1: ошибка=0

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