Программисты, посодействууте с доработкой кода - страница 2

 
да, в скрипте, и не забудь про разницу времени
 
Для Profi_R это чтоб лучше понять Triton'a

"MQL4: нет цены?"
 
Обрати внимание, что теперь во внешних переменных нужно ставить желаемое время для открытия, и еще я поставил 60 сек - время возможного отсутствия тиков, если надо измени, или можешь тоже вывести во внешние
//+------------------------------------------------------------------+
//|                                                       Triton.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern int TakeProfit = 150;            
extern int StopLoss = 1;              
extern int lev= 10;  
extern int risk = 20;               
extern int HourOpen = 17;       
extern int MinutesOpen = 49;
extern int SecondsOpen = 30;
extern int HourClose = 14;
extern int MinutesClose = 0;
extern int SecondsClose = 1;

int  ho, mo,  so, Lots; 
int pos;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
//----
mo=Minute(); 
so=Seconds(); 
ho=Hour(); 

   Lots=MathCeil(AccountBalance()*risk/10000.0)/10.0;
   if (Lots<0.1) Lots=0.1;  
  
//*-----------------------------------------------------------------------  
//|Блок выставления ордеров   
//*-----------------------------------------------------------------------
                        
if( StartTime(60,HourOpen,MinutesOpen,SecondsOpen) )
{
   if(OrderTotal(OP_BUYSTOP)==0)
   {
      OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+lev*Point,3,(Ask+lev*Point)-StopLoss*Point,Ask+(TakeProfit+lev)*Point,"Покупка",222,0,Blue);
   }
   if(OrderTotal(OP_SELLSTOP)==0)
   {
      OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-lev*Point,3,(Bid-lev*Point)+StopLoss*Point,Bid-(TakeProfit+lev)*Point,"Продажа",222,0,Red);
   }
}
//*-----------------------------------------------------------------------  
//|удаление всех ордеров по данному инструменту
//*-----------------------------------------------------------------------

if( StartTime(60,HourClose,MinutesClose,SecondsClose) )
{
   for(pos=OrdersTotal()-1; pos>=0; pos--)
   {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
      {
         if(OrderSymbol()==Symbol())
         {
            if(OrderType()==OP_BUY)
            {
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Blue); 
            }
            else
            {
               if(OrderType()==OP_SELL)
               {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Red); 
               }
               else
               {
                  if(OrderType()==OP_BUYSTOP)
                  {
                     OrderDelete(OrderTicket(),Blue); 
                  }
                  else
                  {
                     if(OrderType()==OP_SELLSTOP)
                     {
                        OrderDelete(OrderTicket(),Red);
                     }
                  }
               }
            }
         }               
      }
      else
      {
         Print("Ошибка ", GetLastError());
      }
   }
}
return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
// функция подсчитывающая количество ордеров в рынке по типу
//+------------------------------------------------------------------+
int OrderTotal(int type)
  {
  int order=0;
  for(int pos=OrdersTotal()-1; pos>=0; pos--)
    {
    if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
      {
      if(OrderSymbol()==Symbol() && OrderType()==type)
        {
        order++;             
        }
      }
    else
      Print("Ошибка ", GetLastError());
    }
//----
   return(order);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
// Функция, отслеживающая время, для того чтобы дать старт определенным
// действиям в точно заданное время
//+------------------------------------------------------------------+
//здесь немного пояснений как работает функция :
//чтобы не зависить от прихода тика, и в то же время не зацикливать эксперт
//и при этом терять информацию о вновь поступивших ценах поступаем следующим образом
//определяем (на своем опыте) масимальное время, в течении которого не приходит тик (в секундах)
//это значение будет храниться в переменной time_absence_tic
//кроме того потребуется час, минута, и секунда - точное время дня, когда должно свершиться "чудо" :)

bool StartTime(int time_absence_tic,int mHour,int mMinutes,int mSeconds)
{
//----
   bool rez; //в эту переменную запишем результат исполнения функции
   int ta_m,ta_s; //переменные в которых будем хранить значения полных минут и секунд времени максимального отсутствия тиков
   int dif_m,dif_s;
   int tsleep;
   rez=0;
   //сначала нужно вычислить сколько времени в минутах и секундах составляет время максимального отсутствия тика
   //вычислять более высокие промежутки времени (часы и выше) думаю не имеет смысла
   if( time_absence_tic>60 )
   {
      ta_m=MathFloor(time_absence_tic/60);
      ta_s=time_absence_tic-ta_m*60;
   }
   else
   {
      ta_m=0;
      ta_s=time_absence_tic;
   }
   //определяем время в которое должен стартовать наш "цикл" чтобы стать независимым от тиков
   if( TimeHour(TimeCurrent())==mHour && TimeMinute(TimeCurrent())>=mMinutes-ta_m && TimeSeconds(TimeCurrent())>=mSeconds-ta_s )
   {
      //чтобы задать время "сна" определим разницу времени когда должен стартануть наш цикл в идеале и реальное
      dif_m=TimeMinute(TimeCurrent())-(mMinutes-ta_m);
      dif_s=TimeSeconds(TimeCurrent())-(mSeconds-ta_s);
      //соответственно время сна в секундах составит (на секунду меньше)
      tsleep=dif_m*60+dif_s-1;
      //засыпаем :)
      Sleep(tsleep*1000);
      //проснулись нужно обновить рыночные данные
      RefreshRates();
      //теперь можно выставить значение тру, и в поход за лиммионами
      rez=1;
   }
//----
return(rez);
}
//+------------------------------------------------------------------+
 
Спасибо Profi_R за уделенное внимание
Буду разбираться
 
Обрати внимание, что теперь во внешних переменных нужно ставить желаемое время для открытия, и еще я поставил 60 сек - время возможного отсутствия тиков, если надо измени, или можешь тоже вывести во внешние

А разве раньше во внешних переменных не ставилось желаемое время?
extern int HourOpen = 17;
extern int MinutesOpen = 49;
extern int SecondsOpen = 30;

Эксперт в таком виде не выставляет ордера.
не совсем до конца понял как работает функция, отслеживающая время. Допустим пример:
торги закрываются в 20:15. Цель - выставить ордера в 20:14:30.(Время МТ4)
К примеру последний тик пришел в 20:08:01. Я так понимаю: mHour, mMinutes и mSeconds это время прихода последнего тика и на основании этого времени
выполняется условие if( StartTime(60,HourOpen,MinutesOpen,SecondsOpen) )

Или я не правильно понял
 
Эксперт в таком виде не выставляет ордера.
не совсем до конца понял как работает функция, отслеживающая время. Допустим пример:
торги закрываются в 20:15. Цель - выставить ордера в 20:14:30.(Время МТ4)
К примеру последний тик пришел в 20:08:01. Я так понимаю: mHour, mMinutes и mSeconds это время прихода последнего тика и на основании этого времени
выполняется условие if( StartTime(60,HourOpen,MinutesOpen,SecondsOpen) )

Или я не правильно понял

в этом случае время в которое ты желаешь выставить ордер 20:14:30 (его и ставишь во внешних переменных), из примера видно что тик на приходил 6 мин. 29 сек, т.е. вместо 60 , как минимум должно стоять 6*60+29 = 389 сек. (нужно на практике знать ориентировочное максимально время отсутствие тиков), за 389 сек. запустится наша функция и будет ждать и ровно в 20:14:30 произведет нужные нам действия. StartTime(389,20,14,30) так будет выглядеть с циферками :)
 
[/quote]
в этом случае время в которое ты желаешь выставить ордер 20:14:30 (его и ставишь во внешних переменных), из примера видно что тик на приходил 6 мин. 29 сек, т.е. вместо 60 , как минимум должно стоять 6*60+29 = 389 сек. (нужно на практике знать ориентировочное максимально время отсутствие тиков), за 389 сек. запустится наша функция и будет ждать и ровно в 20:14:30 произведет нужные нам действия. StartTime(389,20,14,30) так будет выглядеть с циферками :)
[/quote]

Теперь дошло :)

Спасибо
 
Уважаемые разработчики !

Подскажите, пожалуйста, почему появляется такое сообщение компилятора ?

"internal stack overflow-simplify the program, please"


Что рекомендуется оптимизировать и сокращать: количество строк кода, переменных, массивов, обращений к функциям ?

Спасибо.
 
Olga_trader, это сообщение появляется из-за большой вложенности кода (типа цикл внутри цикла ... внутри цикла)
Вместо одной большой функции попробуйте сделать несколько функций
 
To Slawa

Большое спасибо, помогло.